From 18921a82da43a41e6cf7434321a5ea3ce9dcfed2 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 03:04:08 +0530 Subject: [PATCH 01/61] feat: backend refactor --- .eslintrc | 4 - .gitignore | 2 + .prettierrc | 8 - LICENSE | 2 +- apps/api/.gitignore | 4 - apps/api/biome.json | 39 + apps/api/nest-cli.json | 38 +- apps/api/package.json | 161 +- apps/api/src/BaseContext.ts | 35 + apps/api/src/ai/ai.controller.ts | 15 - apps/api/src/ai/ai.module.ts | 10 - apps/api/src/ai/ai.service.ts | 112 - apps/api/src/ai/dto/ai.dto.ts | 12 - apps/api/src/app.controller.ts | 12 - apps/api/src/app.module.ts | 88 +- apps/api/src/auth/auth.controller.ts | 69 - apps/api/src/auth/auth.module.ts | 36 - apps/api/src/auth/auth.service.ts | 103 - apps/api/src/auth/cookieHandler.ts | 29 - .../api/src/auth/decorators/role.decorator.ts | 8 - .../api/src/auth/decorators/user.decorator.ts | 7 - .../api/src/auth/guards/github-oauth.guard.ts | 14 - .../api/src/auth/guards/google-oauth.guard.ts | 14 - apps/api/src/auth/guards/saml-oauth.guard.ts | 14 - apps/api/src/auth/strategy/github.strategy.ts | 48 - apps/api/src/auth/strategy/google.strategy.ts | 48 - apps/api/src/auth/strategy/jwt.strategy.ts | 40 - .../api/src/auth/strategy/refresh.strategy.ts | 42 - apps/api/src/auth/strategy/saml.strategy.ts | 62 - apps/api/src/cloud/cloud.module.ts | 8 - apps/api/src/cloud/cloud.service.ts | 36 - apps/api/src/controllers/ai.controller.ts | 15 + apps/api/src/controllers/auth.controller.ts | 69 + apps/api/src/controllers/events.controller.ts | 162 + apps/api/src/controllers/form.controller.ts | 109 + apps/api/src/controllers/kanban.controller.ts | 39 + .../src/controllers/org-invite.controller.ts | 31 + .../src/controllers/org-member.controller.ts | 53 + .../controllers/organization.controller.ts | 85 + apps/api/src/controllers/stripe.controller.ts | 14 + apps/api/src/controllers/user.controller.ts | 42 + apps/api/src/db/migrations/01.user.ts | 35 + apps/api/src/db/migrations/02.account.ts | 28 + apps/api/src/db/migrations/03.organization.ts | 26 + .../db/migrations/04.organization-member.ts | 26 + .../db/migrations/05.organization-invite.ts | 28 + apps/api/src/db/migrations/06.events.ts | 38 + apps/api/src/db/migrations/07.event-ticket.ts | 34 + apps/api/src/db/migrations/08.form-field.ts | 32 + apps/api/src/db/migrations/09.form.ts | 38 + .../db/migrations/10.form-field-options.ts | 26 + .../api/src/db/migrations/11.form-response.ts | 28 + apps/api/src/db/migrations/12.ticket.ts | 28 + apps/api/src/db/migrations/13.kanban.ts | 24 + apps/api/src/db/migrations/14.kanban-card.ts | 28 + apps/api/src/db/migrations/15.comment.ts | 30 + apps/api/src/db/schema/account.ts | 28 + apps/api/src/db/schema/comment.ts | 32 + apps/api/src/db/schema/event-ticket.ts | 37 + apps/api/src/db/schema/events.ts | 36 + apps/api/src/db/schema/form-field-options.ts | 26 + apps/api/src/db/schema/form-fields.ts | 35 + apps/api/src/db/schema/form-response.ts | 30 + apps/api/src/db/schema/form.ts | 37 + apps/api/src/db/schema/index.ts | 155 + apps/api/src/db/schema/kanban-card.ts | 30 + apps/api/src/db/schema/kanban.ts | 25 + apps/api/src/db/schema/organization-invite.ts | 32 + apps/api/src/db/schema/organization-member.ts | 28 + apps/api/src/db/schema/organization.ts | 24 + apps/api/src/db/schema/tickets.ts | 30 + apps/api/src/db/schema/user.ts | 24 + apps/api/src/error.ts | 48 +- apps/api/src/events/dto/cover-dto.ts | 9 - apps/api/src/events/dto/create-events.dto.ts | 53 - apps/api/src/events/dto/publishForm.dto.ts | 14 - apps/api/src/events/dto/remove-user.dto.ts | 16 - apps/api/src/events/dto/update-event.dto.ts | 50 - apps/api/src/events/events.controller.ts | 154 - apps/api/src/events/events.module.ts | 19 - apps/api/src/events/events.service.ts | 714 - apps/api/src/events/upload.middleware.ts | 18 - apps/api/src/form/dto/create-form.dto.ts | 25 - apps/api/src/form/dto/publish-form.dto.ts | 14 - apps/api/src/form/form.controller.ts | 100 - apps/api/src/form/form.module.ts | 16 - apps/api/src/form/form.service.ts | 204 - apps/api/src/kanban/dto/create-task.dto.ts | 14 - apps/api/src/kanban/kanban.controller.ts | 34 - apps/api/src/kanban/kanban.module.ts | 11 - apps/api/src/kanban/kanban.service.ts | 140 - apps/api/src/mail/mail.module.ts | 44 - apps/api/src/mail/mail.service.ts | 71 - apps/api/src/mail/templates/org-invite.tsx | 77 - .../src/mail/templates/payment-succesfull.tsx | 64 - apps/api/src/mail/templates/welcome.tsx | 64 - apps/api/src/main.ts | 74 +- apps/api/src/middleware/upload.middleware.ts | 18 + apps/api/src/models/BaseModel.ts | 104 + apps/api/src/models/User.ts | 13 + apps/api/src/modules/root.module.ts | 171 + .../api/src/org-invite/dto/user-invite.dto.ts | 21 - .../src/org-invite/org-invite.controller.ts | 26 - apps/api/src/org-invite/org-invite.module.ts | 11 - apps/api/src/org-invite/org-invite.service.ts | 146 - .../src/org-member/dto/member-remove.dto.ts | 14 - .../api/src/org-member/dto/update-role.dto.ts | 19 - .../src/org-member/org-member.controller.ts | 47 - apps/api/src/org-member/org-member.module.ts | 11 - apps/api/src/org-member/org-member.service.ts | 110 - .../src/organization/dto/create-org.dto.ts | 14 - .../src/organization/dto/update-org.dto.ts | 19 - .../organization/guards/rbac-member.guard.ts | 53 - .../organization/organization.controller.ts | 72 - .../src/organization/organization.module.ts | 13 - .../src/organization/organization.service.ts | 262 - apps/api/src/prisma/prisma.module.ts | 8 - apps/api/src/services/ai.service.ts | 112 + apps/api/src/services/auth/auth.service.ts | 107 + apps/api/src/services/auth/cookieHandler.ts | 29 + .../auth/decorators/role.decorator.ts | 10 + .../auth/decorators/user.decorator.ts | 9 + .../auth/guards/github-oauth.guard.ts | 14 + .../auth/guards/google-oauth.guard.ts | 14 + .../auth/guards/refresh.guard.ts | 0 .../services/auth/guards/saml-oauth.guard.ts | 14 + .../services/auth/strategy/github.strategy.ts | 61 + .../services/auth/strategy/google.strategy.ts | 61 + .../services/auth/strategy/jwt.strategy.ts | 40 + .../auth/strategy/refresh.strategy.ts | 46 + .../services/auth/strategy/saml.strategy.ts | 74 + apps/api/src/services/cloud.service.ts | 36 + .../decorator}/roles.decorator.ts | 0 apps/api/src/services/dto/ai.dto.ts | 12 + apps/api/src/services/dto/cover-dto.ts | 9 + .../api/src/services/dto/create-events.dto.ts | 50 + apps/api/src/services/dto/create-form.dto.ts | 25 + apps/api/src/services/dto/create-org.dto.ts | 14 + apps/api/src/services/dto/create-task.dto.ts | 14 + .../dto/delete-event.dto.ts | 6 +- .../dto/delete-org.dto.ts | 8 +- .../dto/generic-org.dto.ts | 8 +- .../dto/get-events.dto.ts | 16 +- .../dto/leave-org.dto.ts | 8 +- .../api/src/services/dto/member-remove.dto.ts | 14 + apps/api/src/services/dto/publish-form.dto.ts | 14 + apps/api/src/services/dto/publishForm.dto.ts | 14 + .../dto/register-event.dto.ts | 8 +- apps/api/src/services/dto/remove-user.dto.ts | 16 + apps/api/src/services/dto/update-event.dto.ts | 50 + apps/api/src/services/dto/update-org.dto.ts | 19 + apps/api/src/services/dto/update-role.dto.ts | 19 + apps/api/src/services/dto/update-user.dto.ts | 21 + apps/api/src/services/dto/user-invite.dto.ts | 21 + apps/api/src/services/events.service.ts | 723 + apps/api/src/services/form.service.ts | 208 + .../src/services/guards/rbac-member.guard.ts | 55 + .../.gitkeep => services/inti.service.ts} | 0 apps/api/src/services/kanban.service.ts | 149 + apps/api/src/services/mail/mail.service.ts | 71 + .../services/mail/templates/org-invite.tsx | 86 + .../mail/templates/payment-succesfull.tsx | 68 + .../src/services/mail/templates/welcome.tsx | 68 + apps/api/src/services/org-invite.service.ts | 155 + apps/api/src/services/org-member.service.ts | 110 + apps/api/src/services/organization.service.ts | 262 + .../{prisma => services}/prisma.service.ts | 8 +- apps/api/src/services/stripe.service.ts | 184 + apps/api/src/services/user.service.ts | 180 + apps/api/src/stripe/stripe.controller.ts | 13 - apps/api/src/stripe/stripe.module.ts | 13 - apps/api/src/stripe/stripe.service.ts | 181 - apps/api/src/types/knex.d.ts | 125 + apps/api/src/user/dto/update-user.dto.ts | 21 - apps/api/src/user/user.controller.ts | 39 - apps/api/src/user/user.module.ts | 12 - apps/api/src/user/user.service.ts | 174 - apps/api/src/utils/db.ts | 71 + apps/api/src/utils/exclude.ts | 8 +- apps/api/tsconfig.json | 47 +- apps/web/.eslintrc | 4 +- apps/web/next-env.d.ts | 5 - fossfolio.code-workspace | 25 - package.json | 39 +- packages/eslint-config-custom/index.js | 7 - packages/eslint-config-custom/package.json | 19 - pnpm-lock.yaml | 12656 +++++++--------- 187 files changed, 11370 insertions(+), 11405 deletions(-) delete mode 100644 .eslintrc delete mode 100644 .prettierrc delete mode 100644 apps/api/.gitignore create mode 100644 apps/api/biome.json create mode 100644 apps/api/src/BaseContext.ts delete mode 100644 apps/api/src/ai/ai.controller.ts delete mode 100644 apps/api/src/ai/ai.module.ts delete mode 100644 apps/api/src/ai/ai.service.ts delete mode 100644 apps/api/src/ai/dto/ai.dto.ts delete mode 100644 apps/api/src/app.controller.ts delete mode 100644 apps/api/src/auth/auth.controller.ts delete mode 100644 apps/api/src/auth/auth.module.ts delete mode 100644 apps/api/src/auth/auth.service.ts delete mode 100644 apps/api/src/auth/cookieHandler.ts delete mode 100644 apps/api/src/auth/decorators/role.decorator.ts delete mode 100644 apps/api/src/auth/decorators/user.decorator.ts delete mode 100644 apps/api/src/auth/guards/github-oauth.guard.ts delete mode 100644 apps/api/src/auth/guards/google-oauth.guard.ts delete mode 100644 apps/api/src/auth/guards/saml-oauth.guard.ts delete mode 100644 apps/api/src/auth/strategy/github.strategy.ts delete mode 100644 apps/api/src/auth/strategy/google.strategy.ts delete mode 100644 apps/api/src/auth/strategy/jwt.strategy.ts delete mode 100644 apps/api/src/auth/strategy/refresh.strategy.ts delete mode 100644 apps/api/src/auth/strategy/saml.strategy.ts delete mode 100644 apps/api/src/cloud/cloud.module.ts delete mode 100644 apps/api/src/cloud/cloud.service.ts create mode 100644 apps/api/src/controllers/ai.controller.ts create mode 100644 apps/api/src/controllers/auth.controller.ts create mode 100644 apps/api/src/controllers/events.controller.ts create mode 100644 apps/api/src/controllers/form.controller.ts create mode 100644 apps/api/src/controllers/kanban.controller.ts create mode 100644 apps/api/src/controllers/org-invite.controller.ts create mode 100644 apps/api/src/controllers/org-member.controller.ts create mode 100644 apps/api/src/controllers/organization.controller.ts create mode 100644 apps/api/src/controllers/stripe.controller.ts create mode 100644 apps/api/src/controllers/user.controller.ts create mode 100644 apps/api/src/db/migrations/01.user.ts create mode 100644 apps/api/src/db/migrations/02.account.ts create mode 100644 apps/api/src/db/migrations/03.organization.ts create mode 100644 apps/api/src/db/migrations/04.organization-member.ts create mode 100644 apps/api/src/db/migrations/05.organization-invite.ts create mode 100644 apps/api/src/db/migrations/06.events.ts create mode 100644 apps/api/src/db/migrations/07.event-ticket.ts create mode 100644 apps/api/src/db/migrations/08.form-field.ts create mode 100644 apps/api/src/db/migrations/09.form.ts create mode 100644 apps/api/src/db/migrations/10.form-field-options.ts create mode 100644 apps/api/src/db/migrations/11.form-response.ts create mode 100644 apps/api/src/db/migrations/12.ticket.ts create mode 100644 apps/api/src/db/migrations/13.kanban.ts create mode 100644 apps/api/src/db/migrations/14.kanban-card.ts create mode 100644 apps/api/src/db/migrations/15.comment.ts create mode 100644 apps/api/src/db/schema/account.ts create mode 100644 apps/api/src/db/schema/comment.ts create mode 100644 apps/api/src/db/schema/event-ticket.ts create mode 100644 apps/api/src/db/schema/events.ts create mode 100644 apps/api/src/db/schema/form-field-options.ts create mode 100644 apps/api/src/db/schema/form-fields.ts create mode 100644 apps/api/src/db/schema/form-response.ts create mode 100644 apps/api/src/db/schema/form.ts create mode 100644 apps/api/src/db/schema/index.ts create mode 100644 apps/api/src/db/schema/kanban-card.ts create mode 100644 apps/api/src/db/schema/kanban.ts create mode 100644 apps/api/src/db/schema/organization-invite.ts create mode 100644 apps/api/src/db/schema/organization-member.ts create mode 100644 apps/api/src/db/schema/organization.ts create mode 100644 apps/api/src/db/schema/tickets.ts create mode 100644 apps/api/src/db/schema/user.ts delete mode 100644 apps/api/src/events/dto/cover-dto.ts delete mode 100644 apps/api/src/events/dto/create-events.dto.ts delete mode 100644 apps/api/src/events/dto/publishForm.dto.ts delete mode 100644 apps/api/src/events/dto/remove-user.dto.ts delete mode 100644 apps/api/src/events/dto/update-event.dto.ts delete mode 100644 apps/api/src/events/events.controller.ts delete mode 100644 apps/api/src/events/events.module.ts delete mode 100644 apps/api/src/events/events.service.ts delete mode 100644 apps/api/src/events/upload.middleware.ts delete mode 100644 apps/api/src/form/dto/create-form.dto.ts delete mode 100644 apps/api/src/form/dto/publish-form.dto.ts delete mode 100644 apps/api/src/form/form.controller.ts delete mode 100644 apps/api/src/form/form.module.ts delete mode 100644 apps/api/src/form/form.service.ts delete mode 100644 apps/api/src/kanban/dto/create-task.dto.ts delete mode 100644 apps/api/src/kanban/kanban.controller.ts delete mode 100644 apps/api/src/kanban/kanban.module.ts delete mode 100644 apps/api/src/kanban/kanban.service.ts delete mode 100644 apps/api/src/mail/mail.module.ts delete mode 100644 apps/api/src/mail/mail.service.ts delete mode 100644 apps/api/src/mail/templates/org-invite.tsx delete mode 100644 apps/api/src/mail/templates/payment-succesfull.tsx delete mode 100644 apps/api/src/mail/templates/welcome.tsx create mode 100644 apps/api/src/middleware/upload.middleware.ts create mode 100644 apps/api/src/models/BaseModel.ts create mode 100644 apps/api/src/models/User.ts create mode 100644 apps/api/src/modules/root.module.ts delete mode 100644 apps/api/src/org-invite/dto/user-invite.dto.ts delete mode 100644 apps/api/src/org-invite/org-invite.controller.ts delete mode 100644 apps/api/src/org-invite/org-invite.module.ts delete mode 100644 apps/api/src/org-invite/org-invite.service.ts delete mode 100644 apps/api/src/org-member/dto/member-remove.dto.ts delete mode 100644 apps/api/src/org-member/dto/update-role.dto.ts delete mode 100644 apps/api/src/org-member/org-member.controller.ts delete mode 100644 apps/api/src/org-member/org-member.module.ts delete mode 100644 apps/api/src/org-member/org-member.service.ts delete mode 100644 apps/api/src/organization/dto/create-org.dto.ts delete mode 100644 apps/api/src/organization/dto/update-org.dto.ts delete mode 100644 apps/api/src/organization/guards/rbac-member.guard.ts delete mode 100644 apps/api/src/organization/organization.controller.ts delete mode 100644 apps/api/src/organization/organization.module.ts delete mode 100644 apps/api/src/organization/organization.service.ts delete mode 100644 apps/api/src/prisma/prisma.module.ts create mode 100644 apps/api/src/services/ai.service.ts create mode 100644 apps/api/src/services/auth/auth.service.ts create mode 100644 apps/api/src/services/auth/cookieHandler.ts create mode 100644 apps/api/src/services/auth/decorators/role.decorator.ts create mode 100644 apps/api/src/services/auth/decorators/user.decorator.ts create mode 100644 apps/api/src/services/auth/guards/github-oauth.guard.ts create mode 100644 apps/api/src/services/auth/guards/google-oauth.guard.ts rename apps/api/src/{ => services}/auth/guards/refresh.guard.ts (100%) create mode 100644 apps/api/src/services/auth/guards/saml-oauth.guard.ts create mode 100644 apps/api/src/services/auth/strategy/github.strategy.ts create mode 100644 apps/api/src/services/auth/strategy/google.strategy.ts create mode 100644 apps/api/src/services/auth/strategy/jwt.strategy.ts create mode 100644 apps/api/src/services/auth/strategy/refresh.strategy.ts create mode 100644 apps/api/src/services/auth/strategy/saml.strategy.ts create mode 100644 apps/api/src/services/cloud.service.ts rename apps/api/src/{organization/decorators => services/decorator}/roles.decorator.ts (100%) create mode 100644 apps/api/src/services/dto/ai.dto.ts create mode 100644 apps/api/src/services/dto/cover-dto.ts create mode 100644 apps/api/src/services/dto/create-events.dto.ts create mode 100644 apps/api/src/services/dto/create-form.dto.ts create mode 100644 apps/api/src/services/dto/create-org.dto.ts create mode 100644 apps/api/src/services/dto/create-task.dto.ts rename apps/api/src/{events => services}/dto/delete-event.dto.ts (66%) rename apps/api/src/{organization => services}/dto/delete-org.dto.ts (62%) rename apps/api/src/{organization => services}/dto/generic-org.dto.ts (62%) rename apps/api/src/{events => services}/dto/get-events.dto.ts (55%) rename apps/api/src/{organization => services}/dto/leave-org.dto.ts (61%) create mode 100644 apps/api/src/services/dto/member-remove.dto.ts create mode 100644 apps/api/src/services/dto/publish-form.dto.ts create mode 100644 apps/api/src/services/dto/publishForm.dto.ts rename apps/api/src/{events => services}/dto/register-event.dto.ts (65%) create mode 100644 apps/api/src/services/dto/remove-user.dto.ts create mode 100644 apps/api/src/services/dto/update-event.dto.ts create mode 100644 apps/api/src/services/dto/update-org.dto.ts create mode 100644 apps/api/src/services/dto/update-role.dto.ts create mode 100644 apps/api/src/services/dto/update-user.dto.ts create mode 100644 apps/api/src/services/dto/user-invite.dto.ts create mode 100644 apps/api/src/services/events.service.ts create mode 100644 apps/api/src/services/form.service.ts create mode 100644 apps/api/src/services/guards/rbac-member.guard.ts rename apps/api/src/{emitters/.gitkeep => services/inti.service.ts} (100%) create mode 100644 apps/api/src/services/kanban.service.ts create mode 100644 apps/api/src/services/mail/mail.service.ts create mode 100644 apps/api/src/services/mail/templates/org-invite.tsx create mode 100644 apps/api/src/services/mail/templates/payment-succesfull.tsx create mode 100644 apps/api/src/services/mail/templates/welcome.tsx create mode 100644 apps/api/src/services/org-invite.service.ts create mode 100644 apps/api/src/services/org-member.service.ts create mode 100644 apps/api/src/services/organization.service.ts rename apps/api/src/{prisma => services}/prisma.service.ts (52%) create mode 100644 apps/api/src/services/stripe.service.ts create mode 100644 apps/api/src/services/user.service.ts delete mode 100644 apps/api/src/stripe/stripe.controller.ts delete mode 100644 apps/api/src/stripe/stripe.module.ts delete mode 100644 apps/api/src/stripe/stripe.service.ts create mode 100644 apps/api/src/types/knex.d.ts delete mode 100644 apps/api/src/user/dto/update-user.dto.ts delete mode 100644 apps/api/src/user/user.controller.ts delete mode 100644 apps/api/src/user/user.module.ts delete mode 100644 apps/api/src/user/user.service.ts create mode 100644 apps/api/src/utils/db.ts delete mode 100644 apps/web/next-env.d.ts delete mode 100644 fossfolio.code-workspace delete mode 100644 packages/eslint-config-custom/index.js delete mode 100644 packages/eslint-config-custom/package.json diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 9b150ca8..00000000 --- a/.eslintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "root": true, - "extends": ["custom"] -} diff --git a/.gitignore b/.gitignore index c5a0f141..4acb27a0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ tmp .pnp.js /dist +apps/api/dist + # testing /coverage diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 87589551..00000000 --- a/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "singleQuote": true, - "printWidth": 100, - "semi": true, - "tabWidth": 4, - "endOfLine": "lf", - "trailingComma": "all" -} diff --git a/LICENSE b/LICENSE index e9f2f007..e146884b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Anbarasu +Copyright (c) 2024 FossLabs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/apps/api/.gitignore b/apps/api/.gitignore deleted file mode 100644 index 379d26d5..00000000 --- a/apps/api/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -# Keep environment variables out of version control -.env -dist \ No newline at end of file diff --git a/apps/api/biome.json b/apps/api/biome.json new file mode 100644 index 00000000..1eba83dc --- /dev/null +++ b/apps/api/biome.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.0/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "security": { + "recommended": true + }, + "complexity": { + "noThisInStatic": "off" + }, + "performance": { + "recommended": true + }, + "style": { + "useImportType": "off" + } + } + }, + "javascript": { + "parser": { + "unsafeParameterDecoratorsEnabled": true + }, + "formatter": { + "enabled": true, + "semicolons": "always", + "quoteStyle": "single" + } + }, + "json": { + "formatter": { + "trailingCommas": "none" + } + } +} \ No newline at end of file diff --git a/apps/api/nest-cli.json b/apps/api/nest-cli.json index e2f17dcf..e713b436 100644 --- a/apps/api/nest-cli.json +++ b/apps/api/nest-cli.json @@ -1,17 +1,25 @@ { - "$schema": "https://json.schemastore.org/nest-cli", - "collection": "@nestjs/schematics", - "sourceRoot": "src", - "compilerOptions": { - "builder": { - "type": "swc", - "options": { - "extensions": [".jsx", ".tsx", ".js", ".ts"] - } - }, - "typeCheck": true, - "deleteOutDir": true, - "assets": ["mail/templates/**/*"], - "watchAssets": true - } + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "builder": { + "type": "swc", + "options": { + "extensions": [".jsx", ".tsx", ".js", ".ts"] + } + }, + "jsc": { + "parser": { + "syntax": "typescript", + "decorators": true, + "tsx": true, + "dynamicImport": true + } + }, + "typeCheck": true, + "deleteOutDir": true, + "assets": ["mail/templates/**/*"], + "watchAssets": true + } } diff --git a/apps/api/package.json b/apps/api/package.json index 7d2511ff..67556865 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,84 +1,81 @@ { - "name": "api", - "version": "1.0.0", - "license": "UNLICENSED", - "private": true, - "scripts": { - "prebuild": "rimraf dist", - "build": "npx prisma generate && nest build", - "start": "nest start", - "nest:dev": "nest start --watch --debug | pino-pretty", - "start:prod": "node dist/main", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "format": "prettier --write \"{src,apps,libs,test}/**/*.ts\"", - "db:generate": "prisma generate", - "db:migrate-deploy": "prisma migrate deploy --schema ./prisma/schema.prisma", - "db:studio": "prisma studio", - "db:migrate": "prisma migrate dev", - "dev": "concurrently \"pnpm --filter api nest:dev\" \"pnpm --filter api db:studio\"", - "email": "email dev", - "db:seed": "ts-node prisma/seed.ts" - }, - "dependencies": { - "@aws-sdk/client-s3": "^3.521.0", - "@nestjs-modules/mailer": "^1.11.0", - "@nestjs/common": "^10.3.3", - "@nestjs/config": "^3.2.0", - "@nestjs/core": "^10.3.3", - "@nestjs/event-emitter": "^2.0.4", - "@nestjs/jwt": "^10.2.0", - "@nestjs/passport": "^10.0.3", - "@nestjs/platform-express": "^10.3.3", - "@nestjs/schematics": "^10.1.1", - "@nestjs/swagger": "^7.3.0", - "@nestjs/throttler": "^5.1.2", - "@node-saml/passport-saml": "^5.0.0", - "@prisma/client": "^5.10.2", - "@webtre/nestjs-mailer-react-adapter": "^0.1.2", - "argon2": "^0.40.1", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.1", - "cookie-parser": "^1.4.6", - "express": "^4.19.2", - "express-session": "^1.18.0", - "joi": "^17.12.2", - "nestjs-pino": "^4.0.0", - "nodemailer": "^6.9.10", - "openai": "^4.33.0", - "passport": "^0.7.0", - "passport-github2": "^0.1.12", - "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.1", - "pino-http": "^9.0.0", - "pino-pretty": "^10.3.1", - "prisma-dbml-generator": "^0.12.0", - "reflect-metadata": "^0.2.1", - "rimraf": "^5.0.5", - "rxjs": "^7.8.1", - "stripe": "^14.18.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.5" - }, - "devDependencies": { - "@faker-js/faker": "^8.4.1", - "@nestjs/cli": "^10.3.2", - "@react-email/components": "^0.0.15", - "@swc/cli": "^0.3.9", - "@swc/core": "^1.4.2", - "@types/cookie-parser": "^1.4.6", - "@types/express": "^4.17.21", - "@types/multer": "^1.4.11", - "@types/node": "^20.11.20", - "@types/nodemailer": "^6.4.14", - "@types/passport": "^1.0.16", - "@types/passport-github2": "^1.2.9", - "@types/passport-google-oauth20": "^2.0.14", - "@types/passport-jwt": "^4.0.1", - "@types/react": "^18.2.58", - "concurrently": "^8.2.2", - "prisma": "^5.10.2", - "react": "^18.2.0", - "ts-node": "^10.9.2", - "typescript": "^5.3.3" - } + "name": "api", + "version": "1.0.0", + "license": "UNLICENSED", + "private": true, + "type": "commonjs", + "scripts": { + "prebuild": "rimraf dist", + "build": "npx prisma generate && nest build", + "start": "nest start", + "dev": "node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty", + "start:prod": "node dist/main", + "db:seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.521.0", + "@nestjs-modules/mailer": "^1.11.0", + "@nestjs/common": "^10.3.3", + "@nestjs/config": "^3.2.0", + "@nestjs/core": "^10.3.3", + "@nestjs/event-emitter": "^2.0.4", + "@nestjs/jwt": "^10.2.0", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-express": "^10.3.3", + "@nestjs/schematics": "^10.1.1", + "@nestjs/swagger": "^7.3.0", + "@nestjs/throttler": "^5.1.2", + "@node-saml/passport-saml": "^5.0.0", + "@prisma/client": "^5.10.2", + "@webtre/nestjs-mailer-react-adapter": "^0.1.2", + "argon2": "^0.40.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "cookie-parser": "^1.4.6", + "express": "^4.19.2", + "express-session": "^1.18.0", + "joi": "^17.12.2", + "knex": "^3.1.0", + "nanoid": "^3.3.4", + "nestjs-pino": "^4.0.0", + "nodemailer": "^6.9.10", + "openai": "^4.33.0", + "passport": "^0.7.0", + "passport-github2": "^0.1.12", + "passport-google-oauth20": "^2.0.0", + "passport-jwt": "^4.0.1", + "pg": "^8.11.5", + "pino-http": "^9.0.0", + "pino-pretty": "^10.3.1", + "prisma-dbml-generator": "^0.12.0", + "reflect-metadata": "^0.2.1", + "rimraf": "^5.0.5", + "rxjs": "^7.8.1", + "stripe": "^14.18.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.5" + }, + "devDependencies": { + "@biomejs/biome": "^1.7.3", + "@faker-js/faker": "^8.4.1", + "@nestjs/cli": "^10.3.2", + "@react-email/components": "^0.0.15", + "@swc-node/register": "^1.9.1", + "@swc/cli": "^0.3.9", + "@swc/core": "^1.4.2", + "@types/cookie-parser": "^1.4.6", + "@types/express": "^4.17.21", + "@types/multer": "^1.4.11", + "@types/node": "^20.11.20", + "@types/nodemailer": "^6.4.14", + "@types/passport": "^1.0.16", + "@types/passport-github2": "^1.2.9", + "@types/passport-google-oauth20": "^2.0.14", + "@types/passport-jwt": "^4.0.1", + "@types/react": "^18.2.58", + "prisma": "^5.10.2", + "react": "^18.3.1", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" + } } diff --git a/apps/api/src/BaseContext.ts b/apps/api/src/BaseContext.ts new file mode 100644 index 00000000..bb8dc513 --- /dev/null +++ b/apps/api/src/BaseContext.ts @@ -0,0 +1,35 @@ +import type { Knex } from 'knex'; +import knex from 'knex'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export default class BaseContext { + public static knex: Knex; + private static readonly logger = new Logger(BaseContext.name); + + public static async init() { + BaseContext.knex = knex({ + client: 'pg', + connection: { + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + }, + migrations: { + tableName: SystemTable.FF_Migrations, + directory: 'src/db/migrations', + }, + }); + + BaseContext.logger.log('Starting Migration process...'); + + await BaseContext.knex.migrate.latest(); + + BaseContext.logger.log('Migration process completed.'); + } + + public async destroy() { + await BaseContext.knex.destroy(); + } +} diff --git a/apps/api/src/ai/ai.controller.ts b/apps/api/src/ai/ai.controller.ts deleted file mode 100644 index 136340a3..00000000 --- a/apps/api/src/ai/ai.controller.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Controller, Post, Body } from '@nestjs/common'; -import { AiService } from './ai.service'; -import { AIFormDto } from './dto/ai.dto'; -import { ApiTags } from '@nestjs/swagger'; - -@Controller('ai') -export class AiController { - constructor(private readonly aiService: AiService) {} - @Post('form') - @ApiTags('ai') - - async generateForm(@Body() aiFormDto: AIFormDto) { - return this.aiService.gptComplete(aiFormDto.prompt, aiFormDto.messages); - } -} diff --git a/apps/api/src/ai/ai.module.ts b/apps/api/src/ai/ai.module.ts deleted file mode 100644 index 0b3cebac..00000000 --- a/apps/api/src/ai/ai.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AiController } from './ai.controller'; -import { AiService } from './ai.service'; - -@Module({ - controllers: [AiController], - providers: [AiService], - exports: [AiService], -}) -export class AiModule {} diff --git a/apps/api/src/ai/ai.service.ts b/apps/api/src/ai/ai.service.ts deleted file mode 100644 index c9767b19..00000000 --- a/apps/api/src/ai/ai.service.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import OpenAI from 'openai'; -import { z } from 'zod'; -import zodToJsonSchema from 'zod-to-json-schema'; -import { ChatCompletionMessageParam } from 'openai/resources/chat/completions'; - -type Message = { - text: string; - ai?: boolean; -}; - -const FormArraySchema = z.object({ - title: z.string().describe('Title of the form'), - description: z.string().optional().describe('Description of the form'), - fields: z.array( - z.object({ - label: z.string().describe('Label of the input'), - placeholder: z.string().optional().describe('Placeholder of the input'), - required: z.boolean().describe('Whether the input is required or not'), - type: z - .enum([ - 'SingleLineText', - 'LongText', - 'SingleSelect', - 'MultiSelect', - 'Checkbox', - 'Number', - 'Email', - 'URL', - 'PhoneNumber', - 'Attachment', - ]) - .describe('Type of the input'), - selectOptions: z - .array( - z - .object({ - option: z.string().describe('Option for the select input'), - }) - .describe('Options for the select input'), - ) - .optional() - .describe('Options for the select input'), - }), - ), -}); - -const jsonSchema = zodToJsonSchema(FormArraySchema, 'mySchema'); - -@Injectable() -export class AiService { - private openAI: OpenAI; - - constructor(private readonly configService: ConfigService) { - this.openAI = new OpenAI({ - apiKey: this.configService.get('AI_KEY'), - baseURL: 'https://api.together.xyz/v1', - }); - } - - async gptComplete(prompt: string, messages: Message[]): Promise { - const history = messages.map( - (message): ChatCompletionMessageParam => ({ - role: message.ai ? 'system' : 'user', - content: message.text, - }), - ); - - history.push({ - role: 'user', - content: prompt, - } as ChatCompletionMessageParam); - - const chat = await this.openAI.chat.completions.create({ - stream: false, - model: 'mistralai/Mistral-7B-Instruct-v0.1', - messages: history, - max_tokens: 5000, - temperature: 0.7, - frequency_penalty: 0.5, - // @ts-ignore – Together.ai supports schema while OpenAI does not - response_format: { type: 'json_object', schema: jsonSchema }, - }); - - const jsonExtract = chat.choices[0].message.content!.match( - /[{\[]{1}([,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis, - ); - - if (!jsonExtract) { - console.log('No JSON found in the response'); - console.log('Retrying!!!!'); - return await this.gptComplete(prompt, messages); - } - - return JSON.parse(jsonExtract[0]); - } - - async generateEmbedding(text: string) { - try { - const res = await this.openAI.embeddings.create({ - model: 'togethercomputer/m2-bert-80M-2k-retrieval', - input: text, - }); - - return res.data[0].embedding; - } catch (error) { - console.error(error); - return ''; - } - } -} diff --git a/apps/api/src/ai/dto/ai.dto.ts b/apps/api/src/ai/dto/ai.dto.ts deleted file mode 100644 index 11015db1..00000000 --- a/apps/api/src/ai/dto/ai.dto.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class AIFormDto { - @ApiProperty() - prompt: string; - - @ApiProperty() - messages: Array<{ - text: string; - ai: boolean; - }> -} diff --git a/apps/api/src/app.controller.ts b/apps/api/src/app.controller.ts deleted file mode 100644 index 2c7cb6e4..00000000 --- a/apps/api/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; - -@Controller('/') -export class AppController { - @Get() - getTest() { - return { - ok: true, - message: 'Server running successfully', - }; - } -} diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index 2490d36b..66f58ca4 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -1,91 +1,7 @@ -import * as Joi from 'joi'; import { Module } from '@nestjs/common'; -import { APP_GUARD } from '@nestjs/core'; -import { LoggerModule } from 'nestjs-pino'; -import { ConfigModule } from '@nestjs/config'; -import { EventEmitterModule } from '@nestjs/event-emitter'; -import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; -import { AuthModule } from './auth/auth.module'; -import { UserModule } from './user/user.module'; -import { MailModule } from './mail/mail.module'; -import { CloudModule } from './cloud/cloud.module'; -import { PrismaModule } from './prisma/prisma.module'; -import { EventsModule } from './events/events.module'; -import { StripeModule } from './stripe/stripe.module'; -import { OrganizationModule } from './organization/organization.module'; -import { OrganizationMemberModule } from './org-member/org-member.module'; -import { OrganizationInviteModule } from './org-invite/org-invite.module'; -import { AppController } from './app.controller'; -import { KanbanModule } from './kanban/kanban.module'; -import { FormModule } from './form/form.module'; -import { AiModule } from './ai/ai.module'; +import { RootModule } from './modules/root.module'; @Module({ - imports: [ - EventEmitterModule.forRoot(), - ThrottlerModule.forRoot([ - { - ttl: 60000, - limit: 50, - }, - ]), - ConfigModule.forRoot({ - isGlobal: true, - validationSchema: Joi.object({ - DATABASE_URL: Joi.string(), - GITHUB_CLIENT_ID: Joi.string(), - GITHUB_CLIENT_SECRET: Joi.string(), - GITHUB_CALLBACK_URL: Joi.string(), - GITHUB_SCOPE: Joi.string(), - ACCESS_TOKEN_VALIDITY: Joi.string(), - API_BASE_URL: Joi.string(), - GOOGLE_CLIENT_ID: Joi.string(), - GOOGLE_CLIENT_SECRET: Joi.string(), - GOOGLE_CALLBACK_URL: Joi.string(), - GOOGLE_SCOPE: Joi.string(), - WEB_URL: Joi.string(), - MAIL_HOST: Joi.string(), - MAIL_PORT: Joi.number(), - MAIL_USER: Joi.string(), - MAIL_PASSWORD: Joi.string(), - AWS_ACCESS_KEY: Joi.string(), - AWS_SECRET_KEY: Joi.string(), - AWS_REGION: Joi.string(), - STRIPE_SECRET_KEY: Joi.string(), - STRIPE_WEBHOOK_SECRET: Joi.string(), - AI_KEY: Joi.string(), - }), - validationOptions: { - allowUnknown: true, - abortEarly: true, - }, - }), - LoggerModule.forRoot({ - pinoHttp: { - level: 'info', - redact: ['req.headers', 'req.remoteAddress', 'res.headers'], - }, - }), - AuthModule, - PrismaModule, - UserModule, - OrganizationModule, - OrganizationMemberModule, - OrganizationInviteModule, - EventsModule, - MailModule, - CloudModule, - StripeModule, - KanbanModule, - AiModule, - FormModule, - ], - controllers: [AppController], - providers: [ - { - provide: APP_GUARD, - useClass: ThrottlerGuard, - }, - ], + imports: [RootModule], }) export class AppModule {} diff --git a/apps/api/src/auth/auth.controller.ts b/apps/api/src/auth/auth.controller.ts deleted file mode 100644 index 7e6ffea2..00000000 --- a/apps/api/src/auth/auth.controller.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Controller, Get, Request, Response, UseGuards } from '@nestjs/common'; -import { GithubAuthGuard } from './guards/github-oauth.guard'; -import { AuthService } from './auth.service'; -import { cookieHandler } from './cookieHandler'; -import { RefreshGuard } from './guards/refresh.guard'; -import { GoogleAuthGuard } from './guards/google-oauth.guard'; -import { SamlAuthGuard } from './guards/saml-oauth.guard'; - -@Controller('auth') -export class AuthController { - constructor(private readonly authService: AuthService) {} - - // Route to Initiate GitHub OAuth - @Get('/github') - @UseGuards(GithubAuthGuard) - async githubOAuth() {} - - // Route to Handle GitHub OAuth Callback - @Get('/github/callback') - @UseGuards(GithubAuthGuard) - async githubOAuthCallback(@Request() req, @Response() res) { - const authToken = await this.authService.generateAuthToken(req.user.uid); - cookieHandler(res, authToken, true); - } - - @Get('/google') - @UseGuards(GoogleAuthGuard) - async googleOAuth() {} - - @Get('/google/callback') - @UseGuards(GoogleAuthGuard) - async googleOAuthCallback(@Request() req, @Response() res) { - const authToken = await this.authService.generateAuthToken(req.user.uid); - cookieHandler(res, authToken, true); - } - - @Get('/saml') - @UseGuards(SamlAuthGuard) - async samlOAuth() {} - - @Get('/saml//callback') - @UseGuards(SamlAuthGuard) - async samlOAuthCallback(@Request() req, @Response() res) { - const genToken = await this.authService.refreshAuthToken( - req.user, - req.cookies['refresh_token'], - ); - cookieHandler(res, genToken, false); - } - - @Get('/refresh') - @UseGuards(RefreshGuard) - async refresh(@Request() req, @Response() res) { - const genToken = await this.authService.refreshAuthToken( - req.user, - req.cookies['refresh_token'], - ); - - cookieHandler(res, genToken, false); - } - - @Get('/logout') - async logout(@Response() res) { - res.clearCookie('access_token'); - res.clearCookie('refresh_token'); - - res.redirect(process.env.CLIENT_REDIRECT_URI); - } -} diff --git a/apps/api/src/auth/auth.module.ts b/apps/api/src/auth/auth.module.ts deleted file mode 100644 index 22f2321a..00000000 --- a/apps/api/src/auth/auth.module.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AuthController } from './auth.controller'; -import { AuthService } from './auth.service'; -import { GithubStrategy } from './strategy/github.strategy'; -import { UserModule } from '../user/user.module'; -import { PrismaModule } from '../prisma/prisma.module'; -import { PassportModule } from '@nestjs/passport'; -import { UserService } from '../user/user.service'; -import { JwtModule } from '@nestjs/jwt'; -import { JwtStrategy } from './strategy/jwt.strategy'; -import { RefreshStrategy } from './strategy/refresh.strategy'; -import { GoogleStrategy } from './strategy/google.strategy'; -import { SamlStrategy } from './strategy/saml.strategy'; - -@Module({ - imports: [ - UserModule, - PrismaModule, - PassportModule, - JwtModule.register({ - secret: process.env.JWT_SECRET, - signOptions: { expiresIn: process.env.ACCESS_TOKEN_VALIDITY }, - }), - ], - controllers: [AuthController], - providers: [ - AuthService, - GithubStrategy, - GoogleStrategy, - SamlStrategy, - UserService, - JwtStrategy, - RefreshStrategy, - ], -}) -export class AuthModule {} diff --git a/apps/api/src/auth/auth.service.ts b/apps/api/src/auth/auth.service.ts deleted file mode 100644 index ddc627cc..00000000 --- a/apps/api/src/auth/auth.service.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { JwtService } from '@nestjs/jwt'; -import { User } from '@prisma/client'; -import { hash, verify } from 'argon2'; -import { Profile } from 'passport'; -import { PrismaService } from '../prisma/prisma.service'; -import { UserService } from '../user/user.service'; - -@Injectable() -export class AuthService { - constructor( - private readonly prismaService: PrismaService, - private readonly jwtService: JwtService, - private readonly userService: UserService, - private readonly configService: ConfigService, - ) {} - - async checkIfProviderAccountExists(OAuthUserData: Profile) { - const provider = await this.prismaService.account.findUnique({ - where: { - verify_provider_account: { - provider: OAuthUserData.provider, - providerAccountId: OAuthUserData.id, - }, - }, - }); - - if (!provider) return null; - - return provider; - } - - async createProviderAccount( - user: User, - profile: Profile, - accessToken: string, - refreshToken: string, - ) { - try { - const createdProviderAccount = await this.prismaService.account.create({ - data: { - provider: profile.provider, - providerAccountId: profile.id, - providerAccessToken: accessToken, - providerRefreshToken: refreshToken, - user: { - connect: { - uid: user.uid, - }, - }, - }, - }); - - return createdProviderAccount; - } catch (error) { - return null; - } - } - - async generateAuthToken(uid: string) { - const payload = { - iss: this.configService.get('API_BASE_URL'), - sub: uid, - iat: new Date().getTime(), - }; - - const accessToken = await this.jwtService.signAsync(payload); - const refreshToken = await this.generateRefreshToken(uid); - - return { - accessToken, - refreshToken, - }; - } - - async generateRefreshToken(uid: string) { - const payload = { - sub: uid, - iss: this.configService.get('API_BASE_URL'), - iat: new Date().getTime(), - }; - const refreshToken = await this.jwtService.signAsync(payload); - - const hashedRefreshToken = await hash(refreshToken); - - const updatedUser = await this.userService.updateRefreshToken(uid, hashedRefreshToken); - - if (!updatedUser) throw new Error('REFRESH_TOKEN_NOT_UPDATED'); - - return refreshToken; - } - - async refreshAuthToken(user: User, hashedToken: string) { - if (!user) throw new Error('USER_NOT_FOUND'); - - const isRefreshTokenValid = await verify(user.refreshToken, hashedToken); - - if (!isRefreshTokenValid) throw new Error('AFTER_GENERATION_INVALID_REFRESH_TOKEN'); - - return await this.generateAuthToken(user.uid); - } -} diff --git a/apps/api/src/auth/cookieHandler.ts b/apps/api/src/auth/cookieHandler.ts deleted file mode 100644 index 0b01b127..00000000 --- a/apps/api/src/auth/cookieHandler.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Response } from 'express'; - -export const cookieHandler = ( - res: Response, - authToken: { - accessToken: string; - refreshToken: string; - }, - redirect?: boolean, -) => { - res.cookie('access_token', authToken.accessToken, { - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - maxAge: 1000 * 60 * 60 * 24, // 1 day - }); - res.cookie('refresh_token', authToken.refreshToken, { - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week - }); - - if (!redirect) { - return res.status(200).json({ - message: 'Success', - }); - } - - return res.status(200).redirect(process.env.CLIENT_REDIRECT_URI); -}; diff --git a/apps/api/src/auth/decorators/role.decorator.ts b/apps/api/src/auth/decorators/role.decorator.ts deleted file mode 100644 index 402b7d60..00000000 --- a/apps/api/src/auth/decorators/role.decorator.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { Role } from '@prisma/client'; - -export const UserRole = createParamDecorator((_, ctx: ExecutionContext): Role => { - const request = ctx.switchToHttp().getRequest(); - - return request.role; -}); diff --git a/apps/api/src/auth/decorators/user.decorator.ts b/apps/api/src/auth/decorators/user.decorator.ts deleted file mode 100644 index 197258a1..00000000 --- a/apps/api/src/auth/decorators/user.decorator.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createParamDecorator, ExecutionContext } from '@nestjs/common'; - -export const AuthUser = createParamDecorator((data: unknown, ctx: ExecutionContext) => { - const request = ctx.switchToHttp().getRequest(); - - return request.user; -}); diff --git a/apps/api/src/auth/guards/github-oauth.guard.ts b/apps/api/src/auth/guards/github-oauth.guard.ts deleted file mode 100644 index 519f7936..00000000 --- a/apps/api/src/auth/guards/github-oauth.guard.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ExecutionContext, Injectable } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; - -@Injectable() -export class GithubAuthGuard extends AuthGuard('github') { - getAuthenticateOptions(context: ExecutionContext) { - const req = context.switchToHttp().getRequest(); - return { - state: { - redirect_uri: req.query.redirect_uri, - }, - }; - } -} diff --git a/apps/api/src/auth/guards/google-oauth.guard.ts b/apps/api/src/auth/guards/google-oauth.guard.ts deleted file mode 100644 index e3e873b6..00000000 --- a/apps/api/src/auth/guards/google-oauth.guard.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ExecutionContext, Injectable } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; - -@Injectable() -export class GoogleAuthGuard extends AuthGuard('google') { - getAuthenticateOptions(context: ExecutionContext) { - const req = context.switchToHttp().getRequest(); - return { - state: { - redirect_uri: req.query.redirect_uri, - }, - }; - } -} diff --git a/apps/api/src/auth/guards/saml-oauth.guard.ts b/apps/api/src/auth/guards/saml-oauth.guard.ts deleted file mode 100644 index 2d8a220c..00000000 --- a/apps/api/src/auth/guards/saml-oauth.guard.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ExecutionContext, Injectable } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; - -@Injectable() -export class SamlAuthGuard extends AuthGuard('saml') { - getAuthenticateOptions(context: ExecutionContext) { - const req = context.switchToHttp().getRequest(); - return { - state: { - redirect_uri: req.query.redirect_uri, - }, - }; - } -} diff --git a/apps/api/src/auth/strategy/github.strategy.ts b/apps/api/src/auth/strategy/github.strategy.ts deleted file mode 100644 index 50fc6b8a..00000000 --- a/apps/api/src/auth/strategy/github.strategy.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Profile, Strategy } from 'passport-github2'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable } from '@nestjs/common'; -import { AuthService } from '../auth.service'; -import { UserService } from '../../user/user.service'; -import { ConfigService } from '@nestjs/config'; - -@Injectable() -export class GithubStrategy extends PassportStrategy(Strategy) { - constructor( - private readonly authService: AuthService, - private readonly usersService: UserService, - private readonly configService: ConfigService, - ) { - super({ - clientID: configService.get('GITHUB_CLIENT_ID'), - clientSecret: configService.get('GITHUB_CLIENT_SECRET'), - callbackURL: configService.get('GITHUB_CALLBACK_URL'), - scope: [configService.get('GITHUB_SCOPE')], - store: true, - }); - } - - async validate(accessToken: string, refreshToken: string, profile: Profile, done) { - // Check whether this user exist in the database or not - const user = await this.usersService.findUserByEmail(profile.emails[0].value); - - // If the user doesn't exist in the database, create a new user - if (!user) { - const createdUser = await this.usersService.createOAuthUser( - accessToken, - refreshToken, - profile, - ); - return createdUser; - } - - // If the user already exists, check if the user has a provider account - const providerAccount = await this.authService.checkIfProviderAccountExists(profile); - - // If the user doesn't have a provider account, create a new provider account - if (!providerAccount) { - await this.authService.createProviderAccount(user, profile, accessToken, refreshToken); - } - - return user; - } -} diff --git a/apps/api/src/auth/strategy/google.strategy.ts b/apps/api/src/auth/strategy/google.strategy.ts deleted file mode 100644 index cafe88e3..00000000 --- a/apps/api/src/auth/strategy/google.strategy.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Profile, Strategy } from 'passport-google-oauth20'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable } from '@nestjs/common'; -import { AuthService } from '../auth.service'; -import { UserService } from '../../user/user.service'; -import { ConfigService } from '@nestjs/config'; - -@Injectable() -export class GoogleStrategy extends PassportStrategy(Strategy) { - constructor( - private readonly authService: AuthService, - private readonly usersService: UserService, - private readonly configService: ConfigService, - ) { - super({ - clientID: configService.get('GOOGLE_CLIENT_ID'), - clientSecret: configService.get('GOOGLE_CLIENT_SECRET'), - callbackURL: configService.get('GOOGLE_CALLBACK_URL'), - scope: (configService.get('GOOGLE_SCOPE') as string).split(','), - store: true, - }); - } - - async validate(accessToken: string, refreshToken: string, profile: Profile, done) { - // Check whether this user exist in the database or not - const user = await this.usersService.findUserByEmail(profile.emails[0].value); - - // If the user doesn't exist in the database, create a new user - if (!user) { - const createdUser = await this.usersService.createOAuthUser( - accessToken, - refreshToken, - profile, - ); - return createdUser; - } - - // If the user already exists, check if the user has a provider account - const providerAccount = await this.authService.checkIfProviderAccountExists(profile); - - // If the user doesn't have a provider account, create a new provider account - if (!providerAccount) { - await this.authService.createProviderAccount(user, profile, accessToken, refreshToken); - } - - return user; - } -} diff --git a/apps/api/src/auth/strategy/jwt.strategy.ts b/apps/api/src/auth/strategy/jwt.strategy.ts deleted file mode 100644 index ec542bee..00000000 --- a/apps/api/src/auth/strategy/jwt.strategy.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Injectable, UnauthorizedException } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { PassportStrategy } from '@nestjs/passport'; -import { Request } from 'express'; -import { ExtractJwt, Strategy } from 'passport-jwt'; -import { UserService } from '../../user/user.service'; - -@Injectable() -export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { - constructor( - private readonly configService: ConfigService, - private readonly userService: UserService, - ) { - super({ - ignoreExpiration: false, - secretOrKey: configService.get('JWT_SECRET'), - jwtFromRequest: ExtractJwt.fromExtractors([ - (request: Request) => { - let data = request?.cookies['access_token']; - if (!data) { - throw new UnauthorizedException('ACCESS_TOKEN_NOT_FOUND'); - } - return data; - }, - ]), - }); - } - - async validate(payload: any) { - if (payload === null) { - throw new UnauthorizedException(); - } - const user = await this.userService.findUserById(payload.sub); - - if (!user) { - throw new UnauthorizedException('INVALID_USER'); - } - return user; - } -} diff --git a/apps/api/src/auth/strategy/refresh.strategy.ts b/apps/api/src/auth/strategy/refresh.strategy.ts deleted file mode 100644 index 14d29dc6..00000000 --- a/apps/api/src/auth/strategy/refresh.strategy.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { BadRequestException, Injectable, UnauthorizedException } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { PassportStrategy } from '@nestjs/passport'; -import { Request } from 'express'; -import { ExtractJwt, Strategy } from 'passport-jwt'; -import { UserService } from '../../user/user.service'; - -@Injectable() -export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { - constructor( - private userService: UserService, - private readonly configService: ConfigService, - ) { - super({ - ignoreExpiration: true, - passReqToCallback: true, - secretOrKey: configService.get('JWT_SECRET'), - jwtFromRequest: ExtractJwt.fromExtractors([ - (request: Request) => { - let data = request?.cookies['refresh_token']; - if (!data) { - throw new UnauthorizedException('REFRESH_TOKEN_NOT_FOUND'); - } - return data; - }, - ]), - }); - } - - async validate(req: Request, payload: any) { - if (!payload) { - throw new BadRequestException('PAYLOAD_NOT_FOUND'); - } - let user = await this.userService.findUserById(payload.sub); - - if (!user) { - throw new BadRequestException('INVALID_USER'); - } - - return user; - } -} diff --git a/apps/api/src/auth/strategy/saml.strategy.ts b/apps/api/src/auth/strategy/saml.strategy.ts deleted file mode 100644 index 7b88f802..00000000 --- a/apps/api/src/auth/strategy/saml.strategy.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { MultiSamlStrategy } from '@node-saml/passport-saml'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable } from '@nestjs/common'; -import { AuthService } from '../auth.service'; -import { UserService } from '../../user/user.service'; -import { PrismaService } from '../../prisma/prisma.service'; -import { StrategyOptionsCallback } from '@node-saml/passport-saml/lib/types'; -import e from 'express'; - -@Injectable() -export class SamlStrategy extends PassportStrategy(MultiSamlStrategy, 'saml') { - constructor( - private readonly authService: AuthService, - private readonly prismaService: PrismaService, - private readonly usersService: UserService, - ) { - super({ - passReqToCallback: true, - getSamlOptions: async (req: e.Request, callback: StrategyOptionsCallback) => { - const issuer = req.query.issuer; - if (!issuer || typeof issuer !== 'string') { - return callback(new Error('Issuer not found')); - } - const config = await this.prismaService.samlConfig.findUnique({ - where: { issuer: issuer }, - }); - if (!config) { - return callback(new Error('SAML config not found')); - } - return callback(null, config); - }, - }); - } - - async validate(profile, done) { - // Check whether this user exist in the database or not - console.log(profile); - const user = await this.prismaService.user.findUnique({ - where: { email: typeof profile.email === 'string' ? profile.email : profile.email[0] }, - }); - - // If the user doesn't exist in the database, create a new user - if (!user) { - const createdUser = await this.usersService.createOAuthUser( - profile.nameID, - profile.nameID, - profile, - ); - return createdUser; - } - - // If the user already exists, check if the user has a provider account - const providerAccount = await this.authService.checkIfProviderAccountExists(profile); - - // If the user doesn't have a provider account, create a new provider account - if (!providerAccount) { - await this.authService.createProviderAccount(user, profile, profile.email, profile.email); - } - - return user; - } -} diff --git a/apps/api/src/cloud/cloud.module.ts b/apps/api/src/cloud/cloud.module.ts deleted file mode 100644 index 4239c4f3..00000000 --- a/apps/api/src/cloud/cloud.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common'; -import { S3Service } from './cloud.service'; - -@Module({ - providers: [S3Service], - exports: [S3Service], -}) -export class CloudModule {} diff --git a/apps/api/src/cloud/cloud.service.ts b/apps/api/src/cloud/cloud.service.ts deleted file mode 100644 index 522a0ba9..00000000 --- a/apps/api/src/cloud/cloud.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; - -@Injectable() -export class S3Service { - private readonly s3Client: S3Client; - - constructor() { - this.s3Client = new S3Client({ - region: process.env.AWS_REGION, - credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY, - secretAccessKey: process.env.AWS_SECRET_KEY, - }, - }); - } - - async uploadFile(file: Express.Multer.File): Promise { - try { - const { mimetype, originalname } = file; - const command = new PutObjectCommand({ - Bucket: 'fossfolio', - Key: originalname.split(' ').join('-'), - Body: file.buffer, - ContentType: mimetype, - }); - const data = await this.s3Client.send(command); - - return `https://${command.input.Bucket}.s3.amazonaws.com/${command.input.Key}`; - } catch (error) { - // Handle error gracefully - console.error(error); - return; - } - } -} diff --git a/apps/api/src/controllers/ai.controller.ts b/apps/api/src/controllers/ai.controller.ts new file mode 100644 index 00000000..104d6b66 --- /dev/null +++ b/apps/api/src/controllers/ai.controller.ts @@ -0,0 +1,15 @@ +import { Controller, Post, Body } from '@nestjs/common'; +import { AiService } from '../services/ai.service'; +import { AIFormDto } from '../services/dto/ai.dto'; +import { ApiTags } from '@nestjs/swagger'; + +@Controller('ai') +export class AiController { + constructor(private readonly aiService: AiService) {} + + @Post('form') + @ApiTags('ai') + async generateForm(@Body() aiFormDto: AIFormDto) { + return this.aiService.gptComplete(aiFormDto.prompt, aiFormDto.messages); + } +} diff --git a/apps/api/src/controllers/auth.controller.ts b/apps/api/src/controllers/auth.controller.ts new file mode 100644 index 00000000..fa374ab6 --- /dev/null +++ b/apps/api/src/controllers/auth.controller.ts @@ -0,0 +1,69 @@ +import { Controller, Get, Request, Response, UseGuards } from '@nestjs/common'; +import { GithubAuthGuard } from '../services/auth/guards/github-oauth.guard'; +import { AuthService } from '../services/auth/auth.service'; +import { cookieHandler } from '../services/auth/cookieHandler'; +import { RefreshGuard } from '../services/auth/guards/refresh.guard'; +import { GoogleAuthGuard } from '../services/auth/guards/google-oauth.guard'; +import { SamlAuthGuard } from '../services/auth/guards/saml-oauth.guard'; + +@Controller('auth') +export class AuthController { + constructor(private readonly authService: AuthService) {} + + // Route to Initiate GitHub OAuth + @Get('/github') + @UseGuards(GithubAuthGuard) + async githubOAuth() {} + + // Route to Handle GitHub OAuth Callback + @Get('/github/callback') + @UseGuards(GithubAuthGuard) + async githubOAuthCallback(@Request() req, @Response() res) { + const authToken = await this.authService.generateAuthToken(req.user.uid); + cookieHandler(res, authToken, true); + } + + @Get('/google') + @UseGuards(GoogleAuthGuard) + async googleOAuth() {} + + @Get('/google/callback') + @UseGuards(GoogleAuthGuard) + async googleOAuthCallback(@Request() req, @Response() res) { + const authToken = await this.authService.generateAuthToken(req.user.uid); + cookieHandler(res, authToken, true); + } + + @Get('/saml') + @UseGuards(SamlAuthGuard) + async samlOAuth() {} + + @Get('/saml//callback') + @UseGuards(SamlAuthGuard) + async samlOAuthCallback(@Request() req, @Response() res) { + const genToken = await this.authService.refreshAuthToken( + req.user, + req.cookies.refresh_token, + ); + cookieHandler(res, genToken, false); + } + + @Get('/refresh') + @UseGuards(RefreshGuard) + async refresh(@Request() req, @Response() res) { + const genToken = await this.authService.refreshAuthToken( + req.user, + req.cookies.refresh_token, + ); + + cookieHandler(res, genToken, false); + } + + @Get('/logout') + async logout(@Response() res) { + res.clearCookie('access_token'); + res.clearCookie('refresh_token'); + + res.redirect(process.env.CLIENT_REDIRECT_URI); + } +} diff --git a/apps/api/src/controllers/events.controller.ts b/apps/api/src/controllers/events.controller.ts new file mode 100644 index 00000000..0cb268b2 --- /dev/null +++ b/apps/api/src/controllers/events.controller.ts @@ -0,0 +1,162 @@ +import { + Body, + Controller, + Delete, + FileTypeValidator, + Get, + MaxFileSizeValidator, + Param, + ParseFilePipe, + Patch, + Post, + Query, + UploadedFile, + UseGuards, + UseInterceptors, +} from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import type { User } from '@prisma/client'; +import { EventsService } from '../services/events.service'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import type { CreateEventDto } from '../services/dto/create-events.dto'; +import { Roles } from '../services/decorator/roles.decorator'; +import type { UpdateEventDto } from '../services/dto/update-event.dto'; +import type { RegisterEventDto } from '../services/dto/register-event.dto'; +import type { DeleteEventDto } from '../services/dto/delete-event.dto'; +import type { RemoveUserDto } from '../services/dto/remove-user.dto'; + +@Controller('events') +export class EventsController { + constructor(private readonly events: EventsService) {} + + @Get('/') + @ApiTags('events') + @ApiOperation({ summary: 'returns all upcoming events' }) + async getAllEvents(@Query('search') query) { + return await this.events.getAllEvents(query); + } + + @Get('/:eventId') + @ApiTags('events') + @ApiOperation({ summary: 'returns the specific event with slug' }) + async getEventByID(@Param('eventId') id: string) { + return await this.events.getEventBySlugId(id); + } + + @Post('/create') + @ApiOperation({ summary: 'create new events' }) + @ApiTags('events') + @Roles('ADMIN', 'EDITOR') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async createNewEvent(@Body() data: CreateEventDto, @AuthUser() user: User) { + return await this.events.createEvent(data, user.uid); + } + + @Get('/publish/:orgID/:id') + @ApiTags('events') + @ApiOperation({ + summary: + 'publish event , by doing this we lets public to register for event', + }) + @Roles('ADMIN', 'EDITOR') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async publishNewEvent(@Param('id') data: string) { + return await this.events.publishEvent(data); + } + + @Patch('/edit') + @ApiOperation({ summary: 'update info of event' }) + @ApiTags('events') + @Roles('ADMIN', 'EDITOR') + @UseInterceptors(FileInterceptor('file')) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async updateNewEvent(@Body() data: UpdateEventDto) { + return await this.events.updateEvent(data); + } + + @Post('/register') + @ApiTags('events') + @ApiOperation({ summary: 'Register for specific event' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async registerEvent(@Body() data: RegisterEventDto, @AuthUser() user: User) { + return await this.events.registerEvent(data.eventId, user.uid); + } + + @Get('/participants/:orgID/:id') + @ApiTags('events') + @Roles('ADMIN', 'EDITOR', 'VIEWER') + @ApiOperation({ summary: 'Get all participants of events' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getregisterDParticipants(@Param('id') id: string) { + return await this.events.getEventParticipants(id); + } + + @Delete('/participants/delete') + @ApiTags('events') + @Roles('ADMIN', 'EDITOR') + @ApiOperation({ summary: 'Remove participant from a event' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async removePartcipent(@Body() data: RemoveUserDto) { + return await this.events.removeParticipant(data.eventId, data.userId); + } + + @Get('/status/:id') + @ApiTags('events') + @ApiOperation({ summary: 'Get if participant is registerd for event or not' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getUserEventStatus( + @Param('id') slugId: string, + @AuthUser() user: User, + ) { + return await this.events.getEventRegistartionStatus(slugId, user.uid); + } + + @Get('/stats/:id') + @ApiTags('events') + @ApiOperation({ summary: 'Get event stats' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getEventStats(@Param('id') id: string) { + return await this.events.getEventStats(id); + } + + @Patch('/edit/cover') + @Roles('ADMIN', 'EDITOR') + @ApiTags('events') + @UseGuards(AuthGuard('jwt'), RbacGuard) + @UseInterceptors(FileInterceptor('file')) + @ApiOperation({ summary: 'Upload image for event cover page' }) + async uploadFile( + @UploadedFile( + new ParseFilePipe({ + // file size validators + validators: [ + new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' }), // support png,jpg,peg + new MaxFileSizeValidator({ maxSize: 1024 * 1024 * 4 }), // File size 4 megabytes + ], + }), + ) + file: Express.Multer.File, + @Query('event') event: string, + ) { + return await this.events.uploadEventCover(file, event); + } + + @Get('/ticket/:eventId') + @ApiTags('events') + @ApiOperation({ summary: 'return ticket info' }) + async getTicketInfo(@Param('eventId') eventId: string) { + return await this.events.getTicketInfo(eventId); + } + + @Delete('/delete/:id') + @Roles('ADMIN') + @ApiTags('events') + @UseGuards(AuthGuard('jwt'), RbacGuard) + @ApiOperation({ summary: 'Delete a event using event id' }) + async deleteEvent(@Param('id') eventId: string, @Body() _: DeleteEventDto) { + return await this.events.deleteEvent(eventId); + } +} diff --git a/apps/api/src/controllers/form.controller.ts b/apps/api/src/controllers/form.controller.ts new file mode 100644 index 00000000..e7585fa2 --- /dev/null +++ b/apps/api/src/controllers/form.controller.ts @@ -0,0 +1,109 @@ +import { + Body, + Controller, + Delete, + Get, + InternalServerErrorException, + NotFoundException, + Param, + Post, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import { Roles } from '../services/decorator/roles.decorator'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import { FormService } from '../services/form.service'; +import { EventsService } from '../services/events.service'; +import type { FormPayLoad } from '../services/dto/create-form.dto'; +import type { User } from '@prisma/client'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import type { ToggleFormPublishStatus } from '../services/dto/publish-form.dto'; + +@Controller('/events') +export class FormController { + constructor( + private form: FormService, + private events: EventsService, + ) {} + + @Get('/form/:orgID/:eventId') + @ApiTags('events') + @Roles('ADMIN', 'EDITOR', 'VIEWER') + @ApiOperation({ summary: 'get form schema of a specific event' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getFormSchema(@Param('eventId') slugId: string) { + return await this.form.getEventFormScheme(slugId); + } + + @Post('/form/:eventId') + @ApiTags('events') + @ApiOperation({ summary: 'users register form via this route' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async postFormResponse( + @Param('eventId') eventId: string, + @Body() data: Record>, + @AuthUser() user: User, + ) { + try { + const event = await this.events.getEventById(eventId); + if (event.maxTicketCount < 1) { + throw new NotFoundException(); + } + await this.form.addUserFormSubmission(data, eventId, user.uid); + return await this.events.registerEvent(event.slug, user.uid); + } catch (e) { + if (e instanceof NotFoundException) throw new NotFoundException(); + + throw new InternalServerErrorException(); + } + } + + @Post('/publish/form/:id') + @ApiTags('events') + @ApiOperation({ + summary: + 'publish event , by doing this we lets public to register for event', + }) + @Roles('ADMIN', 'EDITOR') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async publishForm( + @Param('id') data: string, + @Body() payload: ToggleFormPublishStatus, + ) { + return await this.form.toggleFormPublishStatus( + data, + payload.shouldFormPublish, + ); + } + + @Post('/form') + @ApiTags('events') + @Roles('ADMIN', 'EDITOR') + @ApiOperation({ summary: 'Create form for each event' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async createForm(@Body() payload: FormPayLoad) { + return await this.form.createForm(payload); + } + + @Get('/participants/:orgID/:id/:userId/form') + @ApiTags('events') + @Roles('ADMIN', 'EDITOR', 'VIEWER') + @ApiOperation({ summary: 'Get all the form submission from participant' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getRegisteredParticipantsFormSubmissions( + @Param('id') id: string, + @Param('userId') uid: string, + ) { + return await this.form.getRegisteredParticipantsFormSubmissions(id, uid); + } + + @Delete('/form/bulk-delete/:slug') + @ApiTags('events') + @Roles('ADMIN', 'EDITOR') + @ApiOperation({ summary: 'Bulk delete form for each event' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async bulkDeleteForm(@Param('slug') eventName: string) { + return await this.events.deleteForm(eventName); + } +} diff --git a/apps/api/src/controllers/kanban.controller.ts b/apps/api/src/controllers/kanban.controller.ts new file mode 100644 index 00000000..bc6a511a --- /dev/null +++ b/apps/api/src/controllers/kanban.controller.ts @@ -0,0 +1,39 @@ +import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; +import { KanbanService } from '../services/kanban.service'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import type { CreateTask } from '../services/dto/create-task.dto'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import type { User } from '@prisma/client'; + +@Controller('/events/kanban') +export class KanbanController { + constructor(private kanbanService: KanbanService) {} + + @ApiOperation({ summary: 'get all kanban boards associated with a event' }) + @ApiTags('kanban') + @UseGuards(AuthGuard('jwt'), RbacGuard) + @Get('/:slug') + async getAllBoards(@Param('slug') slug: string) { + return await this.kanbanService.getAllBoards(slug); + } + + @ApiOperation({ summary: 'create a new task in kanban board' }) + @ApiTags('kanban') + @UseGuards(AuthGuard('jwt'), RbacGuard) + @Post('/:slug/:boardId') + async createTask( + @Param('slug') slug: string, + @Param('boardId') boardId: string, + @Body() payload: CreateTask, + @AuthUser() user: User, + ) { + return await this.kanbanService.createTask( + payload, + slug, + boardId, + user.uid, + ); + } +} diff --git a/apps/api/src/controllers/org-invite.controller.ts b/apps/api/src/controllers/org-invite.controller.ts new file mode 100644 index 00000000..d53ddcb5 --- /dev/null +++ b/apps/api/src/controllers/org-invite.controller.ts @@ -0,0 +1,31 @@ +import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import { Roles } from '../services/decorator/roles.decorator'; +import { OrganizationInviteService } from '../services/org-invite.service'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import type { OrgInvie } from '../services/dto/user-invite.dto'; +import { AuthGuard } from '@nestjs/passport'; +import type { User } from '@prisma/client'; + +@Controller('org/invite') +export class OrgInviteController { + constructor(private readonly service: OrganizationInviteService) {} + + @Post('/') + @Roles('ADMIN') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async sendInvite(@AuthUser() user: User, @Body() data: OrgInvie) { + return this.service.inviteToOrg( + data.email, + user.uid, + data.organizationId, + data.role, + ); + } + + @Get('/verify') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async verfyEmail(@AuthUser() user: User, @Query() { id }) { + return this.service.verifyEmailInvite(id, user.uid, user.email); + } +} diff --git a/apps/api/src/controllers/org-member.controller.ts b/apps/api/src/controllers/org-member.controller.ts new file mode 100644 index 00000000..305afc2a --- /dev/null +++ b/apps/api/src/controllers/org-member.controller.ts @@ -0,0 +1,53 @@ +import { Body, Controller, Get, Param, Patch, UseGuards } from '@nestjs/common'; +import { OrganizationMemberService } from '../services/org-member.service'; +import { AuthGuard } from '@nestjs/passport'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import { Roles } from '../services/decorator/roles.decorator'; +import type { RemoveMember } from '../services/dto/member-remove.dto'; +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import type { UpdateMemberRole } from '../services/dto/update-role.dto'; +import type { Role } from '@prisma/client'; + +@Controller('org/member') +export class OrgMemberController { + constructor(private readonly orgMemberService: OrganizationMemberService) {} + + @Get('/:orgID') + @Roles('ADMIN', 'EDITOR', 'VIEWER') + @ApiTags('org-members') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getMembers(@Param('orgID') orgID: string) { + return await this.orgMemberService.getMembers(orgID); + } + + @Patch('/remove') + @ApiTags('org-members') + @ApiOperation({ summary: 'Remove members from organization' }) + @ApiResponse({ + status: 200, + description: 'User will be removed successfully', + }) + @Roles('ADMIN') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async removeUser(@Body() data: RemoveMember) { + return await this.orgMemberService.removeMember( + data.organizationId, + data.memberId, + ); + } + + @Patch('/role') + @ApiTags('org-members') + @ApiOperation({ summary: 'Update member role in org' }) + @ApiResponse({ status: 200, description: 'User role will be updated' }) + @Roles('ADMIN') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async updateUserRole(@Body() data: UpdateMemberRole) { + return await this.orgMemberService.updateRole( + data.organizationId, + data.memberId, + data.role as Role, + ); + // swagger was throwing circular error so i had to define type as this way + } +} diff --git a/apps/api/src/controllers/organization.controller.ts b/apps/api/src/controllers/organization.controller.ts new file mode 100644 index 00000000..5eaf5e1e --- /dev/null +++ b/apps/api/src/controllers/organization.controller.ts @@ -0,0 +1,85 @@ +import { + Body, + Controller, + Get, + Param, + Patch, + Post, + UseGuards, + Delete, +} from '@nestjs/common'; +import { OrganizationService } from '../services/organization.service'; +import { AuthGuard } from '@nestjs/passport'; +import type { CreateOrgDto } from '../services/dto/create-org.dto'; +import type { DeleteOrgDto } from '../services/dto/delete-org.dto'; +import { Roles } from '../services/decorator/roles.decorator'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import type { UpdateOrgDto } from '../services/dto/update-org.dto'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import type { User, Role } from '@prisma/client'; +import type { LeaveOrg } from '../services/dto/leave-org.dto'; +import { UserRole } from '../services/auth/decorators/role.decorator'; + +@Controller('org') +export class OrganizationController { + constructor(private readonly organizationService: OrganizationService) {} + + @Post('/') + @UseGuards(AuthGuard('jwt')) + async createOrganization( + @Body() createOrgDto: CreateOrgDto, + @AuthUser() user: User, + ) { + return this.organizationService.create(createOrgDto, user.uid); + } + + @Get('/find/:slug') + async findOrgBySlug(@Param('slug') slug: string) { + return this.organizationService.findOrgBySlug(slug); + } + + @Get('/:orgID') + @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getOrgInfo(@Param('orgID') info) { + return await this.organizationService.getOrgById(info); + } + + @Get('/events/public/:slug') + async getOrgEvents(@Param('slug') slug) { + return await this.organizationService.getEventsByorg(slug); + } + + @Get('/events/:orgID') + @Roles('ADMIN', 'EDITOR', 'VIEWER') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getAllEvents(@Param('orgID') orgID: string, @UserRole() role: Role) { + return this.organizationService.getAllEvents(orgID, role); + } + + @Patch('/') + @Roles('ADMIN') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async updateOrganization(@Body() updateOrgDto: UpdateOrgDto) { + return this.organizationService.update(updateOrgDto); + } + + @Delete('/delete') + @Roles('ADMIN') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async deleteOrganization(@Body() data: DeleteOrgDto) { + return this.organizationService.deleteOrg(data.organizationId); + } + + @Delete('/leave') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async leaveOrg(@AuthUser() user: User, @Body() body: LeaveOrg) { + return this.organizationService.leaveOrg(body.organizationId, user.uid); + } + + @Patch('/update') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async UpdateOrg(@Body() data: UpdateOrgDto) { + return await this.organizationService.UpdateOrg(data.organizationId, data); + } +} diff --git a/apps/api/src/controllers/stripe.controller.ts b/apps/api/src/controllers/stripe.controller.ts new file mode 100644 index 00000000..85e1a9af --- /dev/null +++ b/apps/api/src/controllers/stripe.controller.ts @@ -0,0 +1,14 @@ +import { Body, Controller, Post, Headers } from '@nestjs/common'; +import { StripeService } from '../services/stripe.service'; + +@Controller('payment/webhook') +export class StripeController { + constructor(private readonly stripeService: StripeService) {} + + @Post('/') + async handleWebHook(@Body() data, @Headers() head) { + const signature = head['stripe-signature'] as string; + + return await this.stripeService.handleWebHookEvent(data, signature); + } +} diff --git a/apps/api/src/controllers/user.controller.ts b/apps/api/src/controllers/user.controller.ts new file mode 100644 index 00000000..d3650109 --- /dev/null +++ b/apps/api/src/controllers/user.controller.ts @@ -0,0 +1,42 @@ +import { Body, Controller, Get, Patch, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import type { User } from '@prisma/client'; +import { OrganizationService } from '../services/organization.service'; +import { UserService } from '../services/user.service'; +import type { UpdateUserDto } from '../services/dto/update-user.dto'; + +@Controller('user') +export class UserController { + constructor( + private readonly organizationService: OrganizationService, + private readonly userService: UserService, + ) {} + + @Get('/orgs') + @UseGuards(AuthGuard('jwt')) + async findOrgs(@AuthUser() user: User) { + return this.organizationService.findOrgsByUser(user.uid); + } + + @Get('/') + @UseGuards(AuthGuard('jwt')) + async getUser(@AuthUser() user: User) { + return this.userService.findUserById(user.uid); + } + + @Patch('/') + @UseGuards(AuthGuard('jwt')) + async updateUser( + @Body() updateUserDto: UpdateUserDto, + @AuthUser() user: User, + ) { + return this.userService.updateUser(user, updateUserDto); + } + + @Get('/tickets') + @UseGuards(AuthGuard('jwt')) + async getUserTickets(@AuthUser() user: User) { + return this.userService.getReservedTickets(user.uid); + } +} diff --git a/apps/api/src/db/migrations/01.user.ts b/apps/api/src/db/migrations/01.user.ts new file mode 100644 index 00000000..6b2c20d8 --- /dev/null +++ b/apps/api/src/db/migrations/01.user.ts @@ -0,0 +1,35 @@ +import type { Knex } from 'knex'; + +import { SystemTable } from '../../utils/db'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.User); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.User, (table) => { + table.string('id', 25).primary(); + + table.string('email').notNullable().unique(); + + table.string('display_name'); + + table.string('slug').unique(); + + table.text('photo_url'); + + table.text('college_name'); + + table.boolean('is_student'); + + table.text('refresh_token'); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.User); +} diff --git a/apps/api/src/db/migrations/02.account.ts b/apps/api/src/db/migrations/02.account.ts new file mode 100644 index 00000000..80069c60 --- /dev/null +++ b/apps/api/src/db/migrations/02.account.ts @@ -0,0 +1,28 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Account); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Account, (table) => { + table.string('id', 25).primary(); + + table.string('fk_user_id', 25).notNullable(); + + table.string('provider').notNullable(); + table.string('provider_account_id').notNullable(); + + table.text('provider_access_token'); + table.text('provider_refresh_token'); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Account); +} diff --git a/apps/api/src/db/migrations/03.organization.ts b/apps/api/src/db/migrations/03.organization.ts new file mode 100644 index 00000000..08e8a7b0 --- /dev/null +++ b/apps/api/src/db/migrations/03.organization.ts @@ -0,0 +1,26 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Org); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Org, (table) => { + table.string('id', 25).primary(); + + table.string('name').notNullable().unique(); + + table.string('slug').unique(); + + table.boolean('is_verified').defaultTo(false); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Org); +} diff --git a/apps/api/src/db/migrations/04.organization-member.ts b/apps/api/src/db/migrations/04.organization-member.ts new file mode 100644 index 00000000..f45e33a5 --- /dev/null +++ b/apps/api/src/db/migrations/04.organization-member.ts @@ -0,0 +1,26 @@ +import { Role, SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.OrgMember); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.OrgMember, (table) => { + table.string('id', 25).primary(); + + table.string('fk_organization_id', 25); + + table.string('fk_user_id', 25); + + table.enum('role', [Role.ADMIN, Role.EDITOR, Role.VIEWER]); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.OrgMember); +} diff --git a/apps/api/src/db/migrations/05.organization-invite.ts b/apps/api/src/db/migrations/05.organization-invite.ts new file mode 100644 index 00000000..1249a17e --- /dev/null +++ b/apps/api/src/db/migrations/05.organization-invite.ts @@ -0,0 +1,28 @@ +import { Role, SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.OrgInvite); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.OrgInvite, (table) => { + table.string('id', 25).primary(); + + table.string('fk_organization_id', 25); + + table.string('invitee_email', 255); + + table.string('inviter_uid', 25); + + table.enum('role', [Role.ADMIN, Role.EDITOR, Role.VIEWER]); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.OrgInvite); +} diff --git a/apps/api/src/db/migrations/06.events.ts b/apps/api/src/db/migrations/06.events.ts new file mode 100644 index 00000000..3268514d --- /dev/null +++ b/apps/api/src/db/migrations/06.events.ts @@ -0,0 +1,38 @@ +import { Role, SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Events); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Events, (table) => { + table.string('id', 25).primary(); + + table.string('name', 255); + + table.string('slug', 255); + + table.string('fk_organization_id', 25); + + table.string('description'); + + table.string('website').nullable(); + + table.string('cover_image').nullable(); + + table.string('location', 255); + + table.timestamp('event_date'); + + table.boolean('is_published').defaultTo(false); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Events); +} diff --git a/apps/api/src/db/migrations/07.event-ticket.ts b/apps/api/src/db/migrations/07.event-ticket.ts new file mode 100644 index 00000000..0646da50 --- /dev/null +++ b/apps/api/src/db/migrations/07.event-ticket.ts @@ -0,0 +1,34 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.EventTicket); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.EventTicket, (table) => { + table.string('id', 25).primary(); + + table.string('fk_event_id', 25); + + table.string('name', 255); + + table.string('description'); + + table.decimal('price', 10, 2); + + table.integer('quantity'); + + table.json('stripe_price_object').nullable(); + + table.json('stripe_product_object').nullable(); + + table.boolean('is_active').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.EventTicket); +} diff --git a/apps/api/src/db/migrations/08.form-field.ts b/apps/api/src/db/migrations/08.form-field.ts new file mode 100644 index 00000000..d13481e4 --- /dev/null +++ b/apps/api/src/db/migrations/08.form-field.ts @@ -0,0 +1,32 @@ +import { SystemTable, FormInput } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.FormFields); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.FormFields, (table) => { + table.string('id', 25).primary(); + + table.string('fk_form_id', 25); + + table.string('name', 255); + + table.string('placeholder'); + + table.string('description'); + + table.boolean('required').defaultTo('false'); + + table.enum('type', FormInput); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.FormFields); +} diff --git a/apps/api/src/db/migrations/09.form.ts b/apps/api/src/db/migrations/09.form.ts new file mode 100644 index 00000000..b20e9a86 --- /dev/null +++ b/apps/api/src/db/migrations/09.form.ts @@ -0,0 +1,38 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Form); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Form, (table) => { + table.string('id', 25).primary(); + + table.string('fk_event_id', 25); + + table.string('title', 255); + + table.string('description'); + + table.string('logo_url'); + + table.string('banner_url'); + + table.string('confirmation_message'); + + table.json('misc'); + + table.boolean('is_default_form').defaultTo(false); + + table.boolean('is_published').defaultTo(false); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Form); +} diff --git a/apps/api/src/db/migrations/10.form-field-options.ts b/apps/api/src/db/migrations/10.form-field-options.ts new file mode 100644 index 00000000..51fee87c --- /dev/null +++ b/apps/api/src/db/migrations/10.form-field-options.ts @@ -0,0 +1,26 @@ +import { SystemTable, FormInput } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable( + SystemTable.FormFieldOptions, + ); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.FormFieldOptions, (table) => { + table.string('id', 25).primary(); + + table.string('fk_form_id', 25); + + table.string('option', 255); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.FormFieldOptions); +} diff --git a/apps/api/src/db/migrations/11.form-response.ts b/apps/api/src/db/migrations/11.form-response.ts new file mode 100644 index 00000000..92f5a404 --- /dev/null +++ b/apps/api/src/db/migrations/11.form-response.ts @@ -0,0 +1,28 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.FormResponse); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.FormResponse, (table) => { + table.string('id', 25).primary(); + + table.string('fk_form_id', 25); + + table.string('fk_event_id', 25); + + table.string('fk_user_id', 25).nullable(); + + table.json('response'); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.FormResponse); +} diff --git a/apps/api/src/db/migrations/12.ticket.ts b/apps/api/src/db/migrations/12.ticket.ts new file mode 100644 index 00000000..35ddc45d --- /dev/null +++ b/apps/api/src/db/migrations/12.ticket.ts @@ -0,0 +1,28 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Ticket); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Ticket, (table) => { + table.string('id', 25).primary(); + + table.string('fk_event_id', 25); + + table.string('fk_user_id', 25).nullable(); + + table.string('fk_event_ticket_id', 25); + + table.float('paid_amount'); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Ticket); +} diff --git a/apps/api/src/db/migrations/13.kanban.ts b/apps/api/src/db/migrations/13.kanban.ts new file mode 100644 index 00000000..01422f82 --- /dev/null +++ b/apps/api/src/db/migrations/13.kanban.ts @@ -0,0 +1,24 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Kanban); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Kanban, (table) => { + table.string('id', 25).primary(); + + table.string('fk_event_id', 25); + + table.string('title'); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Kanban); +} diff --git a/apps/api/src/db/migrations/14.kanban-card.ts b/apps/api/src/db/migrations/14.kanban-card.ts new file mode 100644 index 00000000..fb4a2d26 --- /dev/null +++ b/apps/api/src/db/migrations/14.kanban-card.ts @@ -0,0 +1,28 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.KanbanCard); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.KanbanCard, (table) => { + table.string('id', 25).primary(); + + table.string('fk_kanban_id', 25); + + table.string('title'); + + table.string('description'); + + table.string('fk_user_id', 25); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.KanbanCard); +} diff --git a/apps/api/src/db/migrations/15.comment.ts b/apps/api/src/db/migrations/15.comment.ts new file mode 100644 index 00000000..accbec16 --- /dev/null +++ b/apps/api/src/db/migrations/15.comment.ts @@ -0,0 +1,30 @@ +import { SystemTable } from '../../utils/db'; +import type { Knex } from 'knex'; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.Comment); + + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Comment, (table) => { + table.string('id', 25).primary(); + + table.string('fk_user_id', 25); + + table.string('fk_event_id', 25); + + table.string('fk_kanban_card_id', 25); + + table.string('fk_kanban_id', 25); + + table.string('comment'); + + table.boolean('is_deleted').defaultTo(false); + + table.timestamps(true, true); + }); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(SystemTable.Comment); +} diff --git a/apps/api/src/db/schema/account.ts b/apps/api/src/db/schema/account.ts new file mode 100644 index 00000000..d5b92979 --- /dev/null +++ b/apps/api/src/db/schema/account.ts @@ -0,0 +1,28 @@ +import type { SystemFields } from '../../utils/db'; +import { z } from 'zod'; + +export const AccountSchema = z.object({ + id: z.string().length(25), + + fk_user_id: z.string().length(25), + + provider: z.string(), + provider_account_id: z.string(), + + provider_access_token: z.string().optional(), + provider_refresh_token: z.string().optional(), + + created_at: z.date(), + updated_at: z.date(), + + is_deleted: z.boolean().default(false), +}); + +export type Account = z.infer; + +export type AccountCreateSchema = Omit< + z.input, + SystemFields +>; + +export type AccountUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/comment.ts b/apps/api/src/db/schema/comment.ts new file mode 100644 index 00000000..61911976 --- /dev/null +++ b/apps/api/src/db/schema/comment.ts @@ -0,0 +1,32 @@ +import { z } from 'zod'; + +import type { SystemFields } from '../../utils/db'; + +export const CommentSchema = z.object({ + id: z.string().length(25), + + fk_user_id: z.string().length(25), + + fk_event_id: z.string().length(25), + + fk_kanban_card_id: z.string().length(25), + + fk_kanban_id: z.string().length(25), + + comment: z.string().min(3).max(255), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type Comment = z.infer; + +export type CommentCreateSchema = Omit< + z.input, + SystemFields +>; + +export type CommentUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/event-ticket.ts b/apps/api/src/db/schema/event-ticket.ts new file mode 100644 index 00000000..3b3d0dd3 --- /dev/null +++ b/apps/api/src/db/schema/event-ticket.ts @@ -0,0 +1,37 @@ +import type { SystemFields } from '../../utils/db'; +import { z } from 'zod'; + +export const EventTicketSchema = z.object({ + id: z.string().length(25), + + fk_event_id: z.string().length(25), + + name: z.string().min(3).max(255), + + description: z.string(), + + price: z.number().min(0), + + quantity: z.number().min(0), + + stripe_price_object: z.record(z.unknown()).optional(), + + stripe_product_object: z.record(z.unknown()).optional(), + + is_active: z.boolean().default(false), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type EventTicket = z.infer; + +export type EventTicketCreateSchema = Omit< + z.input, + SystemFields +>; + +export type EventTicketUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/events.ts b/apps/api/src/db/schema/events.ts new file mode 100644 index 00000000..b596ed8a --- /dev/null +++ b/apps/api/src/db/schema/events.ts @@ -0,0 +1,36 @@ +import type { SystemFields } from '../../utils/db'; +import { z } from 'zod'; + +export const EventSchema = z.object({ + id: z.string().length(25), + + name: z.string().min(3).max(255), + + slug: z.string().min(3).max(255), + + fk_organization_id: z.string().length(25), + + description: z.string(), + + website: z.string().url().optional(), + + cover_image: z.string().url().optional(), + + location: z.string().min(3).max(255), + + event_date: z.date(), + + is_published: z.boolean().default(false), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type Event = z.infer; + +export type EventCreateSchema = Omit, SystemFields>; + +export type EventUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/form-field-options.ts b/apps/api/src/db/schema/form-field-options.ts new file mode 100644 index 00000000..8280f418 --- /dev/null +++ b/apps/api/src/db/schema/form-field-options.ts @@ -0,0 +1,26 @@ +import type { SystemFields } from '../../utils/db'; +import { z } from 'zod'; + +export const FormFieldOptionsSchems = z.object({ + id: z.string().length(25), + + fk_form_id: z.string().length(25), + + option: z.string(), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type FormFieldOptions = z.infer; + +export type FormFieldOptionsCreateSchema = Omit< + z.input, + SystemFields +>; + +export type FormFieldOptionsUpdateSchema = + Partial; diff --git a/apps/api/src/db/schema/form-fields.ts b/apps/api/src/db/schema/form-fields.ts new file mode 100644 index 00000000..ddcd0128 --- /dev/null +++ b/apps/api/src/db/schema/form-fields.ts @@ -0,0 +1,35 @@ +import type { SystemFields, FormInput } from '../../utils/db'; +import { z } from 'zod'; + +export const FormFieldSchema = z.object({ + id: z.string().length(25), + + fk_form_id: z.string().length(25), + + name: z.string().min(3).max(255), + + placeholder: z.string().optional(), + + description: z.string().optional(), + + required: z.boolean().default(false), + + type: z.custom((val) => { + return val; + }), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type FormField = z.infer; + +export type FormFieldCreateSchema = Omit< + z.input, + SystemFields +>; + +export type FormFieldUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/form-response.ts b/apps/api/src/db/schema/form-response.ts new file mode 100644 index 00000000..600ae0c1 --- /dev/null +++ b/apps/api/src/db/schema/form-response.ts @@ -0,0 +1,30 @@ +import { z } from 'zod'; + +import type { SystemFields } from '../../utils/db'; + +export const FormResponseSchema = z.object({ + id: z.string().length(25), + + fk_form_id: z.string().length(25), + + fk_event_id: z.string().length(25), + + fk_user_id: z.string().length(25).optional(), + + response: z.record(z.unknown()), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type FormResponse = z.infer; + +export type FormResponseCreateSchema = Omit< + z.input, + SystemFields +>; + +export type FormResponseUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/form.ts b/apps/api/src/db/schema/form.ts new file mode 100644 index 00000000..8eb26f74 --- /dev/null +++ b/apps/api/src/db/schema/form.ts @@ -0,0 +1,37 @@ +import { z } from 'zod'; + +import type { SystemFields } from '../../utils/db'; + +export const FormSchema = z.object({ + id: z.string().length(25), + + fk_event_id: z.string().length(25), + + title: z.string().min(3).max(255), + + description: z.string(), + + logo_url: z.string().url().optional(), + + banner_url: z.string().url().optional(), + + confirmation_message: z.string(), + + misc: z.record(z.unknown()), + + is_default_form: z.boolean().default(true), + + is_published: z.boolean().default(false), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type Form = z.infer; + +export type FormCreateSchema = Omit, SystemFields>; + +export type FormUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/index.ts b/apps/api/src/db/schema/index.ts new file mode 100644 index 00000000..278c5596 --- /dev/null +++ b/apps/api/src/db/schema/index.ts @@ -0,0 +1,155 @@ +import { User, UserCreateSchema, UserUpdateSchema } from './user'; +import { Account, AccountCreateSchema, AccountUpdateSchema } from './account'; +import { + Organization, + OrganizationCreateSchema, + OrganizationUpdateSchema, +} from './organization'; +import { + OrganizationMember, + OrganizationMemberCreateSchema, + OrganizationMemberUpdateSchema, +} from './organization-member'; +import { + OrganizationInvite, + OrganizationInviteCreateSchema, + OrganizationInviteUpdateSchema, +} from './organization-invite'; +import { Event, EventCreateSchema, EventUpdateSchema } from './events'; +import { + EventTicket, + EventTicketCreateSchema, + EventTicketUpdateSchema, +} from './event-ticket'; +import { Form, FormCreateSchema, FormUpdateSchema } from './form'; +import { + FormField, + FormFieldCreateSchema, + FormFieldUpdateSchema, +} from './form-fields'; +import { + FormFieldOptions, + FormFieldOptionsCreateSchema, + FormFieldOptionsUpdateSchema, +} from './form-field-options'; +import { + FormResponse, + FormResponseCreateSchema, + FormResponseUpdateSchema, +} from './form-response'; +import { Ticket, TicketCreateSchema, TicketUpdateSchema } from './tickets'; +import { Kanban, KanbanCreateSchema, KanbanUpdateSchema } from './Kanban'; +import { + KanbanCard, + KanbanCardCreateSchema, + KanbanCardUpdateSchema, +} from './kanban-card'; +import { Comment, CommentCreateSchema, CommentUpdateSchema } from './comment'; + +export { + User, + UserCreateSchema, + UserUpdateSchema, + Account, + AccountCreateSchema, + AccountUpdateSchema, + Organization, + OrganizationCreateSchema, + OrganizationUpdateSchema, + OrganizationMember, + OrganizationMemberCreateSchema, + OrganizationMemberUpdateSchema, + OrganizationInvite, + OrganizationInviteCreateSchema, + OrganizationInviteUpdateSchema, + Event, + EventCreateSchema, + EventUpdateSchema, + EventTicket, + EventTicketCreateSchema, + EventTicketUpdateSchema, + Form, + FormCreateSchema, + FormUpdateSchema, + FormField, + FormFieldCreateSchema, + FormFieldUpdateSchema, + FormFieldOptions, + FormFieldOptionsCreateSchema, + FormFieldOptionsUpdateSchema, + FormResponse, + FormResponseCreateSchema, + FormResponseUpdateSchema, + Ticket, + TicketCreateSchema, + TicketUpdateSchema, + Kanban, + KanbanCreateSchema, + KanbanUpdateSchema, + KanbanCard, + KanbanCardCreateSchema, + KanbanCardUpdateSchema, + Comment, + CommentCreateSchema, + CommentUpdateSchema, +}; + +import { SystemTable } from '@api/utils/db'; + +type InputFields = + | 'SingleLineText' + | 'LongText' + | 'SingleSelect' + | 'MultiSelect' + | 'Checkbox' + | 'Number' + | 'Email' + | 'URL' + | 'PhoneNumber' + | 'Attachment'; + +export type FormInput = Exclude; + +type CreateRowSchema = { + [SystemTable.User]: UserCreateSchema; + [SystemTable.Account]: AccountCreateSchema; + [SystemTable.Org]: OrganizationCreateSchema; + [SystemTable.OrgMember]: OrganizationMemberCreateSchema; + [SystemTable.OrgInvite]: OrganizationInviteCreateSchema; + [SystemTable.Events]: EventCreateSchema; + [SystemTable.EventTicket]: EventTicketCreateSchema; + [SystemTable.Form]: FormCreateSchema; + [SystemTable.FormFields]: FormFieldCreateSchema; + [SystemTable.FormFieldOptions]: FormFieldOptionsCreateSchema; + [SystemTable.FormResponse]: FormResponseCreateSchema; + [SystemTable.Ticket]: TicketCreateSchema; + [SystemTable.Kanban]: KanbanCreateSchema; + [SystemTable.KanbanCard]: KanbanCardCreateSchema; + [SystemTable.Comment]: CommentCreateSchema; + // biome-ignore lint/suspicious/noExplicitAny: FF_Migrations is a migration table. It should not be modified. + [SystemTable.FF_Migrations]: any; +}; + +export type CreateSchema = CreateRowSchema[K]; + +type UpdateRowSchema = { + [SystemTable.User]: UserUpdateSchema; + [SystemTable.Account]: AccountUpdateSchema; + [SystemTable.Org]: OrganizationUpdateSchema; + [SystemTable.OrgMember]: OrganizationMemberUpdateSchema; + [SystemTable.OrgInvite]: OrganizationInviteUpdateSchema; + [SystemTable.Events]: EventUpdateSchema; + [SystemTable.EventTicket]: EventTicketUpdateSchema; + [SystemTable.Form]: FormUpdateSchema; + [SystemTable.FormFields]: FormFieldUpdateSchema; + [SystemTable.FormFieldOptions]: FormFieldOptionsUpdateSchema; + [SystemTable.FormResponse]: FormResponseUpdateSchema; + [SystemTable.Ticket]: TicketUpdateSchema; + [SystemTable.Kanban]: KanbanUpdateSchema; + [SystemTable.KanbanCard]: KanbanCardUpdateSchema; + [SystemTable.Comment]: CommentUpdateSchema; + // biome-ignore lint/suspicious/noExplicitAny: FF_Migrations is a migration table. It should not be modified. + [SystemTable.FF_Migrations]: any; +}; + +export type UpdateSchema = UpdateRowSchema[K]; diff --git a/apps/api/src/db/schema/kanban-card.ts b/apps/api/src/db/schema/kanban-card.ts new file mode 100644 index 00000000..ac239b3f --- /dev/null +++ b/apps/api/src/db/schema/kanban-card.ts @@ -0,0 +1,30 @@ +import { z } from 'zod'; + +import type { SystemFields } from '../../utils/db'; + +export const KanbanCardSchema = z.object({ + id: z.string().length(25), + + fk_kanban_id: z.string().length(25), + + title: z.string().min(3).max(255), + + description: z.string().optional(), + + is_deleted: z.boolean().default(false), + + fk_user_id: z.string().length(25), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type KanbanCard = z.infer; + +export type KanbanCardCreateSchema = Omit< + z.input, + SystemFields +>; + +export type KanbanCardUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/kanban.ts b/apps/api/src/db/schema/kanban.ts new file mode 100644 index 00000000..8b8ade95 --- /dev/null +++ b/apps/api/src/db/schema/kanban.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; +import type { SystemFields } from '../../utils/db'; + +export const KanbanSchema = z.object({ + id: z.string().length(25), + + fk_event_id: z.string().length(25), + + title: z.string().min(3).max(255), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type Kanban = z.infer; + +export type KanbanCreateSchema = Omit< + z.input, + SystemFields +>; + +export type KanbanUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/organization-invite.ts b/apps/api/src/db/schema/organization-invite.ts new file mode 100644 index 00000000..0076de84 --- /dev/null +++ b/apps/api/src/db/schema/organization-invite.ts @@ -0,0 +1,32 @@ +import { z } from 'zod'; + +import type { SystemFields } from '../../utils/db'; +import { Role } from '../../utils/db'; + +export const OrganizationInviteSchema = z.object({ + id: z.string().length(25), + + fk_organization_id: z.string().length(25), + + invitee_email: z.string().email(), + + inviter_uid: z.string().length(25), + + role: z.enum([Role.ADMIN, Role.EDITOR, Role.VIEWER]), + + created_at: z.date(), + + updated_at: z.date(), + + is_deleted: z.boolean().default(false), +}); + +export type OrganizationInvite = z.infer; + +export type OrganizationInviteCreateSchema = Omit< + z.input, + SystemFields +>; + +export type OrganizationInviteUpdateSchema = + Partial; diff --git a/apps/api/src/db/schema/organization-member.ts b/apps/api/src/db/schema/organization-member.ts new file mode 100644 index 00000000..10d852bb --- /dev/null +++ b/apps/api/src/db/schema/organization-member.ts @@ -0,0 +1,28 @@ +import { Role, type SystemFields } from '../../utils/db'; +import { z } from 'zod'; + +export const OrganizationMemberSchema = z.object({ + id: z.string().length(25), + + fk_organization_id: z.string().length(25), + + fk_user_id: z.string().length(25), + + role: z.enum([Role.ADMIN, Role.EDITOR, Role.VIEWER]), + + created_at: z.date(), + + updated_at: z.date(), + + is_deleted: z.boolean().default(false), +}); + +export type OrganizationMember = z.infer; + +export type OrganizationMemberCreateSchema = Omit< + z.input, + SystemFields +>; + +export type OrganizationMemberUpdateSchema = + Partial; diff --git a/apps/api/src/db/schema/organization.ts b/apps/api/src/db/schema/organization.ts new file mode 100644 index 00000000..fe63b78d --- /dev/null +++ b/apps/api/src/db/schema/organization.ts @@ -0,0 +1,24 @@ +import type { SystemFields } from '../../utils/db'; +import { z } from 'zod'; + +export const OrganizationSchema = z.object({ + id: z.string().length(25), + name: z.string(), + slug: z.string(), + + is_verified: z.boolean().default(false), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + updated_at: z.date(), +}); + +export type Organization = z.infer; + +export type OrganizationCreateSchema = Omit< + z.input, + SystemFields +>; + +export type OrganizationUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/tickets.ts b/apps/api/src/db/schema/tickets.ts new file mode 100644 index 00000000..220f9190 --- /dev/null +++ b/apps/api/src/db/schema/tickets.ts @@ -0,0 +1,30 @@ +import { z } from 'zod'; + +import type { SystemFields } from '../../utils/db'; + +export const TicketSchema = z.object({ + id: z.string().length(25), + + fk_event_id: z.string().length(25), + + fk_user_id: z.string().length(25).optional(), + + fk_event_ticket_id: z.string().length(25), + + paid_amount: z.number(), + + is_deleted: z.boolean().default(false), + + created_at: z.date(), + + updated_at: z.date(), +}); + +export type Ticket = z.infer; + +export type TicketCreateSchema = Omit< + z.input, + SystemFields +>; + +export type TicketUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/user.ts b/apps/api/src/db/schema/user.ts new file mode 100644 index 00000000..c29ee31f --- /dev/null +++ b/apps/api/src/db/schema/user.ts @@ -0,0 +1,24 @@ +import { SystemFields } from '@api/utils/db'; +import { z } from 'zod'; + +export const UserSchema = z.object({ + id: z.string().length(25), + email: z.string().email(), + display_name: z.string(), + slug: z.string(), + photo_url: z.string().optional(), + college_name: z.string().optional(), + is_student: z.boolean().optional(), + + refresh_token: z.string().optional(), + + created_at: z.date(), + updated_at: z.date(), + is_deleted: z.boolean().default(false), +}); + +export type User = z.infer; + +export type UserCreateSchema = Omit; + +export type UserUpdateSchema = Partial; diff --git a/apps/api/src/error.ts b/apps/api/src/error.ts index e3159413..3725f48d 100644 --- a/apps/api/src/error.ts +++ b/apps/api/src/error.ts @@ -1,46 +1,46 @@ export const ORG_EXISTS = { - ok: false, - message: 'An organization with that slug already exists', - error: 'ORG_EXISTS', + ok: false, + message: 'An organization with that slug already exists', + error: 'ORG_EXISTS', }; export const ORG_NOT_FOUND = { - ok: false, - message: 'An organization with that slug does not exist', - error: 'ORG_NOT_FOUND', + ok: false, + message: 'An organization with that slug does not exist', + error: 'ORG_NOT_FOUND', }; export const ORG_MEMBER_NOT_FOUND = { - ok: false, - message: 'An organization member with that user id does not exist', - error: 'ORG_MEMBER_NOT_FOUND', + ok: false, + message: 'An organization member with that user id does not exist', + error: 'ORG_MEMBER_NOT_FOUND', }; export const ROLE_UPDATE_FAILED = { - ok: false, - message: 'Failed to update role', - error: 'ROLE_UPDATE_FAILED', + ok: false, + message: 'Failed to update role', + error: 'ROLE_UPDATE_FAILED', }; export const USER_NOT_FOUND = { - ok: false, - message: 'User Doesnt Exist', - error: 'USER_NOT_FOUND', + ok: false, + message: 'User Doesnt Exist', + error: 'USER_NOT_FOUND', }; export const USER_UPDATE_ERROR = { - ok: false, - message: 'Cant Update User', - error: 'USER_UPDATE_ERROR', + ok: false, + message: 'Cant Update User', + error: 'USER_UPDATE_ERROR', }; export const ORG_ID_NOT_FOUND = { - ok: false, - message: "couldn't find the org", - error: 'please provide an organizationId', + ok: false, + message: "couldn't find the org", + error: 'please provide an organizationId', }; export const NO_ROLE_ACCESS = { - ok: false, - message: 'you are not authorized to visit the page', - error: 'insufficent role access', + ok: false, + message: 'you are not authorized to visit the page', + error: 'insufficent role access', }; diff --git a/apps/api/src/events/dto/cover-dto.ts b/apps/api/src/events/dto/cover-dto.ts deleted file mode 100644 index d3d5b8d0..00000000 --- a/apps/api/src/events/dto/cover-dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class ImageUpload { - @ApiProperty() - organizationId: string; - - @ApiProperty() - eventId: string; -} diff --git a/apps/api/src/events/dto/create-events.dto.ts b/apps/api/src/events/dto/create-events.dto.ts deleted file mode 100644 index eec3b7ca..00000000 --- a/apps/api/src/events/dto/create-events.dto.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; - -export class CreateEventDto { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - name: string; - - @ApiProperty() - description: JSON; - - @ApiProperty() - @IsString() - website: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - location: string; - - @ApiProperty() - @IsNumber() - ticketPrice: number; - - @ApiProperty() - @IsString() - @IsNotEmpty() - eventDate: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - isPaidEvent: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - lastDate: string; - - @ApiProperty() - @IsNumber() - @IsNotEmpty() - maxTicketCount: number; - - - -} diff --git a/apps/api/src/events/dto/publishForm.dto.ts b/apps/api/src/events/dto/publishForm.dto.ts deleted file mode 100644 index 10cc5f08..00000000 --- a/apps/api/src/events/dto/publishForm.dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsString, IsBoolean, IsNotEmpty } from 'class-validator'; - -export class ToggleFormPublishStatus { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsBoolean() - @IsNotEmpty() - shouldFormPublish: boolean; -} diff --git a/apps/api/src/events/dto/remove-user.dto.ts b/apps/api/src/events/dto/remove-user.dto.ts deleted file mode 100644 index ea62fce8..00000000 --- a/apps/api/src/events/dto/remove-user.dto.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsString } from 'class-validator'; - -export class RemoveUserDto { - @ApiProperty() - @IsString() - organizationId: string; - - @ApiProperty() - @IsString() - eventId: string; - - @ApiProperty() - @IsString() - userId: string; -} diff --git a/apps/api/src/events/dto/update-event.dto.ts b/apps/api/src/events/dto/update-event.dto.ts deleted file mode 100644 index e2d3b58e..00000000 --- a/apps/api/src/events/dto/update-event.dto.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class UpdateEventDto { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - eventSlug: string; - - @ApiProperty() - name: string; - - @ApiProperty() - description?: Record; - - @ApiProperty() - website: string; - - @ApiProperty() - location: string; - - @ApiProperty() - lastDate: Date; - - @ApiProperty() - isPublished: boolean; - - @ApiProperty() - maxTeamSize: number; - - @ApiProperty() - minTeamSize: number; - - @ApiProperty() - isCollegeEvent: boolean; - - @ApiProperty() - maxTicketCount: number; - - @ApiProperty() - eventDate: Date; - - @ApiProperty() - file: string; -} diff --git a/apps/api/src/events/events.controller.ts b/apps/api/src/events/events.controller.ts deleted file mode 100644 index 8f853309..00000000 --- a/apps/api/src/events/events.controller.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { - Body, - Controller, - Delete, - FileTypeValidator, - Get, - MaxFileSizeValidator, - Param, - ParseFilePipe, - Patch, - Post, - Query, - UploadedFile, - UseGuards, - UseInterceptors, -} from '@nestjs/common'; -import { FileInterceptor } from '@nestjs/platform-express'; -import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiTags } from '@nestjs/swagger'; -import { User } from '@prisma/client'; -import { EventsService } from './events.service'; -import { AuthUser } from '../auth/decorators/user.decorator'; -import { RbacGuard } from '../organization/guards/rbac-member.guard'; -import { CreateEventDto } from './dto/create-events.dto'; -import { Roles } from '../organization/decorators/roles.decorator'; -import { UpdateEventDto } from './dto/update-event.dto'; -import { RegisterEventDto } from './dto/register-event.dto'; -import { DeleteEventDto } from './dto/delete-event.dto'; -import { RemoveUserDto } from './dto/remove-user.dto'; -@Controller('events') -export class EventsController { - constructor(private readonly events: EventsService) {} - - @Get('/') - @ApiTags('events') - @ApiOperation({ summary: 'returns all upcoming events' }) - async getAllEvents(@Query('search') query) { - return await this.events.getAllEvents(query); - } - - @Get('/:eventId') - @ApiTags('events') - @ApiOperation({ summary: 'returns the specific event with slug' }) - async getEventByID(@Param('eventId') id: string) { - return await this.events.getEventBySlugId(id); - } - - @Post('/create') - @ApiOperation({ summary: 'create new events' }) - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async createNewEvent(@Body() data: CreateEventDto, @AuthUser() user: User) { - return await this.events.createEvent(data, user.uid); - } - - @Get('/publish/:orgID/:id') - @ApiTags('events') - @ApiOperation({ summary: 'publish event , by doing this we lets public to register for event' }) - @Roles('ADMIN', 'EDITOR') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async publishNewEvent(@Param('id') data: string) { - return await this.events.publishEvent(data); - } - @Patch('/edit') - @ApiOperation({ summary: 'update info of event' }) - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @UseInterceptors(FileInterceptor('file')) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async updateNewEvent(@Body() data: UpdateEventDto) { - return await this.events.updateEvent(data); - } - - @Post('/register') - @ApiTags('events') - @ApiOperation({ summary: 'Register for specific event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async registerEvent(@Body() data: RegisterEventDto, @AuthUser() user: User) { - return await this.events.registerEvent(data.eventId, user.uid); - } - - @Get('/participants/:orgID/:id') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiOperation({ summary: 'Get all participants of events' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getregisterDParticipants(@Param('id') id: string) { - return await this.events.getEventParticipants(id); - } - - @Delete('/participants/delete') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @ApiOperation({ summary: 'Remove participant from a event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async removePartcipent(@Body() data: RemoveUserDto) { - return await this.events.removeParticipant(data.eventId, data.userId); - } - - @Get('/status/:id') - @ApiTags('events') - @ApiOperation({ summary: 'Get if participant is registerd for event or not' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getUserEventStatus(@Param('id') slugId: string, @AuthUser() user: User) { - return await this.events.getEventRegistartionStatus(slugId, user.uid); - } - - @Get('/stats/:id') - @ApiTags('events') - @ApiOperation({ summary: 'Get event stats' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getEventStats(@Param('id') id: string) { - return await this.events.getEventStats(id); - } - - @Patch('/edit/cover') - @Roles('ADMIN', 'EDITOR') - @ApiTags('events') - @UseGuards(AuthGuard('jwt'), RbacGuard) - @UseInterceptors(FileInterceptor('file')) - @ApiOperation({ summary: 'Upload image for event cover page' }) - async uploadFile( - @UploadedFile( - new ParseFilePipe({ - // file size validators - validators: [ - new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' }), // support png,jpg,peg - new MaxFileSizeValidator({ maxSize: 1024 * 1024 * 4 }), // File size 4 megabytes - ], - }), - ) - file: Express.Multer.File, - @Query('event') event: string, - ) { - return await this.events.uploadEventCover(file, event); - } - - @Get('/ticket/:eventId') - @ApiTags('events') - @ApiOperation({ summary: 'return ticket info' }) - async getTicketInfo(@Param('eventId') eventId: string) { - return await this.events.getTicketInfo(eventId); - } - - @Delete('/delete/:id') - @Roles('ADMIN') - @ApiTags('events') - @UseGuards(AuthGuard('jwt'), RbacGuard) - @ApiOperation({ summary: 'Delete a event using event id' }) - async deleteEvent(@Param('id') eventId: string, @Body() _: DeleteEventDto) { - return await this.events.deleteEvent(eventId); - } -} diff --git a/apps/api/src/events/events.module.ts b/apps/api/src/events/events.module.ts deleted file mode 100644 index 2c6d1565..00000000 --- a/apps/api/src/events/events.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; -import { EventsService } from './events.service'; -import { PrismaModule } from '../prisma/prisma.module'; -import { CloudModule } from '../cloud/cloud.module'; -import { EventsController } from './events.controller'; -import { UploadMiddleWare } from './upload.middleware'; -import { StripeService } from '../stripe/stripe.service'; -import { AiModule } from '../ai/ai.module'; - -@Module({ - providers: [EventsService, StripeService], - imports: [PrismaModule, CloudModule, AiModule], - controllers: [EventsController], -}) -export class EventsModule implements NestModule { - configure(consumer: MiddlewareConsumer) { - consumer.apply(UploadMiddleWare).forRoutes(EventsController); - } -} diff --git a/apps/api/src/events/events.service.ts b/apps/api/src/events/events.service.ts deleted file mode 100644 index 48cd7a7c..00000000 --- a/apps/api/src/events/events.service.ts +++ /dev/null @@ -1,714 +0,0 @@ -import { - ConflictException, - Injectable, - InternalServerErrorException, - NotFoundException, - ServiceUnavailableException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { StripeService } from '../stripe/stripe.service'; -import { S3Service } from '../cloud/cloud.service'; -import { CreateEventDto } from './dto/create-events.dto'; -import { UpdateEventDto } from './dto/update-event.dto'; -import { GetEventByOrgDto, GetEventByOrgIdDto } from './dto/get-events.dto'; -import excludeKey from '../utils/exclude'; -import { Events, User } from '@prisma/client'; -import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; -import { AiService } from '../ai/ai.service'; - -@Injectable() -export class EventsService { - constructor( - private readonly prismaService: PrismaService, - private readonly cloudService: S3Service, - private readonly stripeService: StripeService, - private readonly eventEmitter: EventEmitter2, - private readonly AiService: AiService, - ) {} - - public async getEventById(id: string) { - return this.prismaService.events.findUnique({ - where: { - id, - }, - }); - } - - private async getEventBySlug(id: string) { - return this.prismaService.events.findUnique({ - where: { - slug: id, - }, - }); - } - - async createEvent(d: CreateEventDto, userId: string) { - try { - const isEventWithSlugExist = await this.getEventBySlug(d.name); - - const totalCount = await this.prismaService.events.aggregate({ - _count: true, - }); - - let slug: string; - - if (isEventWithSlugExist) { - slug = `${d.name}-${totalCount._count}`; - } else { - slug = d.name; - } - - await this.prismaService.organization.update({ - where: { - id: d.organizationId, - }, - data: { - events: { - create: { - name: d.name, - website: d.website, - location: d.location, - ticketPrice: d.ticketPrice, - slug, - eventDate: new Date(d.eventDate), - lastDate: new Date(d.lastDate), - maxTicketCount: d.maxTicketCount, - }, - }, - }, - }); - - const newEvent = await this.getEventBySlug(slug); - - this.eventEmitter.emit('event.created', newEvent, userId); - - return { - ok: true, - message: 'event created successfully', - data: newEvent, - }; - } catch (e) { - return { - ok: false, - message: 'could not create event', - ERROR: e, - }; - } - } - - async updateEvent(payload: UpdateEventDto) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - organizationId: payload.organizationId, - slug: payload.eventSlug, - }, - }); - - if (!event) { - throw new NotFoundException("Event doesn't exist"); - } - - const data = await this.prismaService.events.update({ - where: { - organizationId: payload.organizationId, - slug: payload.eventSlug, - }, - data: { - name: payload.name || event.name, - website: payload.website || event.website, - location: payload.location || event.location, - description: payload.description || event.description, - lastDate: payload.lastDate || event.lastDate, - isPublished: payload.hasOwnProperty('isPublished') - ? payload.isPublished - : event.isPublished, - maxTeamSize: payload.maxTeamSize || event.maxTeamSize, - minTeamSize: payload.minTeamSize || event.minTeamSize, - isCollegeEvent: payload.hasOwnProperty('isCollegeEvent') - ? payload.isCollegeEvent - : event.isCollegeEvent, - maxTicketCount: payload.maxTicketCount || event.maxTicketCount, - eventDate: payload.eventDate || event.eventDate, - }, - }); - - if (!data) { - throw new UnprocessableEntityException("Event couldn't be updated"); - } - - this.eventEmitter.emit('event.updated', data); - - return { - ok: true, - message: 'Event was updated successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message, - }); - } else if (e instanceof UnprocessableEntityException) { - throw new UnprocessableEntityException({ - ok: false, - message: e.message, - }); - } else { - throw new InternalServerErrorException({ - error: e, - }); - } - } - } - - async getAllEvents(query = '') { - try { - return await this.prismaService.events.findMany({ - where: { - name: { - contains: query, - mode: 'insensitive', - }, - lastDate: { - gte: new Date(), - }, - isPublished: true, - maxTicketCount: { - gt: 0, - }, - }, - orderBy: { - createdAt: 'asc', - }, - }); - } catch { - throw { - ok: false, - message: 'could not get events', - }; - } - } - - async getEventByOrgSlug(payload: GetEventByOrgDto) { - try { - return await this.prismaService.organization.findMany({ - where: { - slug: payload.slug, - }, - select: { - events: true, - }, - }); - } catch { - return null; - } - } - - async getEventByOrgsId(payload: GetEventByOrgIdDto) { - try { - return await this.prismaService.organization.findMany({ - where: { - id: payload.id, - }, - select: { - events: true, - members: true, - }, - }); - } catch { - return null; - } - } - - async publishEvent(eventSlug: string) { - try { - const data = await this.getEventBySlug(eventSlug); - - if (!data) { - throw new NotFoundException(); - } - - const { maxTicketCount, eventDate, lastDate } = data; - if (!maxTicketCount || !eventDate || !lastDate) { - throw new UnprocessableEntityException({ - message: 'please provide all required information for event', - }); - } - await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - isPublished: true, - }, - }); - - return { - ok: true, - message: 'event was published successfully', - }; - } catch (e) { - // Use exception filters to handle exceptions and return appropriate responses - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message, - }); - } else if (e instanceof UnprocessableEntityException) { - throw new UnprocessableEntityException({ - ok: false, - message: e.message, - }); - } else { - throw e; // Rethrow other exceptions - } - } - } - - async getEventBySlugId(slug: string) { - try { - const data = await this.prismaService.events.findUnique({ - where: { - slug, - }, - include: { - form: true, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - return { - ok: true, - message: 'event found successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message, - }); - } else if (e instanceof UnprocessableEntityException) { - throw new UnprocessableEntityException({ - ok: false, - message: e.message, - }); - } else { - throw e; // Rethrow other exceptions - } - } - } - - async registerEvent(eventSlug: string, userId: string) { - try { - const eventInfo = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - include: { - Ticket: { - where: { - userUid: userId, - }, - }, - }, - }); - - if (eventInfo.Ticket.length) { - throw new ConflictException(); - } - - if (eventInfo.maxTicketCount <= 0) { - throw new ServiceUnavailableException(); - } - - // when the event requires a form input we should check if the use has completed the form or not - // can only be done after creating the response schema - - // After this if the event has a ticket price we will redirect to stripe checkout - - if (eventInfo.ticketPrice > 0) { - // this will trigger another service layer from the stripeService Event emitter - return await this.stripeService.createCheckoutSession(eventInfo, userId); - } else { - const data = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - Ticket: { - create: { - userUid: userId, - }, - }, - maxTicketCount: eventInfo.maxTicketCount - 1, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event register successfully', - }; - } - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else if (e instanceof ServiceUnavailableException) { - throw new ServiceUnavailableException(); - } else if (e instanceof ConflictException) { - throw new ConflictException('user already registered'); - } else { - throw e; - } - } - } - - async getEventParticipants(slugId: string) { - try { - const userInfo = await this.prismaService.events.findUnique({ - where: { - slug: slugId, - }, - select: { - Ticket: { - select: { - user: true, - }, - }, - }, - }); - - if (!userInfo) { - throw new NotFoundException('Events not found'); - } - - const data = userInfo.Ticket.map((info) => - excludeKey(info.user, [ - 'refreshToken', - 'createdAt', - ]), - ); - - return { - ok: true, - message: 'members found successfully', - data: data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException('Event not found'); - } else { - throw e; - } - } - } - - async getEventRegistartionStatus(slugId: string, userId: string) { - try { - const data = await this.prismaService.events.findUnique({ - where: { - slug: slugId, - }, - select: { - Ticket: { - where: { - userUid: userId, - }, - }, - }, - }); - - if (!data || !data.Ticket.length) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'User found successfully', - isRegistred: true, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw new InternalServerErrorException({ - error: e, - }); - } - } - } - - async uploadEventCover(file: Express.Multer.File, eventSlug: string) { - try { - const publicUrl = await this.cloudService.uploadFile(file); - if (!publicUrl) { - return new InternalServerErrorException(); - } - - const updatedEventCover = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - coverImage: publicUrl, - }, - }); - - if (!updatedEventCover) { - throw new InternalServerErrorException(); - } - return { - ok: true, - data: updatedEventCover, - message: 'image uploaded successfully', - }; - } catch (e) { - if (e instanceof InternalServerErrorException) { - throw new InternalServerErrorException(); - } - } - } - - async getTicketInfo(id: string) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - id, - }, - select: { - eventDate: true, - description: true, - isCollegeEvent: true, - coverImage: true, - location: true, - name: true, - }, - }); - if (!event) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event schema found', - data: event, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - async deleteEvent(eventId: string) { - try { - const event = await this.getEventById(eventId); - // cant delete paid event till we figure out a way to process refund - // #TODO: @sreehari2003 add refund logic here - if (event.ticketPrice > 0) { - return new ServiceUnavailableException(); - } - - await this.prismaService.ticket.deleteMany({ - where: { - eventsId: eventId, - }, - }); - - await this.prismaService.events.delete({ - where: { - id: eventId, - }, - }); - - return { - ok: true, - message: 'event was deleted successfully', - }; - } catch (e) { - if (e instanceof ServiceUnavailableException) { - throw new ServiceUnavailableException({ - message: 'We dont support to delete a paid event', - }); - } - throw new InternalServerErrorException({ - error: e, - }); - } - } - - async removeParticipant(eventId: string, userId: string) { - try { - const isUserExist = await this.prismaService.ticket.findFirst({ - where: { - eventsId: eventId, - userUid: userId, - }, - }); - - if (!isUserExist) { - throw new NotFoundException(); - } - - await this.prismaService.ticket.delete({ - where: { - id: isUserExist.id, - }, - }); - - return { - ok: true, - message: 'user was removed successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw new ServiceUnavailableException(); - } - } - } - - async getEventStats(id: string) { - try { - const eventInfo = await this.prismaService.events.findUnique({ - where: { - slug: id, - }, - }); - - if (!eventInfo) throw new NotFoundException(); - - const insights = await this.prismaService.ticket.groupBy({ - by: ['createdAt'], - where: { - eventsId: eventInfo.id, - }, - _count: true, - }); - - const stats = await this.prismaService.user.aggregate({ - where: { - Ticket: { - some: { - eventsId: eventInfo.id, - }, - }, - }, - _count: true, - }); - - const totalRevenue = stats._count * eventInfo.ticketPrice; - - const data = { - totalRevenue: totalRevenue || 0, - totalTickets: stats._count || 0, - insights: this.aggregateCountsByDay(insights), - }; - - return { - data, - message: 'Data Found successfully', - }; - } catch { - throw new NotFoundException(); - } - } - private aggregateCountsByDay(responses: Insights[]) { - const aggregatedCounts = {}; - - responses.forEach((response) => { - // Extract the date part from createdAt - const date = new Date(response.createdAt).toISOString().split('T')[0]; - - // Initialize count for the day if not exists - if (!aggregatedCounts[date]) { - aggregatedCounts[date] = 0; - } - - // Add count to the existing count for the day - aggregatedCounts[date] += response._count; - }); - - return aggregatedCounts; - } - - @OnEvent('event.updated') - async handleEventUpdated(event: Events) { - const embedDescription = await this.AiService.generateEmbedding( - JSON.stringify(event.description), - ); - const embedName = await this.AiService.generateEmbedding(JSON.stringify(event.name)); - await this.prismaService - .$queryRaw`UPDATE public."Events" SET embedding_description = ${embedDescription} WHERE id = ${event.id}`; - await this.prismaService - .$queryRaw`UPDATE public."Events" SET embedding_title = ${embedName} WHERE id = ${event.id}`; - } - - @OnEvent('event.created') - async addSeedKanbanBoards(newEvent: Events, userId: string) { - // By default these kanban boards are created for each event - await this.prismaService.events.update({ - where: { - id: newEvent.id, - }, - data: { - kanban: { - createMany: { - data: [ - { - userUid: userId, - title: 'Todo', - }, - { - userUid: userId, - title: 'In process', - }, - { - userUid: userId, - title: 'completed', - }, - ], - }, - }, - }, - }); - } - - async deleteForm(slug: string) { - try { - await this.prismaService.events.update({ - where: { - slug, - }, - data: { - form: { - deleteMany: {}, - }, - }, - }); - return { - ok: true, - message: 'form deleted successfully', - }; - } catch { - throw new InternalServerErrorException(); - } - } -} - -type Insights = { - _count: number; - createdAt: Date; -}; diff --git a/apps/api/src/events/upload.middleware.ts b/apps/api/src/events/upload.middleware.ts deleted file mode 100644 index 311c859d..00000000 --- a/apps/api/src/events/upload.middleware.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable, NestMiddleware } from '@nestjs/common'; -import { Request, Response, NextFunction } from 'express'; - -@Injectable() -export class UploadMiddleWare implements NestMiddleware { - use(req: Request, _: Response, next: NextFunction) { - let url = new URL(process.env.API_BASE_URL + req.originalUrl); - // // Access the extracted parameters this is done to upload files to events - if (!req.body.organizationId) { - req.body = { - ...req.body, - }; - req.body.organizationId = url.searchParams.get('org'); - } - - next(); - } -} diff --git a/apps/api/src/form/dto/create-form.dto.ts b/apps/api/src/form/dto/create-form.dto.ts deleted file mode 100644 index 6a3313a3..00000000 --- a/apps/api/src/form/dto/create-form.dto.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { FieldType } from '@prisma/client'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class FormPayLoad { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - eventId: string; - - data: Payload; -} - -class Payload { - label: string; - placeholder?: string; - options?: Array; - required: boolean; - type: FieldType; -} diff --git a/apps/api/src/form/dto/publish-form.dto.ts b/apps/api/src/form/dto/publish-form.dto.ts deleted file mode 100644 index 10cc5f08..00000000 --- a/apps/api/src/form/dto/publish-form.dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsString, IsBoolean, IsNotEmpty } from 'class-validator'; - -export class ToggleFormPublishStatus { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsBoolean() - @IsNotEmpty() - shouldFormPublish: boolean; -} diff --git a/apps/api/src/form/form.controller.ts b/apps/api/src/form/form.controller.ts deleted file mode 100644 index d1adccaf..00000000 --- a/apps/api/src/form/form.controller.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - InternalServerErrorException, - NotFoundException, - Param, - Post, - UseGuards, -} from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiTags } from '@nestjs/swagger'; -import { Roles } from 'src/organization/decorators/roles.decorator'; -import { RbacGuard } from 'src/organization/guards/rbac-member.guard'; -import { FormService } from './form.service'; -import { EventsService } from '../events/events.service'; -import { FormPayLoad } from './dto/create-form.dto'; -import { User } from '@prisma/client'; -import { AuthUser } from 'src/auth/decorators/user.decorator'; -import { ToggleFormPublishStatus } from './dto/publish-form.dto'; - -@Controller('/events') -export class FormController { - constructor( - private form: FormService, - private events: EventsService, - ) {} - - @Get('/form/:orgID/:eventId') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiOperation({ summary: 'get form schema of a specific event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getFormSchema(@Param('eventId') slugId: string) { - return await this.form.getEventFormScheme(slugId); - } - - @Post('/form/:eventId') - @ApiTags('events') - @ApiOperation({ summary: 'users register form via this route' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async postFormResponse( - @Param('eventId') eventId: string, - @Body() data: Record>, - @AuthUser() user: User, - ) { - try { - const event = await this.events.getEventById(eventId); - if (event.maxTicketCount < 1) { - throw new NotFoundException(); - } - await this.form.addUserFormSubmission(data, eventId, user.uid); - return await this.events.registerEvent(event.slug, user.uid); - } catch (e) { - if (e instanceof NotFoundException) throw new NotFoundException(); - - throw new InternalServerErrorException(); - } - } - - @Post('/publish/form/:id') - @ApiTags('events') - @ApiOperation({ summary: 'publish event , by doing this we lets public to register for event' }) - @Roles('ADMIN', 'EDITOR') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async publishForm(@Param('id') data: string, @Body() payload: ToggleFormPublishStatus) { - return await this.form.toggleFormPublishStatus(data, payload.shouldFormPublish); - } - - @Post('/form') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @ApiOperation({ summary: 'Create form for each event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async createForm(@Body() payload: FormPayLoad) { - return await this.form.createForm(payload); - } - - @Get('/participants/:orgID/:id/:userId/form') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiOperation({ summary: 'Get all the form submission from participant' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getRegisteredParticipantsFormSubmissions( - @Param('id') id: string, - @Param('userId') uid: string, - ) { - return await this.form.getRegisteredParticipantsFormSubmissions(id, uid); - } - - @Delete('/form/bulk-delete/:slug') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @ApiOperation({ summary: 'Bulk delete form for each event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async bulkDeleteForm(@Param('slug') eventName: string) { - return await this.events.deleteForm(eventName); - } -} diff --git a/apps/api/src/form/form.module.ts b/apps/api/src/form/form.module.ts deleted file mode 100644 index 81cc428a..00000000 --- a/apps/api/src/form/form.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Module } from '@nestjs/common'; -import { PrismaModule } from '../prisma/prisma.module'; -import { AiModule } from '../ai/ai.module'; -import { FormController } from './form.controller'; -import { FormService } from './form.service'; -import { EventsService } from '../events/events.service'; -import { EventsModule } from '../events/events.module'; -import { S3Service } from '../cloud/cloud.service'; -import { StripeService } from '../stripe/stripe.service'; - -@Module({ - providers: [FormService, EventsService, S3Service, StripeService], - imports: [PrismaModule, AiModule, EventsModule], - controllers: [FormController], -}) -export class FormModule {} diff --git a/apps/api/src/form/form.service.ts b/apps/api/src/form/form.service.ts deleted file mode 100644 index e1152ec9..00000000 --- a/apps/api/src/form/form.service.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { Injectable, InternalServerErrorException, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { AiService } from '../ai/ai.service'; -import { EventsService } from '../events/events.service'; -import { FormPayLoad } from './dto/create-form.dto'; - -@Injectable() -export class FormService { - constructor( - private readonly prismaService: PrismaService, - private readonly AiService: AiService, - private readonly EventService: EventsService, - ) {} - - async createForm(data: FormPayLoad) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - organizationId: data.organizationId, - id: data.eventId, - }, - }); - - if (!event) { - throw new NotFoundException(); - } - - const formSchema = await this.prismaService.field.create({ - data: { - label: data.data.label, - placeholder: data.data.placeholder, - required: data.data.required, - type: data.data.type, - options: data.data.options, - Events: { - connect: { - id: data.eventId, - }, - }, - }, - }); - - return { - ok: true, - message: 'schema updated successfully', - data: formSchema, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - async toggleFormPublishStatus(eventSlug: string, shouldPublish: boolean) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - select: { - form: true, - }, - }); - if (!event) { - throw new NotFoundException(); - } - - if (!event.form.length) { - throw new InternalServerErrorException(); - } - - const newEventStatus = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - isFormPublished: shouldPublish, - }, - }); - - return { - ok: 'true', - message: 'form status was changed', - data: newEventStatus, - }; - } catch (e) { - if (e instanceof InternalServerErrorException) { - throw new InternalServerErrorException({ - message: 'Please create a form schema to publish the form', - }); - } - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } - - return e; - } - } - - async getEventFormScheme(eventSlug: string) { - try { - const eventSchema = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - select: { - form: true, - }, - }); - - if (!eventSchema) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event schema found', - data: eventSchema.form, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - public async addUserFormSubmission( - info: Record>, - eventId: string, - userId: string, - ) { - const event = await this.EventService.getEventById(eventId); - if (!event) return new NotFoundException(); - - await this.prismaService.response.create({ - data: { - data: info, - user: { - connect: { - uid: userId, - }, - }, - Events: { - connect: { - id: event.id, - }, - }, - }, - }); - } - - async getRegisteredParticipantsFormSubmissions(id: string, userId: string) { - try { - const schema = await this.prismaService.events.findUnique({ - where: { - slug: id, - }, - select: { - form: true, - id: true, - }, - }); - - const label = {}; - schema.form.forEach((el) => { - label[el.id] = el.label; - }); - - const data = await this.prismaService.response.findMany({ - where: { - userUid: userId, - eventsId: schema.id, - }, - }); - if (!data) return new NotFoundException(); - - const result = {}; - - schema.form.forEach((el) => { - // @ts-ignore - if (data[0] && el.id in data[0].data) { - result[el.label] = data[0].data[el.id]; - } - }); - - return { - ok: true, - data: result, - message: 'received form successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } -} diff --git a/apps/api/src/kanban/dto/create-task.dto.ts b/apps/api/src/kanban/dto/create-task.dto.ts deleted file mode 100644 index b3a282e5..00000000 --- a/apps/api/src/kanban/dto/create-task.dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { Prisma } from '@prisma/client'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class CreateTask { - @ApiProperty() - @IsString() - @IsNotEmpty() - title: string; - - @ApiProperty() - @IsNotEmpty() - data: Prisma.JsonValue; -} diff --git a/apps/api/src/kanban/kanban.controller.ts b/apps/api/src/kanban/kanban.controller.ts deleted file mode 100644 index 77e39a43..00000000 --- a/apps/api/src/kanban/kanban.controller.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; -import { KanbanService } from './kanban.service'; -import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiTags } from '@nestjs/swagger'; -import { RbacGuard } from '../organization/guards/rbac-member.guard'; -import { CreateTask } from './dto/create-task.dto'; -import { AuthUser } from '../auth/decorators/user.decorator'; -import { User } from '@prisma/client'; - -@Controller('/events/kanban') -export class KanbanController { - constructor(private kanbanService: KanbanService) {} - - @ApiOperation({ summary: 'get all kanban boards associated with a event' }) - @ApiTags('kanban') - @UseGuards(AuthGuard('jwt'), RbacGuard) - @Get('/:slug') - async getAllBoards(@Param('slug') slug: string) { - return await this.kanbanService.getAllBoards(slug); - } - - @ApiOperation({ summary: 'create a new task in kanban board' }) - @ApiTags('kanban') - @UseGuards(AuthGuard('jwt'), RbacGuard) - @Post('/:slug/:boardId') - async createTask( - @Param('slug') slug: string, - @Param('boardId') boardId: string, - @Body() payload: CreateTask, - @AuthUser() user: User, - ) { - return await this.kanbanService.createTask(payload, slug, boardId, user.uid); - } -} diff --git a/apps/api/src/kanban/kanban.module.ts b/apps/api/src/kanban/kanban.module.ts deleted file mode 100644 index b23c431d..00000000 --- a/apps/api/src/kanban/kanban.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { KanbanService } from './kanban.service'; -import { PrismaModule } from '../prisma/prisma.module'; -import { KanbanController } from './kanban.controller'; - -@Module({ - providers: [KanbanService], - imports: [PrismaModule], - controllers: [KanbanController], -}) -export class KanbanModule {} diff --git a/apps/api/src/kanban/kanban.service.ts b/apps/api/src/kanban/kanban.service.ts deleted file mode 100644 index 985d40bb..00000000 --- a/apps/api/src/kanban/kanban.service.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { Injectable, InternalServerErrorException, NotFoundException } from '@nestjs/common'; -import { Comment, Prisma } from '@prisma/client'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateTask } from './dto/create-task.dto'; - -@Injectable() -export class KanbanService { - constructor(private prismaService: PrismaService) {} - - async getAllBoards(slug: string) { - try { - const allBoards = await this.prismaService.events.findUnique({ - where: { - slug, - }, - select: { - kanban: { - include: { - tasks: { - include: { - createdBy: { - select: { - email: true, - displayName: true, - photoURL: true, - }, - }, - Comment: true, - }, - }, - createdBy: { - select: { - email: true, - displayName: true, - photoURL: true, - }, - }, - _count: true, - }, - orderBy: { - createdAt: 'asc', - }, - }, - }, - }); - - if (!allBoards) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Boards found', - data: allBoards.kanban, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } - - throw new InternalServerErrorException({ - error: e, - }); - } - } - - async createTask(payload: CreateTask, slug: string, kanbanId: string, user: string) { - try { - const newKanban = await this.prismaService.events.update({ - where: { - slug, - }, - data: { - kanban: { - update: { - where: { - id: kanbanId, - }, - data: { - tasks: { - create: { - title: payload.title, - userUid: user, - }, - }, - }, - }, - }, - }, - }); - if (!newKanban) throw new InternalServerErrorException(); - - const newTask = await this.prismaService.task.findFirst({ - where: { - userUid: user, - kanbanId: kanbanId, - title: payload.title, - }, - }); - - await this.addComment(newTask.id, payload.data, user); - - return { - ok: true, - message: 'task was added successfully', - }; - } catch { - throw new InternalServerErrorException(); - } - } - - async addComment(taskId: string, comment: Prisma.JsonValue, userId: string) { - try { - const newComment = await this.prismaService.task.update({ - where: { - id: taskId, - }, - data: { - Comment: { - create: { - data: comment, - userUid: userId, - }, - }, - }, - }); - - if (!newComment) throw new InternalServerErrorException(); - - return { - ok: true, - message: 'comment was added', - }; - } catch (e) { - throw new InternalServerErrorException({ - error: e, - }); - } - } -} diff --git a/apps/api/src/mail/mail.module.ts b/apps/api/src/mail/mail.module.ts deleted file mode 100644 index 74ee72e5..00000000 --- a/apps/api/src/mail/mail.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { MailerModule } from '@nestjs-modules/mailer'; -import { Module } from '@nestjs/common'; -import { MailService } from './mail.service'; -import { join } from 'path'; -import { ReactAdapter } from '@webtre/nestjs-mailer-react-adapter'; -import { ConfigService } from '@nestjs/config'; - -@Module({ - imports: [ - MailerModule.forRootAsync({ - useFactory: async (configService: ConfigService) => ({ - transport: { - host: configService.get('MAIL_HOST'), - port: configService.get('MAIL_PORT'), - secure: false, - auth: { - user: configService.get('MAIL_USER'), - pass: configService.get('MAIL_PASSWORD'), - }, - tls: { - rejectUnauthorized: false, - }, - }, - defaults: { - from: configService.get('MAIL_FROM'), - }, - template: { - dir: join(__dirname, 'templates'), - adapter: new ReactAdapter({ - pretty: false, - plainText: false, - }), - options: { - strict: true, - }, - }, - }), - inject: [ConfigService], - }), - ], - providers: [MailService], - exports: [MailService], // 👈 export for DI -}) -export class MailModule {} diff --git a/apps/api/src/mail/mail.service.ts b/apps/api/src/mail/mail.service.ts deleted file mode 100644 index 90214d2d..00000000 --- a/apps/api/src/mail/mail.service.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { MailerService } from '@nestjs-modules/mailer'; -import { Injectable } from '@nestjs/common'; -import { OnEvent } from '@nestjs/event-emitter'; - -@Injectable() -export class MailService { - constructor(private readonly mailerService: MailerService) {} - - @OnEvent('org.invite') - async onOrgInvite(payload: OrgInviteEvent) { - await this.mailerService.sendMail({ - to: payload.to, - subject: `You have been invited to Join ${payload.orgName}`, - template: 'org-invite', - context: { - from: payload.from, - fromEmail: payload.fromEmail, - orgName: payload.orgName, - inviteUrl: payload.inviteUrl, - }, - }); - } - - @OnEvent('user.registered') - async onUserRegistered(payload: UserRegisteredEvent) { - await this.mailerService.sendMail({ - to: payload.email, - subject: 'Welcome to Fossfolio', - template: 'welcome', - context: { - name: payload.name, - email: payload.email, - avatarUrl: payload.avatarUrl, - }, - }); - } - - @OnEvent('payment.success') - async onPaymentSuccess(payload: PaymentSuccessEvent) { - await this.mailerService.sendMail({ - to: payload.email, - subject: 'Payment Success', - template: 'payment-succesfull', - context: { - from: payload.from, - email: payload.email, - amount: payload.amount, - }, - }); - } -} - -export interface OrgInviteEvent { - inviteUrl: string; - from: string; - orgName: string; - fromEmail: string; - to: string; -} - -export interface UserRegisteredEvent { - email: string; - name: string; - avatarUrl: string; -} - -export interface PaymentSuccessEvent{ - from : string; - email : string; - amount : number; -} \ No newline at end of file diff --git a/apps/api/src/mail/templates/org-invite.tsx b/apps/api/src/mail/templates/org-invite.tsx deleted file mode 100644 index b4559d82..00000000 --- a/apps/api/src/mail/templates/org-invite.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Heading, - Hr, - Html, - Img, - Link, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { OrgInviteEvent } from '../mail.service'; -import React from 'react'; - -const baseUrl = process.env.CLIENT_URL ? `https://${process.env.CLIENT_URL}` : 'fossfolio.com'; - -const InviteUserEmail = ({ from, fromEmail, orgName, inviteUrl }: OrgInviteEvent) => { - const previewText = `Join ${orgName} on Fossfolio`; - - return ( - - - {previewText} - - - -
- Fossfolio -
- - Join {orgName} on Fossfolio - - Hello, - - {from} ( - - {fromEmail} - - ) has invited you to the {orgName} Organisation on{' '} - Fossfolio. - -
- -
- - or copy and paste this URL into your browser:{' '} - - {inviteUrl} - - -
-
- -
- - ); -}; - -export default InviteUserEmail; diff --git a/apps/api/src/mail/templates/payment-succesfull.tsx b/apps/api/src/mail/templates/payment-succesfull.tsx deleted file mode 100644 index e95dec5e..00000000 --- a/apps/api/src/mail/templates/payment-succesfull.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Heading, - Hr, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { PaymentSuccessEvent } from '../mail.service'; -import React from 'react'; - -const baseUrl = process.env.CLIENT_URL ? `${process.env.CLIENT_URL}` : 'fossfolio.com'; - -const InviteUserEmail = ({ from, amount }: PaymentSuccessEvent) => { - return ( - - - Payment Successsfull - - - -
- Fossfolio -
- - Payment Successsfull - - Hello, - - Congratulations {from}! -
- Your payment of ₹ {amount} was successfull. You can find your tickets in - the website below -
-
- -
- -
-
- -
- - ); -}; - -export default InviteUserEmail; diff --git a/apps/api/src/mail/templates/welcome.tsx b/apps/api/src/mail/templates/welcome.tsx deleted file mode 100644 index 4d53dfca..00000000 --- a/apps/api/src/mail/templates/welcome.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Heading, - Hr, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { UserRegisteredEvent } from '../mail.service'; -import React from 'react'; - -const baseUrl = process.env.CLIENT_URL ? `${process.env.CLIENT_URL}` : 'fossfolio.com'; - -const UserWelcome = ({ name, email, avatarUrl }: UserRegisteredEvent) => { - const previewText = `Welcome to Fossfolio`; - - return ( - - - {previewText} - - - -
- Fossfolio -
- - Welcome to Fossfolio - - Hello, {name} - - You have successfully registered for Fossfolio. We are glad to have you - on board. You can now explore the events and start exploring the - community. - -
- -
-
-
- -
- - ); -}; - -export default UserWelcome; diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index c1cbe8cf..45faf24f 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -1,46 +1,52 @@ -import session from 'express-session'; +import * as session from 'express-session'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; -import cookieParser from 'cookie-parser'; +import * as cookieParser from 'cookie-parser'; import * as express from 'express'; import { ValidationPipe } from '@nestjs/common'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import * as process from 'node:process'; +import BaseContext from '@api/BaseContext'; +import { NestExpressApplication } from '@nestjs/platform-express'; async function bootstrap() { - const app = await NestFactory.create(AppModule, { - bufferLogs: true, - }); + const app = await NestFactory.create(AppModule, { + bufferLogs: true, + }); - app.use( - session({ - secret: process.env.SESSION_SECRET as string, - resave: false, - saveUninitialized: false, - }), - ); - app.use(cookieParser()); - app.useGlobalPipes(new ValidationPipe()); - // prevent body parsing in stripe webhook route to access the stripe signature as buffer - app.use('/api/payment/webhook', express.raw({ type: '*/*' })); - app.setGlobalPrefix('api'); - app.enableCors({ - origin: process.env.CLIENT_URL || 'http://localhost:3000', - credentials: true, - }); + await BaseContext.init(); - const config = new DocumentBuilder() - .setTitle('FOSSFOLIO') - .setDescription( - 'An open source web application for people to Find, Host and Manage Events,Hackathons.', - ) - .setVersion('1.0') - .build(); - const document = SwaggerModule.createDocument(app, config); - SwaggerModule.setup('api/docs', app, document); + app.use( + session({ + secret: process.env.SESSION_SECRET as string, + resave: false, + saveUninitialized: false, + }), + ); + app.use(cookieParser()); + app.useGlobalPipes(new ValidationPipe()); + // prevent body parsing in stripe webhook route to access the stripe signature as buffer + app.use('/api/payment/webhook', express.raw({ type: '*/*' })); + app.setGlobalPrefix('api'); + app.enableCors({ + origin: process.env.CLIENT_URL || 'http://localhost:3000', + credentials: true, + }); - await app.listen( - (process.env.PORT as string) || 8080, - (process.env.HOST as string) || '0.0.0.0', - ); + const config = new DocumentBuilder() + .setTitle('FossFolio') + .setDescription( + 'An open source web application for people to Find, Host and Manage Events.', + ) + .setVersion('1.0') + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('api/docs', app, document); + + await app.listen( + (process.env.PORT as string) || 8080, + (process.env.HOST as string) || '0.0.0.0', + ); } + bootstrap(); diff --git a/apps/api/src/middleware/upload.middleware.ts b/apps/api/src/middleware/upload.middleware.ts new file mode 100644 index 00000000..f2fc5187 --- /dev/null +++ b/apps/api/src/middleware/upload.middleware.ts @@ -0,0 +1,18 @@ +import { Injectable, type NestMiddleware } from '@nestjs/common'; +import type { Request, Response, NextFunction } from 'express'; + +@Injectable() +export class UploadMiddleWare implements NestMiddleware { + use(req: Request, _: Response, next: NextFunction) { + const url = new URL(process.env.API_BASE_URL + req.originalUrl); + // // Access the extracted parameters this is done to upload files to events + if (!req.body.organizationId) { + req.body = { + ...req.body, + }; + req.body.organizationId = url.searchParams.get('org'); + } + + next(); + } +} diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts new file mode 100644 index 00000000..d4b662c4 --- /dev/null +++ b/apps/api/src/models/BaseModel.ts @@ -0,0 +1,104 @@ +import BaseContext from '@api/BaseContext'; +import { Logger } from '@nestjs/common'; +import { generateID, SystemTable } from '@api/utils/db'; +import { CreateSchema, UpdateSchema } from '@api/db/schema'; + +export default function createBaseModel( + tableName: SystemTable, +) { + abstract class BaseModel { + logger: Logger; + + constructor(logger?: Logger) { + this.logger = logger || new Logger(); + } + + static async findById(id: string): Promise { + const data = await BaseContext.knex(tableName) + .where(id) + .andWhere('is_deleted', false) + .first(); + return (data as M) || null; + } + + static async find(where: Partial): Promise { + const data = await BaseContext.knex(tableName) + .where(where) + .andWhere('is_deleted', false); + return data as M[]; + } + + static async create(data: CreateSchema): Promise { + const insertData = { + ...data, + id: generateID(tableName), + }; + const res = await BaseContext.knex(tableName) + .insert(insertData) + .returning('*'); + return res[0] as M; + } + + static async update( + where: Partial, + data: UpdateSchema, + ): Promise { + const res = await BaseContext.knex(tableName) + .where(where) + .update(data) + .returning('*'); + return res as M[]; + } + + static async delete(where: Partial) { + if (!where || Object.keys(where).length === 0) { + throw new Error('Where clause is required for delete operation'); + } + await BaseContext.knex(tableName) + .where(where) + // @ts-ignore + .update({ is_deleted: true }); + return 1; + } + + static async dangerousHardDelete(where: Partial) { + if (!where || Object.keys(where).length === 0) { + throw new Error('Where clause is required for dangerousHardDelete'); + } + return BaseContext.knex(tableName).where(where).del(); + } + + static async count(where: Partial): Promise { + const data = await BaseContext.knex(tableName) + .where(where) + .andWhere('is_deleted', false) + .count(); + return Number.parseInt(data[0].count as string, 10); + } + + static async findPaginated( + where: Partial, + page: number, + limit: number, + ): Promise { + const data = await BaseContext.knex(tableName) + .where(where) + .andWhere('is_deleted', false) + .limit(limit) + .offset((page - 1) * limit); + return data as M[]; + } + + static async dangerousRawQuery(query: string) { + if (!query.toLowerCase().includes(tableName)) { + throw new Error('Only raw queries for the current table are allowed'); + } + if (!query.toLowerCase().includes('where')) { + throw new Error('Raw query must contain a where clause'); + } + return BaseContext.knex.raw(query); + } + } + + return BaseModel; +} diff --git a/apps/api/src/models/User.ts b/apps/api/src/models/User.ts new file mode 100644 index 00000000..cfd0e0ee --- /dev/null +++ b/apps/api/src/models/User.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { User } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class UserModel extends BaseModel( + SystemTable.User, +) { + constructor() { + const logger = new Logger('UserModel'); + super(logger); + } +} diff --git a/apps/api/src/modules/root.module.ts b/apps/api/src/modules/root.module.ts new file mode 100644 index 00000000..fdc48d1c --- /dev/null +++ b/apps/api/src/modules/root.module.ts @@ -0,0 +1,171 @@ +import { Module } from '@nestjs/common'; +import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { LoggerModule } from 'nestjs-pino'; +import { APP_GUARD } from '@nestjs/core'; +import { AuthController } from '../controllers/auth.controller'; +import { AuthService } from '../services/auth/auth.service'; +import { GithubStrategy } from '../services/auth/strategy/github.strategy'; +import { GoogleStrategy } from '../services/auth/strategy/google.strategy'; +import { SamlStrategy } from '../services/auth/strategy/saml.strategy'; +import { UserService } from '../services/user.service'; +import { JwtStrategy } from '../services/auth/strategy/jwt.strategy'; +import { RefreshStrategy } from '../services/auth/strategy/refresh.strategy'; +import { PassportModule } from '@nestjs/passport'; +import { JwtModule } from '@nestjs/jwt'; +import { AiController } from '../controllers/ai.controller'; +import { AiService } from '../services/ai.service'; +import { S3Service } from '../services/cloud.service'; +import { EventsController } from '../controllers/events.controller'; +import { StripeService } from '../services/stripe.service'; +import { EventsService } from '../services/events.service'; +import { FormService } from '../services/form.service'; +import { FormController } from '../controllers/form.controller'; +import { KanbanService } from '../services/kanban.service'; +import { KanbanController } from '../controllers/kanban.controller'; +import { MailService } from '../services/mail/mail.service'; +import { MailerModule } from '@nestjs-modules/mailer'; +import { join } from 'node:path'; +import { ReactAdapter } from '@webtre/nestjs-mailer-react-adapter'; +import { OrganizationInviteService } from '../services/org-invite.service'; +import { OrgInviteController } from '../controllers/org-invite.controller'; +import { OrgMemberController } from '../controllers/org-member.controller'; +import { OrganizationMemberService } from '../services/org-member.service'; +import { OrganizationService } from '../services/organization.service'; +import { OrganizationController } from '../controllers/organization.controller'; +import { PrismaService } from '../services/prisma.service'; +import { StripeController } from '../controllers/stripe.controller'; +import { UserController } from '../controllers/user.controller'; +import * as Joi from 'joi'; + +const AuthProviders = [ + AuthService, + GithubStrategy, + GoogleStrategy, + SamlStrategy, + UserService, + JwtStrategy, + RefreshStrategy, +]; + +const AuthModules = [ + PassportModule, + JwtModule.register({ + secret: process.env.JWT_SECRET, + signOptions: { expiresIn: process.env.ACCESS_TOKEN_VALIDITY }, + }), +]; + +const GlobalModules = [ + ConfigModule.forRoot({ + isGlobal: true, + validationSchema: Joi.object({ + DATABASE_URL: Joi.string(), + GITHUB_CLIENT_ID: Joi.string(), + GITHUB_CLIENT_SECRET: Joi.string(), + GITHUB_CALLBACK_URL: Joi.string(), + GITHUB_SCOPE: Joi.string(), + ACCESS_TOKEN_VALIDITY: Joi.string(), + API_BASE_URL: Joi.string(), + GOOGLE_CLIENT_ID: Joi.string(), + GOOGLE_CLIENT_SECRET: Joi.string(), + GOOGLE_CALLBACK_URL: Joi.string(), + GOOGLE_SCOPE: Joi.string(), + WEB_URL: Joi.string(), + MAIL_HOST: Joi.string(), + MAIL_PORT: Joi.number(), + MAIL_USER: Joi.string(), + MAIL_PASSWORD: Joi.string(), + AWS_ACCESS_KEY: Joi.string(), + AWS_SECRET_KEY: Joi.string(), + AWS_REGION: Joi.string(), + STRIPE_SECRET_KEY: Joi.string(), + STRIPE_WEBHOOK_SECRET: Joi.string(), + AI_KEY: Joi.string(), + }), + validationOptions: { + allowUnknown: true, + abortEarly: true, + }, + }), + EventEmitterModule.forRoot(), + ThrottlerModule.forRoot([ + { + ttl: 60000, + limit: 50, + }, + ]), + LoggerModule.forRoot({ + pinoHttp: { + level: 'info', + redact: ['req.headers', 'req.remoteAddress', 'res.headers'], + }, + }), + MailerModule.forRootAsync({ + useFactory: async (configService: ConfigService) => ({ + transport: { + host: configService.get('MAIL_HOST'), + port: configService.get('MAIL_PORT'), + secure: false, + auth: { + user: configService.get('MAIL_USER'), + pass: configService.get('MAIL_PASSWORD'), + }, + tls: { + rejectUnauthorized: false, + }, + }, + defaults: { + from: configService.get('MAIL_FROM'), + }, + template: { + dir: join(__dirname, 'templates'), + adapter: new ReactAdapter({ + pretty: false, + plainText: false, + }), + options: { + strict: true, + }, + }, + }), + inject: [ConfigService], + }), +]; + +@Module({ + imports: [...GlobalModules, ...AuthModules], + controllers: [ + AuthController, + AiController, + EventsController, + FormController, + KanbanController, + OrgInviteController, + OrgMemberController, + OrganizationController, + StripeController, + UserController, + ], + providers: [ + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, + ...AuthProviders, + AiService, + S3Service, + StripeService, + EventsService, + FormService, + KanbanService, + MailService, + OrganizationInviteService, + OrganizationMemberService, + OrganizationService, + PrismaService, + UserService, + ], +}) +export class RootModule {} diff --git a/apps/api/src/org-invite/dto/user-invite.dto.ts b/apps/api/src/org-invite/dto/user-invite.dto.ts deleted file mode 100644 index aff86372..00000000 --- a/apps/api/src/org-invite/dto/user-invite.dto.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { Role } from '@prisma/client'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class OrgInvie { - @ApiProperty() - @IsNotEmpty() - @IsString() - email: string; - - @ApiProperty({ - enum: Role, - }) - @IsNotEmpty() - role: Role; - - @ApiProperty() - @IsNotEmpty() - @IsString() - organizationId: string; -} diff --git a/apps/api/src/org-invite/org-invite.controller.ts b/apps/api/src/org-invite/org-invite.controller.ts deleted file mode 100644 index 3fd376ed..00000000 --- a/apps/api/src/org-invite/org-invite.controller.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common'; -import { RbacGuard } from '../organization/guards/rbac-member.guard'; -import { Roles } from '../organization/decorators/roles.decorator'; -import { OrganizationInviteService } from './org-invite.service'; -import { AuthUser } from '../auth/decorators/user.decorator'; -import { OrgInvie } from './dto/user-invite.dto'; -import { AuthGuard } from '@nestjs/passport'; -import { User } from '@prisma/client'; - -@Controller('org/invite') -export class OrgInviteController { - constructor(private readonly service: OrganizationInviteService) {} - - @Post('/') - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async sendInvite(@AuthUser() user: User, @Body() data: OrgInvie) { - return this.service.inviteToOrg(data.email, user.uid, data.organizationId, data.role); - } - - @Get('/verify') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async verfyEmail(@AuthUser() user: User, @Query() { id }) { - return this.service.verifyEmailInvite(id, user.uid, user.email); - } -} diff --git a/apps/api/src/org-invite/org-invite.module.ts b/apps/api/src/org-invite/org-invite.module.ts deleted file mode 100644 index 3423ba20..00000000 --- a/apps/api/src/org-invite/org-invite.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { OrganizationInviteService } from './org-invite.service'; -import { PrismaModule } from '../prisma/prisma.module'; -import { OrgInviteController } from './org-invite.controller'; - -@Module({ - providers: [OrganizationInviteService], - imports: [PrismaModule], - controllers: [OrgInviteController], -}) -export class OrganizationInviteModule {} diff --git a/apps/api/src/org-invite/org-invite.service.ts b/apps/api/src/org-invite/org-invite.service.ts deleted file mode 100644 index c9c27249..00000000 --- a/apps/api/src/org-invite/org-invite.service.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { PrismaService } from '../prisma/prisma.service'; -import { Injectable, ServiceUnavailableException } from '@nestjs/common'; -import { Role } from '@prisma/client'; -import { EventEmitter2 } from '@nestjs/event-emitter'; - -@Injectable() -export class OrganizationInviteService { - constructor( - private readonly prismaService: PrismaService, - private readonly eventEmitter: EventEmitter2, - ) {} - - async inviteToOrg(email: string, inviterid: string, orgId: string, role: Role) { - try { - // if there is already invite - const isAlreadySent = await this.prismaService.organizationInvite.findUnique({ - where: { - inviteeEmail_organizationId: { - inviteeEmail: email, - organizationId: orgId, - }, - }, - select: { - id: true, - }, - }); - // if user already exist in db - // delete the already existing invite - if (isAlreadySent) { - await this.prismaService.organizationInvite.delete({ - where: { - inviteeEmail_organizationId: { - organizationId: orgId, - inviteeEmail: email, - }, - }, - }); - } - - // transaction - const inviteUrl = await this.prismaService.$transaction(async (db) => { - const data = await db.organization.update({ - where: { - id: orgId, - }, - data: { - invites: { - create: { - inviteeEmail: email, - inviterUid: inviterid, - inviteeRole: role, - }, - }, - }, - include: { - invites: true, - }, - }); - // the guy who send invite - const inviter = await db.user.findUnique({ - where: { - uid: inviterid, - }, - }); - const inviteId = data.invites.find((el) => el.inviteeEmail === email).id; - // finding the id of new invite - const localPort = process.env.CLIENT_URL || 'http://localhost:3000'; - const inviteURL = `${localPort}/verify?id=${inviteId}`; - - // we dont want to send invite on local - // @sreehari2003 Removing this for presentation - // if (process.env.NODE_ENV === 'production') { - await this.eventEmitter.emit('org.invite', { - to: email, - inviteUrl: inviteURL, - from: inviter.displayName, - orgName: data.name, - fromEmail: inviter.email, - }); - // } - - return inviteURL; - }); - - return { - ok: true, - data: process.env.NODE_ENV !== 'production' ? inviteUrl : null, - message: 'email sent successfully , please check your mailbox', - }; - } catch { - return { - ok: false, - message: 'email sending failed, please try again later', - }; - } - } - - async verifyEmailInvite(id: string, ownerId: string, authUserEmail: string) { - // TODO - // convert to transaction - try { - const data = await this.prismaService.organizationInvite.findUniqueOrThrow({ - where: { - id: id, - }, - }); - if (data.inviteeEmail !== authUserEmail) { - throw new ServiceUnavailableException(); - } - const orgData = await this.prismaService.organization.update({ - where: { - id: data.organizationId, - }, - data: { - members: { - create: { - role: data.inviteeRole, - userUid: ownerId, - }, - }, - }, - }); - await this.prismaService.organizationInvite.delete({ - where: { - id: id, - }, - }); - if (orgData) { - return { - ok: true, - message: 'invite verifcation successfull', - data: orgData, - }; - } - throw new Error(); - } catch (e) { - if (e instanceof ServiceUnavailableException) { - throw new ServiceUnavailableException(); - } - return { - ok: false, - message: 'couldnt verify the invite', - }; - } - } -} diff --git a/apps/api/src/org-member/dto/member-remove.dto.ts b/apps/api/src/org-member/dto/member-remove.dto.ts deleted file mode 100644 index 26c363ae..00000000 --- a/apps/api/src/org-member/dto/member-remove.dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class RemoveMember { - @ApiProperty() - @IsNotEmpty() - @IsString() - organizationId: string; - - @ApiProperty() - @IsNotEmpty() - @IsString() - memberId: string; -} diff --git a/apps/api/src/org-member/dto/update-role.dto.ts b/apps/api/src/org-member/dto/update-role.dto.ts deleted file mode 100644 index 0d4c383d..00000000 --- a/apps/api/src/org-member/dto/update-role.dto.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class UpdateMemberRole { - @ApiProperty() - @IsNotEmpty() - @IsString() - organizationId: string; - - @ApiProperty() - @IsNotEmpty() - @IsString() - memberId: string; - - @ApiProperty() - @IsNotEmpty() - @IsString() - role: string; -} diff --git a/apps/api/src/org-member/org-member.controller.ts b/apps/api/src/org-member/org-member.controller.ts deleted file mode 100644 index 63dca312..00000000 --- a/apps/api/src/org-member/org-member.controller.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Body, Controller, Get, Param, Patch, UseGuards } from '@nestjs/common'; -import { OrganizationMemberService } from './org-member.service'; -import { AuthGuard } from '@nestjs/passport'; -import { RbacGuard } from '../organization/guards/rbac-member.guard'; -import { Roles } from '../organization/decorators/roles.decorator'; -import { RemoveMember } from './dto/member-remove.dto'; -import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; -import { UpdateMemberRole } from './dto/update-role.dto'; -import { Role } from '@prisma/client'; - -@Controller('org/member') -export class OrgMemberController { - constructor(private readonly orgMemberService: OrganizationMemberService) {} - - @Get('/:orgID') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiTags('org-members') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getMembers(@Param('orgID') orgID: string) { - return await this.orgMemberService.getMembers(orgID); - } - - @Patch('/remove') - @ApiTags('org-members') - @ApiOperation({ summary: 'Remove members from organization' }) - @ApiResponse({ status: 200, description: 'User will be removed successfully' }) - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async removeUser(@Body() data: RemoveMember) { - return await this.orgMemberService.removeMember(data.organizationId, data.memberId); - } - - @Patch('/role') - @ApiTags('org-members') - @ApiOperation({ summary: 'Update member role in org' }) - @ApiResponse({ status: 200, description: 'User role will be updated' }) - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async updateUserRole(@Body() data: UpdateMemberRole) { - return await this.orgMemberService.updateRole( - data.organizationId, - data.memberId, - data.role as Role, - ); - // swagger was throwing circular error so i had to define type as this way - } -} diff --git a/apps/api/src/org-member/org-member.module.ts b/apps/api/src/org-member/org-member.module.ts deleted file mode 100644 index 98b59069..00000000 --- a/apps/api/src/org-member/org-member.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { OrganizationMemberService } from './org-member.service'; -import { PrismaModule } from '../prisma/prisma.module'; -import { OrgMemberController } from './org-member.controller'; - -@Module({ - providers: [OrganizationMemberService], - imports: [PrismaModule], - controllers: [OrgMemberController], -}) -export class OrganizationMemberModule {} diff --git a/apps/api/src/org-member/org-member.service.ts b/apps/api/src/org-member/org-member.service.ts deleted file mode 100644 index 31d6a4a1..00000000 --- a/apps/api/src/org-member/org-member.service.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { Role } from '@prisma/client'; -import { ORG_MEMBER_NOT_FOUND, ROLE_UPDATE_FAILED } from '../error'; -import { PrismaService } from '../prisma/prisma.service'; - -@Injectable() -export class OrganizationMemberService { - constructor(private readonly prismaService: PrismaService) {} - - async getMembers(organizationId: string) { - const members = await this.prismaService.organizationMember.findMany({ - where: { - organizationId, - }, - select: { - user: { - select: { - uid: true, - email: true, - displayName: true, - slug: true, - }, - }, - role: true, - }, - }); - - return members; - } - - async findMember(organizationId: string, userUid: string) { - const member = await this.prismaService.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid, - organizationId, - }, - }, - }); - - if (member) return member; - return ORG_MEMBER_NOT_FOUND; - } - - async removeMember(organizationId: string, userUid: string) { - try { - const member = await this.prismaService.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid, - organizationId, - }, - }, - }); - - if (!member) throw new NotFoundException(); - - await this.prismaService.organizationMember.delete({ - where: { - id: member.id, - }, - }); - - return { - ok: true, - message: 'User removed successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ORG_MEMBER_NOT_FOUND, - }); - } else { - return e; - } - } - } - - async updateRole(organizationId: string, userUid: string, role: Role) { - try { - const newRole = await this.prismaService.organizationMember.update({ - where: { - userUid_organizationId: { - userUid, - organizationId, - }, - }, - data: { - role, - }, - }); - - if (!newRole) throw new NotFoundException(); - - return { - ok: true, - message: 'role updated successfully', - data: newRole, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ROLE_UPDATE_FAILED, - }); - } else { - return e; - } - } - } -} diff --git a/apps/api/src/organization/dto/create-org.dto.ts b/apps/api/src/organization/dto/create-org.dto.ts deleted file mode 100644 index 62251ef1..00000000 --- a/apps/api/src/organization/dto/create-org.dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class CreateOrgDto { - @ApiProperty() - @IsString() - @IsNotEmpty() - name: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - slug: string; -} diff --git a/apps/api/src/organization/dto/update-org.dto.ts b/apps/api/src/organization/dto/update-org.dto.ts deleted file mode 100644 index 5c638856..00000000 --- a/apps/api/src/organization/dto/update-org.dto.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class UpdateOrgDto { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - name: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - slug: string; -} diff --git a/apps/api/src/organization/guards/rbac-member.guard.ts b/apps/api/src/organization/guards/rbac-member.guard.ts deleted file mode 100644 index 8e9a729c..00000000 --- a/apps/api/src/organization/guards/rbac-member.guard.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - CanActivate, - ExecutionContext, - Injectable, - ForbiddenException, - NotFoundException, -} from '@nestjs/common'; -import { Reflector } from '@nestjs/core'; -import { ORG_ID_NOT_FOUND, NO_ROLE_ACCESS } from '../../error'; -import { PrismaService } from '../../prisma/prisma.service'; - -@Injectable() -export class RbacGuard implements CanActivate { - constructor( - private reflector: Reflector, - private prisma: PrismaService, - ) {} - - async canActivate(context: ExecutionContext): Promise { - const roles = this.reflector.get('roles', context.getHandler()); - if (!roles) { - return true; - } - - const request = context.switchToHttp().getRequest(); - const user = request.user; - - const organizationId = - request.method === 'GET' ? request.params.orgID : request.body.organizationId; - - if (!organizationId) { - throw new NotFoundException(ORG_ID_NOT_FOUND); - } - - const organizationMember = await this.prisma.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid: user.uid, - organizationId, - }, - }, - }); - - if (!organizationMember) { - throw new ForbiddenException(NO_ROLE_ACCESS); - } - - // setting role in request so that we can access the role via decorator - request.role = organizationMember.role; - - return roles.includes(organizationMember.role); - } -} diff --git a/apps/api/src/organization/organization.controller.ts b/apps/api/src/organization/organization.controller.ts deleted file mode 100644 index 363b89b1..00000000 --- a/apps/api/src/organization/organization.controller.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Body, Controller, Get, Param, Patch, Post, UseGuards, Delete } from '@nestjs/common'; -import { OrganizationService } from './organization.service'; -import { AuthGuard } from '@nestjs/passport'; -import { CreateOrgDto } from './dto/create-org.dto'; -import { DeleteOrgDto } from './dto/delete-org.dto'; -import { Roles } from './decorators/roles.decorator'; -import { RbacGuard } from './guards/rbac-member.guard'; -import { UpdateOrgDto } from './dto/update-org.dto'; -import { AuthUser } from '../auth/decorators/user.decorator'; -import { User, Role } from '@prisma/client'; -import { LeaveOrg } from './dto/leave-org.dto'; -import { UserRole } from '../auth/decorators/role.decorator'; - -@Controller('org') -export class OrganizationController { - constructor(private readonly organizationService: OrganizationService) {} - - @Post('/') - @UseGuards(AuthGuard('jwt')) - async createOrganization(@Body() createOrgDto: CreateOrgDto, @AuthUser() user: User) { - return this.organizationService.create(createOrgDto, user.uid); - } - - @Get('/find/:slug') - async findOrgBySlug(@Param('slug') slug: string) { - return this.organizationService.findOrgBySlug(slug); - } - - @Get('/:orgID') - @UseGuards(AuthGuard('jwt')) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getOrgInfo(@Param('orgID') info) { - return await this.organizationService.getOrgById(info); - } - - @Get('/events/public/:slug') - async getOrgEvents(@Param('slug') slug) { - return await this.organizationService.getEventsByorg(slug); - } - - @Get('/events/:orgID') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getAllEvents(@Param('orgID') orgID: string, @UserRole() role: Role) { - return this.organizationService.getAllEvents(orgID, role); - } - - @Patch('/') - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async updateOrganization(@Body() updateOrgDto: UpdateOrgDto) { - return this.organizationService.update(updateOrgDto); - } - - @Delete('/delete') - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async deleteOrganization(@Body() data: DeleteOrgDto) { - return this.organizationService.deleteOrg(data.organizationId); - } - @Delete('/leave') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async leaveOrg(@AuthUser() user: User, @Body() body: LeaveOrg) { - return this.organizationService.leaveOrg(body.organizationId, user.uid); - } - - @Patch('/update') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async UpdateOrg(@Body() data: UpdateOrgDto) { - return await this.organizationService.UpdateOrg(data.organizationId, data); - } -} diff --git a/apps/api/src/organization/organization.module.ts b/apps/api/src/organization/organization.module.ts deleted file mode 100644 index 2a1aaf7d..00000000 --- a/apps/api/src/organization/organization.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { OrganizationController } from './organization.controller'; -import { OrganizationService } from './organization.service'; -import { PrismaModule } from '../prisma/prisma.module'; -import { OrganizationMemberService } from '../org-member/org-member.service'; -import { OrganizationInviteService } from '../org-invite/org-invite.service'; - -@Module({ - imports: [PrismaModule], - controllers: [OrganizationController], - providers: [OrganizationService, OrganizationMemberService, OrganizationInviteService], -}) -export class OrganizationModule {} diff --git a/apps/api/src/organization/organization.service.ts b/apps/api/src/organization/organization.service.ts deleted file mode 100644 index 69b1ee2e..00000000 --- a/apps/api/src/organization/organization.service.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateOrgDto } from './dto/create-org.dto'; -import { ORG_EXISTS, ORG_NOT_FOUND } from '../error'; -import { UpdateOrgDto } from './dto/update-org.dto'; -import { Role } from '@prisma/client'; - -@Injectable() -export class OrganizationService { - constructor(private readonly prismaService: PrismaService) {} - - async create(createOrgDto: CreateOrgDto, uid: string) { - try { - const { name, slug } = createOrgDto; - - const org = await this.prismaService.organization.create({ - data: { - name, - slug, - members: { - create: { - role: 'ADMIN', - userUid: uid, - }, - }, - }, - }); - - return org; - } catch (error) { - return ORG_EXISTS; - } - } - - async findOrgBySlug(slug: string) { - const org = await this.prismaService.organization.findUnique({ - where: { - slug, - }, - }); - - if (org) return org; - return ORG_NOT_FOUND; - } - - async update(updateOrgDto: UpdateOrgDto) { - const { organizationId, name } = updateOrgDto; - - const org = await this.prismaService.organization.findUnique({ - where: { - id: organizationId, - }, - }); - - if (!org) return ORG_NOT_FOUND; - - const updatedOrg = await this.prismaService.organization.update({ - where: { - id: organizationId, - }, - data: { - name, - }, - }); - - return updatedOrg; - } - - async findOrgsByUser(uid: string) { - const data = await this.prismaService.organizationMember.findMany({ - where: { - userUid: uid, - }, - select: { - organization: { - include: { - _count: { - select: { - members: true, - events: true, - }, - }, - }, - }, - role: true, - }, - }); - - return { - ok: true, - message: 'orgs found successfully', - data, - }; - } - async deleteOrg(id: string) { - await this.prismaService.organization.delete({ - where: { - id, - }, - }); - return { - ok: true, - message: 'org was deleted successfully', - }; - } - - /* - - * if there is only one admin and he is the one leaving the org we should tranfer the org to the first - person who joined the org - - * if the person is the last person to leave the org we should delete the org completly - - * if there is multiple admins just make user leave the org - - */ - - async leaveOrg(orgId: string, userId: string) { - try { - await this.prismaService.organizationMember.delete({ - where: { - userUid_organizationId: { - userUid: userId, - organizationId: orgId, - }, - }, - }); - return { - ok: true, - message: 'successfully left the organization', - }; - } catch { - return { - ok: false, - message: 'Unable to leave the org please try again later', - }; - } - } - - async getAllEvents(id: string, role: Role) { - try { - const event = await this.prismaService.events.findMany({ - where: { - organizationId: id, - }, - }); - - return { - event, - role, - }; - } catch (e) { - return { - ok: false, - message: 'could not find the events', - ERROR: e, - }; - } - } - - async getOrgRole(orgId: string, user: string) { - try { - return await this.prismaService.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid: user, - organizationId: orgId, - }, - }, - select: { - role: true, - }, - }); - } catch {} - } - - async getOrgById(orgId: string) { - try { - const data = await this.prismaService.organization.findUnique({ - where: { - id: orgId, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'org found successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message || 'error loading organization', - }); - } - } - } - async UpdateOrg(id: string, payload: Data) { - try { - const data = await this.prismaService.organization.update({ - where: { - id, - }, - data: { - name: payload.name, - slug: payload.slug, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - return { - ok: true, - message: 'Org was updated successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - return e; - } - } - } - - async getEventsByorg(key: string) { - try { - const data = await this.prismaService.organization.findUnique({ - where: { - slug: key, - }, - select: { - events: { - where: { - isPublished: true, - }, - }, - name: true, - }, - }); - if (!data) throw new NotFoundException(); - return { - ok: true, - message: 'Events found successfully', - data, - }; - } catch { - throw new NotFoundException(); - } - } -} - -type Data = { - slug: string; - name: string; -}; diff --git a/apps/api/src/prisma/prisma.module.ts b/apps/api/src/prisma/prisma.module.ts deleted file mode 100644 index 8b744e14..00000000 --- a/apps/api/src/prisma/prisma.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Module } from '@nestjs/common/decorators'; -import { PrismaService } from './prisma.service'; - -@Module({ - providers: [PrismaService], - exports: [PrismaService], -}) -export class PrismaModule {} diff --git a/apps/api/src/services/ai.service.ts b/apps/api/src/services/ai.service.ts new file mode 100644 index 00000000..62fca3d6 --- /dev/null +++ b/apps/api/src/services/ai.service.ts @@ -0,0 +1,112 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import OpenAI from 'openai'; +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; +import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions'; + +type Message = { + text: string; + ai?: boolean; +}; + +const FormArraySchema = z.object({ + title: z.string().describe('Title of the form'), + description: z.string().optional().describe('Description of the form'), + fields: z.array( + z.object({ + label: z.string().describe('Label of the input'), + placeholder: z.string().optional().describe('Placeholder of the input'), + required: z.boolean().describe('Whether the input is required or not'), + type: z + .enum([ + 'SingleLineText', + 'LongText', + 'SingleSelect', + 'MultiSelect', + 'Checkbox', + 'Number', + 'Email', + 'URL', + 'PhoneNumber', + 'Attachment', + ]) + .describe('Type of the input'), + selectOptions: z + .array( + z + .object({ + option: z.string().describe('Option for the select input'), + }) + .describe('Options for the select input'), + ) + .optional() + .describe('Options for the select input'), + }), + ), +}); + +const jsonSchema = zodToJsonSchema(FormArraySchema, 'mySchema'); + +@Injectable() +export class AiService { + private openAI: OpenAI; + + constructor(private readonly configService: ConfigService) { + this.openAI = new OpenAI({ + apiKey: this.configService.get('AI_KEY'), + baseURL: 'https://api.together.xyz/v1', + }); + } + + async gptComplete(prompt: string, messages: Message[]): Promise { + const history = messages.map( + (message): ChatCompletionMessageParam => ({ + role: message.ai ? 'system' : 'user', + content: message.text, + }), + ); + + history.push({ + role: 'user', + content: prompt, + } as ChatCompletionMessageParam); + + const chat = await this.openAI.chat.completions.create({ + stream: false, + model: 'mistralai/Mistral-7B-Instruct-v0.1', + messages: history, + max_tokens: 5000, + temperature: 0.7, + frequency_penalty: 0.5, + // @ts-ignore – Together.ai supports schema while OpenAI does not + response_format: { type: 'json_object', schema: jsonSchema }, + }); + + const jsonExtract = chat.choices[0].message.content.match( + /[{\[]{1}([,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis, + ); + + if (!jsonExtract) { + console.log('No JSON found in the response'); + console.log('Retrying!!!!'); + return await this.gptComplete(prompt, messages); + } + + return JSON.parse(jsonExtract[0]); + } + + async generateEmbedding(text: string) { + try { + const res = await this.openAI.embeddings.create({ + model: 'togethercomputer/m2-bert-80M-2k-retrieval', + input: text, + }); + + return res.data[0].embedding; + } catch (error) { + console.error(error); + return ''; + } + } +} diff --git a/apps/api/src/services/auth/auth.service.ts b/apps/api/src/services/auth/auth.service.ts new file mode 100644 index 00000000..6486a8e6 --- /dev/null +++ b/apps/api/src/services/auth/auth.service.ts @@ -0,0 +1,107 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { JwtService } from '@nestjs/jwt'; +import type { User } from '@prisma/client'; +import { hash, verify } from 'argon2'; +import type { Profile } from 'passport'; +import { PrismaService } from '../prisma.service'; +import { UserService } from '../user.service'; + +@Injectable() +export class AuthService { + constructor( + private readonly prismaService: PrismaService, + private readonly jwtService: JwtService, + private readonly userService: UserService, + private readonly configService: ConfigService, + ) {} + + async checkIfProviderAccountExists(OAuthUserData: Profile) { + const provider = await this.prismaService.account.findUnique({ + where: { + verify_provider_account: { + provider: OAuthUserData.provider, + providerAccountId: OAuthUserData.id, + }, + }, + }); + + if (!provider) return null; + + return provider; + } + + async createProviderAccount( + user: User, + profile: Profile, + accessToken: string, + refreshToken: string, + ) { + try { + const createdProviderAccount = await this.prismaService.account.create({ + data: { + provider: profile.provider, + providerAccountId: profile.id, + providerAccessToken: accessToken, + providerRefreshToken: refreshToken, + user: { + connect: { + uid: user.uid, + }, + }, + }, + }); + + return createdProviderAccount; + } catch (error) { + return null; + } + } + + async generateAuthToken(uid: string) { + const payload = { + iss: this.configService.get('API_BASE_URL'), + sub: uid, + iat: new Date().getTime(), + }; + + const accessToken = await this.jwtService.signAsync(payload); + const refreshToken = await this.generateRefreshToken(uid); + + return { + accessToken, + refreshToken, + }; + } + + async generateRefreshToken(uid: string) { + const payload = { + sub: uid, + iss: this.configService.get('API_BASE_URL'), + iat: new Date().getTime(), + }; + const refreshToken = await this.jwtService.signAsync(payload); + + const hashedRefreshToken = await hash(refreshToken); + + const updatedUser = await this.userService.updateRefreshToken( + uid, + hashedRefreshToken, + ); + + if (!updatedUser) throw new Error('REFRESH_TOKEN_NOT_UPDATED'); + + return refreshToken; + } + + async refreshAuthToken(user: User, hashedToken: string) { + if (!user) throw new Error('USER_NOT_FOUND'); + + const isRefreshTokenValid = await verify(user.refreshToken, hashedToken); + + if (!isRefreshTokenValid) + throw new Error('AFTER_GENERATION_INVALID_REFRESH_TOKEN'); + + return await this.generateAuthToken(user.uid); + } +} diff --git a/apps/api/src/services/auth/cookieHandler.ts b/apps/api/src/services/auth/cookieHandler.ts new file mode 100644 index 00000000..4d57c2c8 --- /dev/null +++ b/apps/api/src/services/auth/cookieHandler.ts @@ -0,0 +1,29 @@ +import type { Response } from 'express'; + +export const cookieHandler = ( + res: Response, + authToken: { + accessToken: string; + refreshToken: string; + }, + redirect?: boolean, +) => { + res.cookie('access_token', authToken.accessToken, { + httpOnly: true, + secure: process.env.NODE_ENV === 'production', + maxAge: 1000 * 60 * 60 * 24, // 1 day + }); + res.cookie('refresh_token', authToken.refreshToken, { + httpOnly: true, + secure: process.env.NODE_ENV === 'production', + maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week + }); + + if (!redirect) { + return res.status(200).json({ + message: 'Success', + }); + } + + return res.status(200).redirect(process.env.CLIENT_REDIRECT_URI); +}; diff --git a/apps/api/src/services/auth/decorators/role.decorator.ts b/apps/api/src/services/auth/decorators/role.decorator.ts new file mode 100644 index 00000000..2ae3970a --- /dev/null +++ b/apps/api/src/services/auth/decorators/role.decorator.ts @@ -0,0 +1,10 @@ +import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; +import type { Role } from '@prisma/client'; + +export const UserRole = createParamDecorator( + (_, ctx: ExecutionContext): Role => { + const request = ctx.switchToHttp().getRequest(); + + return request.role; + }, +); diff --git a/apps/api/src/services/auth/decorators/user.decorator.ts b/apps/api/src/services/auth/decorators/user.decorator.ts new file mode 100644 index 00000000..5c179751 --- /dev/null +++ b/apps/api/src/services/auth/decorators/user.decorator.ts @@ -0,0 +1,9 @@ +import { createParamDecorator, type ExecutionContext } from '@nestjs/common'; + +export const AuthUser = createParamDecorator( + (data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + + return request.user; + }, +); diff --git a/apps/api/src/services/auth/guards/github-oauth.guard.ts b/apps/api/src/services/auth/guards/github-oauth.guard.ts new file mode 100644 index 00000000..ce0061f5 --- /dev/null +++ b/apps/api/src/services/auth/guards/github-oauth.guard.ts @@ -0,0 +1,14 @@ +import { type ExecutionContext, Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class GithubAuthGuard extends AuthGuard('github') { + getAuthenticateOptions(context: ExecutionContext) { + const req = context.switchToHttp().getRequest(); + return { + state: { + redirect_uri: req.query.redirect_uri, + }, + }; + } +} diff --git a/apps/api/src/services/auth/guards/google-oauth.guard.ts b/apps/api/src/services/auth/guards/google-oauth.guard.ts new file mode 100644 index 00000000..26517cb7 --- /dev/null +++ b/apps/api/src/services/auth/guards/google-oauth.guard.ts @@ -0,0 +1,14 @@ +import { type ExecutionContext, Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class GoogleAuthGuard extends AuthGuard('google') { + getAuthenticateOptions(context: ExecutionContext) { + const req = context.switchToHttp().getRequest(); + return { + state: { + redirect_uri: req.query.redirect_uri, + }, + }; + } +} diff --git a/apps/api/src/auth/guards/refresh.guard.ts b/apps/api/src/services/auth/guards/refresh.guard.ts similarity index 100% rename from apps/api/src/auth/guards/refresh.guard.ts rename to apps/api/src/services/auth/guards/refresh.guard.ts diff --git a/apps/api/src/services/auth/guards/saml-oauth.guard.ts b/apps/api/src/services/auth/guards/saml-oauth.guard.ts new file mode 100644 index 00000000..cf5d92ec --- /dev/null +++ b/apps/api/src/services/auth/guards/saml-oauth.guard.ts @@ -0,0 +1,14 @@ +import { type ExecutionContext, Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class SamlAuthGuard extends AuthGuard('saml') { + getAuthenticateOptions(context: ExecutionContext) { + const req = context.switchToHttp().getRequest(); + return { + state: { + redirect_uri: req.query.redirect_uri, + }, + }; + } +} diff --git a/apps/api/src/services/auth/strategy/github.strategy.ts b/apps/api/src/services/auth/strategy/github.strategy.ts new file mode 100644 index 00000000..b52dd513 --- /dev/null +++ b/apps/api/src/services/auth/strategy/github.strategy.ts @@ -0,0 +1,61 @@ +import { type Profile, Strategy } from 'passport-github2'; +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable } from '@nestjs/common'; +import { AuthService } from '../auth.service'; +import { UserService } from '../../user.service'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class GithubStrategy extends PassportStrategy(Strategy) { + constructor( + private readonly authService: AuthService, + private readonly usersService: UserService, + private readonly configService: ConfigService, + ) { + super({ + clientID: configService.get('GITHUB_CLIENT_ID'), + clientSecret: configService.get('GITHUB_CLIENT_SECRET'), + callbackURL: configService.get('GITHUB_CALLBACK_URL'), + scope: [configService.get('GITHUB_SCOPE')], + store: true, + }); + } + + async validate( + accessToken: string, + refreshToken: string, + profile: Profile, + done, + ) { + // Check whether this user exist in the database or not + const user = await this.usersService.findUserByEmail( + profile.emails[0].value, + ); + + // If the user doesn't exist in the database, create a new user + if (!user) { + const createdUser = await this.usersService.createOAuthUser( + accessToken, + refreshToken, + profile, + ); + return createdUser; + } + + // If the user already exists, check if the user has a provider account + const providerAccount = + await this.authService.checkIfProviderAccountExists(profile); + + // If the user doesn't have a provider account, create a new provider account + if (!providerAccount) { + await this.authService.createProviderAccount( + user, + profile, + accessToken, + refreshToken, + ); + } + + return user; + } +} diff --git a/apps/api/src/services/auth/strategy/google.strategy.ts b/apps/api/src/services/auth/strategy/google.strategy.ts new file mode 100644 index 00000000..5dc0d030 --- /dev/null +++ b/apps/api/src/services/auth/strategy/google.strategy.ts @@ -0,0 +1,61 @@ +import { type Profile, Strategy } from 'passport-google-oauth20'; +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable } from '@nestjs/common'; +import { AuthService } from '../auth.service'; +import { UserService } from '../../user.service'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class GoogleStrategy extends PassportStrategy(Strategy) { + constructor( + private readonly authService: AuthService, + private readonly usersService: UserService, + private readonly configService: ConfigService, + ) { + super({ + clientID: configService.get('GOOGLE_CLIENT_ID'), + clientSecret: configService.get('GOOGLE_CLIENT_SECRET'), + callbackURL: configService.get('GOOGLE_CALLBACK_URL'), + scope: (configService.get('GOOGLE_SCOPE') as string).split(','), + store: true, + }); + } + + async validate( + accessToken: string, + refreshToken: string, + profile: Profile, + done, + ) { + // Check whether this user exist in the database or not + const user = await this.usersService.findUserByEmail( + profile.emails[0].value, + ); + + // If the user doesn't exist in the database, create a new user + if (!user) { + const createdUser = await this.usersService.createOAuthUser( + accessToken, + refreshToken, + profile, + ); + return createdUser; + } + + // If the user already exists, check if the user has a provider account + const providerAccount = + await this.authService.checkIfProviderAccountExists(profile); + + // If the user doesn't have a provider account, create a new provider account + if (!providerAccount) { + await this.authService.createProviderAccount( + user, + profile, + accessToken, + refreshToken, + ); + } + + return user; + } +} diff --git a/apps/api/src/services/auth/strategy/jwt.strategy.ts b/apps/api/src/services/auth/strategy/jwt.strategy.ts new file mode 100644 index 00000000..c3d6e913 --- /dev/null +++ b/apps/api/src/services/auth/strategy/jwt.strategy.ts @@ -0,0 +1,40 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PassportStrategy } from '@nestjs/passport'; +import type { Request } from 'express'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { UserService } from '../../user.service'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { + constructor( + private readonly configService: ConfigService, + private readonly userService: UserService, + ) { + super({ + ignoreExpiration: false, + secretOrKey: configService.get('JWT_SECRET'), + jwtFromRequest: ExtractJwt.fromExtractors([ + (request: Request) => { + const data = request?.cookies.access_token; + if (!data) { + throw new UnauthorizedException('ACCESS_TOKEN_NOT_FOUND'); + } + return data; + }, + ]), + }); + } + + async validate(payload: any) { + if (payload === null) { + throw new UnauthorizedException(); + } + const user = await this.userService.findUserById(payload.sub); + + if (!user) { + throw new UnauthorizedException('INVALID_USER'); + } + return user; + } +} diff --git a/apps/api/src/services/auth/strategy/refresh.strategy.ts b/apps/api/src/services/auth/strategy/refresh.strategy.ts new file mode 100644 index 00000000..efff372a --- /dev/null +++ b/apps/api/src/services/auth/strategy/refresh.strategy.ts @@ -0,0 +1,46 @@ +import { + BadRequestException, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PassportStrategy } from '@nestjs/passport'; +import type { Request } from 'express'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { UserService } from '../../user.service'; + +@Injectable() +export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { + constructor( + private userService: UserService, + private readonly configService: ConfigService, + ) { + super({ + ignoreExpiration: true, + passReqToCallback: true, + secretOrKey: configService.get('JWT_SECRET'), + jwtFromRequest: ExtractJwt.fromExtractors([ + (request: Request) => { + const data = request?.cookies['refresh_token']; + if (!data) { + throw new UnauthorizedException('REFRESH_TOKEN_NOT_FOUND'); + } + return data; + }, + ]), + }); + } + + async validate(req: Request, payload: any) { + if (!payload) { + throw new BadRequestException('PAYLOAD_NOT_FOUND'); + } + const user = await this.userService.findUserById(payload.sub); + + if (!user) { + throw new BadRequestException('INVALID_USER'); + } + + return user; + } +} diff --git a/apps/api/src/services/auth/strategy/saml.strategy.ts b/apps/api/src/services/auth/strategy/saml.strategy.ts new file mode 100644 index 00000000..8f1463c5 --- /dev/null +++ b/apps/api/src/services/auth/strategy/saml.strategy.ts @@ -0,0 +1,74 @@ +import { MultiSamlStrategy } from '@node-saml/passport-saml'; +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable } from '@nestjs/common'; +import { AuthService } from '../auth.service'; +import { UserService } from '../../user.service'; +import { PrismaService } from '../../prisma.service'; +import type { StrategyOptionsCallback } from '@node-saml/passport-saml/lib/types'; +import type e from 'express'; + +@Injectable() +export class SamlStrategy extends PassportStrategy(MultiSamlStrategy, 'saml') { + constructor( + private readonly authService: AuthService, + private readonly prismaService: PrismaService, + private readonly usersService: UserService, + ) { + super({ + passReqToCallback: true, + getSamlOptions: async ( + req: e.Request, + callback: StrategyOptionsCallback, + ) => { + const issuer = req.query.issuer; + if (!issuer || typeof issuer !== 'string') { + return callback(new Error('Issuer not found')); + } + const config = await this.prismaService.samlConfig.findUnique({ + where: { issuer: issuer }, + }); + if (!config) { + return callback(new Error('SAML config not found')); + } + return callback(null, config); + }, + }); + } + + async validate(profile, done) { + // Check whether this user exist in the database or not + console.log(profile); + const user = await this.prismaService.user.findUnique({ + where: { + email: + typeof profile.email === 'string' ? profile.email : profile.email[0], + }, + }); + + // If the user doesn't exist in the database, create a new user + if (!user) { + const createdUser = await this.usersService.createOAuthUser( + profile.nameID, + profile.nameID, + profile, + ); + return createdUser; + } + + // If the user already exists, check if the user has a provider account + const providerAccount = + await this.authService.checkIfProviderAccountExists(profile); + + // If the user doesn't have a provider account, create a new provider account + if (!providerAccount) { + await this.authService.createProviderAccount( + user, + profile, + profile.email, + profile.email, + ); + } + + return user; + } +} diff --git a/apps/api/src/services/cloud.service.ts b/apps/api/src/services/cloud.service.ts new file mode 100644 index 00000000..46e9087e --- /dev/null +++ b/apps/api/src/services/cloud.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; +import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; + +@Injectable() +export class S3Service { + private readonly s3Client: S3Client; + + constructor() { + this.s3Client = new S3Client({ + region: process.env.AWS_REGION, + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY, + secretAccessKey: process.env.AWS_SECRET_KEY, + }, + }); + } + + async uploadFile(file: Express.Multer.File): Promise { + try { + const { mimetype, originalname } = file; + const command = new PutObjectCommand({ + Bucket: 'fossfolio', + Key: originalname.split(' ').join('-'), + Body: file.buffer, + ContentType: mimetype, + }); + const data = await this.s3Client.send(command); + + return `https://${command.input.Bucket}.s3.amazonaws.com/${command.input.Key}`; + } catch (error) { + // Handle error gracefully + console.error(error); + return; + } + } +} diff --git a/apps/api/src/organization/decorators/roles.decorator.ts b/apps/api/src/services/decorator/roles.decorator.ts similarity index 100% rename from apps/api/src/organization/decorators/roles.decorator.ts rename to apps/api/src/services/decorator/roles.decorator.ts diff --git a/apps/api/src/services/dto/ai.dto.ts b/apps/api/src/services/dto/ai.dto.ts new file mode 100644 index 00000000..faedfa68 --- /dev/null +++ b/apps/api/src/services/dto/ai.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class AIFormDto { + @ApiProperty() + prompt: string; + + @ApiProperty() + messages: Array<{ + text: string; + ai: boolean; + }>; +} diff --git a/apps/api/src/services/dto/cover-dto.ts b/apps/api/src/services/dto/cover-dto.ts new file mode 100644 index 00000000..33929c02 --- /dev/null +++ b/apps/api/src/services/dto/cover-dto.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class ImageUpload { + @ApiProperty() + organizationId: string; + + @ApiProperty() + eventId: string; +} diff --git a/apps/api/src/services/dto/create-events.dto.ts b/apps/api/src/services/dto/create-events.dto.ts new file mode 100644 index 00000000..ad0e6dc4 --- /dev/null +++ b/apps/api/src/services/dto/create-events.dto.ts @@ -0,0 +1,50 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; + +export class CreateEventDto { + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + name: string; + + @ApiProperty() + description: JSON; + + @ApiProperty() + @IsString() + website: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + location: string; + + @ApiProperty() + @IsNumber() + ticketPrice: number; + + @ApiProperty() + @IsString() + @IsNotEmpty() + eventDate: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + isPaidEvent: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + lastDate: string; + + @ApiProperty() + @IsNumber() + @IsNotEmpty() + maxTicketCount: number; +} diff --git a/apps/api/src/services/dto/create-form.dto.ts b/apps/api/src/services/dto/create-form.dto.ts new file mode 100644 index 00000000..250e93e5 --- /dev/null +++ b/apps/api/src/services/dto/create-form.dto.ts @@ -0,0 +1,25 @@ +import { ApiProperty } from '@nestjs/swagger'; +import type { FieldType } from '@prisma/client'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class FormPayLoad { + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + eventId: string; + + data: Payload; +} + +class Payload { + label: string; + placeholder?: string; + options?: Array; + required: boolean; + type: FieldType; +} diff --git a/apps/api/src/services/dto/create-org.dto.ts b/apps/api/src/services/dto/create-org.dto.ts new file mode 100644 index 00000000..37750f1c --- /dev/null +++ b/apps/api/src/services/dto/create-org.dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class CreateOrgDto { + @ApiProperty() + @IsString() + @IsNotEmpty() + name: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + slug: string; +} diff --git a/apps/api/src/services/dto/create-task.dto.ts b/apps/api/src/services/dto/create-task.dto.ts new file mode 100644 index 00000000..ddee652e --- /dev/null +++ b/apps/api/src/services/dto/create-task.dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import type { Prisma } from '@prisma/client'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class CreateTask { + @ApiProperty() + @IsString() + @IsNotEmpty() + title: string; + + @ApiProperty() + @IsNotEmpty() + data: Prisma.JsonValue; +} diff --git a/apps/api/src/events/dto/delete-event.dto.ts b/apps/api/src/services/dto/delete-event.dto.ts similarity index 66% rename from apps/api/src/events/dto/delete-event.dto.ts rename to apps/api/src/services/dto/delete-event.dto.ts index 1b3c71c9..b941e7d1 100644 --- a/apps/api/src/events/dto/delete-event.dto.ts +++ b/apps/api/src/services/dto/delete-event.dto.ts @@ -2,7 +2,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsString } from 'class-validator'; export class DeleteEventDto { - @ApiProperty() - @IsString() - organizationId: string; + @ApiProperty() + @IsString() + organizationId: string; } diff --git a/apps/api/src/organization/dto/delete-org.dto.ts b/apps/api/src/services/dto/delete-org.dto.ts similarity index 62% rename from apps/api/src/organization/dto/delete-org.dto.ts rename to apps/api/src/services/dto/delete-org.dto.ts index 1b59199f..cc806543 100644 --- a/apps/api/src/organization/dto/delete-org.dto.ts +++ b/apps/api/src/services/dto/delete-org.dto.ts @@ -2,8 +2,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString } from 'class-validator'; export class DeleteOrgDto { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; } diff --git a/apps/api/src/organization/dto/generic-org.dto.ts b/apps/api/src/services/dto/generic-org.dto.ts similarity index 62% rename from apps/api/src/organization/dto/generic-org.dto.ts rename to apps/api/src/services/dto/generic-org.dto.ts index de6007f4..9489b3e6 100644 --- a/apps/api/src/organization/dto/generic-org.dto.ts +++ b/apps/api/src/services/dto/generic-org.dto.ts @@ -2,8 +2,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString } from 'class-validator'; export class GenericOrgDto { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; } diff --git a/apps/api/src/events/dto/get-events.dto.ts b/apps/api/src/services/dto/get-events.dto.ts similarity index 55% rename from apps/api/src/events/dto/get-events.dto.ts rename to apps/api/src/services/dto/get-events.dto.ts index 7e5de7c4..20cb6f71 100644 --- a/apps/api/src/events/dto/get-events.dto.ts +++ b/apps/api/src/services/dto/get-events.dto.ts @@ -2,14 +2,14 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString } from 'class-validator'; export class GetEventByOrgDto { - @ApiProperty() - @IsNotEmpty() - @IsString() - slug: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + slug: string; } export class GetEventByOrgIdDto { - @ApiProperty() - @IsNotEmpty() - @IsString() - id: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + id: string; } diff --git a/apps/api/src/organization/dto/leave-org.dto.ts b/apps/api/src/services/dto/leave-org.dto.ts similarity index 61% rename from apps/api/src/organization/dto/leave-org.dto.ts rename to apps/api/src/services/dto/leave-org.dto.ts index 297c7ca4..ffbdf0d5 100644 --- a/apps/api/src/organization/dto/leave-org.dto.ts +++ b/apps/api/src/services/dto/leave-org.dto.ts @@ -2,8 +2,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString } from 'class-validator'; export class LeaveOrg { - @ApiProperty() - @IsNotEmpty() - @IsString() - organizationId: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + organizationId: string; } diff --git a/apps/api/src/services/dto/member-remove.dto.ts b/apps/api/src/services/dto/member-remove.dto.ts new file mode 100644 index 00000000..5f931f7b --- /dev/null +++ b/apps/api/src/services/dto/member-remove.dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class RemoveMember { + @ApiProperty() + @IsNotEmpty() + @IsString() + organizationId: string; + + @ApiProperty() + @IsNotEmpty() + @IsString() + memberId: string; +} diff --git a/apps/api/src/services/dto/publish-form.dto.ts b/apps/api/src/services/dto/publish-form.dto.ts new file mode 100644 index 00000000..d591ef24 --- /dev/null +++ b/apps/api/src/services/dto/publish-form.dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsBoolean, IsNotEmpty } from 'class-validator'; + +export class ToggleFormPublishStatus { + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; + + @ApiProperty() + @IsBoolean() + @IsNotEmpty() + shouldFormPublish: boolean; +} diff --git a/apps/api/src/services/dto/publishForm.dto.ts b/apps/api/src/services/dto/publishForm.dto.ts new file mode 100644 index 00000000..d591ef24 --- /dev/null +++ b/apps/api/src/services/dto/publishForm.dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsBoolean, IsNotEmpty } from 'class-validator'; + +export class ToggleFormPublishStatus { + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; + + @ApiProperty() + @IsBoolean() + @IsNotEmpty() + shouldFormPublish: boolean; +} diff --git a/apps/api/src/events/dto/register-event.dto.ts b/apps/api/src/services/dto/register-event.dto.ts similarity index 65% rename from apps/api/src/events/dto/register-event.dto.ts rename to apps/api/src/services/dto/register-event.dto.ts index 9aa06af4..47d49f3c 100644 --- a/apps/api/src/events/dto/register-event.dto.ts +++ b/apps/api/src/services/dto/register-event.dto.ts @@ -2,8 +2,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString } from 'class-validator'; export class RegisterEventDto { - @ApiProperty() - @IsNotEmpty() - @IsString() - eventId: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + eventId: string; } diff --git a/apps/api/src/services/dto/remove-user.dto.ts b/apps/api/src/services/dto/remove-user.dto.ts new file mode 100644 index 00000000..51c49bbe --- /dev/null +++ b/apps/api/src/services/dto/remove-user.dto.ts @@ -0,0 +1,16 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; + +export class RemoveUserDto { + @ApiProperty() + @IsString() + organizationId: string; + + @ApiProperty() + @IsString() + eventId: string; + + @ApiProperty() + @IsString() + userId: string; +} diff --git a/apps/api/src/services/dto/update-event.dto.ts b/apps/api/src/services/dto/update-event.dto.ts new file mode 100644 index 00000000..284b6a22 --- /dev/null +++ b/apps/api/src/services/dto/update-event.dto.ts @@ -0,0 +1,50 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class UpdateEventDto { + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + eventSlug: string; + + @ApiProperty() + name: string; + + @ApiProperty() + description?: Record; + + @ApiProperty() + website: string; + + @ApiProperty() + location: string; + + @ApiProperty() + lastDate: Date; + + @ApiProperty() + isPublished: boolean; + + @ApiProperty() + maxTeamSize: number; + + @ApiProperty() + minTeamSize: number; + + @ApiProperty() + isCollegeEvent: boolean; + + @ApiProperty() + maxTicketCount: number; + + @ApiProperty() + eventDate: Date; + + @ApiProperty() + file: string; +} diff --git a/apps/api/src/services/dto/update-org.dto.ts b/apps/api/src/services/dto/update-org.dto.ts new file mode 100644 index 00000000..b8078aed --- /dev/null +++ b/apps/api/src/services/dto/update-org.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class UpdateOrgDto { + @ApiProperty() + @IsString() + @IsNotEmpty() + organizationId: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + name: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + slug: string; +} diff --git a/apps/api/src/services/dto/update-role.dto.ts b/apps/api/src/services/dto/update-role.dto.ts new file mode 100644 index 00000000..2e9a84ed --- /dev/null +++ b/apps/api/src/services/dto/update-role.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class UpdateMemberRole { + @ApiProperty() + @IsNotEmpty() + @IsString() + organizationId: string; + + @ApiProperty() + @IsNotEmpty() + @IsString() + memberId: string; + + @ApiProperty() + @IsNotEmpty() + @IsString() + role: string; +} diff --git a/apps/api/src/services/dto/update-user.dto.ts b/apps/api/src/services/dto/update-user.dto.ts new file mode 100644 index 00000000..63a3c37f --- /dev/null +++ b/apps/api/src/services/dto/update-user.dto.ts @@ -0,0 +1,21 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsBoolean, IsNotEmpty, IsString } from 'class-validator'; + +export class UpdateUserDto { + @ApiProperty() + @IsString() + displayName?: string; + + @ApiProperty() + @IsString() + @IsNotEmpty() + slug?: string; + + photoUrl?: string; + + @ApiProperty() + @IsBoolean() + isCollegeStudent?: boolean; + + collegeName?: string; +} diff --git a/apps/api/src/services/dto/user-invite.dto.ts b/apps/api/src/services/dto/user-invite.dto.ts new file mode 100644 index 00000000..0383f57e --- /dev/null +++ b/apps/api/src/services/dto/user-invite.dto.ts @@ -0,0 +1,21 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Role } from '@prisma/client'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class OrgInvie { + @ApiProperty() + @IsNotEmpty() + @IsString() + email: string; + + @ApiProperty({ + enum: Role, + }) + @IsNotEmpty() + role: Role; + + @ApiProperty() + @IsNotEmpty() + @IsString() + organizationId: string; +} diff --git a/apps/api/src/services/events.service.ts b/apps/api/src/services/events.service.ts new file mode 100644 index 00000000..9747d6ff --- /dev/null +++ b/apps/api/src/services/events.service.ts @@ -0,0 +1,723 @@ +import { + ConflictException, + Injectable, + InternalServerErrorException, + NotFoundException, + ServiceUnavailableException, + UnprocessableEntityException, +} from '@nestjs/common'; +import { PrismaService } from './prisma.service'; +import { StripeService } from './stripe.service'; +import { S3Service } from './cloud.service'; +import type { CreateEventDto } from './dto/create-events.dto'; +import type { UpdateEventDto } from './dto/update-event.dto'; +import type { + GetEventByOrgDto, + GetEventByOrgIdDto, +} from './dto/get-events.dto'; +import excludeKey from '../utils/exclude'; +import type { Events, User } from '@prisma/client'; +import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; +import { AiService } from './ai.service'; + +@Injectable() +export class EventsService { + constructor( + private readonly prismaService: PrismaService, + private readonly cloudService: S3Service, + private readonly stripeService: StripeService, + private readonly eventEmitter: EventEmitter2, + private readonly AiService: AiService, + ) {} + + public async getEventById(id: string) { + return this.prismaService.events.findUnique({ + where: { + id, + }, + }); + } + + async createEvent(d: CreateEventDto, userId: string) { + try { + const isEventWithSlugExist = await this.getEventBySlug(d.name); + + const totalCount = await this.prismaService.events.aggregate({ + _count: true, + }); + + let slug: string; + + if (isEventWithSlugExist) { + slug = `${d.name}-${totalCount._count}`; + } else { + slug = d.name; + } + + await this.prismaService.organization.update({ + where: { + id: d.organizationId, + }, + data: { + events: { + create: { + name: d.name, + website: d.website, + location: d.location, + ticketPrice: d.ticketPrice, + slug, + eventDate: new Date(d.eventDate), + lastDate: new Date(d.lastDate), + maxTicketCount: d.maxTicketCount, + }, + }, + }, + }); + + const newEvent = await this.getEventBySlug(slug); + + this.eventEmitter.emit('event.created', newEvent, userId); + + return { + ok: true, + message: 'event created successfully', + data: newEvent, + }; + } catch (e) { + return { + ok: false, + message: 'could not create event', + ERROR: e, + }; + } + } + + async updateEvent(payload: UpdateEventDto) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + organizationId: payload.organizationId, + slug: payload.eventSlug, + }, + }); + + if (!event) { + throw new NotFoundException("Event doesn't exist"); + } + + const data = await this.prismaService.events.update({ + where: { + organizationId: payload.organizationId, + slug: payload.eventSlug, + }, + data: { + name: payload.name || event.name, + website: payload.website || event.website, + location: payload.location || event.location, + description: payload.description || event.description, + lastDate: payload.lastDate || event.lastDate, + isPublished: payload.hasOwnProperty('isPublished') + ? payload.isPublished + : event.isPublished, + maxTeamSize: payload.maxTeamSize || event.maxTeamSize, + minTeamSize: payload.minTeamSize || event.minTeamSize, + isCollegeEvent: payload.hasOwnProperty('isCollegeEvent') + ? payload.isCollegeEvent + : event.isCollegeEvent, + maxTicketCount: payload.maxTicketCount || event.maxTicketCount, + eventDate: payload.eventDate || event.eventDate, + }, + }); + + if (!data) { + throw new UnprocessableEntityException("Event couldn't be updated"); + } + + this.eventEmitter.emit('event.updated', data); + + return { + ok: true, + message: 'Event was updated successfully', + data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ok: false, + message: e.message, + }); + } else if (e instanceof UnprocessableEntityException) { + throw new UnprocessableEntityException({ + ok: false, + message: e.message, + }); + } else { + throw new InternalServerErrorException({ + error: e, + }); + } + } + } + + async getAllEvents(query = '') { + try { + return await this.prismaService.events.findMany({ + where: { + name: { + contains: query, + mode: 'insensitive', + }, + lastDate: { + gte: new Date(), + }, + isPublished: true, + maxTicketCount: { + gt: 0, + }, + }, + orderBy: { + createdAt: 'asc', + }, + }); + } catch { + throw { + ok: false, + message: 'could not get events', + }; + } + } + + async getEventByOrgSlug(payload: GetEventByOrgDto) { + try { + return await this.prismaService.organization.findMany({ + where: { + slug: payload.slug, + }, + select: { + events: true, + }, + }); + } catch { + return null; + } + } + + async getEventByOrgsId(payload: GetEventByOrgIdDto) { + try { + return await this.prismaService.organization.findMany({ + where: { + id: payload.id, + }, + select: { + events: true, + members: true, + }, + }); + } catch { + return null; + } + } + + async publishEvent(eventSlug: string) { + try { + const data = await this.getEventBySlug(eventSlug); + + if (!data) { + throw new NotFoundException(); + } + + const { maxTicketCount, eventDate, lastDate } = data; + if (!maxTicketCount || !eventDate || !lastDate) { + throw new UnprocessableEntityException({ + message: 'please provide all required information for event', + }); + } + await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + isPublished: true, + }, + }); + + return { + ok: true, + message: 'event was published successfully', + }; + } catch (e) { + // Use exception filters to handle exceptions and return appropriate responses + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ok: false, + message: e.message, + }); + } else if (e instanceof UnprocessableEntityException) { + throw new UnprocessableEntityException({ + ok: false, + message: e.message, + }); + } else { + throw e; // Rethrow other exceptions + } + } + } + + async getEventBySlugId(slug: string) { + try { + const data = await this.prismaService.events.findUnique({ + where: { + slug, + }, + include: { + form: true, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + return { + ok: true, + message: 'event found successfully', + data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ok: false, + message: e.message, + }); + } else if (e instanceof UnprocessableEntityException) { + throw new UnprocessableEntityException({ + ok: false, + message: e.message, + }); + } else { + throw e; // Rethrow other exceptions + } + } + } + + async registerEvent(eventSlug: string, userId: string) { + try { + const eventInfo = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + include: { + Ticket: { + where: { + userUid: userId, + }, + }, + }, + }); + + if (eventInfo.Ticket.length) { + throw new ConflictException(); + } + + if (eventInfo.maxTicketCount <= 0) { + throw new ServiceUnavailableException(); + } + + // when the event requires a form input we should check if the use has completed the form or not + // can only be done after creating the response schema + + // After this if the event has a ticket price we will redirect to stripe checkout + + if (eventInfo.ticketPrice > 0) { + // this will trigger another service layer from the stripeService Event emitter + return await this.stripeService.createCheckoutSession( + eventInfo, + userId, + ); + } else { + const data = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + Ticket: { + create: { + userUid: userId, + }, + }, + maxTicketCount: eventInfo.maxTicketCount - 1, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'Event register successfully', + }; + } + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else if (e instanceof ServiceUnavailableException) { + throw new ServiceUnavailableException(); + } else if (e instanceof ConflictException) { + throw new ConflictException('user already registered'); + } else { + throw e; + } + } + } + + async getEventParticipants(slugId: string) { + try { + const userInfo = await this.prismaService.events.findUnique({ + where: { + slug: slugId, + }, + select: { + Ticket: { + select: { + user: true, + }, + }, + }, + }); + + if (!userInfo) { + throw new NotFoundException('Events not found'); + } + + const data = userInfo.Ticket.map((info) => + excludeKey(info.user, [ + 'refreshToken', + 'createdAt', + ]), + ); + + return { + ok: true, + message: 'members found successfully', + data: data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException('Event not found'); + } else { + throw e; + } + } + } + + async getEventRegistartionStatus(slugId: string, userId: string) { + try { + const data = await this.prismaService.events.findUnique({ + where: { + slug: slugId, + }, + select: { + Ticket: { + where: { + userUid: userId, + }, + }, + }, + }); + + if (!data || !data.Ticket.length) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'User found successfully', + isRegistred: true, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw new InternalServerErrorException({ + error: e, + }); + } + } + } + + async uploadEventCover(file: Express.Multer.File, eventSlug: string) { + try { + const publicUrl = await this.cloudService.uploadFile(file); + if (!publicUrl) { + return new InternalServerErrorException(); + } + + const updatedEventCover = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + coverImage: publicUrl, + }, + }); + + if (!updatedEventCover) { + throw new InternalServerErrorException(); + } + return { + ok: true, + data: updatedEventCover, + message: 'image uploaded successfully', + }; + } catch (e) { + if (e instanceof InternalServerErrorException) { + throw new InternalServerErrorException(); + } + } + } + + async getTicketInfo(id: string) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + id, + }, + select: { + eventDate: true, + description: true, + isCollegeEvent: true, + coverImage: true, + location: true, + name: true, + }, + }); + if (!event) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'Event schema found', + data: event, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } + + async deleteEvent(eventId: string) { + try { + const event = await this.getEventById(eventId); + // cant delete paid event till we figure out a way to process refund + // #TODO: @sreehari2003 add refund logic here + if (event.ticketPrice > 0) { + return new ServiceUnavailableException(); + } + + await this.prismaService.ticket.deleteMany({ + where: { + eventsId: eventId, + }, + }); + + await this.prismaService.events.delete({ + where: { + id: eventId, + }, + }); + + return { + ok: true, + message: 'event was deleted successfully', + }; + } catch (e) { + if (e instanceof ServiceUnavailableException) { + throw new ServiceUnavailableException({ + message: 'We dont support to delete a paid event', + }); + } + throw new InternalServerErrorException({ + error: e, + }); + } + } + + async removeParticipant(eventId: string, userId: string) { + try { + const isUserExist = await this.prismaService.ticket.findFirst({ + where: { + eventsId: eventId, + userUid: userId, + }, + }); + + if (!isUserExist) { + throw new NotFoundException(); + } + + await this.prismaService.ticket.delete({ + where: { + id: isUserExist.id, + }, + }); + + return { + ok: true, + message: 'user was removed successfully', + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw new ServiceUnavailableException(); + } + } + } + + async getEventStats(id: string) { + try { + const eventInfo = await this.prismaService.events.findUnique({ + where: { + slug: id, + }, + }); + + if (!eventInfo) throw new NotFoundException(); + + const insights = await this.prismaService.ticket.groupBy({ + by: ['createdAt'], + where: { + eventsId: eventInfo.id, + }, + _count: true, + }); + + const stats = await this.prismaService.user.aggregate({ + where: { + Ticket: { + some: { + eventsId: eventInfo.id, + }, + }, + }, + _count: true, + }); + + const totalRevenue = stats._count * eventInfo.ticketPrice; + + const data = { + totalRevenue: totalRevenue || 0, + totalTickets: stats._count || 0, + insights: this.aggregateCountsByDay(insights), + }; + + return { + data, + message: 'Data Found successfully', + }; + } catch { + throw new NotFoundException(); + } + } + + @OnEvent('event.updated') + async handleEventUpdated(event: Events) { + const embedDescription = await this.AiService.generateEmbedding( + JSON.stringify(event.description), + ); + const embedName = await this.AiService.generateEmbedding( + JSON.stringify(event.name), + ); + await this.prismaService + .$queryRaw`UPDATE public."Events" SET embedding_description = ${embedDescription} WHERE id = ${event.id}`; + await this.prismaService + .$queryRaw`UPDATE public."Events" SET embedding_title = ${embedName} WHERE id = ${event.id}`; + } + + @OnEvent('event.created') + async addSeedKanbanBoards(newEvent: Events, userId: string) { + // By default these kanban boards are created for each event + await this.prismaService.events.update({ + where: { + id: newEvent.id, + }, + data: { + kanban: { + createMany: { + data: [ + { + userUid: userId, + title: 'Todo', + }, + { + userUid: userId, + title: 'In process', + }, + { + userUid: userId, + title: 'completed', + }, + ], + }, + }, + }, + }); + } + + async deleteForm(slug: string) { + try { + await this.prismaService.events.update({ + where: { + slug, + }, + data: { + form: { + deleteMany: {}, + }, + }, + }); + return { + ok: true, + message: 'form deleted successfully', + }; + } catch { + throw new InternalServerErrorException(); + } + } + + private async getEventBySlug(id: string) { + return this.prismaService.events.findUnique({ + where: { + slug: id, + }, + }); + } + + private aggregateCountsByDay(responses: Insights[]) { + const aggregatedCounts = {}; + + responses.forEach((response) => { + // Extract the date part from createdAt + const date = new Date(response.createdAt).toISOString().split('T')[0]; + + // Initialize count for the day if not exists + if (!aggregatedCounts[date]) { + aggregatedCounts[date] = 0; + } + + // Add count to the existing count for the day + aggregatedCounts[date] += response._count; + }); + + return aggregatedCounts; + } +} + +type Insights = { + _count: number; + createdAt: Date; +}; diff --git a/apps/api/src/services/form.service.ts b/apps/api/src/services/form.service.ts new file mode 100644 index 00000000..51bfe494 --- /dev/null +++ b/apps/api/src/services/form.service.ts @@ -0,0 +1,208 @@ +import { + Injectable, + InternalServerErrorException, + NotFoundException, +} from '@nestjs/common'; +import { PrismaService } from './prisma.service'; +import { AiService } from './ai.service'; +import { EventsService } from './events.service'; +import type { FormPayLoad } from './dto/create-form.dto'; + +@Injectable() +export class FormService { + constructor( + private readonly prismaService: PrismaService, + private readonly AiService: AiService, + private readonly EventService: EventsService, + ) {} + + async createForm(data: FormPayLoad) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + organizationId: data.organizationId, + id: data.eventId, + }, + }); + + if (!event) { + throw new NotFoundException(); + } + + const formSchema = await this.prismaService.field.create({ + data: { + label: data.data.label, + placeholder: data.data.placeholder, + required: data.data.required, + type: data.data.type, + options: data.data.options, + Events: { + connect: { + id: data.eventId, + }, + }, + }, + }); + + return { + ok: true, + message: 'schema updated successfully', + data: formSchema, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } + + async toggleFormPublishStatus(eventSlug: string, shouldPublish: boolean) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + select: { + form: true, + }, + }); + if (!event) { + throw new NotFoundException(); + } + + if (!event.form.length) { + throw new InternalServerErrorException(); + } + + const newEventStatus = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + isFormPublished: shouldPublish, + }, + }); + + return { + ok: 'true', + message: 'form status was changed', + data: newEventStatus, + }; + } catch (e) { + if (e instanceof InternalServerErrorException) { + throw new InternalServerErrorException({ + message: 'Please create a form schema to publish the form', + }); + } + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + + return e; + } + } + + async getEventFormScheme(eventSlug: string) { + try { + const eventSchema = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + select: { + form: true, + }, + }); + + if (!eventSchema) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'Event schema found', + data: eventSchema.form, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } + + public async addUserFormSubmission( + info: Record>, + eventId: string, + userId: string, + ) { + const event = await this.EventService.getEventById(eventId); + if (!event) return new NotFoundException(); + + await this.prismaService.response.create({ + data: { + data: info, + user: { + connect: { + uid: userId, + }, + }, + Events: { + connect: { + id: event.id, + }, + }, + }, + }); + } + + async getRegisteredParticipantsFormSubmissions(id: string, userId: string) { + try { + const schema = await this.prismaService.events.findUnique({ + where: { + slug: id, + }, + select: { + form: true, + id: true, + }, + }); + + const label = {}; + schema.form.forEach((el) => { + label[el.id] = el.label; + }); + + const data = await this.prismaService.response.findMany({ + where: { + userUid: userId, + eventsId: schema.id, + }, + }); + if (!data) return new NotFoundException(); + + const result = {}; + + schema.form.forEach((el) => { + // @ts-ignore + if (data[0] && el.id in data[0].data) { + result[el.label] = data[0].data[el.id]; + } + }); + + return { + ok: true, + data: result, + message: 'received form successfully', + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } +} diff --git a/apps/api/src/services/guards/rbac-member.guard.ts b/apps/api/src/services/guards/rbac-member.guard.ts new file mode 100644 index 00000000..744e9090 --- /dev/null +++ b/apps/api/src/services/guards/rbac-member.guard.ts @@ -0,0 +1,55 @@ +import { + type CanActivate, + type ExecutionContext, + Injectable, + ForbiddenException, + NotFoundException, +} from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { ORG_ID_NOT_FOUND, NO_ROLE_ACCESS } from '../../error'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class RbacGuard implements CanActivate { + constructor( + private reflector: Reflector, + private prisma: PrismaService, + ) {} + + async canActivate(context: ExecutionContext): Promise { + const roles = this.reflector.get('roles', context.getHandler()); + if (!roles) { + return true; + } + + const request = context.switchToHttp().getRequest(); + const user = request.user; + + const organizationId = + request.method === 'GET' + ? request.params.orgID + : request.body.organizationId; + + if (!organizationId) { + throw new NotFoundException(ORG_ID_NOT_FOUND); + } + + const organizationMember = await this.prisma.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid: user.uid, + organizationId, + }, + }, + }); + + if (!organizationMember) { + throw new ForbiddenException(NO_ROLE_ACCESS); + } + + // setting role in request so that we can access the role via decorator + request.role = organizationMember.role; + + return roles.includes(organizationMember.role); + } +} diff --git a/apps/api/src/emitters/.gitkeep b/apps/api/src/services/inti.service.ts similarity index 100% rename from apps/api/src/emitters/.gitkeep rename to apps/api/src/services/inti.service.ts diff --git a/apps/api/src/services/kanban.service.ts b/apps/api/src/services/kanban.service.ts new file mode 100644 index 00000000..7646a769 --- /dev/null +++ b/apps/api/src/services/kanban.service.ts @@ -0,0 +1,149 @@ +import { + Injectable, + InternalServerErrorException, + NotFoundException, +} from '@nestjs/common'; +import { type Prisma } from '@prisma/client'; +import { PrismaService } from './prisma.service'; +import type { CreateTask } from './dto/create-task.dto'; + +@Injectable() +export class KanbanService { + constructor(private prismaService: PrismaService) {} + + async getAllBoards(slug: string) { + try { + const allBoards = await this.prismaService.events.findUnique({ + where: { + slug, + }, + select: { + kanban: { + include: { + tasks: { + include: { + createdBy: { + select: { + email: true, + displayName: true, + photoURL: true, + }, + }, + Comment: true, + }, + }, + createdBy: { + select: { + email: true, + displayName: true, + photoURL: true, + }, + }, + _count: true, + }, + orderBy: { + createdAt: 'asc', + }, + }, + }, + }); + + if (!allBoards) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'Boards found', + data: allBoards.kanban, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + + throw new InternalServerErrorException({ + error: e, + }); + } + } + + async createTask( + payload: CreateTask, + slug: string, + kanbanId: string, + user: string, + ) { + try { + const newKanban = await this.prismaService.events.update({ + where: { + slug, + }, + data: { + kanban: { + update: { + where: { + id: kanbanId, + }, + data: { + tasks: { + create: { + title: payload.title, + userUid: user, + }, + }, + }, + }, + }, + }, + }); + if (!newKanban) throw new InternalServerErrorException(); + + const newTask = await this.prismaService.task.findFirst({ + where: { + userUid: user, + kanbanId: kanbanId, + title: payload.title, + }, + }); + + await this.addComment(newTask.id, payload.data, user); + + return { + ok: true, + message: 'task was added successfully', + }; + } catch { + throw new InternalServerErrorException(); + } + } + + async addComment(taskId: string, comment: Prisma.JsonValue, userId: string) { + try { + const newComment = await this.prismaService.task.update({ + where: { + id: taskId, + }, + data: { + Comment: { + create: { + data: comment, + userUid: userId, + }, + }, + }, + }); + + if (!newComment) throw new InternalServerErrorException(); + + return { + ok: true, + message: 'comment was added', + }; + } catch (e) { + throw new InternalServerErrorException({ + error: e, + }); + } + } +} diff --git a/apps/api/src/services/mail/mail.service.ts b/apps/api/src/services/mail/mail.service.ts new file mode 100644 index 00000000..8a48cf80 --- /dev/null +++ b/apps/api/src/services/mail/mail.service.ts @@ -0,0 +1,71 @@ +import { MailerService } from '@nestjs-modules/mailer'; +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class MailService { + constructor(private readonly mailerService: MailerService) {} + + @OnEvent('org.invite') + async onOrgInvite(payload: OrgInviteEvent) { + await this.mailerService.sendMail({ + to: payload.to, + subject: `You have been invited to Join ${payload.orgName}`, + template: 'org-invite', + context: { + from: payload.from, + fromEmail: payload.fromEmail, + orgName: payload.orgName, + inviteUrl: payload.inviteUrl, + }, + }); + } + + @OnEvent('user.registered') + async onUserRegistered(payload: UserRegisteredEvent) { + await this.mailerService.sendMail({ + to: payload.email, + subject: 'Welcome to Fossfolio', + template: 'welcome', + context: { + name: payload.name, + email: payload.email, + avatarUrl: payload.avatarUrl, + }, + }); + } + + @OnEvent('payment.success') + async onPaymentSuccess(payload: PaymentSuccessEvent) { + await this.mailerService.sendMail({ + to: payload.email, + subject: 'Payment Success', + template: 'payment-succesfull', + context: { + from: payload.from, + email: payload.email, + amount: payload.amount, + }, + }); + } +} + +export interface OrgInviteEvent { + inviteUrl: string; + from: string; + orgName: string; + fromEmail: string; + to: string; +} + +export interface UserRegisteredEvent { + email: string; + name: string; + avatarUrl: string; +} + +export interface PaymentSuccessEvent { + from: string; + email: string; + amount: number; +} diff --git a/apps/api/src/services/mail/templates/org-invite.tsx b/apps/api/src/services/mail/templates/org-invite.tsx new file mode 100644 index 00000000..f70523d4 --- /dev/null +++ b/apps/api/src/services/mail/templates/org-invite.tsx @@ -0,0 +1,86 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; +import type { OrgInviteEvent } from '../mail.service'; +import React from 'react'; + +const baseUrl = process.env.CLIENT_URL + ? `https://${process.env.CLIENT_URL}` + : 'fossfolio.com'; + +const InviteUserEmail = ({ + from, + fromEmail, + orgName, + inviteUrl, +}: OrgInviteEvent) => { + const previewText = `Join ${orgName} on Fossfolio`; + + return ( + + + {previewText} + + + +
+ Fossfolio +
+ + Join {orgName} on Fossfolio + + + Hello, + + + {from} ( + + {fromEmail} + + ) has invited you to the {orgName} Organisation + on Fossfolio. + +
+ +
+ + or copy and paste this URL into your browser:{' '} + + {inviteUrl} + + +
+
+ +
+ + ); +}; + +export default InviteUserEmail; diff --git a/apps/api/src/services/mail/templates/payment-succesfull.tsx b/apps/api/src/services/mail/templates/payment-succesfull.tsx new file mode 100644 index 00000000..a6049073 --- /dev/null +++ b/apps/api/src/services/mail/templates/payment-succesfull.tsx @@ -0,0 +1,68 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; +import type { PaymentSuccessEvent } from '../mail.service'; +import React from 'react'; + +const baseUrl = process.env.CLIENT_URL + ? `${process.env.CLIENT_URL}` + : 'fossfolio.com'; + +const InviteUserEmail = ({ from, amount }: PaymentSuccessEvent) => { + return ( + + + Payment Successsfull + + + +
+ Fossfolio +
+ + Payment Successsfull + + + Hello, + + + Congratulations {from}! +
+ Your payment of ₹ {amount} was successfull. You can find your + tickets in the website below +
+
+ +
+ +
+
+ +
+ + ); +}; + +export default InviteUserEmail; diff --git a/apps/api/src/services/mail/templates/welcome.tsx b/apps/api/src/services/mail/templates/welcome.tsx new file mode 100644 index 00000000..0df91581 --- /dev/null +++ b/apps/api/src/services/mail/templates/welcome.tsx @@ -0,0 +1,68 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; +import type { UserRegisteredEvent } from '../mail.service'; +import React from 'react'; + +const baseUrl = process.env.CLIENT_URL + ? `${process.env.CLIENT_URL}` + : 'fossfolio.com'; + +const UserWelcome = ({ name, email, avatarUrl }: UserRegisteredEvent) => { + const previewText = `Welcome to Fossfolio`; + + return ( + + + {previewText} + + + +
+ Fossfolio +
+ + Welcome to Fossfolio + + + Hello, {name} + + + You have successfully registered for Fossfolio. We are glad to + have you on board. You can now explore the events and start + exploring the community. + +
+ +
+
+
+ +
+ + ); +}; + +export default UserWelcome; diff --git a/apps/api/src/services/org-invite.service.ts b/apps/api/src/services/org-invite.service.ts new file mode 100644 index 00000000..999a843f --- /dev/null +++ b/apps/api/src/services/org-invite.service.ts @@ -0,0 +1,155 @@ +import { PrismaService } from './prisma.service'; +import { Injectable, ServiceUnavailableException } from '@nestjs/common'; +import type { Role } from '@prisma/client'; +import { EventEmitter2 } from '@nestjs/event-emitter'; + +@Injectable() +export class OrganizationInviteService { + constructor( + private readonly prismaService: PrismaService, + private readonly eventEmitter: EventEmitter2, + ) {} + + async inviteToOrg( + email: string, + inviterid: string, + orgId: string, + role: Role, + ) { + try { + // if there is already invite + const isAlreadySent = + await this.prismaService.organizationInvite.findUnique({ + where: { + inviteeEmail_organizationId: { + inviteeEmail: email, + organizationId: orgId, + }, + }, + select: { + id: true, + }, + }); + // if user already exist in db + // delete the already existing invite + if (isAlreadySent) { + await this.prismaService.organizationInvite.delete({ + where: { + inviteeEmail_organizationId: { + organizationId: orgId, + inviteeEmail: email, + }, + }, + }); + } + + // transaction + const inviteUrl = await this.prismaService.$transaction(async (db) => { + const data = await db.organization.update({ + where: { + id: orgId, + }, + data: { + invites: { + create: { + inviteeEmail: email, + inviterUid: inviterid, + inviteeRole: role, + }, + }, + }, + include: { + invites: true, + }, + }); + // the guy who send invite + const inviter = await db.user.findUnique({ + where: { + uid: inviterid, + }, + }); + const inviteId = data.invites.find( + (el) => el.inviteeEmail === email, + ).id; + // finding the id of new invite + const localPort = process.env.CLIENT_URL || 'http://localhost:3000'; + const inviteURL = `${localPort}/verify?id=${inviteId}`; + + // we dont want to send invite on local + // @sreehari2003 Removing this for presentation + // if (process.env.NODE_ENV === 'production') { + await this.eventEmitter.emit('org.invite', { + to: email, + inviteUrl: inviteURL, + from: inviter.displayName, + orgName: data.name, + fromEmail: inviter.email, + }); + // } + + return inviteURL; + }); + + return { + ok: true, + data: process.env.NODE_ENV !== 'production' ? inviteUrl : null, + message: 'email sent successfully , please check your mailbox', + }; + } catch { + return { + ok: false, + message: 'email sending failed, please try again later', + }; + } + } + + async verifyEmailInvite(id: string, ownerId: string, authUserEmail: string) { + // TODO + // convert to transaction + try { + const data = + await this.prismaService.organizationInvite.findUniqueOrThrow({ + where: { + id: id, + }, + }); + if (data.inviteeEmail !== authUserEmail) { + throw new ServiceUnavailableException(); + } + const orgData = await this.prismaService.organization.update({ + where: { + id: data.organizationId, + }, + data: { + members: { + create: { + role: data.inviteeRole, + userUid: ownerId, + }, + }, + }, + }); + await this.prismaService.organizationInvite.delete({ + where: { + id: id, + }, + }); + if (orgData) { + return { + ok: true, + message: 'invite verifcation successfull', + data: orgData, + }; + } + throw new Error(); + } catch (e) { + if (e instanceof ServiceUnavailableException) { + throw new ServiceUnavailableException(); + } + return { + ok: false, + message: 'couldnt verify the invite', + }; + } + } +} diff --git a/apps/api/src/services/org-member.service.ts b/apps/api/src/services/org-member.service.ts new file mode 100644 index 00000000..44d7dd47 --- /dev/null +++ b/apps/api/src/services/org-member.service.ts @@ -0,0 +1,110 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import type { Role } from '@prisma/client'; +import { ORG_MEMBER_NOT_FOUND, ROLE_UPDATE_FAILED } from '../error'; +import { PrismaService } from './prisma.service'; + +@Injectable() +export class OrganizationMemberService { + constructor(private readonly prismaService: PrismaService) {} + + async getMembers(organizationId: string) { + const members = await this.prismaService.organizationMember.findMany({ + where: { + organizationId, + }, + select: { + user: { + select: { + uid: true, + email: true, + displayName: true, + slug: true, + }, + }, + role: true, + }, + }); + + return members; + } + + async findMember(organizationId: string, userUid: string) { + const member = await this.prismaService.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid, + organizationId, + }, + }, + }); + + if (member) return member; + return ORG_MEMBER_NOT_FOUND; + } + + async removeMember(organizationId: string, userUid: string) { + try { + const member = await this.prismaService.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid, + organizationId, + }, + }, + }); + + if (!member) throw new NotFoundException(); + + await this.prismaService.organizationMember.delete({ + where: { + id: member.id, + }, + }); + + return { + ok: true, + message: 'User removed successfully', + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ORG_MEMBER_NOT_FOUND, + }); + } else { + return e; + } + } + } + + async updateRole(organizationId: string, userUid: string, role: Role) { + try { + const newRole = await this.prismaService.organizationMember.update({ + where: { + userUid_organizationId: { + userUid, + organizationId, + }, + }, + data: { + role, + }, + }); + + if (!newRole) throw new NotFoundException(); + + return { + ok: true, + message: 'role updated successfully', + data: newRole, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ROLE_UPDATE_FAILED, + }); + } else { + return e; + } + } + } +} diff --git a/apps/api/src/services/organization.service.ts b/apps/api/src/services/organization.service.ts new file mode 100644 index 00000000..839ea801 --- /dev/null +++ b/apps/api/src/services/organization.service.ts @@ -0,0 +1,262 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; +import type { CreateOrgDto } from './dto/create-org.dto'; +import { ORG_EXISTS, ORG_NOT_FOUND } from '../error'; +import type { UpdateOrgDto } from './dto/update-org.dto'; +import type { Role } from '@prisma/client'; + +@Injectable() +export class OrganizationService { + constructor(private readonly prismaService: PrismaService) {} + + async create(createOrgDto: CreateOrgDto, uid: string) { + try { + const { name, slug } = createOrgDto; + + const org = await this.prismaService.organization.create({ + data: { + name, + slug, + members: { + create: { + role: 'ADMIN', + userUid: uid, + }, + }, + }, + }); + + return org; + } catch (error) { + return ORG_EXISTS; + } + } + + async findOrgBySlug(slug: string) { + const org = await this.prismaService.organization.findUnique({ + where: { + slug, + }, + }); + + if (org) return org; + return ORG_NOT_FOUND; + } + + async update(updateOrgDto: UpdateOrgDto) { + const { organizationId, name } = updateOrgDto; + + const org = await this.prismaService.organization.findUnique({ + where: { + id: organizationId, + }, + }); + + if (!org) return ORG_NOT_FOUND; + + const updatedOrg = await this.prismaService.organization.update({ + where: { + id: organizationId, + }, + data: { + name, + }, + }); + + return updatedOrg; + } + + async findOrgsByUser(uid: string) { + const data = await this.prismaService.organizationMember.findMany({ + where: { + userUid: uid, + }, + select: { + organization: { + include: { + _count: { + select: { + members: true, + events: true, + }, + }, + }, + }, + role: true, + }, + }); + + return { + ok: true, + message: 'orgs found successfully', + data, + }; + } + + async deleteOrg(id: string) { + await this.prismaService.organization.delete({ + where: { + id, + }, + }); + return { + ok: true, + message: 'org was deleted successfully', + }; + } + + /* + + * if there is only one admin and he is the one leaving the org we should tranfer the org to the first + person who joined the org + + * if the person is the last person to leave the org we should delete the org completly + + * if there is multiple admins just make user leave the org + + */ + + async leaveOrg(orgId: string, userId: string) { + try { + await this.prismaService.organizationMember.delete({ + where: { + userUid_organizationId: { + userUid: userId, + organizationId: orgId, + }, + }, + }); + return { + ok: true, + message: 'successfully left the organization', + }; + } catch { + return { + ok: false, + message: 'Unable to leave the org please try again later', + }; + } + } + + async getAllEvents(id: string, role: Role) { + try { + const event = await this.prismaService.events.findMany({ + where: { + organizationId: id, + }, + }); + + return { + event, + role, + }; + } catch (e) { + return { + ok: false, + message: 'could not find the events', + ERROR: e, + }; + } + } + + async getOrgRole(orgId: string, user: string) { + try { + return await this.prismaService.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid: user, + organizationId: orgId, + }, + }, + select: { + role: true, + }, + }); + } catch {} + } + + async getOrgById(orgId: string) { + try { + const data = await this.prismaService.organization.findUnique({ + where: { + id: orgId, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'org found successfully', + data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ok: false, + message: e.message || 'error loading organization', + }); + } + } + } + + async UpdateOrg(id: string, payload: Data) { + try { + const data = await this.prismaService.organization.update({ + where: { + id, + }, + data: { + name: payload.name, + slug: payload.slug, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + return { + ok: true, + message: 'Org was updated successfully', + data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + } + } + + async getEventsByorg(key: string) { + try { + const data = await this.prismaService.organization.findUnique({ + where: { + slug: key, + }, + select: { + events: { + where: { + isPublished: true, + }, + }, + name: true, + }, + }); + if (!data) throw new NotFoundException(); + return { + ok: true, + message: 'Events found successfully', + data, + }; + } catch { + throw new NotFoundException(); + } + } +} + +type Data = { + slug: string; + name: string; +}; diff --git a/apps/api/src/prisma/prisma.service.ts b/apps/api/src/services/prisma.service.ts similarity index 52% rename from apps/api/src/prisma/prisma.service.ts rename to apps/api/src/services/prisma.service.ts index 0560595d..fdd44f37 100644 --- a/apps/api/src/prisma/prisma.service.ts +++ b/apps/api/src/services/prisma.service.ts @@ -1,9 +1,9 @@ -import { Injectable, OnModuleInit } from '@nestjs/common'; +import { Injectable, type OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { - async onModuleInit() { - await this.$connect(); - } + async onModuleInit() { + await this.$connect(); + } } diff --git a/apps/api/src/services/stripe.service.ts b/apps/api/src/services/stripe.service.ts new file mode 100644 index 00000000..5780db03 --- /dev/null +++ b/apps/api/src/services/stripe.service.ts @@ -0,0 +1,184 @@ +import { Injectable } from '@nestjs/common'; +import type { Events } from '@prisma/client'; +import { ConfigService } from '@nestjs/config'; +import { PrismaService } from './prisma.service'; +import Stripe from 'stripe'; +import { EventEmitter2 } from '@nestjs/event-emitter'; + +@Injectable() +export class StripeService { + private readonly stripe: Stripe; + private readonly prisma: PrismaService; + private readonly configService: ConfigService; + + constructor( + prisma: PrismaService, + config: ConfigService, + private readonly eventEmitter: EventEmitter2, + ) { + this.stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { + apiVersion: '2023-10-16', + }); + + this.prisma = prisma; + this.configService = config; + } + + async handleWebHookEvent(body, signature) { + try { + const event = this.stripe.webhooks.constructEvent( + body, + signature, + process.env.STRIPE_WEBHOOK_SECRET, + ); + if (event.type === 'payment_intent.created') { + const eventInfo = event.data.object.metadata; + const { event_id, user_id } = eventInfo; + if (!event_id || !user_id) { + throw new Error('Invalid metadata'); + } else { + const event = await this.prisma.events.findUnique({ + where: { + id: event_id, + }, + }); + + await this.prisma.events.update({ + where: { + id: event_id, + }, + data: { + Ticket: { + create: { + userUid: user_id, + }, + }, + maxTicketCount: event.maxTicketCount - 1, + }, + }); + + const user = await this.prisma.user.findUnique({ + where: { + uid: user_id, + }, + }); + + this.eventEmitter.emit('payment.success', { + from: user.displayName ?? user.email.split('@')[0], + email: user.email, + amount: event.ticketPrice, + }); + } + } + } catch (e) { + console.log(e); + throw new Error('Failed to handle payments'); + } + } + + async createProductObject(event: Events): Promise { + try { + const product = await this.stripe.products.create({ + name: event.name, + description: event.name, + images: [event.coverImage], + shippable: false, + metadata: { + event_id: event.id, + }, + }); + + await this.prisma.events.update({ + where: { + id: event.id, + }, + data: { + stripe_product_object: product.id, + }, + }); + + return product.id; + } catch (error) { + console.error('Stripe API Error:', error); + throw new Error('Failed to create product object'); + } + } + + async createProductPricingObject(event: Events): Promise { + try { + let stripe_product_object = ''; + if (!event.stripe_product_object) { + stripe_product_object = await this.createProductObject(event); + } else { + stripe_product_object = event.stripe_product_object; + } + const price = await this.stripe.prices.create({ + product: stripe_product_object, + unit_amount: event.ticketPrice * 100, // amount in inr , stripe default takes paisa in inr so we conver that to rupee + currency: 'inr', + }); + + await this.prisma.events.update({ + where: { + id: event.id, + }, + data: { + stripe_price_object: price.id, + }, + }); + + return price.id; + } catch (error) { + console.error('Stripe API Error:', error); + throw new Error('Failed to create product pricing object'); + } + } + + async createCheckoutSession( + items: Events, + user: string, + ): Promise { + try { + const webUrl = this.configService.get('WEB_URL'); + // if there is already stripe_payment_object we will use it else we will create another one + let price_object = ''; + if (!items.stripe_price_object) { + price_object = await this.createProductPricingObject(items); + } else { + price_object = items.stripe_price_object; + } + + const session = await this.stripe.checkout.sessions.create({ + metadata: { + user_id: user, + event_id: items.id, + event_image: items.coverImage, + event_name: items.name, + }, + payment_method_types: ['card'], + line_items: [ + { + price: price_object, + quantity: 1, + // one user can only buy one ticket for now + }, + ], + mode: 'payment', + // might need to create a success page then redirect to tickets page + success_url: webUrl + '/tickets', + // can show a toast in frontend + cancel_url: webUrl + '/events?payment_error=true', + }); + + return { sessionId: session.id, url: session.url }; + } catch (error) { + console.log('Stripe API Error:', error); + throw new Error('Failed to create checkout'); + } + } +} + +type CheckOutReturnProp = { + sessionId: string; + url: string; +}; diff --git a/apps/api/src/services/user.service.ts b/apps/api/src/services/user.service.ts new file mode 100644 index 00000000..d3a48e6a --- /dev/null +++ b/apps/api/src/services/user.service.ts @@ -0,0 +1,180 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import type { Profile } from 'passport'; +import { USER_UPDATE_ERROR } from '../error'; +import { PrismaService } from './prisma.service'; +import type { UpdateUserDto } from './dto/update-user.dto'; +import type { User } from '@prisma/client'; +import { fakerEN } from '@faker-js/faker'; +import { EventEmitter2 } from '@nestjs/event-emitter'; + +@Injectable() +export class UserService { + constructor( + private readonly prismaService: PrismaService, + private readonly eventEmitter: EventEmitter2, + ) {} + + async findUserByEmail(email: string) { + try { + const user = await this.prismaService.user.findUnique({ + where: { + email: email, + }, + }); + return user; + } catch (error) { + return null; + } + } + + async findUserBySlug(slug: string) { + try { + const user = await this.prismaService.user.findUnique({ + where: { + slug, + }, + }); + return user; + } catch (e) { + return null; + } + } + + async createOAuthUser( + accessToken: string, + refreshToken: string, + profile: Profile, + ) { + const userDisplayName = profile.displayName ? profile.displayName : null; + const userPhotoURL = profile.photos ? profile.photos[0].value : null; + + let slug: string; + while (true) { + slug = this.generateSlug(); + const user = await this.findUserBySlug(slug); + if (user) continue; + break; + } + + const createdUser = await this.prismaService.user.create({ + data: { + displayName: userDisplayName, + email: profile.emails[0].value, + photoURL: userPhotoURL, + slug, + providerAccounts: { + create: { + provider: profile.provider, + providerAccountId: profile.id, + providerRefreshToken: refreshToken, + providerAccessToken: accessToken, + }, + }, + }, + }); + + this.eventEmitter.emit('user.registered', { + email: createdUser.email, + name: createdUser.displayName, + avatarUrl: createdUser.photoURL, + }); + + return createdUser; + } + + async updateRefreshToken(uid: string, refreshToken: string | null) { + try { + const updatedUser = await this.prismaService.user.update({ + where: { + uid: uid, + }, + data: { + refreshToken: refreshToken, + }, + }); + return updatedUser; + } catch (error) { + throw error; + } + } + + async findUserById(uid: string) { + try { + const user = await this.prismaService.user.findUnique({ + where: { + uid: uid, + }, + }); + + return user; + } catch (error) { + return null; + } + } + + async updateUser(authUser: User, updateUserDto: UpdateUserDto) { + try { + const user = await this.prismaService.user.update({ + where: { + uid: authUser.uid, + }, + data: { + slug: updateUserDto.slug ? updateUserDto.slug : authUser.slug, + photoURL: updateUserDto.photoUrl + ? updateUserDto.photoUrl + : authUser.photoURL, + displayName: updateUserDto.displayName + ? updateUserDto.displayName + : authUser.displayName, + isStudent: updateUserDto.hasOwnProperty('isCollegeStudent') + ? updateUserDto.isCollegeStudent + : authUser.isStudent, + collegeName: updateUserDto.collegeName || authUser.collegeName, + }, + }); + return user; + } catch (error) { + return USER_UPDATE_ERROR; + } + } + + async getReservedTickets(id: string) { + try { + const data = await this.prismaService.user.findUnique({ + where: { + uid: id, + }, + + select: { + Ticket: { + select: { + event: true, + }, + }, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + return { + ok: true, + message: 'Ticket found successfully', + data: data.Ticket.map((el) => el.event), + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + return e; + } + } + } + + private generateSlug() { + return fakerEN.lorem.slug({ + min: 1, + max: 2, + }); + } +} diff --git a/apps/api/src/stripe/stripe.controller.ts b/apps/api/src/stripe/stripe.controller.ts deleted file mode 100644 index 573315fa..00000000 --- a/apps/api/src/stripe/stripe.controller.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Body, Controller, Post, Headers } from '@nestjs/common'; -import { StripeService } from './stripe.service'; - -@Controller('payment/webhook') -export class StripeController { - constructor(private readonly stripeService: StripeService) {} - @Post('/') - async handleWebHook(@Body() data, @Headers() head) { - const signature = head['stripe-signature'] as string; - - return await this.stripeService.handleWebHookEvent(data, signature); - } -} diff --git a/apps/api/src/stripe/stripe.module.ts b/apps/api/src/stripe/stripe.module.ts deleted file mode 100644 index 6533e951..00000000 --- a/apps/api/src/stripe/stripe.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { StripeService } from './stripe.service'; -import { PrismaService } from '../prisma/prisma.service'; -import { ConfigModule } from '@nestjs/config'; -import { StripeController } from './stripe.controller'; - -@Module({ - imports: [ConfigModule], - providers: [StripeService, PrismaService], - exports: [StripeService], - controllers: [StripeController], -}) -export class StripeModule {} diff --git a/apps/api/src/stripe/stripe.service.ts b/apps/api/src/stripe/stripe.service.ts deleted file mode 100644 index 77a2c318..00000000 --- a/apps/api/src/stripe/stripe.service.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { Events } from '@prisma/client'; -import { ConfigService } from '@nestjs/config'; -import { PrismaService } from '../prisma/prisma.service'; -import Stripe from 'stripe'; -import { EventEmitter2 } from '@nestjs/event-emitter'; - -@Injectable() -export class StripeService { - private readonly stripe: Stripe; - private readonly prisma: PrismaService; - private readonly configService: ConfigService; - - constructor( - prisma: PrismaService, - config: ConfigService, - private readonly eventEmitter: EventEmitter2, - ) { - this.stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { - apiVersion: '2023-10-16', - }); - - this.prisma = prisma; - this.configService = config; - } - - async handleWebHookEvent(body, signature) { - try { - const event = this.stripe.webhooks.constructEvent( - body, - signature, - process.env.STRIPE_WEBHOOK_SECRET, - ); - if (event.type === 'payment_intent.created') { - const eventInfo = event.data.object.metadata; - const { event_id, user_id } = eventInfo; - if (!event_id || !user_id) { - throw new Error('Invalid metadata'); - } else { - const event = await this.prisma.events.findUnique({ - where: { - id: event_id, - }, - }); - - await this.prisma.events.update({ - where: { - id: event_id, - }, - data: { - Ticket: { - create: { - userUid: user_id, - }, - }, - maxTicketCount: event.maxTicketCount - 1, - }, - }); - - const user = await this.prisma.user.findUnique({ - where: { - uid: user_id, - }, - }); - - this.eventEmitter.emit('payment.success', { - from: user.displayName ?? user.email.split('@')[0], - email: user.email, - amount: event.ticketPrice, - }); - } - } - } catch (e) { - console.log(e); - throw new Error('Failed to handle payments'); - } - } - - async createProductObject(event: Events): Promise { - try { - const product = await this.stripe.products.create({ - name: event.name, - description: event.name, - images: [event.coverImage], - shippable: false, - metadata: { - event_id: event.id, - }, - }); - - await this.prisma.events.update({ - where: { - id: event.id, - }, - data: { - stripe_product_object: product.id, - }, - }); - - return product.id; - } catch (error) { - console.error('Stripe API Error:', error); - throw new Error('Failed to create product object'); - } - } - - async createProductPricingObject(event: Events): Promise { - try { - let stripe_product_object = ''; - if (!event.stripe_product_object) { - stripe_product_object = await this.createProductObject(event); - } else { - stripe_product_object = event.stripe_product_object; - } - const price = await this.stripe.prices.create({ - product: stripe_product_object, - unit_amount: event.ticketPrice * 100, // amount in inr , stripe default takes paisa in inr so we conver that to rupee - currency: 'inr', - }); - - await this.prisma.events.update({ - where: { - id: event.id, - }, - data: { - stripe_price_object: price.id, - }, - }); - - return price.id; - } catch (error) { - console.error('Stripe API Error:', error); - throw new Error('Failed to create product pricing object'); - } - } - - async createCheckoutSession(items: Events, user: string): Promise { - try { - const webUrl = this.configService.get('WEB_URL'); - // if there is already stripe_payment_object we will use it else we will create another one - let price_object = ''; - if (!items.stripe_price_object) { - price_object = await this.createProductPricingObject(items); - } else { - price_object = items.stripe_price_object; - } - - const session = await this.stripe.checkout.sessions.create({ - metadata: { - user_id: user, - event_id: items.id, - event_image: items.coverImage, - event_name: items.name, - }, - payment_method_types: ['card'], - line_items: [ - { - price: price_object, - quantity: 1, - // one user can only buy one ticket for now - }, - ], - mode: 'payment', - // might need to create a success page then redirect to tickets page - success_url: webUrl + '/tickets', - // can show a toast in frontend - cancel_url: webUrl + '/events?payment_error=true', - }); - - return { sessionId: session.id, url: session.url }; - } catch (error) { - console.log('Stripe API Error:', error); - throw new Error('Failed to create checkout'); - } - } -} - -type CheckOutReturnProp = { - sessionId: string; - url: string; -}; diff --git a/apps/api/src/types/knex.d.ts b/apps/api/src/types/knex.d.ts new file mode 100644 index 00000000..d99c11ac --- /dev/null +++ b/apps/api/src/types/knex.d.ts @@ -0,0 +1,125 @@ +import { SystemTable } from '@api/utils/db'; +import { + Account, + AccountCreateSchema, + AccountUpdateSchema, + CommentCreateSchema, + CommentUpdateSchema, + EventCreateSchema, + EventTicket, + EventTicketCreateSchema, + EventTicketUpdateSchema, + EventUpdateSchema, + Form, + FormCreateSchema, + FormField, + FormFieldCreateSchema, + FormFieldOptions, + FormFieldUpdateSchema, + FormResponse, + FormResponseCreateSchema, + FormResponseUpdateSchema, + FormUpdateSchema, + Kanban, + KanbanCard, + KanbanCardCreateSchema, + KanbanCardUpdateSchema, + KanbanCreateSchema, + KanbanUpdateSchema, + Organization, + OrganizationCreateSchema, + OrganizationInvite, + OrganizationInviteCreateSchema, + OrganizationInviteUpdateSchema, + OrganizationMember, + OrganizationMemberCreateSchema, + OrganizationMemberUpdateSchema, + OrganizationUpdateSchema, + Ticket, + TicketCreateSchema, + TicketUpdateSchema, + User, + UserCreateSchema, + UserUpdateSchema, +} from '@api/db/schema'; +import { Knex } from 'knex'; + +declare module 'knex/types/tables' { + interface Tables { + [SystemTable.User]: Knex.CompositeTableType< + User, + UserCreateSchema, + UserUpdateSchema + >; + [SystemTable.Account]: Knex.CompositeTableType< + Account, + AccountCreateSchema, + AccountUpdateSchema + >; + [SystemTable.Organization]: Knex.CompositeTableType< + Organization, + OrganizationCreateSchema, + OrganizationUpdateSchema + >; + [SystemTable.OrgMember]: Knex.CompositeTableType< + OrganizationMember, + OrganizationMemberCreateSchema, + OrganizationMemberUpdateSchema + >; + [SystemTable.OrgInvite]: Knex.CompositeTableType< + OrganizationInvite, + OrganizationInviteCreateSchema, + OrganizationInviteUpdateSchema + >; + [SystemTable.Events]: Knex.CompositeTableType< + Event, + EventCreateSchema, + EventUpdateSchema + >; + [SystemTable.EventTicket]: Knex.CompositeTableType< + EventTicket, + EventTicketCreateSchema, + EventTicketUpdateSchema + >; + [SystemTable.Form]: Knex.CompositeTableType< + Form, + FormCreateSchema, + FormUpdateSchema + >; + [SystemTable.FormFields]: Knex.CompositeTableType< + FormField, + FormFieldCreateSchema, + FormFieldUpdateSchema + >; + [SystemTable.FormFieldOptions]: Knex.CompositeTableType< + FormFieldOptions, + FormFieldCreateSchema, + FormFieldUpdateSchema + >; + [SystemTable.FormResponse]: Knex.CompositeTableType< + FormResponse, + FormResponseCreateSchema, + FormResponseUpdateSchema + >; + [SystemTable.Ticket]: Knex.CompositeTableType< + Ticket, + TicketCreateSchema, + TicketUpdateSchema + >; + [SystemTable.Kanban]: Knex.CompositeTableType< + Kanban, + KanbanCreateSchema, + KanbanUpdateSchema + >; + [SystemTable.KanbanCard]: Knex.CompositeTableType< + KanbanCard, + KanbanCardCreateSchema, + KanbanCardUpdateSchema + >; + [SystemTable.Comment]: Knex.CompositeTableType< + Comment, + CommentCreateSchema, + CommentUpdateSchema + >; + } +} diff --git a/apps/api/src/user/dto/update-user.dto.ts b/apps/api/src/user/dto/update-user.dto.ts deleted file mode 100644 index 4b12255e..00000000 --- a/apps/api/src/user/dto/update-user.dto.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsBoolean, IsNotEmpty, IsString } from 'class-validator'; - -export class UpdateUserDto { - @ApiProperty() - @IsString() - displayName?: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - slug?: string; - - photoUrl?: string; - - @ApiProperty() - @IsBoolean() - isCollegeStudent?: boolean; - - collegeName?: string; -} diff --git a/apps/api/src/user/user.controller.ts b/apps/api/src/user/user.controller.ts deleted file mode 100644 index 6c4e5a77..00000000 --- a/apps/api/src/user/user.controller.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Body, Controller, Get, Patch, UseGuards } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import { AuthUser } from '../auth/decorators/user.decorator'; -import { User } from '@prisma/client'; -import { OrganizationService } from '../organization/organization.service'; -import { UserService } from './user.service'; -import { UpdateUserDto } from './dto/update-user.dto'; - -@Controller('user') -export class UserController { - constructor( - private readonly organizationService: OrganizationService, - private readonly userService: UserService, - ) {} - - @Get('/orgs') - @UseGuards(AuthGuard('jwt')) - async findOrgs(@AuthUser() user: User) { - return this.organizationService.findOrgsByUser(user.uid); - } - - @Get('/') - @UseGuards(AuthGuard('jwt')) - async getUser(@AuthUser() user: User) { - return this.userService.findUserById(user.uid); - } - - @Patch('/') - @UseGuards(AuthGuard('jwt')) - async updateUser(@Body() updateUserDto: UpdateUserDto, @AuthUser() user: User) { - return this.userService.updateUser(user, updateUserDto); - } - - @Get('/tickets') - @UseGuards(AuthGuard('jwt')) - async getUserTickets(@AuthUser() user: User) { - return this.userService.getReservedTickets(user.uid); - } -} diff --git a/apps/api/src/user/user.module.ts b/apps/api/src/user/user.module.ts deleted file mode 100644 index f581bed9..00000000 --- a/apps/api/src/user/user.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { UserService } from './user.service'; -import { UserController } from './user.controller'; -import { PrismaModule } from '../prisma/prisma.module'; -import { OrganizationService } from '../organization/organization.service'; - -@Module({ - imports: [PrismaModule], - providers: [UserService, OrganizationService], - controllers: [UserController], -}) -export class UserModule {} diff --git a/apps/api/src/user/user.service.ts b/apps/api/src/user/user.service.ts deleted file mode 100644 index 388148b8..00000000 --- a/apps/api/src/user/user.service.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { Profile } from 'passport'; -import { USER_UPDATE_ERROR } from '../error'; -import { PrismaService } from '../prisma/prisma.service'; -import { UpdateUserDto } from './dto/update-user.dto'; -import { User } from '@prisma/client'; -import { fakerEN } from '@faker-js/faker'; -import { EventEmitter2 } from '@nestjs/event-emitter'; - -@Injectable() -export class UserService { - constructor( - private readonly prismaService: PrismaService, - private readonly eventEmitter: EventEmitter2, - ) {} - - async findUserByEmail(email: string) { - try { - const user = await this.prismaService.user.findUnique({ - where: { - email: email, - }, - }); - return user; - } catch (error) { - return null; - } - } - - async findUserBySlug(slug: string) { - try { - const user = await this.prismaService.user.findUnique({ - where: { - slug, - }, - }); - return user; - } catch (e) { - return null; - } - } - - async createOAuthUser(accessToken: string, refreshToken: string, profile: Profile) { - const userDisplayName = profile.displayName ? profile.displayName : null; - const userPhotoURL = profile.photos ? profile.photos[0].value : null; - - let slug: string; - while (true) { - slug = this.generateSlug(); - const user = await this.findUserBySlug(slug); - if (user) continue; - break; - } - - const createdUser = await this.prismaService.user.create({ - data: { - displayName: userDisplayName, - email: profile.emails[0].value, - photoURL: userPhotoURL, - slug, - providerAccounts: { - create: { - provider: profile.provider, - providerAccountId: profile.id, - providerRefreshToken: refreshToken, - providerAccessToken: accessToken, - }, - }, - }, - }); - - this.eventEmitter.emit('user.registered', { - email: createdUser.email, - name: createdUser.displayName, - avatarUrl: createdUser.photoURL, - }); - - return createdUser; - } - - async updateRefreshToken(uid: string, refreshToken: string | null) { - try { - const updatedUser = await this.prismaService.user.update({ - where: { - uid: uid, - }, - data: { - refreshToken: refreshToken, - }, - }); - return updatedUser; - } catch (error) { - throw error; - } - } - - async findUserById(uid: string) { - try { - const user = await this.prismaService.user.findUnique({ - where: { - uid: uid, - }, - }); - - return user; - } catch (error) { - return null; - } - } - - async updateUser(authUser: User, updateUserDto: UpdateUserDto) { - try { - const user = await this.prismaService.user.update({ - where: { - uid: authUser.uid, - }, - data: { - slug: updateUserDto.slug ? updateUserDto.slug : authUser.slug, - photoURL: updateUserDto.photoUrl ? updateUserDto.photoUrl : authUser.photoURL, - displayName: updateUserDto.displayName - ? updateUserDto.displayName - : authUser.displayName, - isStudent: updateUserDto.hasOwnProperty('isCollegeStudent') - ? updateUserDto.isCollegeStudent - : authUser.isStudent, - collegeName: updateUserDto.collegeName || authUser.collegeName, - }, - }); - return user; - } catch (error) { - return USER_UPDATE_ERROR; - } - } - - async getReservedTickets(id: string) { - try { - const data = await this.prismaService.user.findUnique({ - where: { - uid: id, - }, - - select: { - Ticket: { - select: { - event: true, - }, - }, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - return { - ok: true, - message: 'Ticket found successfully', - data: data.Ticket.map((el) => el.event), - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - return e; - } - } - } - - private generateSlug() { - return fakerEN.lorem.slug({ - min: 1, - max: 2, - }); - } -} diff --git a/apps/api/src/utils/db.ts b/apps/api/src/utils/db.ts new file mode 100644 index 00000000..7c33cdfa --- /dev/null +++ b/apps/api/src/utils/db.ts @@ -0,0 +1,71 @@ +import { customAlphabet } from 'nanoid'; + +export type SystemFields = 'id' | 'created_at' | 'updated_at' | 'is_deleted'; + +export enum SystemTable { + User = 'ff_user', + Account = 'ff_account', + Org = 'ff_organization', + OrgMember = 'ff_organization_member', + OrgInvite = 'ff_organization_invite', + Events = 'ff_events', + EventTicket = 'ff_event_ticket', + Form = 'ff_form', + FormFields = 'ff_form_fields', + FormFieldOptions = 'ff_form_field_options', + FormResponse = 'ff_form_response', + Ticket = 'ff_ticket', + Kanban = 'ff_kanban', + KanbanCard = 'ff_kanban_card', + Comment = 'ff_comment', + FF_Migrations = 'ff_migrations', +} + +export const IDPrefix = { + [SystemTable.User]: 'usr', + [SystemTable.Account]: 'acc', + [SystemTable.Org]: 'org', + [SystemTable.OrgMember]: 'orm', + [SystemTable.OrgInvite]: 'oin', + [SystemTable.Events]: 'evt', + [SystemTable.EventTicket]: 'evt', + [SystemTable.Form]: 'frm', + [SystemTable.FormFields]: 'fld', + [SystemTable.FormFieldOptions]: 'ffo', + [SystemTable.FormResponse]: 'frs', + [SystemTable.Ticket]: 'tkt', + [SystemTable.Kanban]: 'kan', + [SystemTable.KanbanCard]: 'kcd', + [SystemTable.Comment]: 'cmt', + [SystemTable.FF_Migrations]: 'mig', +}; + +export enum Role { + ADMIN = 'admin', + EDITOR = 'editor', + VIEWER = 'viewer', +} + +const nanoid = customAlphabet( + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', + 15, +); + +export const FormInput = [ + 'SingleLineText', + 'LongText', + 'SingleSelect', + 'MultiSelect', + 'Checkbox', + 'Number', + 'Email', + 'Url', + 'PhoneNumber', + 'Attachment', +]; + +export const generateID = (table: SystemTable) => { + const prefix = IDPrefix[table]; + const id = `${prefix}${nanoid()}`; + return id; +}; diff --git a/apps/api/src/utils/exclude.ts b/apps/api/src/utils/exclude.ts index 156cd4b3..5f59090c 100644 --- a/apps/api/src/utils/exclude.ts +++ b/apps/api/src/utils/exclude.ts @@ -1,8 +1,8 @@ function exclude(k: K, keys: Key[]): Omit { - for (let key of keys) { - delete k[key]; - } - return k; + for (const key of keys) { + delete k[key]; + } + return k; } export default exclude; diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 7c175276..ee14610e 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -1,23 +1,28 @@ { - "compilerOptions": { - "jsx": "react", - "module": "commonjs", - "declaration": true, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "target": "es2017", - "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", - "incremental": true, - "skipLibCheck": true, - "strict": false, - "strictNullChecks": false, - "noImplicitAny": false, - "strictBindCallApply": false, - "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": true - } + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx"], + "compilerOptions": { + "jsx": "react", + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "esNext", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strict": false, + "strictNullChecks": true, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": true, + "types": ["src/types/*.d.ts"], + "paths": { + "@api/*": ["src/*"] + } + } } diff --git a/apps/web/.eslintrc b/apps/web/.eslintrc index 10f7aa31..3ecb8294 100644 --- a/apps/web/.eslintrc +++ b/apps/web/.eslintrc @@ -1,3 +1,5 @@ { - "extends": ["next", "custom"] + "extends": [ + "next" + ] } diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts deleted file mode 100644 index 4f11a03d..00000000 --- a/apps/web/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/fossfolio.code-workspace b/fossfolio.code-workspace deleted file mode 100644 index e3e4a9ee..00000000 --- a/fossfolio.code-workspace +++ /dev/null @@ -1,25 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": { - "files.exclude": { - "node_modules": true, - ".eslintrc": true, - "pnpm-lock.yaml": true, - "pnpm-workspace.yaml": true, - "LICENSE": true, - ".prettierrc": true, - "README.md": true, - "tsconfig.json": true, - "apps/web/.turbo": true, - "apps/web/.next": true, - "apps/web/.eslintrc": true, - "apps/web/node_modules": true, - "apps/web/.gitignore": true, - ".gitignore": true - } - } -} diff --git a/package.json b/package.json index 05b1ddf1..4f91dd0b 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,20 @@ { - "name": "fossfolio", - "version": "1.0.0", - "private": true, - "workspaces": [ - "apps/*", - "packages/*" - ], - "scripts": { - "build": "turbo run build", - "dev": "turbo run dev --parallel", - "lint": "turbo run lint", - "format": "prettier --write \"**/*.{ts,tsx,md}\"", - "turbo": "turbo", - "api-dev": "pnpm --filter api dev", - "web-dev": "pnpm --filter web dev" - }, - "devDependencies": { - "eslint-config-custom": "*", - "prettier": "latest", - "turbo": "latest" - } + "name": "fossfolio", + "version": "1.0.0", + "private": true, + "workspaces": [ + "apps/*", + "packages/*" + ], + "scripts": { + "build": "turbo run build", + "dev": "turbo run dev --parallel", + "lint": "turbo run lint", + "turbo": "turbo", + "api-dev": "pnpm --filter api dev", + "web-dev": "pnpm --filter web dev" + }, + "devDependencies": { + "turbo": "latest" + } } diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js deleted file mode 100644 index 9539edf8..00000000 --- a/packages/eslint-config-custom/index.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: ['turbo', 'prettier'], - rules: { - '@next/next/no-html-link-for-pages': 'off', - 'react/jsx-key': 'off', - }, - }; \ No newline at end of file diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json deleted file mode 100644 index ca722487..00000000 --- a/packages/eslint-config-custom/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "eslint-config-custom", - "version": "0.0.0", - "main": "index.js", - "license": "MIT", - "dependencies": { - "eslint": "^8.57.0", - "eslint-config-next": "^13.5.6", - "eslint-config-prettier": "^8.10.0", - "eslint-config-turbo": "^1.12.4", - "eslint-plugin-react": "^7.33.2" - }, - "devDependencies": { - "typescript": "^5.3.3" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72e6dd65..f9e7a0f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,6 @@ importers: .: devDependencies: - eslint-config-custom: - specifier: '*' - version: 0.0.0(eslint@8.57.0)(typescript@5.3.3) - prettier: - specifier: latest - version: 3.2.5 turbo: specifier: latest version: 1.13.3 @@ -22,52 +16,52 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.521.0 - version: 3.521.0 + version: 3.587.0 '@nestjs-modules/mailer': specifier: ^1.11.0 - version: 1.11.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(nodemailer@6.9.10) + version: 1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13) '@nestjs/common': specifier: ^10.3.3 - version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + version: 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/config': specifier: ^3.2.0 - version: 3.2.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(rxjs@7.8.1) + version: 3.2.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1) '@nestjs/core': specifier: ^10.3.3 - version: 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + version: 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/event-emitter': specifier: ^2.0.4 - version: 2.0.4(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1)) + version: 2.0.4(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1)) '@nestjs/jwt': specifier: ^10.2.0 - version: 10.2.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)) + version: 10.2.0(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)) '@nestjs/passport': specifier: ^10.0.3 - version: 10.0.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(passport@0.7.0) + version: 10.0.3(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(passport@0.7.0) '@nestjs/platform-express': specifier: ^10.3.3 - version: 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3) + version: 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8) '@nestjs/schematics': specifier: ^10.1.1 - version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) + version: 10.1.1(chokidar@3.6.0)(typescript@5.4.5) '@nestjs/swagger': specifier: ^7.3.0 - version: 7.3.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) + version: 7.3.1(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) '@nestjs/throttler': specifier: ^5.1.2 - version: 5.1.2(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1) + version: 5.1.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2) '@node-saml/passport-saml': specifier: ^5.0.0 version: 5.0.0 '@prisma/client': specifier: ^5.10.2 - version: 5.10.2(prisma@5.10.2) + version: 5.14.0(prisma@5.14.0) '@webtre/nestjs-mailer-react-adapter': specifier: ^0.1.2 - version: 0.1.2(@nestjs-modules/mailer@1.11.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(nodemailer@6.9.10)) + version: 0.1.2(@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13)) argon2: specifier: ^0.40.1 - version: 0.40.1 + version: 0.40.3 class-transformer: specifier: ^0.5.1 version: 0.5.1 @@ -85,16 +79,22 @@ importers: version: 1.18.0 joi: specifier: ^17.12.2 - version: 17.12.2 + version: 17.13.1 + knex: + specifier: ^3.1.0 + version: 3.1.0(pg@8.11.5) + nanoid: + specifier: ^3.3.4 + version: 3.3.7 nestjs-pino: specifier: ^4.0.0 - version: 4.0.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(pino-http@9.0.0) + version: 4.1.0(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(pino-http@9.0.0) nodemailer: specifier: ^6.9.10 - version: 6.9.10 + version: 6.9.13 openai: specifier: ^4.33.0 - version: 4.33.0 + version: 4.47.2 passport: specifier: ^0.7.0 version: 0.7.0 @@ -107,6 +107,9 @@ importers: passport-jwt: specifier: ^4.0.1 version: 4.0.1 + pg: + specifier: ^8.11.5 + version: 8.11.5 pino-http: specifier: ^9.0.0 version: 9.0.0 @@ -118,41 +121,47 @@ importers: version: 0.12.0 reflect-metadata: specifier: ^0.2.1 - version: 0.2.1 + version: 0.2.2 rimraf: specifier: ^5.0.5 - version: 5.0.5 + version: 5.0.7 rxjs: specifier: ^7.8.1 version: 7.8.1 stripe: specifier: ^14.18.0 - version: 14.18.0 + version: 14.25.0 zod: specifier: ^3.22.4 - version: 3.22.4 + version: 3.23.8 zod-to-json-schema: specifier: ^3.22.5 - version: 3.22.5(zod@3.22.4) + version: 3.23.0(zod@3.23.8) devDependencies: + '@biomejs/biome': + specifier: ^1.7.3 + version: 1.7.3 '@faker-js/faker': specifier: ^8.4.1 version: 8.4.1 '@nestjs/cli': specifier: ^10.3.2 - version: 10.3.2(@swc/cli@0.3.9(@swc/core@1.4.2(@swc/helpers@0.5.5))(chokidar@3.6.0))(@swc/core@1.4.2(@swc/helpers@0.5.5)) + version: 10.3.2(@swc/cli@0.3.12(@swc/core@1.5.24(@swc/helpers@0.5.5))(chokidar@3.6.0))(@swc/core@1.5.24(@swc/helpers@0.5.5)) '@react-email/components': specifier: ^0.0.15 - version: 0.0.15(@types/react@18.2.58)(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0) + version: 0.0.15(@types/react@18.3.3)(react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)))(react@18.3.1) + '@swc-node/register': + specifier: ^1.9.1 + version: 1.9.1(@swc/core@1.5.24(@swc/helpers@0.5.5))(@swc/types@0.1.7)(typescript@5.4.5) '@swc/cli': specifier: ^0.3.9 - version: 0.3.9(@swc/core@1.4.2(@swc/helpers@0.5.5))(chokidar@3.6.0) + version: 0.3.12(@swc/core@1.5.24(@swc/helpers@0.5.5))(chokidar@3.6.0) '@swc/core': specifier: ^1.4.2 - version: 1.4.2(@swc/helpers@0.5.5) + version: 1.5.24(@swc/helpers@0.5.5) '@types/cookie-parser': specifier: ^1.4.6 - version: 1.4.6 + version: 1.4.7 '@types/express': specifier: ^4.17.21 version: 4.17.21 @@ -161,10 +170,10 @@ importers: version: 1.4.11 '@types/node': specifier: ^20.11.20 - version: 20.11.20 + version: 20.12.13 '@types/nodemailer': specifier: ^6.4.14 - version: 6.4.14 + version: 6.4.15 '@types/passport': specifier: ^1.0.16 version: 1.0.16 @@ -173,82 +182,79 @@ importers: version: 1.2.9 '@types/passport-google-oauth20': specifier: ^2.0.14 - version: 2.0.14 + version: 2.0.16 '@types/passport-jwt': specifier: ^4.0.1 version: 4.0.1 '@types/react': specifier: ^18.2.58 - version: 18.2.58 - concurrently: - specifier: ^8.2.2 - version: 8.2.2 + version: 18.3.3 prisma: specifier: ^5.10.2 - version: 5.10.2 + version: 5.14.0 react: - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.1 + version: 18.3.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3) + version: 10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.5 + version: 5.4.5 apps/web: dependencies: '@hookform/resolvers': specifier: ^2.9.11 - version: 2.9.11(react-hook-form@7.43.4(react@18.2.0)) + version: 2.9.11(react-hook-form@7.51.5(react@18.3.1)) '@mistralai/mistralai': specifier: ^0.1.3 version: 0.1.3 '@radix-ui/react-alert-dialog': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-avatar': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: ^2.0.5 - version: 2.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': specifier: ^1.2.2 - version: 1.2.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.74)(react@18.2.0) + version: 1.0.2(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^4.32.6 - version: 4.32.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@vercel/analytics': specifier: ^1.1.2 - version: 1.1.2 + version: 1.3.1(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) axios: specifier: ^1.3.4 - version: 1.3.4 + version: 1.7.2 class-variance-authority: specifier: ^0.6.1 version: 0.6.1 @@ -260,178 +266,152 @@ importers: version: 2.30.0 framer-motion: specifier: ^10.0.1 - version: 10.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lottie-react: specifier: ^2.4.0 - version: 2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) multiselect-react-dropdown: specifier: ^2.0.25 - version: 2.0.25(react@18.2.0) + version: 2.0.25(react@18.3.1) next: specifier: ^14.2.1 - version: 14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-seo: specifier: ^5.15.0 - version: 5.15.0(next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.15.0(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.2.1(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) novel: specifier: ^0.1.22 - version: 0.1.22(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21(typescript@5.3.3)) + version: 0.1.22(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5)) nprogress: specifier: ^0.2.0 version: 0.2.0 posthog-js: specifier: ^1.131.4 - version: 1.131.4 + version: 1.136.2 qrcode: specifier: ^1.5.3 version: 1.5.3 react: specifier: ^18.2.0 - version: 18.2.0 + version: 18.3.1 react-day-picker: specifier: ^8.9.1 - version: 8.9.1(date-fns@2.30.0)(react@18.2.0) + version: 8.10.1(date-fns@2.30.0)(react@18.3.1) react-dom: specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) react-hook-form: specifier: ^7.43.4 - version: 7.43.4(react@18.2.0) + version: 7.51.5(react@18.3.1) react-icons: specifier: ^4.8.0 - version: 4.8.0(react@18.2.0) + version: 4.12.0(react@18.3.1) react-modern-drawer: specifier: ^1.2.2 - version: 1.2.2(react@18.2.0) + version: 1.3.1(react@18.3.1) react-to-pdf: specifier: ^1.0.1 - version: 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-to-print: specifier: ^2.15.1 - version: 2.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts: specifier: ^2.12.2 - version: 2.12.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) sonner: specifier: ^0.6.2 - version: 0.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: specifier: ^1.13.2 - version: 1.13.2 + version: 1.14.0 tailwindcss-animate: specifier: ^1.0.6 - version: 1.0.6(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3))) + version: 1.0.7(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5))) yup: specifier: ^1.0.2 - version: 1.0.2 + version: 1.4.0 devDependencies: '@storybook/addon-essentials': specifier: ^7.4.0 - version: 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/addon-interactions': specifier: ^7.4.0 - version: 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.6.19 '@storybook/addon-links': specifier: ^7.4.0 - version: 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.6.19(react@18.3.1) '@storybook/addon-onboarding': specifier: ^1.0.8 - version: 1.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.0.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/blocks': specifier: ^7.4.0 - version: 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/nextjs': specifier: ^7.4.0 - version: 7.4.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(@swc/helpers@0.5.5)(@types/react-dom@18.2.24)(@types/react@18.2.74)(@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@2.19.0)(typescript@5.3.3)(webpack-hot-middleware@2.26.1)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + version: 7.6.19(@swc/core@1.5.24(@swc/helpers@0.5.5))(@swc/helpers@0.5.5)(@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(type-fest@2.19.0)(typescript@5.4.5)(webpack-hot-middleware@2.26.1)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) '@storybook/react': specifier: ^7.4.0 - version: 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.3.3) + version: 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) '@storybook/testing-library': specifier: ^0.2.0 - version: 0.2.0 + version: 0.2.2 '@testing-library/react': specifier: ^14.1.2 - version: 14.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/formidable': specifier: ^3.4.5 version: 3.4.5 '@types/node': specifier: ^18.14.6 - version: 18.14.6 + version: 18.19.33 '@types/nprogress': specifier: ^0.2.0 - version: 0.2.0 + version: 0.2.3 '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 '@types/react': specifier: ^18.2.74 - version: 18.2.74 + version: 18.3.3 '@types/react-dom': specifier: ^18.2.24 - version: 18.2.24 + version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.2.6(@types/node@18.14.6)(terser@5.27.1)) + version: 4.3.0(vite@5.2.12(@types/node@18.19.33)(terser@5.31.0)) autoprefixer: specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.26) + version: 10.4.19(postcss@8.4.38) jsdom: specifier: ^23.2.0 version: 23.2.0 postcss: specifier: ^8.4.26 - version: 8.4.26 + version: 8.4.38 storybook: specifier: ^7.4.0 - version: 7.4.0 + version: 7.6.19 tailwindcss: specifier: ^3.3.3 - version: 3.3.3(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3)) + version: 3.4.3(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5)) typescript: specifier: ^5 - version: 5.3.3 + version: 5.4.5 vitest: specifier: ^1.2.0 - version: 1.2.0(@types/node@18.14.6)(jsdom@23.2.0)(terser@5.27.1) - - packages/eslint-config-custom: - dependencies: - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-next: - specifier: ^13.5.6 - version: 13.5.6(eslint@8.57.0)(typescript@5.3.3) - eslint-config-prettier: - specifier: ^8.10.0 - version: 8.10.0(eslint@8.57.0) - eslint-config-turbo: - specifier: ^1.12.4 - version: 1.12.4(eslint@8.57.0) - eslint-plugin-react: - specifier: ^7.33.2 - version: 7.33.2(eslint@8.57.0) - devDependencies: - typescript: - specifier: ^5.3.3 - version: 5.3.3 + version: 1.6.0(@types/node@18.19.33)(jsdom@23.2.0)(terser@5.31.0) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} '@angular-devkit/core@17.1.2': @@ -487,136 +467,138 @@ packages: '@aws-crypto/util@3.0.0': resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - '@aws-sdk/client-s3@3.521.0': - resolution: {integrity: sha512-txSfcxezAIW72dgRfhX+plc/lMouilY/QFVne/Cv01SL8Tzclcyp7T7LtkV7aSO4Tb9CUScHdqwWOfjZzCm/yQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/client-s3@3.587.0': + resolution: {integrity: sha512-6p2Hvl2DxIQ1s2Cd+1XvGprnRxqjPXYRN2jw6ruaVsNWvuYTX64IvNvNQuNWDu0mD6+W1r9tgmVM/sEWFcgb9w==} + engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.521.0': - resolution: {integrity: sha512-MhX0CjV/543MR7DRPr3lA4ZDpGGKopp8cyV4EkSGXB7LMN//eFKKDhuZDlpgWU+aFe2A3DIqlNJjqgs08W0cSA==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@aws-sdk/credential-provider-node': ^3.521.0 + '@aws-sdk/client-sso-oidc@3.587.0': + resolution: {integrity: sha512-ISDgHcGmXLdSJjVk8X6dPHRdlaURDbSyZ7b8sQyXCrBt8EQ/d/sEQLEaJJJrdB6Z2fYRDupWQq7+s42bH2FLjA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso@3.521.0': - resolution: {integrity: sha512-aEx8kEvWmTwCja6hvIZd5PvxHsI1HQZkckXhw1UrkDPnfcAwQoQAgselI7D+PVT5qQDIjXRm0NpsvBLaLj6jZw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/client-sso@3.587.0': + resolution: {integrity: sha512-J62SsEaJ5DbsLOl9ICvyNYcDH5je557v2YECt6wxvMLCCVOKmT8WPrPcGFKti8N4BotRLWyifC74sXh7oek8CQ==} + engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.521.0': - resolution: {integrity: sha512-f1J5NDbntcwIHJqhks89sQvk7UXPmN0X0BZ2mgpj6pWP+NlPqy+1t1bia8qRhEuNITaEigoq6rqe9xaf4FdY9A==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@aws-sdk/credential-provider-node': ^3.521.0 + '@aws-sdk/client-sts@3.587.0': + resolution: {integrity: sha512-fnOa7bHuvoOHULZlVE4LgSAiKmXWZFkI42m1XV2XjeW9jtEQDTyTD678My6tGQi2T3Jwrgk6c7h2rOO3wLl9tg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/core@3.521.0': - resolution: {integrity: sha512-KovKmW7yg/P2HVG2dhV2DAJLyoeGelgsnSGHaktXo/josJ3vDGRNqqRSgVaqKFxnD98dPEMLrjkzZumNUNGvLw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/core@3.587.0': + resolution: {integrity: sha512-Yoa7ZyjFgcLIoXuug+bIKxpjEG54/Z+u5FfbSq1dGiRv2rFmOeD0C6sBnSRd7N8yG2886DnvOkdYFd1vvwkHAg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-env@3.521.0': - resolution: {integrity: sha512-OwblTJNdDAoqYVwcNfhlKDp5z+DINrjBfC6ZjNdlJpTXgxT3IqzuilTJTlydQ+2eG7aXfV9OwTVRQWdCmzFuKA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-env@3.587.0': + resolution: {integrity: sha512-Hyg/5KFECIk2k5o8wnVEiniV86yVkhn5kzITUydmNGCkXdBFHMHRx6hleQ1bqwJHbBskyu8nbYamzcwymmGwmw==} + engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-http@3.521.0': - resolution: {integrity: sha512-yJM1yNGj2XFH8v6/ffWrFY5nC3/2+8qZ8c4mMMwZru8bYXeuSV4+NNfE59HUWvkAF7xP76u4gr4I8kNrMPTlfg==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-http@3.587.0': + resolution: {integrity: sha512-Su1SRWVRCuR1e32oxX3C1V4c5hpPN20WYcRfdcr2wXwHqSvys5DrnmuCC+JoEnS/zt3adUJhPliTqpfKgSdMrA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-ini@3.521.0': - resolution: {integrity: sha512-HuhP1AlKgvBBxUIwxL/2DsDemiuwgbz1APUNSeJhDBF6JyZuxR0NU8zEZkvH9b4ukTcmcKGABpY0Wex4rAh3xw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-ini@3.587.0': + resolution: {integrity: sha512-rjRPF1mmMGiPdQsIba/PRknGPWpQZJ06EpEn91wftW5szfJkStadRTIfYYwSfuSO/xIwT11/KQiDVP9hclnSFg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.587.0 - '@aws-sdk/credential-provider-node@3.521.0': - resolution: {integrity: sha512-N9SR4gWI10qh4V2myBcTw8IlX3QpsMMxa4Q8d/FHiAX6eNV7e6irXkXX8o7+J1gtCRy1AtBMqAdGsve4GVqYMQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-node@3.587.0': + resolution: {integrity: sha512-ZMbRCHdSsTzDV1+wPdF0A+umWji9BFPFeICG0gkisZR9Tj9rkb20jIYqD280BpCsKd8Ep7rpFZepyoeNZqI6Nw==} + engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-process@3.521.0': - resolution: {integrity: sha512-EcJjcrpdklxbRAFFgSLk6QGVtvnfZ80ItfZ47VL9LkhWcDAkQ1Oi0esHq+zOgvjb7VkCyD3Q9CyEwT6MlJsriA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-process@3.587.0': + resolution: {integrity: sha512-V4xT3iCqkF8uL6QC4gqBJg/2asd/damswP1h9HCfqTllmPWzImS+8WD3VjgTLw5b0KbTy+ZdUhKc0wDnyzkzxg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-sso@3.521.0': - resolution: {integrity: sha512-GAfc0ji+fC2k9VngYM3zsS1J5ojfWg0WUOBzavvHzkhx/O3CqOt82Vfikg3PvemAp9yOgKPMaasTHVeipNLBBQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-sso@3.587.0': + resolution: {integrity: sha512-7ADd1HV3fmdMB2+DdFMtZGep5qubhtTenfo2BpDdADUkZ0HCpXx7mPLJ2mAww9sQpJsX8dDbc38+pi+bcsPWeA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-web-identity@3.521.0': - resolution: {integrity: sha512-ZPPJqdbPOE4BkdrPrYBtsWg0Zy5b+GY1sbMWLQt0tcISgN5EIoePCS2pGNWnBUmBT+mibMQCVv9fOQpqzRkvAw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-web-identity@3.587.0': + resolution: {integrity: sha512-XqIx/I2PG7kyuw3WjAP9wKlxy8IvFJwB8asOFT1xPFoVfZYKIogjG9oLP5YiRtfvDkWIztHmg5MlVv3HdJDGRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.587.0 - '@aws-sdk/middleware-bucket-endpoint@3.521.0': - resolution: {integrity: sha512-wUPSpzeEGwAic5OJmXQGt1RCbt5KHighZ1ubUeNV67FMPsxaEW+Y0Kd+L0vbbFoQptIui2GqP5JxuROr6J7SjA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.587.0': + resolution: {integrity: sha512-HkFXLPl8pr6BH/Q0JpOESqEKL0ZK3sk7aSZ1S6GE4RXET7H5R94THULXqQFZzD48gZcyFooO/yNKZTqrZFaWKg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-expect-continue@3.521.0': - resolution: {integrity: sha512-6NBaPS+1b1QbsbJ74KI9MkqWbj8rnY6uKNEo0wkxgA8Q6u0aTn/jV+jrn5ZemdYmfS/y/VbaoY/hE+/QNp5vUw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-expect-continue@3.577.0': + resolution: {integrity: sha512-6dPp8Tv4F0of4un5IAyG6q++GrRrNQQ4P2NAMB1W0VO4JoEu1C8GievbbDLi88TFIFmtKpnHB0ODCzwnoe8JsA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.521.0': - resolution: {integrity: sha512-sWNN0wtdwImO2QqN4J1YVTpDhdii6Tp5p8jCkCE1Qe+afQ5u52PeRAS/9U56cJnqM5JLabO4kE10Mm5rufNs2A==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.587.0': + resolution: {integrity: sha512-URMwp/budDvKhIvZ4a6zIBfFTun/iDlPWXqsGKYjEtHt8jz27OSjCZtDtIeqW4WTBdKL8KZgQcl+DdaE5M1qiQ==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-host-header@3.521.0': - resolution: {integrity: sha512-Bc4stnMtVAdqosYI1wedFK9tffclCuwpOK/JA4bxbnvSyP1kz4s1HBVT9OOMzdLRLWLwVj/RslXKfSbzOUP7ug==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-host-header@3.577.0': + resolution: {integrity: sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-location-constraint@3.521.0': - resolution: {integrity: sha512-XlGst6F3+20mhMVk+te7w8Yvrm9i9JGpgRdxdMN1pnXtGn/aAKF9lFFm4bOu47PR/XHun2PLmKlLnlZd7NAP2Q==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-location-constraint@3.577.0': + resolution: {integrity: sha512-DKPTD2D2s+t2QUo/IXYtVa/6Un8GZ+phSTBkyBNx2kfZz4Kwavhl/JJzSqTV3GfCXkVdFu7CrjoX7BZ6qWeTUA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-logger@3.521.0': - resolution: {integrity: sha512-JJ4nyYvLu3RyyNHo74Rlx6WKxJsAixWCEnnFb6IGRUHvsG+xBGU7HF5koY2log8BqlDLrt4ZUaV/CGy5Dp8Mfg==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-logger@3.577.0': + resolution: {integrity: sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-recursion-detection@3.521.0': - resolution: {integrity: sha512-1m5AsC55liTlaYMjc4pIQfjfBHG9LpWgubSl4uUxJSdI++zdA/SRBwXl40p7Ac/y5esweluhWabyiv1g/W4+Xg==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-recursion-detection@3.577.0': + resolution: {integrity: sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-sdk-s3@3.521.0': - resolution: {integrity: sha512-aDeOScfzGGHZ7oEDx+EPzz+JVa8/B88CPeDRaDmO5dFNv2/5PFumHfh0gc6XFl4nJWPPOrJyZ1UYU/9VdDfSyQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-sdk-s3@3.587.0': + resolution: {integrity: sha512-vtXTGEiw1E9Fax4LmcU2Z208gbrC8ShrdsSLmGcRPpu5NPOGBFBSDG5sy5EDNClrFxIl/Le8coQnD0EDBtx+uQ==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-signing@3.521.0': - resolution: {integrity: sha512-OW1jKeN6Eh3/OItXBtyNRFOv1MuZQBeHpEbywgYwtaqxTGxm9gFj//9wFsCXK4zg1+ghun8iC0buNbyOvCUf9A==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-signing@3.587.0': + resolution: {integrity: sha512-tiZaTDj4RvhXGRAlncFn7CSEfL3iNPO67WSaxAq+Ls5j1VgczPhu5262cWONNoMgth3nXR1hhLC4ITSl/a6AzA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-ssec@3.521.0': - resolution: {integrity: sha512-O9vlns8bFxkZA71CyjQbiB2tm3v+925C37Z3wzn9sj2x0FTB3njgSR23w05d8HP2ve1GPuqoVD0T0pa+jG0Zbw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-ssec@3.577.0': + resolution: {integrity: sha512-i2BPJR+rp8xmRVIGc0h1kDRFcM2J9GnClqqpc+NLSjmYadlcg4mPklisz9HzwFVcRPJ5XcGf3U4BYs5G8+iTyg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-user-agent@3.521.0': - resolution: {integrity: sha512-+hmQjWDG93wCcJn5QY2MkzAL1aG5wl3FJ/ud2nQOu/Gx7d4QVT/B6VJwoG6GSPVuVPZwzne5n9zPVst6RmWJGA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-user-agent@3.587.0': + resolution: {integrity: sha512-SyDomN+IOrygLucziG7/nOHkjUXES5oH5T7p8AboO8oakMQJdnudNXiYWTicQWO52R51U6CR27rcMPTGeMedYA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/region-config-resolver@3.521.0': - resolution: {integrity: sha512-eC2T62nFgQva9Q0Sqoc9xsYyyH9EN2rJtmUKkWsBMf77atpmajAYRl5B/DzLwGHlXGsgVK2tJdU5wnmpQCEwEQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/region-config-resolver@3.587.0': + resolution: {integrity: sha512-93I7IPZtulZQoRK+O20IJ4a1syWwYPzoO2gc3v+/GNZflZPV3QJXuVbIm0pxBsu0n/mzKGUKqSOLPIaN098HcQ==} + engines: {node: '>=16.0.0'} - '@aws-sdk/signature-v4-multi-region@3.521.0': - resolution: {integrity: sha512-JVMGQEE6+MQ5Enc/NDQNw8cmy/soALH/Ky00SVQvrfb9ec4H40eDQbbn/d7lua52UCcvUv1w+Ppk00WzbqDAcQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/signature-v4-multi-region@3.587.0': + resolution: {integrity: sha512-TR9+ZSjdXvXUz54ayHcCihhcvxI9W7102J1OK6MrLgBlPE7uRhAx42BR9L5lLJ86Xj3LuqPWf//o9d/zR9WVIg==} + engines: {node: '>=16.0.0'} - '@aws-sdk/token-providers@3.521.0': - resolution: {integrity: sha512-63XxPOn13j87yPWKm6UXOPdMZIMyEyCDJzmlxnIACP8m20S/c6b8xLJ4fE/PUlD0MTKxpFeQbandq5OhnLsWSQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/token-providers@3.587.0': + resolution: {integrity: sha512-ULqhbnLy1hmJNRcukANBWJmum3BbjXnurLPSFXoGdV0llXYlG55SzIla2VYqdveQEEjmsBuTZdFvXAtNpmS5Zg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.587.0 - '@aws-sdk/types@3.521.0': - resolution: {integrity: sha512-H9I3Lut0F9d+kTibrhnTRqDRzhxf/vrDu12FUdTXVZEvVAQ7w9yrVHAZx8j2e8GWegetsQsNitO3KMrj4dA4pw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/types@3.577.0': + resolution: {integrity: sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==} + engines: {node: '>=16.0.0'} - '@aws-sdk/util-arn-parser@3.495.0': - resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==} - engines: {node: '>=14.0.0'} + '@aws-sdk/util-arn-parser@3.568.0': + resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} + engines: {node: '>=16.0.0'} - '@aws-sdk/util-endpoints@3.521.0': - resolution: {integrity: sha512-lO5+1LeAZycDqgNjQyZdPSdXFQKXaW5bRuQ3UIT3bOCcUAbDI0BYXlPm1huPNTCEkI9ItnDCbISbV0uF901VXw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/util-endpoints@3.587.0': + resolution: {integrity: sha512-8I1HG6Em8wQWqKcRW6m358mqebRVNpL8XrrEoT4In7xqkKkmYtHRNVYP6lcmiQh5pZ/c/FXu8dSchuFIWyEtqQ==} + engines: {node: '>=16.0.0'} - '@aws-sdk/util-locate-window@3.495.0': - resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==} - engines: {node: '>=14.0.0'} + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} - '@aws-sdk/util-user-agent-browser@3.521.0': - resolution: {integrity: sha512-2t3uW6AXOvJ5iiI1JG9zPqKQDc/TRFa+v13aqT5KKw9h3WHFyRUpd4sFQL6Ul0urrq2Zg9cG4NHBkei3k9lsHA==} + '@aws-sdk/util-user-agent-browser@3.577.0': + resolution: {integrity: sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==} - '@aws-sdk/util-user-agent-node@3.521.0': - resolution: {integrity: sha512-g4KMEiyLc8DG21eMrp6fJUdfQ9F0fxfCNMDRgf0SE/pWI/u4vuWR2n8obLwq1pMVx7Ksva1NO3dc+a3Rgr0hag==} - engines: {node: '>=14.0.0'} + '@aws-sdk/util-user-agent-node@3.587.0': + resolution: {integrity: sha512-Pnl+DUe/bvnbEEDHP3iVJrOtE3HbFJBPgsD6vJ+ml/+IYk1Eq49jEG+EHZdNTPz3SDG0kbp2+7u41MKYJHR/iQ==} + engines: {node: '>=16.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -626,201 +608,174 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.521.0': - resolution: {integrity: sha512-ahaG39sgpBN/UOKzOW9Ey6Iuy6tK8vh2D+/tsLFLQ59PXoCvU06xg++TGXKpxsYMJGIzBvZMDC1aBhGmm/HsaA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/xml-builder@3.575.0': + resolution: {integrity: sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==} + engines: {node: '>=16.0.0'} + + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@babel/compat-data@7.24.6': + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} - '@babel/core@7.23.9': - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + '@babel/core@7.24.6': + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + '@babel/generator@7.24.6': + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.24.6': + resolution: {integrity: sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': + resolution: {integrity: sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.24.6': + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.23.10': - resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==} + '@babel/helper-create-class-features-plugin@7.24.6': + resolution: {integrity: sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.24.6': + resolution: {integrity: sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.5.0': - resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.6': + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.6': + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.6': + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.23.0': - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + '@babel/helper-member-expression-to-functions@7.24.6': + resolution: {integrity: sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.24.6': + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.22.5': - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.6': + resolution: {integrity: sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + '@babel/helper-plugin-utils@7.24.6': + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.24.6': + resolution: {integrity: sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.22.20': - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + '@babel/helper-replace-supers@7.24.6': + resolution: {integrity: sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-simple-access@7.24.6': + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': + resolution: {integrity: sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-split-export-declaration@7.24.6': + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.6': + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.22.20': - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + '@babel/helper-wrap-function@7.24.6': + resolution: {integrity: sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.9': - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + '@babel/helpers@7.24.6': + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.23.9': - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': - resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3': - resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7': - resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6': + resolution: {integrity: sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-proposal-class-properties@7.18.6': - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-export-namespace-from@7.18.9': - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6': + resolution: {integrity: sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-numeric-separator@7.18.6': - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-proposal-object-rest-spread@7.20.7': - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.6': + resolution: {integrity: sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.13.0 - '@babel/plugin-proposal-optional-chaining@7.21.0': - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.6': + resolution: {integrity: sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -859,20 +814,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.23.3': - resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} + '@babel/plugin-syntax-flow@7.24.6': + resolution: {integrity: sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.23.3': - resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + '@babel/plugin-syntax-import-assertions@7.24.6': + resolution: {integrity: sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.23.3': - resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + '@babel/plugin-syntax-import-attributes@7.24.6': + resolution: {integrity: sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -887,8 +842,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.23.3': - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + '@babel/plugin-syntax-jsx@7.24.6': + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -935,8 +890,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.23.3': - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + '@babel/plugin-syntax-typescript@7.24.6': + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -947,356 +902,356 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.23.3': - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + '@babel/plugin-transform-arrow-functions@7.24.6': + resolution: {integrity: sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.23.9': - resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} + '@babel/plugin-transform-async-generator-functions@7.24.6': + resolution: {integrity: sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.23.3': - resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + '@babel/plugin-transform-async-to-generator@7.24.6': + resolution: {integrity: sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.23.3': - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + '@babel/plugin-transform-block-scoped-functions@7.24.6': + resolution: {integrity: sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.23.4': - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + '@babel/plugin-transform-block-scoping@7.24.6': + resolution: {integrity: sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.23.3': - resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + '@babel/plugin-transform-class-properties@7.24.6': + resolution: {integrity: sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.23.4': - resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + '@babel/plugin-transform-class-static-block@7.24.6': + resolution: {integrity: sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.23.8': - resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + '@babel/plugin-transform-classes@7.24.6': + resolution: {integrity: sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.23.3': - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + '@babel/plugin-transform-computed-properties@7.24.6': + resolution: {integrity: sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.23.3': - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + '@babel/plugin-transform-destructuring@7.24.6': + resolution: {integrity: sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.23.3': - resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + '@babel/plugin-transform-dotall-regex@7.24.6': + resolution: {integrity: sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.23.3': - resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + '@babel/plugin-transform-duplicate-keys@7.24.6': + resolution: {integrity: sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.23.4': - resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + '@babel/plugin-transform-dynamic-import@7.24.6': + resolution: {integrity: sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.23.3': - resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + '@babel/plugin-transform-exponentiation-operator@7.24.6': + resolution: {integrity: sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.23.4': - resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + '@babel/plugin-transform-export-namespace-from@7.24.6': + resolution: {integrity: sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.23.3': - resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} + '@babel/plugin-transform-flow-strip-types@7.24.6': + resolution: {integrity: sha512-1l8b24NoCpaQ13Vi6FtLG1nv6kNoi8PWvQb1AYO7GHZDpFfBYc3lbXArx1lP2KRt8b4pej1eWc/zrRmsQTfOdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.23.6': - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + '@babel/plugin-transform-for-of@7.24.6': + resolution: {integrity: sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.23.3': - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + '@babel/plugin-transform-function-name@7.24.6': + resolution: {integrity: sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.23.4': - resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + '@babel/plugin-transform-json-strings@7.24.6': + resolution: {integrity: sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.23.3': - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + '@babel/plugin-transform-literals@7.24.6': + resolution: {integrity: sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.23.4': - resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + '@babel/plugin-transform-logical-assignment-operators@7.24.6': + resolution: {integrity: sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.23.3': - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + '@babel/plugin-transform-member-expression-literals@7.24.6': + resolution: {integrity: sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.23.3': - resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + '@babel/plugin-transform-modules-amd@7.24.6': + resolution: {integrity: sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.23.3': - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + '@babel/plugin-transform-modules-commonjs@7.24.6': + resolution: {integrity: sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.23.9': - resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} + '@babel/plugin-transform-modules-systemjs@7.24.6': + resolution: {integrity: sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.23.3': - resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + '@babel/plugin-transform-modules-umd@7.24.6': + resolution: {integrity: sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.6': + resolution: {integrity: sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.23.3': - resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + '@babel/plugin-transform-new-target@7.24.6': + resolution: {integrity: sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.23.4': - resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.24.6': + resolution: {integrity: sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.23.4': - resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + '@babel/plugin-transform-numeric-separator@7.24.6': + resolution: {integrity: sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.23.4': - resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} + '@babel/plugin-transform-object-rest-spread@7.24.6': + resolution: {integrity: sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.23.3': - resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + '@babel/plugin-transform-object-super@7.24.6': + resolution: {integrity: sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.23.4': - resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + '@babel/plugin-transform-optional-catch-binding@7.24.6': + resolution: {integrity: sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.23.4': - resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + '@babel/plugin-transform-optional-chaining@7.24.6': + resolution: {integrity: sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.23.3': - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + '@babel/plugin-transform-parameters@7.24.6': + resolution: {integrity: sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.23.3': - resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + '@babel/plugin-transform-private-methods@7.24.6': + resolution: {integrity: sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.23.4': - resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + '@babel/plugin-transform-private-property-in-object@7.24.6': + resolution: {integrity: sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.23.3': - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + '@babel/plugin-transform-property-literals@7.24.6': + resolution: {integrity: sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.23.3': - resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + '@babel/plugin-transform-react-display-name@7.24.6': + resolution: {integrity: sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.22.5': - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + '@babel/plugin-transform-react-jsx-development@7.24.6': + resolution: {integrity: sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.23.3': - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + '@babel/plugin-transform-react-jsx-self@7.24.6': + resolution: {integrity: sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.23.3': - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + '@babel/plugin-transform-react-jsx-source@7.24.6': + resolution: {integrity: sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.23.4': - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + '@babel/plugin-transform-react-jsx@7.24.6': + resolution: {integrity: sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.23.3': - resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + '@babel/plugin-transform-react-pure-annotations@7.24.6': + resolution: {integrity: sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.23.3': - resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + '@babel/plugin-transform-regenerator@7.24.6': + resolution: {integrity: sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.23.3': - resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + '@babel/plugin-transform-reserved-words@7.24.6': + resolution: {integrity: sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.23.9': - resolution: {integrity: sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==} + '@babel/plugin-transform-runtime@7.24.6': + resolution: {integrity: sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.23.3': - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + '@babel/plugin-transform-shorthand-properties@7.24.6': + resolution: {integrity: sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.23.3': - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + '@babel/plugin-transform-spread@7.24.6': + resolution: {integrity: sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.23.3': - resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + '@babel/plugin-transform-sticky-regex@7.24.6': + resolution: {integrity: sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.23.3': - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + '@babel/plugin-transform-template-literals@7.24.6': + resolution: {integrity: sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.23.3': - resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + '@babel/plugin-transform-typeof-symbol@7.24.6': + resolution: {integrity: sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.23.6': - resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + '@babel/plugin-transform-typescript@7.24.6': + resolution: {integrity: sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.23.3': - resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + '@babel/plugin-transform-unicode-escapes@7.24.6': + resolution: {integrity: sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.23.3': - resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + '@babel/plugin-transform-unicode-property-regex@7.24.6': + resolution: {integrity: sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.23.3': - resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + '@babel/plugin-transform-unicode-regex@7.24.6': + resolution: {integrity: sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.23.3': - resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + '@babel/plugin-transform-unicode-sets-regex@7.24.6': + resolution: {integrity: sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.23.9': - resolution: {integrity: sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==} + '@babel/preset-env@7.24.6': + resolution: {integrity: sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.23.3': - resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} + '@babel/preset-flow@7.24.6': + resolution: {integrity: sha512-huoe0T1Qs9fQhMWbmqE/NHUeZbqmHDsN6n/jYvPcUUHfuKiPV32C9i8tDhMbQ1DEKTjbBP7Rjm3nSLwlB2X05g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1306,20 +1261,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.23.3': - resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + '@babel/preset-react@7.24.6': + resolution: {integrity: sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.23.3': - resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + '@babel/preset-typescript@7.24.6': + resolution: {integrity: sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.23.7': - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1327,31 +1282,77 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@babel/runtime@7.23.9': - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.24.1': - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} - '@babel/template@7.23.9': - resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + '@babel/template@7.24.6': + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.23.9': - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + '@babel/traverse@7.24.6': + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.9': - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.1': resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biomejs/biome@1.7.3': + resolution: {integrity: sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.7.3': + resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.7.3': + resolution: {integrity: sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.7.3': + resolution: {integrity: sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.7.3': + resolution: {integrity: sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.7.3': + resolution: {integrity: sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.7.3': + resolution: {integrity: sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.7.3': + resolution: {integrity: sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.7.3': + resolution: {integrity: sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -1434,12 +1435,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -1458,12 +1453,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} @@ -1482,12 +1471,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} @@ -1506,12 +1489,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} @@ -1530,12 +1507,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} @@ -1554,12 +1525,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} @@ -1578,12 +1543,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} @@ -1602,12 +1561,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} @@ -1626,12 +1579,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} @@ -1650,12 +1597,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} @@ -1674,12 +1615,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} @@ -1698,12 +1633,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} @@ -1722,12 +1651,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} @@ -1746,12 +1669,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} @@ -1770,12 +1687,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} @@ -1794,12 +1705,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} @@ -1818,12 +1723,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} @@ -1842,12 +1741,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} @@ -1866,12 +1759,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} @@ -1890,12 +1777,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} @@ -1914,12 +1795,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} @@ -1938,12 +1813,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} @@ -1962,12 +1831,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} @@ -2003,20 +1866,20 @@ packages: '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - '@floating-ui/core@1.6.0': - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - '@floating-ui/dom@1.6.3': - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - '@floating-ui/react-dom@2.0.8': - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + '@floating-ui/react-dom@2.1.0': + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.1': - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2037,8 +1900,8 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -2076,26 +1939,26 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.22': - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2129,8 +1992,8 @@ packages: '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} - '@nestjs-modules/mailer@1.11.0': - resolution: {integrity: sha512-R7Q9yWxvUXooO2lbMINU56pmLa3/JmuJcfgaWuk7qJ/gpuiAyfXrSH7zPMNUuwJigf+f24wA+os6HPgjPHwxHQ==} + '@nestjs-modules/mailer@1.11.2': + resolution: {integrity: sha512-k07wyKbtCzxWMm6IqGwcGIisnXD/6sneGvUR8rBBZbxtLn1HE1FLGyiaXBrPui/0K7W41aS9x9jAIhfTawtlUg==} peerDependencies: '@nestjs/common': '>=7.0.9' '@nestjs/core': '>=7.0.9' @@ -2149,8 +2012,8 @@ packages: '@swc/core': optional: true - '@nestjs/common@10.3.3': - resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} + '@nestjs/common@10.3.8': + resolution: {integrity: sha512-P+vPEIvqx2e+fonsYVlFXKvoChyJ8Tq+lfpqdVFqblovHbFr3kZ/nYX0cPs+XuW6bnRT8tz0SSR9XBGU43kJhw==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -2162,14 +2025,14 @@ packages: class-validator: optional: true - '@nestjs/config@3.2.0': - resolution: {integrity: sha512-BpYRn57shg7CH35KGT6h+hT7ZucB6Qn2B3NBNdvhD4ApU8huS5pX/Wc2e/aO5trIha606Bz2a9t9/vbiuTBTww==} + '@nestjs/config@3.2.2': + resolution: {integrity: sha512-vGICPOui5vE6kPz1iwQ7oCnp3qWgqxldPmBQ9onkVoKlBtyc83KJCr7CjuVtf4OdovMAVcux1d8Q6jglU2ZphA==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 rxjs: ^7.1.0 - '@nestjs/core@10.3.3': - resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} + '@nestjs/core@10.3.8': + resolution: {integrity: sha512-AxF4tpYLDNn5Wfb3C4bNaaHJ4pREH5FJrSisR2A5zkYpQFORFs0Tc36lOFPMwBTy8Iv2wUwWLUVc5ftBnxEv4w==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/microservices': ^10.0.0 @@ -2215,8 +2078,8 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 - '@nestjs/platform-express@10.3.3': - resolution: {integrity: sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==} + '@nestjs/platform-express@10.3.8': + resolution: {integrity: sha512-sifLoxgEJvAgbim1UuW6wyScMfkS9SVQRH+lN33N/9ZvZSjO6NSDLOe+wxqsnZkia+QrjFC0qy0ITRAsggfqbg==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -2226,8 +2089,8 @@ packages: peerDependencies: typescript: '>=4.8.2' - '@nestjs/swagger@7.3.0': - resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} + '@nestjs/swagger@7.3.1': + resolution: {integrity: sha512-LUC4mr+5oAleEC/a2j8pNRh1S5xhKXJ1Gal5ZdRjt9XebQgbngXCdW7JTA9WOEcwGtFZN9EnKYdquzH971LZfw==} peerDependencies: '@fastify/static': ^6.0.0 || ^7.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -2253,29 +2116,23 @@ packages: '@next/env@13.4.20-canary.15': resolution: {integrity: sha512-89+fp4Hx/E3sPVqGsN9eoFp5yB22WRIKuuaGNkTWMfkePcVbqvxwgLZylWjej8gdhThjOxl4e4PN3Ee9Dib91g==} - '@next/env@14.1.0': - resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} + '@next/env@14.1.4': + resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==} '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - '@next/eslint-plugin-next@12.3.4': - resolution: {integrity: sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og==} - '@next/eslint-plugin-next@13.2.4': resolution: {integrity: sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==} - '@next/eslint-plugin-next@13.5.6': - resolution: {integrity: sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg==} - '@next/swc-darwin-arm64@13.4.20-canary.15': resolution: {integrity: sha512-z67rvHD2nQJR3pywepUt8umlEhSt13LUeGlUmBAxIu+O1JVMPm3KL/ll9qXzJI2W8KEI2zgXqURjl+rAD8QooQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@14.1.0': - resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} + '@next/swc-darwin-arm64@14.1.4': + resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -2292,8 +2149,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@14.1.0': - resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} + '@next/swc-darwin-x64@14.1.4': + resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -2310,8 +2167,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@14.1.0': - resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} + '@next/swc-linux-arm64-gnu@14.1.4': + resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2328,8 +2185,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.1.0': - resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} + '@next/swc-linux-arm64-musl@14.1.4': + resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2346,8 +2203,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@14.1.0': - resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} + '@next/swc-linux-x64-gnu@14.1.4': + resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2364,8 +2221,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.1.0': - resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} + '@next/swc-linux-x64-musl@14.1.4': + resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2382,8 +2239,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@14.1.0': - resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} + '@next/swc-win32-arm64-msvc@14.1.4': + resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2400,8 +2257,8 @@ packages: cpu: [ia32] os: [win32] - '@next/swc-win32-ia32-msvc@14.1.0': - resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} + '@next/swc-win32-ia32-msvc@14.1.4': + resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -2418,8 +2275,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@14.1.0': - resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} + '@next/swc-win32-x64-msvc@14.1.4': + resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2470,8 +2327,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pmmmwh/react-refresh-webpack-plugin@0.5.11': - resolution: {integrity: sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==} + '@pmmmwh/react-refresh-webpack-plugin@0.5.13': + resolution: {integrity: sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g==} engines: {node: '>= 10.13'} peerDependencies: '@types/webpack': 4.x || 5.x @@ -2479,7 +2336,7 @@ packages: sockjs-client: ^1.4.0 type-fest: '>=0.17.0 <5.0.0' webpack: '>=4.43.0 <6.0.0' - webpack-dev-server: 3.x || 4.x + webpack-dev-server: 3.x || 4.x || 5.x webpack-hot-middleware: 2.x webpack-plugin-serve: 0.x || 1.x peerDependenciesMeta: @@ -2499,8 +2356,8 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@prisma/client@5.10.2': - resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} + '@prisma/client@5.14.0': + resolution: {integrity: sha512-akMSuyvLKeoU4LeyBAUdThP/uhVP3GuLygFE3MlYzaCb3/J8SfsYBE5PkaFuLuVpLyA6sFoW+16z/aPhNAESqg==} engines: {node: '>=16.13'} peerDependencies: prisma: '*' @@ -2511,23 +2368,23 @@ packages: '@prisma/debug@5.0.0': resolution: {integrity: sha512-3q/M/KqlQ01/HJXifU/zCNOHkoTWu24kGelMF/IBrRxm7njPqTTbwfnT1dh4JK+nuWM5/Dg1Lv00u2c0l7AHxg==} - '@prisma/debug@5.10.2': - resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} + '@prisma/debug@5.14.0': + resolution: {integrity: sha512-iq56qBZuFfX3fCxoxT8gBX33lQzomBU0qIUaEj1RebsKVz1ob/BVH1XSBwwwvRVtZEV1b7Fxx2eVu34Ge/mg3w==} - '@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9': - resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} + '@prisma/engines-version@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48': + resolution: {integrity: sha512-ip6pNkRo1UxWv+6toxNcYvItNYaqQjXdFNGJ+Nuk2eYtRoEdoF13wxo7/jsClJFFenMPVNVqXQDV0oveXnR1cA==} '@prisma/engines@5.0.0': resolution: {integrity: sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==} - '@prisma/engines@5.10.2': - resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} + '@prisma/engines@5.14.0': + resolution: {integrity: sha512-lgxkKZ6IEygVcw6IZZUlPIfLQ9hjSYAtHjZ5r64sCLDgVzsPFCi2XBBJgzPMkOQ5RHzUD4E/dVdpn9+ez8tk1A==} '@prisma/fetch-engine@5.0.0': resolution: {integrity: sha512-eSzHTE0KcMvM5+O1++eaMuVf4D1zwWHdqjWr6D70skCg37q7RYsuty4GFnlWBuqC4aXwVf06EvIxiJ0SQIIeRw==} - '@prisma/fetch-engine@5.10.2': - resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} + '@prisma/fetch-engine@5.14.0': + resolution: {integrity: sha512-VrheA9y9DMURK5vu8OJoOgQpxOhas3qF0IBHJ8G/0X44k82kc8E0w98HCn2nhnbOOMwbWsJWXfLC2/F8n5u0gQ==} '@prisma/generator-helper@5.0.0': resolution: {integrity: sha512-pufQ1mhoH6WzKNtzL79HZDoW4Ql3Lf8QEKVmBoW8e3Tdb50bxpYBYue5LBqp9vNW1xd1pgZO53cNiRfLX2d4Zg==} @@ -2535,8 +2392,8 @@ packages: '@prisma/get-platform@5.0.0': resolution: {integrity: sha512-JT/rz/jaMTggDkd9OIma50si9rPLzSFe7XSrV3mKXwtv9t+rdwx5ZhmKJd+Rz6S1vhn/291k21JLfaxOW6u8KQ==} - '@prisma/get-platform@5.10.2': - resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} + '@prisma/get-platform@5.14.0': + resolution: {integrity: sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==} '@prisma/internals@5.0.0': resolution: {integrity: sha512-VGWyFk6QlSBXT8z65Alq5F3o9E8IiTtaBoa3rmKkGpZjUk85kJy3jZz4xkRv53TaeghGE5rWfwkfak26KtY5yQ==} @@ -2553,8 +2410,8 @@ packages: '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - '@radix-ui/react-alert-dialog@1.0.4': - resolution: {integrity: sha512-jbfBCRlKYlhbitueOAv7z74PXYeIQmWpKwm3jllsdkw7fGWNkxqP3v0nY9WmOzcPqpQuoorNtvViBgL46n5gVg==} + '@radix-ui/react-alert-dialog@1.0.5': + resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2579,8 +2436,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.0.3': - resolution: {integrity: sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ==} + '@radix-ui/react-avatar@1.0.4': + resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2649,8 +2506,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.0.4': - resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} + '@radix-ui/react-dialog@1.0.5': + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2697,8 +2554,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.0.5': - resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} + '@radix-ui/react-dropdown-menu@2.0.6': + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2767,21 +2624,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.0.5': - resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popover@1.0.6': - resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} + '@radix-ui/react-menu@2.0.6': + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2984,19 +2828,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.0.6': - resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-tooltip@1.0.7': resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: @@ -3218,144 +3049,88 @@ packages: '@remirror/core-constants@2.0.2': resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} - '@remirror/core-helpers@3.0.0': - resolution: {integrity: sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==} - - '@remirror/types@1.0.1': - resolution: {integrity: sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==} - - '@rollup/rollup-android-arm-eabi@4.12.0': - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.13.0': - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.12.0': - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-android-arm64@4.13.0': - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.12.0': - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.13.0': - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.12.0': - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.13.0': - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.12.0': - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.12.0': - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.13.0': - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.12.0': - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.13.0': - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.12.0': - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} - cpu: [riscv64] + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.13.0': - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.12.0': - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.13.0': - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} - cpu: [x64] + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-musl@4.12.0': - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.13.0': - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.12.0': - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-arm64-msvc@4.13.0': - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.12.0': - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.13.0': - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.12.0': - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.13.0': - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} - cpu: [x64] - os: [win32] - - '@rushstack/eslint-patch@1.7.2': - resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + '@rushstack/eslint-patch@1.10.3': + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} '@selderee/plugin-htmlparser2@0.10.0': resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} @@ -3385,472 +3160,337 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@2.2.0': - resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==} - engines: {node: '>=14.0.0'} - - '@smithy/chunked-blob-reader-native@2.2.0': - resolution: {integrity: sha512-VNB5+1oCgX3Fzs072yuRsUoC2N4Zg/LJ11DTxX3+Qu+Paa6AmbIF0E9sc2wthz9Psrk/zcOlTCyuposlIhPjZQ==} - - '@smithy/chunked-blob-reader@2.2.0': - resolution: {integrity: sha512-3GJNvRwXBGdkDZZOGiziVYzDpn4j6zfyULHMDKAGIUo72yHALpE9CbhfQp/XcLNVoc1byfMpn6uW5H2BqPjgaQ==} - - '@smithy/config-resolver@2.2.0': - resolution: {integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==} - engines: {node: '>=14.0.0'} - - '@smithy/core@1.4.0': - resolution: {integrity: sha512-uu9ZDI95Uij4qk+L6kyFjdk11zqBkcJ3Lv0sc6jZrqHvLyr0+oeekD3CnqMafBn/5PRI6uv6ulW3kNLRBUHeVw==} - engines: {node: '>=14.0.0'} - - '@smithy/credential-provider-imds@2.2.1': - resolution: {integrity: sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==} - engines: {node: '>=14.0.0'} - - '@smithy/credential-provider-imds@2.3.0': - resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} - engines: {node: '>=14.0.0'} - - '@smithy/eventstream-codec@2.1.1': - resolution: {integrity: sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==} + '@smithy/abort-controller@3.0.0': + resolution: {integrity: sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==} + engines: {node: '>=16.0.0'} - '@smithy/eventstream-codec@2.2.0': - resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} + '@smithy/chunked-blob-reader-native@3.0.0': + resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} - '@smithy/eventstream-serde-browser@2.2.0': - resolution: {integrity: sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==} - engines: {node: '>=14.0.0'} - - '@smithy/eventstream-serde-config-resolver@2.2.0': - resolution: {integrity: sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==} - engines: {node: '>=14.0.0'} + '@smithy/chunked-blob-reader@3.0.0': + resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} - '@smithy/eventstream-serde-node@2.2.0': - resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==} - engines: {node: '>=14.0.0'} + '@smithy/config-resolver@3.0.1': + resolution: {integrity: sha512-hbkYJc20SBDz2qqLzttjI/EqXemtmWk0ooRznLsiXp3066KQRTvuKHa7U4jCZCJq6Dozqvy0R1/vNESC9inPJg==} + engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-universal@2.2.0': - resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==} - engines: {node: '>=14.0.0'} + '@smithy/core@2.1.1': + resolution: {integrity: sha512-0vbIwwUcg0FMhTVJgMhbsRSAFL0rwduy/OQz7Xq1pJXJOyaGv+PGjj1iGawRlzBUPA5BkJv7S6q+YU2U8gk/WA==} + engines: {node: '>=16.0.0'} - '@smithy/fetch-http-handler@2.5.0': - resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} + '@smithy/credential-provider-imds@3.1.0': + resolution: {integrity: sha512-q4A4d38v8pYYmseu/jTS3Z5I3zXlEOe5Obi+EJreVKgSVyWUHOd7/yaVCinC60QG4MRyCs98tcxBH1IMC0bu7Q==} + engines: {node: '>=16.0.0'} - '@smithy/hash-blob-browser@2.2.0': - resolution: {integrity: sha512-SGPoVH8mdXBqrkVCJ1Hd1X7vh1zDXojNN1yZyZTZsCno99hVue9+IYzWDjq/EQDDXxmITB0gBmuyPh8oAZSTcg==} + '@smithy/eventstream-codec@3.0.0': + resolution: {integrity: sha512-PUtyEA0Oik50SaEFCZ0WPVtF9tz/teze2fDptW6WRXl+RrEenH8UbEjudOz8iakiMl3lE3lCVqYf2Y+znL8QFQ==} - '@smithy/hash-node@2.2.0': - resolution: {integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==} - engines: {node: '>=14.0.0'} + '@smithy/eventstream-serde-browser@3.0.0': + resolution: {integrity: sha512-NB7AFiPN4NxP/YCAnrvYR18z2/ZsiHiF7VtG30gshO9GbFrIb1rC8ep4NGpJSWrz6P64uhPXeo4M0UsCLnZKqw==} + engines: {node: '>=16.0.0'} - '@smithy/hash-stream-node@2.2.0': - resolution: {integrity: sha512-aT+HCATOSRMGpPI7bi7NSsTNVZE/La9IaxLXWoVAYMxHT5hGO3ZOGEMZQg8A6nNL+pdFGtZQtND1eoY084HgHQ==} - engines: {node: '>=14.0.0'} + '@smithy/eventstream-serde-config-resolver@3.0.0': + resolution: {integrity: sha512-RUQG3vQ3LX7peqqHAbmayhgrF5aTilPnazinaSGF1P0+tgM3vvIRWPHmlLIz2qFqB9LqFIxditxc8O2Z6psrRw==} + engines: {node: '>=16.0.0'} - '@smithy/invalid-dependency@2.2.0': - resolution: {integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==} + '@smithy/eventstream-serde-node@3.0.0': + resolution: {integrity: sha512-baRPdMBDMBExZXIUAoPGm/hntixjt/VFpU6+VmCyiYJYzRHRxoaI1MN+5XE+hIS8AJ2GCHLMFEIOLzq9xx1EgQ==} + engines: {node: '>=16.0.0'} - '@smithy/is-array-buffer@2.1.1': - resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} - engines: {node: '>=14.0.0'} + '@smithy/eventstream-serde-universal@3.0.0': + resolution: {integrity: sha512-HNFfShmotWGeAoW4ujP8meV9BZavcpmerDbPIjkJbxKbN8RsUcpRQ/2OyIxWNxXNH2GWCAxuSB7ynmIGJlQ3Dw==} + engines: {node: '>=16.0.0'} - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} + '@smithy/fetch-http-handler@3.0.1': + resolution: {integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==} - '@smithy/md5-js@2.2.0': - resolution: {integrity: sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==} + '@smithy/hash-blob-browser@3.0.0': + resolution: {integrity: sha512-/Wbpdg+bwJvW7lxR/zpWAc1/x/YkcqguuF2bAzkJrvXriZu1vm8r+PUdE4syiVwQg7PPR2dXpi3CLBb9qRDaVQ==} - '@smithy/middleware-content-length@2.2.0': - resolution: {integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==} - engines: {node: '>=14.0.0'} + '@smithy/hash-node@3.0.0': + resolution: {integrity: sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==} + engines: {node: '>=16.0.0'} - '@smithy/middleware-endpoint@2.5.0': - resolution: {integrity: sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==} - engines: {node: '>=14.0.0'} + '@smithy/hash-stream-node@3.0.0': + resolution: {integrity: sha512-J0i7de+EgXDEGITD4fxzmMX8CyCNETTIRXlxjMiNUvvu76Xn3GJ31wQR85ynlPk2wI1lqoknAFJaD1fiNDlbIA==} + engines: {node: '>=16.0.0'} - '@smithy/middleware-retry@2.2.0': - resolution: {integrity: sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==} - engines: {node: '>=14.0.0'} + '@smithy/invalid-dependency@3.0.0': + resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==} - '@smithy/middleware-serde@2.3.0': - resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} - engines: {node: '>=14.0.0'} + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} - '@smithy/middleware-stack@2.2.0': - resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} - engines: {node: '>=14.0.0'} + '@smithy/md5-js@3.0.0': + resolution: {integrity: sha512-Tm0vrrVzjlD+6RCQTx7D3Ls58S3FUH1ZCtU1MIh/qQmaOo1H9lMN2as6CikcEwgattnA9SURSdoJJ27xMcEfMA==} - '@smithy/node-config-provider@2.3.0': - resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-content-length@3.0.0': + resolution: {integrity: sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==} + engines: {node: '>=16.0.0'} - '@smithy/node-http-handler@2.5.0': - resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-endpoint@3.0.1': + resolution: {integrity: sha512-lQ/UOdGD4KM5kLZiAl0q8Qy3dPbynvAXKAdXnYlrA1OpaUwr+neSsVokDZpY6ZVb5Yx8jnus29uv6XWpM9P4SQ==} + engines: {node: '>=16.0.0'} - '@smithy/property-provider@2.1.1': - resolution: {integrity: sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-retry@3.0.3': + resolution: {integrity: sha512-Wve1qzJb83VEU/6q+/I0cQdAkDnuzELC6IvIBwDzUEiGpKqXgX1v10FUuZGbRS6Ov/P+HHthcAoHOJZQvZNAkA==} + engines: {node: '>=16.0.0'} - '@smithy/property-provider@2.2.0': - resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-serde@3.0.0': + resolution: {integrity: sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==} + engines: {node: '>=16.0.0'} - '@smithy/protocol-http@3.3.0': - resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} - engines: {node: '>=14.0.0'} + '@smithy/middleware-stack@3.0.0': + resolution: {integrity: sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==} + engines: {node: '>=16.0.0'} - '@smithy/querystring-builder@2.2.0': - resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} - engines: {node: '>=14.0.0'} + '@smithy/node-config-provider@3.1.0': + resolution: {integrity: sha512-ngfB8QItUfTFTfHMvKuc2g1W60V1urIgZHqD1JNFZC2tTWXahqf2XvKXqcBS7yZqR7GqkQQZy11y/lNOUWzq7Q==} + engines: {node: '>=16.0.0'} - '@smithy/querystring-parser@2.2.0': - resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} - engines: {node: '>=14.0.0'} + '@smithy/node-http-handler@3.0.0': + resolution: {integrity: sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==} + engines: {node: '>=16.0.0'} - '@smithy/service-error-classification@2.1.5': - resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==} - engines: {node: '>=14.0.0'} + '@smithy/property-provider@3.1.0': + resolution: {integrity: sha512-Tj3+oVhqdZgemjCiWjFlADfhvLF4C/uKDuKo7/tlEsRQ9+3emCreR2xndj970QSRSsiCEU8hZW3/8JQu+n5w4Q==} + engines: {node: '>=16.0.0'} - '@smithy/shared-ini-file-loader@2.3.1': - resolution: {integrity: sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==} - engines: {node: '>=14.0.0'} + '@smithy/protocol-http@4.0.0': + resolution: {integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==} + engines: {node: '>=16.0.0'} - '@smithy/shared-ini-file-loader@2.4.0': - resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} - engines: {node: '>=14.0.0'} + '@smithy/querystring-builder@3.0.0': + resolution: {integrity: sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==} + engines: {node: '>=16.0.0'} - '@smithy/signature-v4@2.1.1': - resolution: {integrity: sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==} - engines: {node: '>=14.0.0'} + '@smithy/querystring-parser@3.0.0': + resolution: {integrity: sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==} + engines: {node: '>=16.0.0'} - '@smithy/smithy-client@2.5.0': - resolution: {integrity: sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==} - engines: {node: '>=14.0.0'} + '@smithy/service-error-classification@3.0.0': + resolution: {integrity: sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==} + engines: {node: '>=16.0.0'} - '@smithy/types@2.12.0': - resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==} - engines: {node: '>=14.0.0'} + '@smithy/shared-ini-file-loader@3.1.0': + resolution: {integrity: sha512-dAM7wSX0NR3qTNyGVN/nwwpEDzfV9T/3AN2eABExWmda5VqZKSsjlINqomO5hjQWGv+IIkoXfs3u2vGSNz8+Rg==} + engines: {node: '>=16.0.0'} - '@smithy/url-parser@2.2.0': - resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} + '@smithy/signature-v4@3.0.0': + resolution: {integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==} + engines: {node: '>=16.0.0'} - '@smithy/util-base64@2.1.1': - resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==} - engines: {node: '>=14.0.0'} + '@smithy/smithy-client@3.1.1': + resolution: {integrity: sha512-tj4Ku7MpzZR8cmVuPcSbrLFVxmptWktmJMwST/uIEq4sarabEdF8CbmQdYB7uJ/X51Qq2EYwnRsoS7hdR4B7rA==} + engines: {node: '>=16.0.0'} - '@smithy/util-base64@2.3.0': - resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==} - engines: {node: '>=14.0.0'} + '@smithy/types@3.0.0': + resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==} + engines: {node: '>=16.0.0'} - '@smithy/util-body-length-browser@2.1.1': - resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} + '@smithy/url-parser@3.0.0': + resolution: {integrity: sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==} - '@smithy/util-body-length-node@2.2.1': - resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} - engines: {node: '>=14.0.0'} + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} - '@smithy/util-buffer-from@2.1.1': - resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} - engines: {node: '>=14.0.0'} + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} - '@smithy/util-config-provider@2.2.1': - resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} - engines: {node: '>=14.0.0'} + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} - '@smithy/util-config-provider@2.3.0': - resolution: {integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==} - engines: {node: '>=14.0.0'} + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} - '@smithy/util-defaults-mode-browser@2.2.0': - resolution: {integrity: sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==} + '@smithy/util-defaults-mode-browser@3.0.3': + resolution: {integrity: sha512-3DFON2bvXJAukJe+qFgPV/rorG7ZD3m4gjCXHD1V5z/tgKQp5MCTCLntrd686tX6tj8Uli3lefWXJudNg5WmCA==} engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-node@2.3.0': - resolution: {integrity: sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==} + '@smithy/util-defaults-mode-node@3.0.3': + resolution: {integrity: sha512-D0b8GJXecT00baoSQ3Iieu3k3mZ7GY8w1zmg8pdogYrGvWJeLcIclqk2gbkG4K0DaBGWrO6v6r20iwIFfDYrmA==} engines: {node: '>= 10.0.0'} - '@smithy/util-endpoints@1.2.0': - resolution: {integrity: sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==} - engines: {node: '>= 14.0.0'} - - '@smithy/util-hex-encoding@2.1.1': - resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} - engines: {node: '>=14.0.0'} - - '@smithy/util-hex-encoding@2.2.0': - resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==} - engines: {node: '>=14.0.0'} - - '@smithy/util-middleware@2.1.1': - resolution: {integrity: sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-middleware@2.2.0': - resolution: {integrity: sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==} - engines: {node: '>=14.0.0'} + '@smithy/util-endpoints@2.0.1': + resolution: {integrity: sha512-ZRT0VCOnKlVohfoABMc8lWeQo/JEFuPWctfNRXgTHbyOVssMOLYFUNWukxxiHRGVAhV+n3c0kPW+zUqckjVPEA==} + engines: {node: '>=16.0.0'} - '@smithy/util-retry@2.2.0': - resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==} - engines: {node: '>= 14.0.0'} + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} - '@smithy/util-stream@2.2.0': - resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} - engines: {node: '>=14.0.0'} + '@smithy/util-middleware@3.0.0': + resolution: {integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==} + engines: {node: '>=16.0.0'} - '@smithy/util-uri-escape@2.1.1': - resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} - engines: {node: '>=14.0.0'} + '@smithy/util-retry@3.0.0': + resolution: {integrity: sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==} + engines: {node: '>=16.0.0'} - '@smithy/util-uri-escape@2.2.0': - resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==} - engines: {node: '>=14.0.0'} + '@smithy/util-stream@3.0.1': + resolution: {integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==} + engines: {node: '>=16.0.0'} - '@smithy/util-utf8@2.1.1': - resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} - engines: {node: '>=14.0.0'} + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} - '@smithy/util-waiter@2.2.0': - resolution: {integrity: sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==} - engines: {node: '>=14.0.0'} + '@smithy/util-waiter@3.0.0': + resolution: {integrity: sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==} + engines: {node: '>=16.0.0'} - '@socket.io/component-emitter@3.1.0': - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@storybook/addon-actions@7.4.0': - resolution: {integrity: sha512-0lHLLUlrGE7CBFrfmAXrBKu7fUIsiQlnNekuE3cIAjSgVR481bJEzYHUUoMATqpPC4GGErBdP1CZxVDDwWV8jA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-actions@7.6.19': + resolution: {integrity: sha512-ATLrA5QKFJt7tIAScRHz5T3eBQ+RG3jaZk08L7gChvyQZhei8knWwePElZ7GaWbCr9BgznQp1lQUUXq/UUblAQ==} - '@storybook/addon-backgrounds@7.4.0': - resolution: {integrity: sha512-cEO/Tp/eRE+5bf1FGN4wKLqLDBv3EYp9enJyXV7B3cFdciqtoE7VJPZuFZkzjJN1rRcOKSZp8g5agsx+x9uNGQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-backgrounds@7.6.19': + resolution: {integrity: sha512-Nu3LAZODRSV2e5bOroKm/Jp6BIFzwu/nJxD5OvLWkkwNCh+vDXUFbbaVrZf5xRL+fHd9iLFPtWbJQpF/w7UsCw==} - '@storybook/addon-controls@7.4.0': - resolution: {integrity: sha512-tYDfqpTR+c9y4kElmr3aWNHPot6kYd+nruYb697LpkCdy4lFErqSo0mhvPyZfMZp2KEajfp6YJAurhQWbvbj/A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-controls@7.6.19': + resolution: {integrity: sha512-cl6PCNEwihDjuWIUsKTyDNKk+/IE4J3oMbSY5AZV/9Z0jJbpMV2shVm5DMZm5LhCCVcu5obWcxCIa4FMIMJAMQ==} - '@storybook/addon-docs@7.4.0': - resolution: {integrity: sha512-LJE92LUeVTgi8W4tLBEbSvCqF54snmBfTFCr46vhCFov2CE2VBgEvIX1XT3dfUgYUOtPu3RXR2C89fYgU6VYZw==} + '@storybook/addon-docs@7.6.19': + resolution: {integrity: sha512-nv+9SR/NOtM8Od2esOXHcg0NQT8Pk8BMUyGwZu5Q3MLI4JxNVEG65dY0IP2j6Knc4UtlvQTpM0f7m5xp4seHjQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/addon-essentials@7.4.0': - resolution: {integrity: sha512-nZmNM9AKw2JXxnYUXyFKLeUF/cL7Z9E1WTeZyOFTDtU2aITRt8+LvaepwjchtPqu2B0GcQxLB5FRDdhy0I19nw==} + '@storybook/addon-essentials@7.6.19': + resolution: {integrity: sha512-SC33ZEQ5YaOt9wDkrdZmwQgqPWo9om/gqnyif06eug3SwrTe9JjO5iq1PIBfQodLD9MAxr9cwBvO0NG505oszQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/addon-highlight@7.4.0': - resolution: {integrity: sha512-kpYSb3oXI9t/1+aRJhToDZ0/1W4mu+SzTBfv9Bl2d/DogEkFzgJricoy5LtvS5EpcXUmKO1FJsw/DCm9buSL2g==} + '@storybook/addon-highlight@7.6.19': + resolution: {integrity: sha512-/pApl0oiVU1CQ8xETRNDLDthMBjeTmvFnTRq8RJ9m0JYTrSsoyHDmj9zS4K1k9gReqijE7brslhP8d2tblBpNw==} - '@storybook/addon-interactions@7.4.0': - resolution: {integrity: sha512-nEWP+Ib0Y/ShXfpCm40FBTbBy1/MT8XxTEAhcNN+3ZJ07Vhhkrb8GMlWHTKQv2PyghEVBYEoPFHhElUJQOe00g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-interactions@7.6.19': + resolution: {integrity: sha512-lMQDu6JT2LXDWcRnIGvrKRk/W+67zOtUNpDKwoVuvM5eHVJcza5SPV6v8yXDLCHLOt7RZ15h6LT2uXabfKpcww==} - '@storybook/addon-links@7.4.0': - resolution: {integrity: sha512-lFj8fiokWKk3jx5YUQ4anQo1uCNDMP1y6nJ/92Y85vnOd1vJr3w4GlLy8eOWMABRE33AKLI5Yp6wcpWZDe7hhQ==} + '@storybook/addon-links@7.6.19': + resolution: {integrity: sha512-qMIFfcsMf4olxhYUHUV2ZJhxphh6Xpf1DMd0lxKqAibfxl/sX1m0rJkyiqWSBxbCmAy/pwdgqEOJ1lpDUsJ33w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true - react-dom: - optional: true - '@storybook/addon-measure@7.4.0': - resolution: {integrity: sha512-8YjBqm6jPOBgkRn9YnJkLN0+ghgJiukdHOa0VB3qhiT+oww4ZOZ7mc2aQRwXQoFb05UbVVG9UNxE7lhyTyaG2w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-measure@7.6.19': + resolution: {integrity: sha512-n+cfhVXXouBv9oQr3a77vvip5dTznaNoBDWMafP2ohauc8jBlAxeBwCjk5r3pyThMRIFCTG/ypZrhiJcSJT3bw==} - '@storybook/addon-onboarding@1.0.8': - resolution: {integrity: sha512-3WwCocUuTibHWO89uzAbeONEn6x9NkmxA0mOU4rYPhEsMQ4NDNDD1GXcievZmpwt5VviFgw5FRx8+BxPn54YmQ==} + '@storybook/addon-onboarding@1.0.11': + resolution: {integrity: sha512-0Sa7PJDsM6AANOWZX7vq3kgCbS9AZFjr3tfr3bLGfXviwIBKjoZDDdIErJkS3D4mNcDa78lYQvp3PTCKwLIJ9A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/addon-outline@7.4.0': - resolution: {integrity: sha512-CCAWFC3bfkmYPzFjOemfH/kjpqJOHt+SdJgBKmwujDy+zum0DHlUL/7rd+U32cEpezCA8bapd0hlWn59C4agHQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-outline@7.6.19': + resolution: {integrity: sha512-Tt4MrfjK5j/Mdh8nJ8ccVyh78Dy7aiEPxO31YVvr5XUkge0pDi1PX328mHRDPur0i56NM8ssVbekWBZr+9MxlA==} - '@storybook/addon-toolbars@7.4.0': - resolution: {integrity: sha512-00PDLchlQXI3ZClQHU0YQBfikAAxHOhVNv2QKW54yFKmxPl+P2c/VIeir9LcPhA04smKrJTD1u+Nszd66A9xAA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-toolbars@7.6.19': + resolution: {integrity: sha512-+qGbPP2Vo/HoPiS4EJopZ127HGculCV74Hkz6ot7ob6AkYdA1yLMPzWns/ZXNIWm6ab3jV+iq+mQCM/i1qJzvA==} - '@storybook/addon-viewport@7.4.0': - resolution: {integrity: sha512-Bfoilf9eJV/C7tR8XHDxz3h8JlZ+iggoESp2Tc0bW9tlRvz+PsCqeyHhF/IgHY+gLnPal2PkK/PIM+ruO45HXA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-viewport@7.6.19': + resolution: {integrity: sha512-OQQtJ2kYwImbvE9QiC3I3yR0O0EBgNjq+XSaSS4ixJrvUyesfuB7Lm7RkubhEEiP4yANi9OlbzsqZelmPOnk6w==} - '@storybook/blocks@7.4.0': - resolution: {integrity: sha512-YQznNjJm+l32fCfPxrZso9+MbcyG0pWZSpx3RKI1+pxDMsAs4mbXsIw4//jKfjoDP/6/Cz/FJcSx8LT7i4BJ2w==} + '@storybook/blocks@7.6.19': + resolution: {integrity: sha512-/c/bVQRmyRPoviJhPrFdLfubRcrnZWTwkjxsCvrOTJ/UDOyEl0t/H8yY1mGq7KWWTdbIznnZWhAIofHnH4/Esw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/builder-manager@7.4.0': - resolution: {integrity: sha512-4fuxVzBIBbZh2aVBizSOU5EJ8b74IhR6x2TAZjifZZf5Gdxgfgio8sAyrrd/C78vrFOFhFEgmQhMqZRuCLHxvQ==} + '@storybook/builder-manager@7.6.19': + resolution: {integrity: sha512-Dt5OLh97xeWh4h2mk9uG0SbCxBKHPhIiHLHAKEIDzIZBdwUhuyncVNDPHW2NlXM+S7U0/iKs2tw05waqh2lHvg==} - '@storybook/builder-webpack5@7.4.0': - resolution: {integrity: sha512-CYeXppqGACzDUpLCFvWvwD7IjN7VNi7+nwQ1uRNgW2NgBMOIldZe+gcTXcc0BuHyIitU5/vvquYM0qjis05LYw==} + '@storybook/builder-webpack5@7.6.19': + resolution: {integrity: sha512-PeP66orYG0tWoWeOGNcCDKtk/kpDBFfosViCkd0Pxb6c2MtvjOuHSGWGB/9AI3hjodsoe5p9xo/SqGf7lDzpoA==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@storybook/channels@7.4.0': - resolution: {integrity: sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==} - - '@storybook/channels@7.6.16': - resolution: {integrity: sha512-LKB0t4OGISez1O4TRJ/CDPxlb2wAW7gg8YRL91VVUHeffVyr4bnpklvMbLbuEcYrysM82Q2UMB9ipQdyK6Issg==} + '@storybook/channels@7.6.19': + resolution: {integrity: sha512-2JGh+i95GwjtjqWqhtEh15jM5ifwbRGmXeFqkY7dpdHH50EEWafYHr2mg3opK3heVDwg0rJ/VBptkmshloXuvA==} - '@storybook/cli@7.4.0': - resolution: {integrity: sha512-yn27cn3LzhTqpEVX6CzUz13KTJ3jPLA2eM4bO1t7SYUqpDlzw3lET9DIcYIaUAIiL+0r2Js3jW2BsyN/5KmO5w==} + '@storybook/cli@7.6.19': + resolution: {integrity: sha512-7OVy7nPgkLfgivv6/dmvoyU6pKl9EzWFk+g9izyQHiM/jS8jOiEyn6akG8Ebj6k5pWslo5lgiXUSW+cEEZUnqQ==} hasBin: true - '@storybook/client-logger@7.4.0': - resolution: {integrity: sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==} - - '@storybook/client-logger@7.6.16': - resolution: {integrity: sha512-Vquhmgk/SO0VeAkojcA1juuicBHoTST+f4XwBvyUNiebOSOdGIkxHVxpDFXu2kS0aKflFBEutX2IgoysDup+fQ==} + '@storybook/client-logger@7.6.19': + resolution: {integrity: sha512-oGzOxbmLmciSIfd5gsxDzPmX8DttWhoYdPKxjMuCuWLTO2TWpkCWp1FTUMWO72mm/6V/FswT/aqpJJBBvdZ3RQ==} - '@storybook/codemod@7.4.0': - resolution: {integrity: sha512-XqNhv5bec+L7TJ5tXdsMalmJazwaFMVVxoNlnb0f9zKhovAEF2F6hl6+Pnd2avRomH9+1q7EM+GwrTCAvzAfzg==} + '@storybook/codemod@7.6.19': + resolution: {integrity: sha512-bmHE0iEEgWZ65dXCmasd+GreChjPiWkXu2FEa0cJmNz/PqY12GsXGls4ke1TkNTj4gdSZnbtJxbclPZZnib2tQ==} - '@storybook/components@7.4.0': - resolution: {integrity: sha512-GGnQrI4NXwri/PqNjhO1vNv4tC7RBjY87ce9WHBq1ueat3kBakdqV97NzScoldXarkkKK6grBqmhw9jE5PfzhQ==} + '@storybook/components@7.6.19': + resolution: {integrity: sha512-8Zw/RQ4crzKkUR7ojxvRIj8vktKiBBO8Nq93qv4JfDqDWrcR7cro0hOlZgmZmrzbFunBBt6WlsNNO6nVP7R4Xw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/core-client@7.4.0': - resolution: {integrity: sha512-AhysJS2HnydB8Jc+BMVzK5VLHa1liJjxroNsd+ZTgGUhD7R8wvozrswQgY4MLFtcaLwN/wDWlK2YavSBqmc94Q==} - - '@storybook/core-common@7.4.0': - resolution: {integrity: sha512-QKrBL46ZFdfTjlZE3f7b59Q5+frOHWIJ64sC9BZ2PHkZkGjFeYRDdJJ6EHLYBb+nToynl33dYN1GQz+hQn2vww==} - - '@storybook/core-common@7.6.16': - resolution: {integrity: sha512-Xn3Fbo4k9RRKgYzOBx9CeJFpWgS9gkcdo3J9XMMzmUqdZ+MUGT74kl2sMmzSypcH5aI1AUl5vZIKvLwloliejw==} + '@storybook/core-client@7.6.19': + resolution: {integrity: sha512-F0V9nzcEnj6DIpnw2ilrxsV4d9ibyyQS+Wi2uQtXy+wCQQm9PeBVqrOywjXAY2F9pcoftXOaepfhp8jrxX4MXw==} - '@storybook/core-events@7.4.0': - resolution: {integrity: sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==} + '@storybook/core-common@7.6.19': + resolution: {integrity: sha512-njwpGzFJrfbJr/AFxGP8KMrfPfxN85KOfSlxYnQwRm5Z0H1D/lT33LhEBf5m37gaGawHeG7KryxO6RvaioMt2Q==} - '@storybook/core-events@7.6.16': - resolution: {integrity: sha512-mkBqzrbp6vmdjo0fBZGrFQQ4YdvMFxF6AesdKTf8EzPa69FoxnhQLrmQ4aXF+9vXkxfXVJF2HfpoTEdfqqAo+w==} + '@storybook/core-events@7.6.19': + resolution: {integrity: sha512-K/W6Uvum0ocZSgjbi8hiotpe+wDEHDZlvN+KlPqdh9ae9xDK8aBNBq9IelCoqM+uKO1Zj+dDfSQds7CD781DJg==} - '@storybook/core-server@7.4.0': - resolution: {integrity: sha512-AcbfXatHVx1by4R2CiPIMgjQlOL3sUbVarkhmgUcL0AWT0zC0SCQWUZdo22en+jZhAraazgXyLGNCVP7A+6Tqg==} + '@storybook/core-server@7.6.19': + resolution: {integrity: sha512-7mKL73Wv5R2bEl0kJ6QJ9bOu5YY53Idu24QgvTnUdNsQazp2yUONBNwHIrNDnNEXm8SfCi4Mc9o0mmNRMIoiRA==} - '@storybook/core-webpack@7.4.0': - resolution: {integrity: sha512-1zxzJjRbkcjl++OjYBVTDi0V/yO22Kz3ciPASTvXwrg0fXTXgxwxhJBmgOI4r17oY0kOWnJ1RDsmd95NLGAbGw==} + '@storybook/core-webpack@7.6.19': + resolution: {integrity: sha512-Ezvn54hFN99qwP8kDOQa7/IEk2V3NyJys2eg0Afqz1cy9Uc3SkL7U7hQorKOHr5+66dsryNDfJdPzM1YMKFMBQ==} - '@storybook/csf-plugin@7.4.0': - resolution: {integrity: sha512-X1L3l/dpz2UYjCEQlFLkW7w1A13pmzDZpJ0lotkV79PALlakMXBeoX3I2E0VMjJATV8wC9RSj56COBAs6HsPeg==} + '@storybook/csf-plugin@7.6.19': + resolution: {integrity: sha512-yUP0xfJyR8e6fmCgKoEt4c1EvslF8dZ8wtwVLE5hnC3kfs7xt8RVDiKLB/9NhYjY3mD/oOesX60HqRXDgJQHwA==} - '@storybook/csf-tools@7.4.0': - resolution: {integrity: sha512-bKyOmWPyvT50Neq2wCRr2PmVGLVVm6pOw8WL5t5jueD8sRRzo9QdfhEkqmuSyqdsBdt3SiJKL5oA6dqY5Vl9ww==} + '@storybook/csf-tools@7.6.19': + resolution: {integrity: sha512-8Vzia3cHhDdGHuS3XKXJReCRxmfRq3vmTm/Te9yKZnPSAsC58CCKcMh8FNEFJ44vxYF9itKTkRutjGs+DprKLQ==} - '@storybook/csf-tools@7.6.16': - resolution: {integrity: sha512-8kVBq3UKDrEQq7rTHlNMoe1TDOTdO8iL8Jtv/FMDu/Qzj6AoT8/bjrtPsGjGMfVjP7QwBDeiLn6rStT4TlVGog==} - - '@storybook/csf@0.1.2': - resolution: {integrity: sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==} + '@storybook/csf@0.1.7': + resolution: {integrity: sha512-53JeLZBibjQxi0Ep+/AJTfxlofJlxy1jXcSKENlnKxHjWEYyHQCumMP5yTFjf7vhNnMjEpV3zx6t23ssFiGRyw==} '@storybook/docs-mdx@0.1.0': resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} - '@storybook/docs-tools@7.4.0': - resolution: {integrity: sha512-DzXmt4JorAOePoS+sjQznf8jLPI9D5mdB1eSXjfvmGBQyyehKTZv5+TXuxYvT3iPN4rW4OPrIrQCSIrbULFdwA==} + '@storybook/docs-tools@7.6.19': + resolution: {integrity: sha512-JuwV6wtm7Hb7Kb5ValChfxy4J7XngfrSQNpvwsDCSBNVcQUv2y843hvclpa26Ptfr/c7zpUX8r9FGSaMDy+2aQ==} '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/instrumenter@7.4.0': - resolution: {integrity: sha512-jZKxLK0lGKxY8LEul6GP7s+PDlNuXT4JU6MnPY9+SVSo23lP0pAOxo/ojV8WTLf48tcoyL3ztSfbYhxnaJvBfw==} - - '@storybook/manager-api@7.4.0': - resolution: {integrity: sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/manager-api@7.6.19': + resolution: {integrity: sha512-dVCx1Q+HZEA4U08XqYljiG88BeS3I3ahnPAQLZAeWQXQRkoc9G2jMgLNPKYPIqEtq7Xrn6SRlFMIofhwWrwZpg==} - '@storybook/manager@7.4.0': - resolution: {integrity: sha512-uOSdPBEBKg8WORUZ5HKHb4KnKcTyA5j5Q8MWy/NBaRd22JR3fQkZiKuHer9WJIOQTU+fb6KDmzhZbCTKg5Euog==} + '@storybook/manager@7.6.19': + resolution: {integrity: sha512-fZWQcf59x4P0iiBhrL74PZrqKJAPuk9sWjP8BIkGbf8wTZtUunbY5Sv4225fOL4NLJbuX9/RYLUPoxQ3nucGHA==} '@storybook/mdx2-csf@1.1.0': resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - '@storybook/nextjs@7.4.0': - resolution: {integrity: sha512-nGmer4Hu1/XX3+XyxfAkQ9d16Qsj467aLc7MTNQ2uFyYAksCqT3bvznooUOcD/X5NfoyL2YA78OczGdt1HFFpQ==} + '@storybook/nextjs@7.6.19': + resolution: {integrity: sha512-BnwGPV7KgQJaCq9+fnBm3jfTBx1rtvJoPofdPMqcZqmuIMR3rsQRo7XPvjNLEbVChZFwMeB/kjNqQOQQyPxikQ==} engines: {node: '>=16.0.0'} peerDependencies: - '@next/font': ^13.0.0 - next: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + '@next/font': ^13.0.0|| ^14.0.0 + next: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' @@ -3863,17 +3503,14 @@ packages: webpack: optional: true - '@storybook/node-logger@7.4.0': - resolution: {integrity: sha512-tWSWkYyAvp6SxjIBaTklg29avzv/3Lv4c0dOG2o5tz79PyZkq9v6sQtwLLoI8EJA9Mo8Z08vaJp8NZyDQ9RCuA==} + '@storybook/node-logger@7.6.19': + resolution: {integrity: sha512-2g29QC44Zl1jKY37DmQ0/dO7+VSKnGgPI/x0mwVwQffypSapxH3rwLLT5Q5XLHeFyD+fhRu5w9Cj4vTGynJgpA==} - '@storybook/node-logger@7.6.16': - resolution: {integrity: sha512-s18wgtLynLWnunz47lkVIpjk8J6LxT/OmfzkggieU8cG2XYRbf//t7/EOUpOqK77+Xqm3epSwgDAxOXGfjOjAA==} + '@storybook/postinstall@7.6.19': + resolution: {integrity: sha512-s6p1vpgMfn+QGDfCK2YNdyyWKidUgb3nGicB81FANRyzYqGB//QlJlghEc2LKCIQbGIZQiwP3l8PdZQmczEJRw==} - '@storybook/postinstall@7.4.0': - resolution: {integrity: sha512-ZVBZggqkuj7ysfuHSCd/J7ovWV06zY9uWf+VU+Zw7ZeojDT8QHFrCurPsN7D9679j9vRU1/kSzqvAiStALS33g==} - - '@storybook/preset-react-webpack@7.4.0': - resolution: {integrity: sha512-9iZ9lvhRUYtxXmJMqR7txNyatrHryqo6FSKzfpUzmcCySn3d7mu9I6LEPxEir43TkPnBio3W4EsbvtIhjJ5ekA==} + '@storybook/preset-react-webpack@7.6.19': + resolution: {integrity: sha512-WvfDE4upH7jmisx5XOn4E07p9Fm8YJn4Aywc9vYM1jqQ8A1lEH8VSC1KR6dPfdmGr94jRscQkD6fjs9sUNTdrw==} engines: {node: '>=16.0.0'} peerDependencies: '@babel/core': ^7.22.0 @@ -3886,11 +3523,11 @@ packages: typescript: optional: true - '@storybook/preview-api@7.4.0': - resolution: {integrity: sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==} + '@storybook/preview-api@7.6.19': + resolution: {integrity: sha512-04hdMSQucroJT4dBjQzRd7ZwH2hij8yx2nm5qd4HYGkd1ORkvlH6GOLph4XewNJl5Um3xfzFQzBhvkqvG0WaCQ==} - '@storybook/preview@7.4.0': - resolution: {integrity: sha512-R4LMTvUrVAbcUetRbAXpY3frkwD0eysqHrByiR73040+ngzDwtZOBAy0JfO3jw3WrWv2dn3kWlao5aEwVc9Exw==} + '@storybook/preview@7.6.19': + resolution: {integrity: sha512-VqRPua2koOQTOteB+VvuKNXFYQ7IDEopaPpj9Nx+3kom+bqp0hWdAysWcm6CtKN2GGzBQm+5PvGibMNdawsaVg==} '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0': resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} @@ -3898,14 +3535,14 @@ packages: typescript: '>= 4.x' webpack: '>= 4' - '@storybook/react-dom-shim@7.4.0': - resolution: {integrity: sha512-TLpb8a2hnWJoRLqoXpMADh82BFfRZll6JI2Waf1FjnvJ4SF9eS0zBbxybrjW3lFAHWy2XJi+rwcK8FiPj0iBoQ==} + '@storybook/react-dom-shim@7.6.19': + resolution: {integrity: sha512-tpt2AC1428d1gF4fetMkpkeFZ1WdDr1CLKoLbSInWQZ7i96nbnIMIA9raR/W8ai1bo55KSz9Bq5ytC/1Pac2qQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/react@7.4.0': - resolution: {integrity: sha512-QWsFw/twsNkcWI6brW06sugQQ5dV+fJm4IrEeI28cA4cBHK9G9HKOwCHoXDUWikzZx48XYMpNfs/WyIkuGmEqg==} + '@storybook/react@7.6.19': + resolution: {integrity: sha512-uKShAAp1/pRki1YnRjBveH/jAD3f8V0W2WP1LxTQqnKVFkl01mTbDZ/9ZIK6rVTSILUlmsk3fwsNyRbOKVgBGQ==} engines: {node: '>=16.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3915,35 +3552,43 @@ packages: typescript: optional: true - '@storybook/router@7.4.0': - resolution: {integrity: sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/telemetry@7.4.0': - resolution: {integrity: sha512-oxCB3kIbpiDWuXEtQhk/j6t1/h0KKWAuvxmcwGPxwhEvj/uNtoM+f1qhoDID9waxNo4AccU9Px+1ZJQ+2ejcDg==} + '@storybook/router@7.6.19': + resolution: {integrity: sha512-q2/AvY8rG0znFEfbg50OIhkS5yQ6OmyzdCdztoEsDDdsbq87YPmsDj7k8Op1EkTa2T5CB8XhBOCQDtcj7gUUtg==} - '@storybook/telemetry@7.6.16': - resolution: {integrity: sha512-5Uaz6zSRBEio89ScrAN7KKz+mBTJ5Jc/8Uf0uUHIhAxiHprs16PhIBo6MtBeWPQoiNwytN884sAtiUFAP4zFQQ==} + '@storybook/telemetry@7.6.19': + resolution: {integrity: sha512-rA5xum4I36M57iiD3uzmW0MOdpl0vEpHWBSAa5hK0a0ALPeY9TgAsQlI/0dSyNYJ/K7aczEEN6d4qm1NC4u10A==} - '@storybook/testing-library@0.2.0': - resolution: {integrity: sha512-Ff6jNnrsosmDshgCf0Eb5Cz7IA34p/1Ps5N3Kp3598kfXpBSccSkQQvVFUXC3kIHw/isIXWPqntZuKqnWUz7Gw==} + '@storybook/testing-library@0.2.2': + resolution: {integrity: sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==} + deprecated: In Storybook 8, this package functionality has been integrated to a new package called @storybook/test, which uses Vitest APIs for an improved experience. When upgrading to Storybook 8 with 'npx storybook@latest upgrade', you will get prompted and will get an automigration for the new package. Please migrate when you can. - '@storybook/theming@7.4.0': - resolution: {integrity: sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==} + '@storybook/theming@7.6.19': + resolution: {integrity: sha512-sAho13MmtA80ctOaLn8lpkQBsPyiqSdLcOPH5BWFhatQzzBQCpTAKQk+q/xGju8bNiPZ+yQBaBzbN8SfX8ceCg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/types@7.4.0': - resolution: {integrity: sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==} + '@storybook/types@7.6.19': + resolution: {integrity: sha512-DeGYrRPRMGTVfT7o2rEZtRzyLT2yKTI2exgpnxbwPWEFAduZCSfzBrcBXZ/nb5B0pjA9tUNWls1YzGkJGlkhpg==} + + '@swc-node/core@1.13.1': + resolution: {integrity: sha512-emB5l2nZsXjUEAuusqjYvWnQMLWZp6K039Mv8aq5SX1rsNM/N7DNhw1i4/DX7AyzNZ0tT+ASWyTvqEURldp5HA==} + engines: {node: '>= 10'} + peerDependencies: + '@swc/core': '>= 1.4.13' + '@swc/types': '>= 0.1' + + '@swc-node/register@1.9.1': + resolution: {integrity: sha512-z//TBXJdRWXoISCXlQmVz+NMm8Qm/UvcfKiGC0tSJdfeVYf5EZkGqvk2OiRH4SIJ6OGFfS9T0YrvA2pDKzWtPA==} + peerDependencies: + '@swc/core': '>= 1.4.13' + typescript: '>= 4.3' - '@storybook/types@7.6.16': - resolution: {integrity: sha512-Ld4dKbgSbvqThdBNwNlOxQu5AiS6U9DXI5evf/j83eWs6skO3OBdQp+GWa6sUCI9eRqH8tFsw/YmMcIZ4uZrBQ==} + '@swc-node/sourcemap-support@0.5.0': + resolution: {integrity: sha512-fbhjL5G0YvFoWwNhWleuBUfotiX+USiA9oJqu9STFw+Hb0Cgnddn+HVS/K5fI45mn92e8V+cHD2jgFjk4w2T9Q==} - '@swc/cli@0.3.9': - resolution: {integrity: sha512-e5grxGEyNT0fYZEFmhSrRYL1kFAZAXlv+WjfQ35J6J9Hl0EtrMVymAEbGabetg2Q/2FX6HiRcjgc9LrdUCBk4A==} + '@swc/cli@0.3.12': + resolution: {integrity: sha512-h7bvxT+4+UDrLWJLFHt6V+vNAcUNii2G4aGSSotKz1ECEk4MyEh5CWxmeSscwuz5K3i+4DWTgm4+4EyMCQKn+g==} engines: {node: '>= 16.14.0'} hasBin: true peerDependencies: @@ -3959,14 +3604,8 @@ packages: cpu: [arm64] os: [darwin] - '@swc/core-darwin-arm64@1.4.2': - resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-arm64@1.4.8': - resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} + '@swc/core-darwin-arm64@1.5.24': + resolution: {integrity: sha512-M7oLOcC0sw+UTyAuL/9uyB9GeO4ZpaBbH76JSH6g1m0/yg7LYJZGRmplhDmwVSDAR5Fq4Sjoi1CksmmGkgihGA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -3977,14 +3616,8 @@ packages: cpu: [x64] os: [darwin] - '@swc/core-darwin-x64@1.4.2': - resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-darwin-x64@1.4.8': - resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} + '@swc/core-darwin-x64@1.5.24': + resolution: {integrity: sha512-MfcFjGGYognpSBSos2pYUNYJSmqEhuw5ceGr6qAdME7ddbjGXliza4W6FggsM+JnWwpqa31+e7/R+GetW4WkaQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -3995,14 +3628,8 @@ packages: cpu: [arm] os: [linux] - '@swc/core-linux-arm-gnueabihf@1.4.2': - resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm-gnueabihf@1.4.8': - resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} + '@swc/core-linux-arm-gnueabihf@1.5.24': + resolution: {integrity: sha512-amI2pwtcWV3E/m/nf+AQtn1LWDzKLZyjCmWd3ms7QjEueWYrY8cU1Y4Wp7wNNsxIoPOi8zek1Uj2wwFD/pttNQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -4013,14 +3640,8 @@ packages: cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-gnu@1.4.2': - resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.4.8': - resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} + '@swc/core-linux-arm64-gnu@1.5.24': + resolution: {integrity: sha512-sTSvmqMmgT1ynH/nP75Pc51s+iT4crZagHBiDOf5cq+kudUYjda9lWMs7xkXB/TUKFHPCRK0HGunl8bkwiIbuw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4031,14 +3652,8 @@ packages: cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.4.2': - resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.4.8': - resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} + '@swc/core-linux-arm64-musl@1.5.24': + resolution: {integrity: sha512-vd2/hfOBGbrX21FxsFdXCUaffjkHvlZkeE2UMRajdXifwv79jqOHIJg3jXG1F3ZrhCghCzirFts4tAZgcG8XWg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4049,14 +3664,8 @@ packages: cpu: [x64] os: [linux] - '@swc/core-linux-x64-gnu@1.4.2': - resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.4.8': - resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} + '@swc/core-linux-x64-gnu@1.5.24': + resolution: {integrity: sha512-Zrdzi7NqzQxm2BvAG5KyOSBEggQ7ayrxh599AqqevJmsUXJ8o2nMiWQOBvgCGp7ye+Biz3pvZn1EnRzAp+TpUg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4067,14 +3676,8 @@ packages: cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.4.2': - resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.4.8': - resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} + '@swc/core-linux-x64-musl@1.5.24': + resolution: {integrity: sha512-1F8z9NRi52jdZQCGc5sflwYSctL6omxiVmIFVp8TC9nngjQKc00TtX/JC2Eo2HwvgupkFVl5YQJidAck9YtmJw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4085,14 +3688,8 @@ packages: cpu: [arm64] os: [win32] - '@swc/core-win32-arm64-msvc@1.4.2': - resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-arm64-msvc@1.4.8': - resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} + '@swc/core-win32-arm64-msvc@1.5.24': + resolution: {integrity: sha512-cKpP7KvS6Xr0jFSTBXY53HZX/YfomK5EMQYpCVDOvfsZeYHN20sQSKXfpVLvA/q2igVt1zzy1XJcOhpJcgiKLg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -4103,14 +3700,8 @@ packages: cpu: [ia32] os: [win32] - '@swc/core-win32-ia32-msvc@1.4.2': - resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.4.8': - resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} + '@swc/core-win32-ia32-msvc@1.5.24': + resolution: {integrity: sha512-IoPWfi0iwqjZuf7gE223+B97/ZwkKbu7qL5KzGP7g3hJrGSKAvv7eC5Y9r2iKKtLKyv5R/T6Ho0kFR/usi7rHw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -4121,14 +3712,8 @@ packages: cpu: [x64] os: [win32] - '@swc/core-win32-x64-msvc@1.4.2': - resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core-win32-x64-msvc@1.4.8': - resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} + '@swc/core-win32-x64-msvc@1.5.24': + resolution: {integrity: sha512-zHgF2k1uVJL8KIW+PnVz1To4a3Cz9THbh2z2lbehaF/gKHugH4c3djBozU4das1v35KOqf5jWIEviBLql2wDLQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -4142,20 +3727,11 @@ packages: '@swc/helpers': optional: true - '@swc/core@1.4.2': - resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==} + '@swc/core@1.5.24': + resolution: {integrity: sha512-Eph9zvO4xvqWZGVzTdtdEJ0Vqf0VIML/o/e4Qd2RLOqtfgnlRi7avmMu5C0oqciJ0tk+hqdUKVUZ4JPoPaiGvQ==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/core@1.4.8': - resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': ^0.5.0 + '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true @@ -4172,21 +3748,18 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@swc/types@0.1.5': - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - - '@swc/types@0.1.6': - resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + '@swc/types@0.1.7': + resolution: {integrity: sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tanstack/query-core@4.32.6': - resolution: {integrity: sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==} + '@tanstack/query-core@4.36.1': + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} - '@tanstack/react-query@4.32.6': - resolution: {integrity: sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg==} + '@tanstack/react-query@4.36.1': + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4201,8 +3774,8 @@ packages: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} - '@testing-library/react@14.1.2': - resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} + '@testing-library/react@14.3.1': + resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} engines: {node: '>=14'} peerDependencies: react: ^18.0.0 @@ -4214,127 +3787,127 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tiptap/core@2.2.3': - resolution: {integrity: sha512-0l3p1/cuaQk8XFf+Ft/ExbUjReGes5Iep7y4nuL/Fzi2S92DZzozY6cosXBHC/Xsqzn6zIkl/gnQTgmTvlmhCQ==} + '@tiptap/core@2.4.0': + resolution: {integrity: sha512-YJSahk8pkxpCs8SflCZfTnJpE7IPyUWIylfgXM2DefjRQa5DZ+c6sNY0s/zbxKYFQ6AuHVX40r9pCfcqHChGxQ==} peerDependencies: '@tiptap/pm': ^2.0.0 - '@tiptap/extension-blockquote@2.2.3': - resolution: {integrity: sha512-gN23d/ADhTOB0YIM4lR0VrVczdyaXpmIVYYWZ45tQEVJzFWRSIScE9m9NaVqtqwEMpYHyTHxLth0OQutZ91sog==} + '@tiptap/extension-blockquote@2.4.0': + resolution: {integrity: sha512-nJJy4KsPgQqWTTDOWzFRdjCfG5+QExfZj44dulgDFNh+E66xhamnbM70PklllXJgEcge7xmT5oKM0gKls5XgFw==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-bold@2.2.3': - resolution: {integrity: sha512-bHeFkRY5+Nf2DKupstV8EIVn359tw/9MFwDEDoF9F+Sn/vjuS35vm0OqjXYg/Ya9CQvwl/2oym/fKv5kO+Q6og==} + '@tiptap/extension-bold@2.4.0': + resolution: {integrity: sha512-csnW6hMDEHoRfxcPRLSqeJn+j35Lgtt1YRiOwn7DlS66sAECGRuoGfCvQSPij0TCDp4VCR9if5Sf8EymhnQumQ==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-bubble-menu@2.2.3': - resolution: {integrity: sha512-6ybColxLznGilzOY/yk3KcpV4JQy+QDDW6Za6zWV6OEs9D8I8VUeMAS77isMMc1dffvHfmgZpVZm/lsva8UuCw==} + '@tiptap/extension-bubble-menu@2.4.0': + resolution: {integrity: sha512-s99HmttUtpW3rScWq8rqk4+CGCwergNZbHLTkF6Rp6TSboMwfp+rwL5Q/JkcAG9KGLso1vGyXKbt1xHOvm8zMw==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-bullet-list@2.2.3': - resolution: {integrity: sha512-BpYg1pIfLE+2LTC90ts53deEWGSmAojhM/jJ84U19qfbfXt/7/KHrZJ4SAMxJSW3pLpy0bIq2XuOuvppOYVR5g==} + '@tiptap/extension-bullet-list@2.4.0': + resolution: {integrity: sha512-9S5DLIvFRBoExvmZ+/ErpTvs4Wf1yOEs8WXlKYUCcZssK7brTFj99XDwpHFA29HKDwma5q9UHhr2OB2o0JYAdw==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-code-block@2.2.3': - resolution: {integrity: sha512-1xFM2Aj/JEWAT1PWjQ/7hEVmo1Av6JHxTANxMIjXUcmrMJkXDA+BQ7yItlwrrHxY0SJdxBbR/WWFn4dWIxd7iA==} + '@tiptap/extension-code-block@2.4.0': + resolution: {integrity: sha512-QWGdv1D56TBGbbJSj2cIiXGJEKguPiAl9ONzJ/Ql1ZksiQsYwx0YHriXX6TOC//T4VIf6NSClHEtwtxWBQ/Csg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-code@2.2.3': - resolution: {integrity: sha512-ZMp3CrbAV+PVOnPbGmruvlxFENLc+J/Fos8Y4mWvS1nDbrGuu19OKgKimwdzfDBpZVFVnHpEUnDTMBDzDe0hkg==} + '@tiptap/extension-code@2.4.0': + resolution: {integrity: sha512-wjhBukuiyJMq4cTcK3RBTzUPV24k5n1eEPlpmzku6ThwwkMdwynnMGMAmSF3fErh3AOyOUPoTTjgMYN2d10SJA==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-color@2.2.3': - resolution: {integrity: sha512-d9CNqXkv6jWfb7gFxmuRw8+fgh90mbZJIWwLROrUEZj87rZbRggDh24KViR3W++Ha+G4WruoRrMlVsl62SFAVw==} + '@tiptap/extension-color@2.4.0': + resolution: {integrity: sha512-aVuqGtzTIZO93niADdu+Hx8g03X0pS7wjrJcCcYkkDEbC/siC03zlxKZIYBW1Jiabe99Z7/s2KdtLoK6DW2A2g==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/extension-text-style': ^2.0.0 - '@tiptap/extension-document@2.2.3': - resolution: {integrity: sha512-60Egd9yKb5SzpQlstQAP2A/2a/Qr+A+TblMRKZugrT+NENUhAj6Tx1HxWlblqGu2MsS1iXvQLZ6BQO1jHkL2IQ==} + '@tiptap/extension-document@2.4.0': + resolution: {integrity: sha512-3jRodQJZDGbXlRPERaloS+IERg/VwzpC1IO6YSJR9jVIsBO6xC29P3cKTQlg1XO7p6ZH/0ksK73VC5BzzTwoHg==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-dropcursor@2.2.3': - resolution: {integrity: sha512-SFvxgVX8/l3H+fV1q6dwmVEwlHuGbaKp1pkQb16/cDiWke/AWOBFTGOIVDfulLI5IiRIL7u3uc+Fy7BXrGDqQw==} + '@tiptap/extension-dropcursor@2.4.0': + resolution: {integrity: sha512-c46HoG2PEEpSZv5rmS5UX/lJ6/kP1iVO0Ax+6JrNfLEIiDULUoi20NqdjolEa38La2VhWvs+o20OviiTOKEE9g==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-floating-menu@2.2.3': - resolution: {integrity: sha512-ZeQGmIFNImhu/zzn//Xzupwa82j2vIwiMoviX2zd+2DutoFnm4qRIAU6qpjzV+ZOSHAq3aBMGnYwEAY6vl4f3g==} + '@tiptap/extension-floating-menu@2.4.0': + resolution: {integrity: sha512-vLb9v+htbHhXyty0oaXjT3VC8St4xuGSHWUB9GuAJAQ+NajIO6rBPbLUmm9qM0Eh2zico5mpSD1Qtn5FM6xYzg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-gapcursor@2.2.3': - resolution: {integrity: sha512-zPVpxembkuOQL/eJ5oAjvZ9Tyv480OpViKrNtOsQh+0nZctmWKnfDntMoWBZiSeW1vsGjkeFIckdeEAQ1KbIxA==} + '@tiptap/extension-gapcursor@2.4.0': + resolution: {integrity: sha512-F4y/0J2lseohkFUw9P2OpKhrJ6dHz69ZScABUvcHxjznJLd6+0Zt7014Lw5PA8/m2d/w0fX8LZQ88pZr4quZPQ==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-hard-break@2.2.3': - resolution: {integrity: sha512-P7sP4WBEaQyiiFAswy9lKvaUWUAUwnfTSN3svTAgx0fpU3/ZeVWg+SDi5ve474Ym2oz2eRAr09mNTdWEUsL32Q==} + '@tiptap/extension-hard-break@2.4.0': + resolution: {integrity: sha512-3+Z6zxevtHza5IsDBZ4lZqvNR3Kvdqwxq/QKCKu9UhJN1DUjsg/l1Jn2NilSQ3NYkBYh2yJjT8CMo9pQIu776g==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-heading@2.2.3': - resolution: {integrity: sha512-7atctuvtwPqIAdnBPOhAMsJZd41UPnWN3CktzgzfsfEoplq/86QR1hGIE4JXVB2wAZDmbnKP9Fe8PCNr7Q8JCQ==} + '@tiptap/extension-heading@2.4.0': + resolution: {integrity: sha512-fYkyP/VMo7YHO76YVrUjd95Qeo0cubWn/Spavmwm1gLTHH/q7xMtbod2Z/F0wd6QHnc7+HGhO7XAjjKWDjldaw==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-highlight@2.2.3': - resolution: {integrity: sha512-3K9WbrR2WCYq7a/2JSQi5K2zzG/5ebNfTOXyDcT3kn5B5PutyWuDCzqjkPxGXmkf8yEZTQ9Sn2lQPRMG3sNwFw==} + '@tiptap/extension-highlight@2.4.0': + resolution: {integrity: sha512-p2I/CaMrs6hzpj/dSw6UNobOWTV38yTjPK+B4ShJQ7IN2u/C82KOTOeFfJoFd9KykmpVOVW3w3nKG3ad0HXPuQ==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-history@2.2.3': - resolution: {integrity: sha512-S1TUfLtrasyv4zFNlBL302uYaR4wxqR/T36a4d71c0ozr0PsdVc6/f9lfH4aYw4PmS3fzDwJj0PAJ9bb+qDbPw==} + '@tiptap/extension-history@2.4.0': + resolution: {integrity: sha512-gr5qsKAXEVGr1Lyk1598F7drTaEtAxqZiuuSwTCzZzkiwgEQsWMWTWc9F8FlneCEaqe1aIYg6WKWlmYPaFwr0w==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-horizontal-rule@2.2.3': - resolution: {integrity: sha512-pc0J0hBcvj9ymJkFau1W/3L+OhB1PQzMjsx4ZWJvxURL8U7zdDqvYvJjfCA0i5Qw2ZuSVXFACGbEVr6NoCMRAw==} + '@tiptap/extension-horizontal-rule@2.4.0': + resolution: {integrity: sha512-yDgxy+YxagcEsBbdWvbQiXYxsv3noS1VTuGwc9G7ZK9xPmBHJ5y0agOkB7HskwsZvJHoaSqNRsh7oZTkf0VR3g==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-image@2.2.3': - resolution: {integrity: sha512-IkhISPZ++INAQ3RSwjtJkMIinRyY2g8bqfgyLrc6kXNtfxRGLYS+lizvnI5UUO6X4sRgg/FPfqctAz5bqQBGzA==} + '@tiptap/extension-image@2.4.0': + resolution: {integrity: sha512-NIVhRPMO/ONo8OywEd+8zh0Q6Q7EbFHtBxVsvfOKj9KtZkaXQfUO4MzONTyptkvAchTpj9pIzeaEY5fyU87gFA==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-italic@2.2.3': - resolution: {integrity: sha512-SSsFuRnm4Y4Qnc6EuvmA4iarLCt/sg8qkqCKiNPjDUP5JR8HGESeoYVjQzprLHY8jusT9qoC26TP1Sin5vZmWQ==} + '@tiptap/extension-italic@2.4.0': + resolution: {integrity: sha512-aaW/L9q+KNHHK+X73MPloHeIsT191n3VLd3xm6uUcFDnUNvzYJ/q65/1ZicdtCaOLvTutxdrEvhbkrVREX6a8g==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-link@2.2.3': - resolution: {integrity: sha512-AKKgkllpj0Po/hi2bVz719OMqyB1nBhKU/Q05yeWVirOYwF2ZwfM4iK2Iab7xWUVhvlyIG3lrWFQL8A30yuqwQ==} + '@tiptap/extension-link@2.4.0': + resolution: {integrity: sha512-r3PjT0bjSKAorHAEBPA0icSMOlqALbxVlWU9vAc+Q3ndzt7ht0CTPNewzFF9kjzARABVt1cblXP/2+c0qGzcsg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-list-item@2.2.3': - resolution: {integrity: sha512-eyfk4f1jOioj+mkIN2m6XQK61MpV0fi17utt8VNx893Td8kS0g7HHuuYMwyjIRtG35ENUaAt7c216JQwnLsrAw==} + '@tiptap/extension-list-item@2.4.0': + resolution: {integrity: sha512-reUVUx+2cI2NIAqMZhlJ9uK/+zvRzm1GTmlU2Wvzwc7AwLN4yemj6mBDsmBLEXAKPvitfLh6EkeHaruOGymQtg==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-ordered-list@2.2.3': - resolution: {integrity: sha512-YIWpjkHAJN74tY185ZqatlG4+KbXQOdkJpc5cKWqO89gVWLi7+4xwdeeXbTEG64/LOOWS4Q6r1/EJmDy2FCbyA==} + '@tiptap/extension-ordered-list@2.4.0': + resolution: {integrity: sha512-Zo0c9M0aowv+2+jExZiAvhCB83GZMjZsxywmuOrdUbq5EGYKb7q8hDyN3hkrktVHr9UPXdPAYTmLAHztTOHYRA==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-paragraph@2.2.3': - resolution: {integrity: sha512-4dP+Ecb2iEWW33ckFKjXRnSfEygaFUN19qzc7mUYD8e61ZA8caWL6//uL7DFIz4Q1rchyefbU52gCwTh2P42kQ==} + '@tiptap/extension-paragraph@2.4.0': + resolution: {integrity: sha512-+yse0Ow67IRwcACd9K/CzBcxlpr9OFnmf0x9uqpaWt1eHck1sJnti6jrw5DVVkyEBHDh/cnkkV49gvctT/NyCw==} peerDependencies: '@tiptap/core': ^2.0.0 @@ -4344,53 +3917,53 @@ packages: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-strike@2.2.3': - resolution: {integrity: sha512-3wwFk01ociZajRzD08hp4j/4isFUeD6BIkKPDnZeGD5HKPdTOaDciE3dJ3JaZZrRZPPdPV3yMt5hkBOapqEKzQ==} + '@tiptap/extension-strike@2.4.0': + resolution: {integrity: sha512-pE1uN/fQPOMS3i+zxPYMmPmI3keubnR6ivwM+KdXWOMnBiHl9N4cNpJgq1n2eUUGKLurC2qrQHpnVyGAwBS6Vg==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-task-item@2.2.3': - resolution: {integrity: sha512-QffmRA56pq4mOb3MnWVOJTiW7NPf54z/iBIlW/8zLKcCKUr8PtC27rs++r5MmtsBrQInRm50b+ibKINyOixd+g==} + '@tiptap/extension-task-item@2.4.0': + resolution: {integrity: sha512-x40vdHnmDiBbA2pjWR/92wVGb6jT13Nk2AhRUI/oP/r4ZGKpTypoB7heDnvLBgH0Y5a51dFqU+G1SFFL30u5uA==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-task-list@2.2.3': - resolution: {integrity: sha512-ruwJ//jPjIT60p42goqqApCYsjZHk+E15HajEycdpu9gOqEiVh/Hsn8z4g3ZYwgMF8SuyU4mm11K05xYtoG40A==} + '@tiptap/extension-task-list@2.4.0': + resolution: {integrity: sha512-vmUB3wEJU81QbiHUygBlselQW8YIW8/85UTwANvWx8+KEWyM7EUF4utcm5R2UobIprIcWb4hyVkvW/5iou25gg==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-text-style@2.2.3': - resolution: {integrity: sha512-23OGAX0GFXY3CBlrsgqgWTw2G6RNPao4O8FV/Ryvo2ckSI58ITOgXQtt6pejk424RAFVolHUKob36VGfC7RRGw==} + '@tiptap/extension-text-style@2.4.0': + resolution: {integrity: sha512-H0uPWeZ4sXz3o836TDWnpd38qClqzEM2d6QJ9TK+cQ1vE5Gp8wQ5W4fwUV1KAHzpJKE/15+BXBjLyVYQdmXDaQ==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-text@2.2.3': - resolution: {integrity: sha512-BrWGCkmuzVcsNy7dSCfJyVwedPzeNz6BR/OUNzM8Mqt2KSxfoIRy7cg16HvFB4YW+ijrM9XUqDIFvqYI0TY+Jg==} + '@tiptap/extension-text@2.4.0': + resolution: {integrity: sha512-LV0bvE+VowE8IgLca7pM8ll7quNH+AgEHRbSrsI3SHKDCYB9gTHMjWaAkgkUVaO1u0IfCrjnCLym/PqFKa+vvg==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-underline@2.2.3': - resolution: {integrity: sha512-Y6PTaXmDFay39+Knk77T+Ezc5vuC/gFxZFD6cQhjctZHMJ2QMAguMKWtBVaSs78HBkKnwTU9EViAFBurz++Geg==} + '@tiptap/extension-underline@2.4.0': + resolution: {integrity: sha512-guWojb7JxUwLz4OKzwNExJwOkhZjgw/ttkXCMBT0PVe55k998MMYe1nvN0m2SeTW9IxurEPtScH4kYJ0XuSm8Q==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/pm@2.2.3': - resolution: {integrity: sha512-jYZX+0fjN+a1J8qY72Poz1LK6X6oHVQkJIq6qzcx3rm0voYZNVRzP2GIfzstncZiEqRXABHY3mWfOi2I4K9tQA==} + '@tiptap/pm@2.4.0': + resolution: {integrity: sha512-B1HMEqGS4MzIVXnpgRZDLm30mxDWj51LkBT/if1XD+hj5gm8B9Q0c84bhvODX6KIs+c6z+zsY9VkVu8w9Yfgxg==} - '@tiptap/react@2.2.3': - resolution: {integrity: sha512-OTQgc5DHX3KRqf4MvSR5uJqXvxKnMGDPlbYC7psREIie1eK6J456e91q+MLwAtRshnP7nHryGCpZZOXn5nq7vQ==} + '@tiptap/react@2.4.0': + resolution: {integrity: sha512-baxnIr6Dy+5iGagOEIKFeHzdl1ZRa6Cg+SJ3GDL/BVLpO6KiCM3Mm5ymB726UKP1w7icrBiQD2fGY3Bx8KaiSA==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - '@tiptap/starter-kit@2.2.3': - resolution: {integrity: sha512-Jx+QXz0SE1y+j498TqYEJcjbIV9YSMwcuIJQ04q8KqHuSmZrq9B22Qa4d0fpcM7uL7dLI4AcRrcqaOuIahCJYQ==} + '@tiptap/starter-kit@2.4.0': + resolution: {integrity: sha512-DYYzMZdTEnRn9oZhKOeRCcB+TjhNz5icLlvJKoHoOGL9kCbuUyEf8WRR2OSPckI0+KUIPJL3oHRqO4SqSdTjfg==} - '@tiptap/suggestion@2.2.3': - resolution: {integrity: sha512-pMInbk8+rYNaCz4oT/uS498mxSGIJXU32mkXv7wdDqMT2nnZQ2AHtJDUtMuB1RX+DS4ll9vdzrKqQHSW5t2ybQ==} + '@tiptap/suggestion@2.4.0': + resolution: {integrity: sha512-6dCkjbL8vIzcLWtS6RCBx0jlYPKf2Beuyq5nNLrDDZZuyJow5qJAY0eGu6Xomp9z0WDK/BYOxT4hHNoGMDkoAg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 @@ -4402,8 +3975,8 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -4426,8 +3999,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -4438,8 +4011,8 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie-parser@1.4.6': - resolution: {integrity: sha512-KoooCrD56qlLskXPLGUiJxOMnv5l/8m7cQD2OxJ73NPMhuSz9PmvwRD6EpjDyKBVrdJDdQ4bQK7JFNHnNmax0w==} + '@types/cookie-parser@1.4.7': + resolution: {integrity: sha512-Fvuyi354Z+uayxzIGCwYTayFKocfV7TuDYZClCdIP9ckhvAu/ixDtCB6qx2TT0FKjPLf1f3P/J1rgf6lPs64mw==} '@types/cookie@0.4.1': resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} @@ -4492,11 +4065,14 @@ packages: '@types/doctrine@0.0.3': resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - '@types/emscripten@1.39.10': - resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} + '@types/emscripten@1.39.13': + resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} '@types/escodegen@0.0.6': resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} @@ -4504,8 +4080,8 @@ packages: '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.56.2': - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} '@types/estree@0.0.51': resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} @@ -4513,8 +4089,8 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/express-serve-static-core@4.17.43': - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/express-serve-static-core@4.19.3': + resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -4561,17 +4137,20 @@ packages: '@types/jsonwebtoken@9.0.5': resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} + '@types/jsonwebtoken@9.0.6': + resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} '@types/linkify-it@3.0.5': resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} - '@types/lodash@4.14.202': - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + '@types/lodash@4.17.4': + resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} - '@types/markdown-it@12.2.3': - resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + '@types/markdown-it@13.0.8': + resolution: {integrity: sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg==} '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -4579,8 +4158,8 @@ packages: '@types/mdurl@1.0.5': resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - '@types/mdx@2.0.11': - resolution: {integrity: sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} @@ -4588,12 +4167,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -4603,38 +4176,26 @@ packages: '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - '@types/node@16.18.82': - resolution: {integrity: sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==} - - '@types/node@18.14.6': - resolution: {integrity: sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==} - '@types/node@18.15.3': resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} - '@types/node@20.11.20': - resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + '@types/node@20.12.13': + resolution: {integrity: sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==} - '@types/nodemailer@6.4.14': - resolution: {integrity: sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==} + '@types/nodemailer@6.4.15': + resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/nprogress@0.2.0': - resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} - - '@types/oauth@0.9.4': - resolution: {integrity: sha512-qk9orhti499fq5XxKCCEbd0OzdPZuancneyse3KtR+vgMiHRbh+mn8M4G6t64ob/Fg+GZGpa565MF/2dKWY32A==} - - '@types/object.omit@3.0.3': - resolution: {integrity: sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew==} + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} - '@types/object.pick@1.3.4': - resolution: {integrity: sha512-5PjwB0uP2XDp3nt5u5NJAG2DORHIRClPzWT/TTZhJ2Ekwe8M5bA9tvPdi9NO/n2uvu2/ictat8kgqvLfcIE1SA==} + '@types/oauth@0.9.5': + resolution: {integrity: sha512-+oQ3C2Zx6ambINOcdIARF5Z3Tu3x//HipE889/fqo3sgpQZbe9c6ExdQFtN6qlhpR7p83lTZfPJt0tCAW29dog==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4642,14 +4203,14 @@ packages: '@types/passport-github2@1.2.9': resolution: {integrity: sha512-/nMfiPK2E6GKttwBzwj0Wjaot8eHrM57hnWxu52o6becr5/kXlH/4yE2v2rh234WGvSgEEzIII02Nc5oC5xEHA==} - '@types/passport-google-oauth20@2.0.14': - resolution: {integrity: sha512-ZaZpRUAeMl3vy298ulKO1wGLn9SQtj/CyIfZL/Px5xU9pybMiQU3mhXDCBiWSbg0EK9uXT4ZoWC3ktuWY+5fwQ==} + '@types/passport-google-oauth20@2.0.16': + resolution: {integrity: sha512-ayXK2CJ7uVieqhYOc6k/pIr5pcQxOLB6kBev+QUGS7oEZeTgIs1odDobXRqgfBPvXzl0wXCQHftV5220czZCPA==} '@types/passport-jwt@4.0.1': resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} - '@types/passport-oauth2@1.4.15': - resolution: {integrity: sha512-9cUTP/HStNSZmhxXGuRrBJfEWzIEJRub2eyJu3CvkA+8HAMc9W3aKdFhVq+Qz1hi42qn+GvSAnz3zwacDSYWpw==} + '@types/passport-oauth2@1.4.17': + resolution: {integrity: sha512-ODiAHvso6JcWJ6ZkHHroVp05EHGhqQN533PtFNBkg8Fy5mERDqsr030AX81M0D69ZcaMvhF92SRckEk2B0HYYg==} '@types/passport-strategy@0.2.38': resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} @@ -4660,11 +4221,8 @@ packages: '@types/pretty-hrtime@1.0.3': resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - '@types/prismjs@1.26.3': - resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} - - '@types/prop-types@15.7.11': - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + '@types/prismjs@1.26.4': + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -4675,8 +4233,8 @@ packages: '@types/qrcode@1.5.5': resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} - '@types/qs@6.9.11': - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} '@types/raf@3.4.3': resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} @@ -4687,20 +4245,17 @@ packages: '@types/react-dom@18.0.11': resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} - '@types/react-dom@18.2.24': - resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==} - - '@types/react@16.14.56': - resolution: {integrity: sha512-MxuHB7dvVm5yOxRr7hJoonLG0JY8YvqZtaQ9Quirp3Oe4FLFjAgxkxsKE6IspdHPpRVZKo2ZoDEravWO81EeYA==} + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} '@types/react@18.0.28': resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} - '@types/react@18.2.58': - resolution: {integrity: sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==} + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - '@types/react@18.2.74': - resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==} + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -4708,32 +4263,32 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/scheduler@0.16.8': - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/scheduler@0.23.0': + resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - '@types/semver@7.5.7': - resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/throttle-debounce@2.1.0': - resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} - '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - '@types/validator@13.11.9': - resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/validator@13.11.10': + resolution: {integrity: sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==} '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} @@ -4797,11 +4352,19 @@ packages: '@upstash/redis@1.24.3': resolution: {integrity: sha512-gw6d4IA1biB4eye5ESaXc0zOlVQI94aptsBvVcTghYWu1kRmOrJFoMFEDCa8p5uzluyYAOFCuY2GWLR6O4ZoIw==} - '@upstash/redis@1.29.0': - resolution: {integrity: sha512-kbO5fgMAeUzErnA/SOtaSbAa0dguYhhBT4MZHJ1O8gVl4iK754aC9+rIYY5hsp4nlxeCGfnIDkWpof991c9jjA==} + '@upstash/redis@1.31.3': + resolution: {integrity: sha512-KtVgWBUEx/LGbR8oRwYexwzHh3s5DNqYW0bjkD+gjFZVOnREJITvK+hC4PjSSD+8D4qJ+Xbkfmy8ANADZ9EUFg==} - '@vercel/analytics@1.1.2': - resolution: {integrity: sha512-CodhkLCQ/EHzjX8k+Qg+OzTBY0UadykrcfolfSOJVZZY/ZJM5nbhztm9KdbYvMfqKlasAr1+OYy0ThZnDA/MYA==} + '@vercel/analytics@1.3.1': + resolution: {integrity: sha512-xhSlYgAuJ6Q4WQGkzYTLmXwhYl39sWjoMA3nHxfkvG+WdBT25c563a7QhwwKivEOZtPJXifYHR1m2ihoisbWyA==} + peerDependencies: + next: '>= 13' + react: ^18 || ^19 + peerDependenciesMeta: + next: + optional: true + react: + optional: true '@vercel/blob@0.9.3': resolution: {integrity: sha512-/joEYvzqiItiUdN/WgrA/ICpOfBe1b/5eTJhMd92PHiXw0AEsi41FgGyoKhtFISkkkjOY6c7VO0MHAg/TaWooQ==} @@ -4811,58 +4374,55 @@ packages: resolution: {integrity: sha512-wbIOOXhg6MzmNMzKFSWbbLAS65hCZcJN33z1coENzI1M0fOX55yE9v9LwVGqkzdItp3eZsv6pYvwcmGtllyLTw==} engines: {node: '>=14.6'} - '@vitejs/plugin-react@4.2.1': - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + '@vitejs/plugin-react@4.3.0': + resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/expect@1.2.0': - resolution: {integrity: sha512-H+2bHzhyvgp32o7Pgj2h9RTHN0pgYaoi26Oo3mE+dCi1PAqV31kIIVfTbqMO3Bvshd5mIrJLc73EwSRrbol9Lw==} + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} - '@vitest/runner@1.2.0': - resolution: {integrity: sha512-vaJkDoQaNUTroT70OhM0NPznP7H3WyRwt4LvGwCVYs/llLaqhoSLnlIhUClZpbF5RgAee29KRcNz0FEhYcgxqA==} + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} - '@vitest/snapshot@1.2.0': - resolution: {integrity: sha512-P33EE7TrVgB3HDLllrjK/GG6WSnmUtWohbwcQqmm7TAk9AVHpdgf7M3F3qRHKm6vhr7x3eGIln7VH052Smo6Kw==} + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - '@vitest/spy@1.2.0': - resolution: {integrity: sha512-MNxSAfxUaCeowqyyGwC293yZgk7cECZU9wGb8N1pYQ0yOn/SIr8t0l9XnGRdQZvNV/ZHBYu6GO/W3tj5K3VN1Q==} + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - '@vitest/utils@1.2.0': - resolution: {integrity: sha512-FyD5bpugsXlwVpTcGLDf3wSPYy8g541fQt14qtzo8mJ4LdEpDKZ9mQy2+qdJm2TZRpjY5JLXihXCgIxiRJgi5g==} + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - '@vue/compiler-core@3.4.21': - resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + '@vue/compiler-core@3.4.27': + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} - '@vue/compiler-dom@3.4.21': - resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + '@vue/compiler-dom@3.4.27': + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} - '@vue/compiler-sfc@3.4.21': - resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + '@vue/compiler-sfc@3.4.27': + resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} - '@vue/compiler-ssr@3.4.21': - resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + '@vue/compiler-ssr@3.4.27': + resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} - '@vue/reactivity@3.4.21': - resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + '@vue/reactivity@3.4.27': + resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} - '@vue/runtime-core@3.4.21': - resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} + '@vue/runtime-core@3.4.27': + resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} - '@vue/runtime-dom@3.4.21': - resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} + '@vue/runtime-dom@3.4.27': + resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} - '@vue/server-renderer@3.4.21': - resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} + '@vue/server-renderer@3.4.27': + resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} peerDependencies: - vue: 3.4.21 + vue: 3.4.27 - '@vue/shared@3.4.21': - resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} - - '@webassemblyjs/ast@1.11.6': - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@vue/shared@3.4.27': + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -4873,9 +4433,6 @@ packages: '@webassemblyjs/helper-api-error@1.11.6': resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - '@webassemblyjs/helper-buffer@1.11.6': - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - '@webassemblyjs/helper-buffer@1.12.1': resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} @@ -4885,9 +4442,6 @@ packages: '@webassemblyjs/helper-wasm-bytecode@1.11.6': resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - '@webassemblyjs/helper-wasm-section@1.11.6': - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - '@webassemblyjs/helper-wasm-section@1.12.1': resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} @@ -4900,33 +4454,18 @@ packages: '@webassemblyjs/utf8@1.11.6': resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - '@webassemblyjs/wasm-edit@1.11.6': - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - '@webassemblyjs/wasm-edit@1.12.1': resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - '@webassemblyjs/wasm-gen@1.11.6': - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - '@webassemblyjs/wasm-gen@1.12.1': resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - '@webassemblyjs/wasm-opt@1.11.6': - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - '@webassemblyjs/wasm-opt@1.12.1': resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - '@webassemblyjs/wasm-parser@1.11.6': - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - '@webassemblyjs/wasm-parser@1.12.1': resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - '@webassemblyjs/wast-printer@1.11.6': - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - '@webassemblyjs/wast-printer@1.12.1': resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} @@ -5027,8 +4566,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} agentkeepalive@4.5.0: @@ -5081,6 +4620,9 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.14.0: + resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + alce@1.2.0: resolution: {integrity: sha512-XppPf2S42nO2WhvKzlwzlfcApcXHzjlod30pKmcWjRgLOtqoe5DMuqdiYoM6AgyXksc6A6pV4v1L/WW217e57w==} engines: {node: '>=0.8.0'} @@ -5098,10 +4640,6 @@ packages: engines: {'0': node >= 0.8.0} hasBin: true - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -5110,10 +4648,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -5164,8 +4698,8 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argon2@0.40.1: - resolution: {integrity: sha512-DjtHDwd7pm12qeWyfihHoM8Bn5vGcgH6sKwgPqwNYroRmxlrzadHEvMyuvQxN/V8YSyRRKD5x6ito09q1e9OyA==} + argon2@0.40.3: + resolution: {integrity: sha512-FrSmz4VeM91jwFvvjsQv9GYp6o/kARWoYKjbjDB2U5io1H3e5X67PYGclFDeQff6UXIhUd4aHR3mxCdBbMMuQw==} engines: {node: '>=16.17.0'} argparse@1.0.10: @@ -5174,10 +4708,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} - aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} @@ -5195,8 +4725,8 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-timsort@1.0.3: @@ -5206,12 +4736,12 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: @@ -5222,6 +4752,9 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.tosorted@1.1.3: resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} @@ -5229,15 +4762,11 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} assert-never@1.2.1: resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} @@ -5249,15 +4778,7 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - ast-types@0.14.2: - resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} - engines: {node: '>=4'} - - ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} @@ -5273,9 +4794,6 @@ packages: async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -5295,16 +4813,23 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.6: - resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} - axios@1.3.4: - resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==} + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} @@ -5312,6 +4837,9 @@ packages: axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-core@7.0.0-bridge.0: resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: @@ -5331,27 +4859,21 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} - babel-plugin-named-exports-order@0.0.2: - resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} - - babel-plugin-polyfill-corejs2@0.4.8: - resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.9.0: - resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.5.5: - resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-react-docgen@4.2.1: - resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} - babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} @@ -5362,6 +4884,21 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.3.1: + resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} + + bare-fs@2.3.0: + resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} + + bare-os@2.3.0: + resolution: {integrity: sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@1.0.0: + resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} + base64-arraybuffer@1.0.2: resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} engines: {node: '>= 0.6.0'} @@ -5403,26 +4940,19 @@ packages: resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} engines: {node: '>=12'} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -5443,8 +4973,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brorand@1.1.0: @@ -5465,9 +4995,9 @@ packages: browserify-rsa@4.1.0: resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - browserify-sign@4.2.2: - resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} - engines: {node: '>= 4'} + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} @@ -5521,11 +5051,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} - hasBin: true - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -5556,28 +5081,17 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001587: - resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} - - caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} canvg@3.0.10: resolution: {integrity: sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==} engines: {node: '>=10.0.0'} - case-anything@2.1.13: - resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} - engines: {node: '>=12.13'} - case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -5586,10 +5100,6 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5643,8 +5153,8 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} ci-info@3.8.0: @@ -5661,6 +5171,9 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -5686,10 +5199,6 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-spinner@0.2.10: - resolution: {integrity: sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==} - engines: {node: '>=0.10'} - cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -5698,6 +5207,10 @@ packages: resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} engines: {node: 10.* || >= 12.*} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -5716,9 +5229,6 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -5742,6 +5252,10 @@ packages: resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} engines: {node: '>=6'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -5758,6 +5272,16 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -5787,10 +5311,6 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -5824,15 +5344,13 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true - condense-newlines@0.2.1: resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} engines: {node: '>=0.10.0'} + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -5884,22 +5402,18 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - core-js-compat@3.36.0: - resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - core-js-pure@3.36.0: - resolution: {integrity: sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==} + core-js-pure@3.37.1: + resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} - core-js@3.37.0: - resolution: {integrity: sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==} + core-js@3.37.1: + resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -5969,8 +5483,8 @@ packages: css-line-break@2.1.0: resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} - css-loader@6.10.0: - resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} engines: {node: '>= 12.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -6064,9 +5578,6 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dash-get@1.0.2: - resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} - data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} @@ -6075,6 +5586,18 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -6111,9 +5634,14 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -6199,8 +5727,8 @@ packages: des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -6210,6 +5738,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -6224,8 +5756,9 @@ packages: resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} engines: {node: '>=12'} - detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} hasBin: true didyoumean@1.2.2: @@ -6310,8 +5843,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@2.5.3: - resolution: {integrity: sha512-09uyBM2URzOfXMUAqGRnm9R9IUeSkzO9PktXc2eVQIsBmmJUqRmfL1xW2QPBxVJEtlEVs5d8ndrsIQsyAqs81g==} + dompurify@2.5.5: + resolution: {integrity: sha512-FgbqnEPiv5Vdtwt6Mxl7XSylttCC03cqP5ldNT2z+Kj0nLxPHJH4+1Cyf5Jasxhw93Rl4Oo11qRoUV72fmya2Q==} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -6330,12 +5863,8 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.4.1: - resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} - engines: {node: '>=12'} - - dotenv@16.4.4: - resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} duplexify@3.7.1: @@ -6358,16 +5887,16 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.4.672: - resolution: {integrity: sha512-YYCy+goe3UqZqa3MOQCI5Mx/6HdBLzXL/mkbGCEWL3sP3Z1BP9zqAzeD3YEmLZlespYGFtyM8tRp5i2vfaUGCA==} + electron-to-chromium@1.4.787: + resolution: {integrity: sha512-d0EFmtLPjctczO3LogReyM2pbBiiZbnsKnGF+cdZhsYzHm/A0GV7W94kqzLD8SN4O3f3iHlgLUChqghgyznvCQ==} - elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6390,6 +5919,10 @@ packages: resolution: {integrity: sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==} engines: {node: '>=8.10.0'} + encoding-japanese@2.1.0: + resolution: {integrity: sha512-58XySVxUgVlBikBTbQ8WdDxBDHIdXucB16LO5PBHR8t75D54wQrNo4cg+58+R1CtJfKnsVsvt9XlteRaR8xw1w==} + engines: {node: '>=8.10.0'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -6407,21 +5940,13 @@ packages: resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -6430,8 +5955,8 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - envinfo@7.11.1: - resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} + envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} engines: {node: '>=4'} hasBin: true @@ -6441,13 +5966,10 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.22.4: - resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -6459,18 +5981,19 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} - es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} - es-module-lexer@1.4.2: - resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: @@ -6498,11 +6021,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -6544,18 +6062,6 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-custom@0.0.0: - resolution: {integrity: sha512-kwCw78yisbgKdJBJ5qooPmpBYDphDfM2oxSROmtfOwBXBwXuRiSV3suO01W3mVLEFpmQZxMWd/qajKpJhkKSug==} - - eslint-config-next@12.3.4: - resolution: {integrity: sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - eslint-config-next@13.2.4: resolution: {integrity: sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==} peerDependencies: @@ -6565,21 +6071,6 @@ packages: typescript: optional: true - eslint-config-next@13.5.6: - resolution: {integrity: sha512-o8pQsUHTo9aHqJ2YiZDym5gQAMRf7O2HndHo/JZeY7TDD+W4hk6Ma8Vw54RHiBeb7OWWO5dPirQB+Is/aVQ7Kg==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-config-prettier@9.0.0: resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true @@ -6591,21 +6082,9 @@ packages: peerDependencies: eslint: '>6.6.0' - eslint-config-turbo@1.12.4: - resolution: {integrity: sha512-5hqEaV6PNmAYLL4RTmq74OcCt8pgzOLnfDVPG/7PUXpQ0Mpz0gr926oCSFukywKKXjdum3VHD84S7Z9A/DqTAw==} - peerDependencies: - eslint: '>6.6.0' - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@2.7.1: - resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} - engines: {node: '>=4'} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-import-resolver-typescript@3.6.1: resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6613,8 +6092,8 @@ packages: eslint: '*' eslint-plugin-import: '*' - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6650,20 +6129,14 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.28.0: - resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-react@7.33.2: - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + eslint-plugin-react@7.34.2: + resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -6673,11 +6146,6 @@ packages: peerDependencies: eslint: '>6.6.0' - eslint-plugin-turbo@1.12.4: - resolution: {integrity: sha512-3AGmXvH7E4i/XTWqBrcgu+G7YKZJV/8FrEn79kTd50ilNsv+U3nS2IlcCrQB6Xm2m9avGD9cadLzKDR1/UF2+g==} - peerDependencies: - eslint: '>6.6.0' - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -6700,6 +6168,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6734,10 +6206,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-to-babel@3.2.1: - resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} - engines: {node: '>=8.3.0'} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -6797,14 +6265,14 @@ packages: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + express-session@1.18.0: resolution: {integrity: sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==} engines: {node: '>= 0.8.0'} - express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} @@ -6835,8 +6303,8 @@ packages: resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} hasBin: true - fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -6845,6 +6313,9 @@ packages: resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} engines: {node: '>=6.0.0'} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -6858,8 +6329,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} fast-safe-stringify@2.1.1: @@ -6917,8 +6388,8 @@ packages: resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} engines: {node: '>=12.20'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} filter-obj@2.0.2: @@ -6973,15 +6444,15 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - flow-parser@0.229.0: - resolution: {integrity: sha512-mOYmMuvJwAo/CvnMFEq4SHftq7E5188hYMTTxJyQOXk2nh+sgslRdYMw3wTthH+FMcFaZLtmBPuMu6IwztdoUQ==} + flow-parser@0.237.1: + resolution: {integrity: sha512-PUeG8GQLmrv49vEcFcag7mriJvVs7Yyegnv1DGskvcokhP8UyqWsLV0KoTQ1iAW3ePVUIGUc3MFfBaXwz9MmIg==} engines: {node: '>=0.4.0'} - follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6992,10 +6463,6 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -7035,14 +6502,19 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@10.0.1: - resolution: {integrity: sha512-/N7gBA9gH8PkStyNQ67P/lx8UhL/7Y8z9Ku7FfgOF77sSG8wu8781kX7I5ZUgflRRtQXo8qH4Rev23004G1zcQ==} + framer-motion@10.17.4: + resolution: {integrity: sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - framer-motion@10.17.4: - resolution: {integrity: sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==} + framer-motion@10.18.0: + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -7078,8 +6550,8 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -7150,13 +6622,19 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - giget@1.2.1: - resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==} + getopts@2.3.0: + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-slugger@1.5.0: resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} @@ -7181,15 +6659,23 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} @@ -7207,8 +6693,8 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: @@ -7240,14 +6726,6 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -7266,8 +6744,8 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} has-symbols@1.0.3: @@ -7278,6 +6756,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -7289,8 +6771,8 @@ packages: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} - hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} hast-util-whitespace@2.0.1: @@ -7317,11 +6799,8 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - html-entities@2.4.0: - resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} @@ -7470,6 +6949,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -7504,11 +6984,15 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + ip@2.0.1: + resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -7529,6 +7013,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -7558,6 +7045,10 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -7577,10 +7068,6 @@ packages: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -7608,15 +7095,16 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} is-number-object@1.0.7: @@ -7664,11 +7152,13 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -7702,14 +7192,16 @@ packages: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} is-whitespace@0.3.0: resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} @@ -7744,14 +7236,6 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - iterare@1.2.1: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} @@ -7763,8 +7247,12 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} - jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + jackspeak@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + engines: {node: '>=14'} + + jake@10.9.1: + resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} engines: {node: '>=10'} hasBin: true @@ -7813,8 +7301,8 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - joi@17.12.2: - resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} + joi@17.13.1: + resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -7838,6 +7326,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -7846,11 +7337,14 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jscodeshift@0.14.0: - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + jscodeshift@0.15.2: + resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.1.6 + peerDependenciesMeta: + '@babel/preset-env': + optional: true jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} @@ -7960,8 +7454,36 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + knex@3.1.0: + resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + better-sqlite3: '*' + mysql: '*' + mysql2: '*' + pg: '*' + pg-native: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} @@ -7989,33 +7511,35 @@ packages: libbase64@1.2.1: resolution: {integrity: sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==} + libbase64@1.3.0: + resolution: {integrity: sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==} + libmime@5.2.0: resolution: {integrity: sha512-X2U5Wx0YmK0rXFbk67ASMeqYIkZ6E5vY7pNWRKtnNzqjvdYYG8xtPDpCnuUEnPU9vlgNev+JoSrcaKSUaNvfsw==} - libmime@5.2.1: - resolution: {integrity: sha512-A0z9O4+5q+ZTj7QwNe/Juy1KARNb4WaviO4mYeFC4b8dBT2EEqK2pkM+GC8MVnkOjqhl5nYQxRgnPYRRTNmuSQ==} + libmime@5.3.5: + resolution: {integrity: sha512-nSlR1yRZ43L3cZCiWEw7ali3jY29Hz9CQQ96Oy+sSspYnIP5N54ucOPHqooBsXzwrX1pwn13VUE05q4WmzfaLg==} - libphonenumber-js@1.10.56: - resolution: {integrity: sha512-d0GdKshNnyfl5gM7kZ9rXjGiAbxT/zCXp0k+EAzh8H4zrb2R7GXtMCrULrX7UQxtfx6CLy/vz/lomvW79FAFdA==} + libphonenumber-js@1.11.2: + resolution: {integrity: sha512-V9mGLlaXN1WETzqQvSu6qf6XVAr3nFuJvWsHcuzCCCo6xUKawwSxOPTpan5CGOSKTn5w/bQuCZcLPJkyysgC3w==} libqp@2.0.1: resolution: {integrity: sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==} + libqp@2.1.0: + resolution: {integrity: sha512-O6O6/fsG5jiUVbvdgT7YX3xY3uIadR6wEZ7+vy9u7PKHAlSEB6blvC1o5pHBjgsi95Uo0aiBBdkyFecj6jtb7A==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.0: - resolution: {integrity: sha512-p3cz0JV5vw/XeouBU3Ldnp+ZkBjE+n8ydJ4mcwBrOiXXPqNlrzGBqWs9X4MWF7f+iKUBu794Y8Hh8yawiJbCjw==} + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} engines: {node: '>=14'} - deprecated: This version contains a security issue. Please upgrade to 3.1.1 or later. lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@4.0.1: - resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} - linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -8030,8 +7554,8 @@ packages: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} - loader-utils@3.2.1: - resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + loader-utils@3.2.2: + resolution: {integrity: sha512-vjJi4vQDasD8t0kMpxe+9URAcgbSuASqoj/Wuk3MawTk97LYa2KfdHreAkd1G/pmPLMvzZEw7/OsydADNemerQ==} engines: {node: '>= 12.13.0'} local-pkg@0.5.0: @@ -8132,8 +7656,8 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} lru-cache@4.1.5: @@ -8142,10 +7666,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - lucide-react@0.244.0: resolution: {integrity: sha512-PeDVbx5PlIRrVvdxiuSxPfBo7sK5qrL3LbvvRoGVNiHYRAkBm/48lKqoioxcmp0bgsyJs9lMw7CdtGFvnMJbVg==} peerDependencies: @@ -8155,16 +7675,15 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} - magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} - - mailparser@3.6.7: - resolution: {integrity: sha512-/3x8HW70DNehw+3vdOPKdlLuxOHoWcGB5jfx5vJ5XUbY9/2jUJbrrhda5Si8Dj/3w08U0y5uGAkqs5+SPTPKoA==} + mailparser@3.7.1: + resolution: {integrity: sha512-RCnBhy5q8XtB3mXzxcAfT1huNqN93HTYYyL6XawlIKycfxM/rXPg9tXoZ7D46+SgCS1zxKzw+BayDQSvncSTTw==} mailsplit@5.4.0: resolution: {integrity: sha512-wnYxX5D5qymGIPYLwnp6h8n1+6P6vz/MJn5AzGjZ8pwICWssL+CCQjWBIToOVHASmATot4ktvlLo6CyLfOXWYA==} @@ -8177,40 +7696,24 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} markdown-it-task-lists@2.1.1: resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} - markdown-it@13.0.2: - resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} - hasBin: true - - markdown-it@14.0.0: - resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - markdown-to-jsx@7.4.1: - resolution: {integrity: sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==} + markdown-to-jsx@7.4.7: + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -8250,9 +7753,6 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -8270,10 +7770,6 @@ packages: mensch@0.3.4: resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} - meow@7.1.1: - resolution: {integrity: sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==} - engines: {node: '>=10'} - merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -8351,8 +7847,8 @@ packages: micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} miller-rabin@4.0.1: @@ -8418,14 +7914,10 @@ packages: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -8441,8 +7933,8 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} minizlib@2.1.2: @@ -8560,8 +8052,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.5.0: - resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -8570,9 +8062,6 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.1: - resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -8608,6 +8097,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -8618,12 +8110,12 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nestjs-pino@4.0.0: - resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} + nestjs-pino@4.1.0: + resolution: {integrity: sha512-I6zcddauD2TNMRbsraEIxNUvHcz0El5QRUYH5eY1+pBzj7R17U+Yoyypoc+akVdSLWJ1r0kDYAZPy2mlhXv6vw==} engines: {node: '>= 14'} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 new-github-issue-url@0.2.1: resolution: {integrity: sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==} @@ -8658,8 +8150,8 @@ packages: sass: optional: true - next@14.1.0: - resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} + next@14.1.4: + resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -8704,15 +8196,22 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.63.0: + resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} + engines: {node: '>=10'} + node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - node-addon-api@7.1.0: - resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} - engines: {node: ^16 || ^18 || >= 20} + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@8.0.0: + resolution: {integrity: sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==} + engines: {node: ^18 || ^20 || >= 21} node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} @@ -8725,8 +8224,8 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch-native@1.6.2: - resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} node-fetch@2.6.11: resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} @@ -8755,8 +8254,8 @@ packages: encoding: optional: true - node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true node-int64@0.4.0: @@ -8771,16 +8270,12 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - nodemailer@6.9.10: - resolution: {integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==} - engines: {node: '>=6.0.0'} - - nodemailer@6.9.9: - resolution: {integrity: sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==} + nodemailer@6.9.13: + resolution: {integrity: sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==} engines: {node: '>=6.0.0'} - nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true @@ -8825,8 +8320,8 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} nprogress@0.2.0: @@ -8835,11 +8330,11 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + nwsapi@2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - nypm@0.3.6: - resolution: {integrity: sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==} + nypm@0.3.8: + resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -8857,8 +8352,8 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -8869,30 +8364,24 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} - - object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} - - object.omit@3.0.0: - resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} - engines: {node: '>=0.10.0'} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} objectorarray@1.0.5: @@ -8932,12 +8421,12 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openai@4.33.0: - resolution: {integrity: sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg==} + openai@4.47.2: + resolution: {integrity: sha512-E3Wq9mYdDSLajmcJm9RO/lCegTKrQ7ilAkMbhob4UgGhTjHwIHI+mXNDNPl5+sGIUp2iVUkpoi772FjYa7JlqA==} hasBin: true - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.4.1: @@ -9046,8 +8535,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -9129,9 +8619,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -9178,8 +8668,45 @@ packages: periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.11.5: + resolution: {integrity: sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -9197,8 +8724,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} pino-http@9.0.0: resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} @@ -9210,16 +8737,16 @@ packages: pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - pino@8.18.0: - resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} + pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} hasBin: true pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - piscina@4.4.0: - resolution: {integrity: sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==} + piscina@4.5.1: + resolution: {integrity: sha512-DVhySLPfqAW+uRH9dF0bjA2xEWr5ANLAzkYXx5adSLMFnwssSIVJYhg0FlvgYsnT/khILQJ3WkjqbAlBvt+maw==} pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} @@ -9237,8 +8764,8 @@ packages: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} @@ -9256,6 +8783,10 @@ packages: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -9287,20 +8818,20 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 - postcss-modules-extract-imports@3.0.0: - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 - postcss-modules-local-by-default@4.0.4: - resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 - postcss-modules-scope@3.1.1: - resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -9317,12 +8848,8 @@ packages: peerDependencies: postcss: ^8.2.14 - postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} - engines: {node: '>=4'} - - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + postcss-selector-parser@6.1.0: + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -9332,27 +8859,40 @@ packages: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.26: - resolution: {integrity: sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.131.4: - resolution: {integrity: sha512-pKa1p6Q9jRU6s+xSluqGifODMncWTXRaeQw7yVet5U+0U56P0srdMO8NpzllIgDjYL9WLgUjDInucOBw5Cl/tA==} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + posthog-js@1.136.2: + resolution: {integrity: sha512-9oTUB/JDayzV+hB4f7u+ZNUbfnkGHLxyZw+FOE59pCgmbWHcJxhpGbu2Xlyv027/iHIjQbn1mtm2wJmBI2BuqA==} - preact@10.21.0: - resolution: {integrity: sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==} + preact@10.22.0: + resolution: {integrity: sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9363,11 +8903,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} @@ -9400,8 +8935,8 @@ packages: resolution: {integrity: sha512-b5CqA9cCY5jmNJGjx8oUbPw3KSgVd+mu8711MSZIRY9dIF0Vlcs/Au6LR3S5guncydM7Zkh8iz8vC+c2CDj3Xw==} hasBin: true - prisma@5.10.2: - resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} + prisma@5.14.0: + resolution: {integrity: sha512-gCNZco7y5XtjrnQYeDJTiVZmT/ncqCr5RY1/Cf8X2wgLRmyh9ayPAGBNziI4qEE4S6SxCH5omQLVo9lmURaJ/Q==} engines: {node: '>=16.13'} hasBin: true @@ -9436,8 +8971,8 @@ packages: property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} prosemirror-changeset@2.2.1: resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} @@ -9454,8 +8989,8 @@ packages: prosemirror-gapcursor@1.3.2: resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} - prosemirror-history@1.3.2: - resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + prosemirror-history@1.4.0: + resolution: {integrity: sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==} prosemirror-inputrules@1.4.0: resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} @@ -9463,14 +8998,14 @@ packages: prosemirror-keymap@1.2.2: resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} - prosemirror-markdown@1.12.0: - resolution: {integrity: sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==} + prosemirror-markdown@1.13.0: + resolution: {integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==} prosemirror-menu@1.2.4: resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} - prosemirror-model@1.19.4: - resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + prosemirror-model@1.21.0: + resolution: {integrity: sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==} prosemirror-schema-basic@1.2.2: resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==} @@ -9481,21 +9016,21 @@ packages: prosemirror-state@1.4.3: resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} - prosemirror-tables@1.3.5: - resolution: {integrity: sha512-JSZ2cCNlApu/ObAhdPyotrjBe2cimniniTpz60YXzbL0kZ+47nEYk2LWbfKU2lKpBkUNquta2PjteoNi4YCluQ==} + prosemirror-tables@1.3.7: + resolution: {integrity: sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA==} - prosemirror-trailing-node@2.0.7: - resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==} + prosemirror-trailing-node@2.0.8: + resolution: {integrity: sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA==} peerDependencies: prosemirror-model: ^1.19.0 prosemirror-state: ^1.4.2 prosemirror-view: ^1.31.2 - prosemirror-transform@1.8.0: - resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + prosemirror-transform@1.9.0: + resolution: {integrity: sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==} - prosemirror-view@1.33.1: - resolution: {integrity: sha512-62qkYgSJIkwIMMCpuGuPzc52DiK1Iod6TWoIMxP4ja6BTD4yO8kCUL64PZ/WhH/dJ9fW0CDO39FhH1EMyhUFEg==} + prosemirror-view@1.33.7: + resolution: {integrity: sha512-jo6eMQCtPRwcrA2jISBCnm0Dd2B+szS08BU1Ay+XGiozHo5EZMHfLQE8R5nO4vb1spTH2RW1woZIYXRiQsuP8g==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -9519,11 +9054,11 @@ packages: pug-attrs@3.0.0: resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} - pug-code-gen@3.0.2: - resolution: {integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==} + pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} - pug-error@2.0.0: - resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==} + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} pug-filters@4.0.0: resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} @@ -9549,8 +9084,8 @@ packages: pug-walk@2.0.0: resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} - pug@3.0.2: - resolution: {integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==} + pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} @@ -9585,8 +9120,8 @@ packages: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} engines: {node: '>=0.6'} querystring-es3@0.2.1: @@ -9599,16 +9134,15 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -9633,10 +9167,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -9657,10 +9187,10 @@ packages: peerDependencies: react: ^16.3.0 || ^17.0.1 || ^18.0.0 - react-day-picker@8.9.1: - resolution: {integrity: sha512-W0SPApKIsYq+XCtfGeMYDoU0KbsG3wfkYtlw8l+vZp6KoBXGOlhzBUp4tNx1XiwiOZwhfdGOlj7NGSCKGSlg5Q==} + react-day-picker@8.10.1: + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} peerDependencies: - date-fns: ^2.28.0 + date-fns: ^2.28.0 || ^3.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-docgen-typescript@2.2.2: @@ -9668,43 +9198,42 @@ packages: peerDependencies: typescript: '>= 4.3.x' - react-docgen@5.4.3: - resolution: {integrity: sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==} - engines: {node: '>=8.10.0'} - hasBin: true + react-docgen@7.0.3: + resolution: {integrity: sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==} + engines: {node: '>=16.14.0'} react-dom@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: react: ^18.2.0 + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + react-element-to-jsx-string@15.0.0: resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} peerDependencies: react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-email@2.1.0: - resolution: {integrity: sha512-fTt85ca1phsBu57iy32wn4LTR37rOzDZoY2AOWVq3JQYVwk6GlBdUuQWif2cudkwWINL9COf9kRMS4/QWtKtAQ==} + react-email@2.1.4: + resolution: {integrity: sha512-YKZ4jhkalWcNyaw4qyI//+QeTeUxe/ptqI+wSc4wVIoHzqffAWoV5x/jBpFex3FQ636xVIDFrvGq39rUVL7zSQ==} engines: {node: '>=18.0.0'} hasBin: true - react-hook-form@7.43.4: - resolution: {integrity: sha512-JZp05wvmuV8qr3NNDWwyhiQL05sh9E8x/2NoWtkdiyyiezmwOr5pKexlvbCEfBMa7ZYrvzk88G/uhLl47T9b7Q==} + react-hook-form@7.51.5: + resolution: {integrity: sha512-J2ILT5gWx1XUIJRETiA7M19iXHlG74+6O3KApzvqB/w8S5NQR7AbU8HVZrMALdmDgWpRPYiZJl0zx8Z4L2mP6Q==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 - react-icons@4.8.0: - resolution: {integrity: sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==} + react-icons@4.12.0: + resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} peerDependencies: react: '*' - react-inspector@6.0.2: - resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -9714,8 +9243,8 @@ packages: react-is@18.1.0: resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} react-markdown@8.0.7: resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} @@ -9723,22 +9252,17 @@ packages: '@types/react': '>=16' react: '>=16' - react-modern-drawer@1.2.2: - resolution: {integrity: sha512-SXUNjofHzeoEas0kdMWWafuF2+vwdtbQD1cpkHxo7oyFj3v+2l2CMeJjc/GodYsnxVhSiYj75xosMJXXed9ykQ==} - engines: {node: '>=10'} + react-modern-drawer@1.3.1: + resolution: {integrity: sha512-bT4KLgrnu98dL9NUpiHbg6dpp4zRH7M+VlS1zK6zCFgn6OLxjGEBRTf2ZYfVcibLGTkoRJxfD5l7zTqWtDLp+w==} peerDependencies: react: '>16.0.0' - react-refresh@0.11.0: - resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} - engines: {node: '>=0.10.0'} - - react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.4: - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9757,8 +9281,8 @@ packages: '@types/react': optional: true - react-smooth@4.0.0: - resolution: {integrity: sha512-2NMXOBY1uVUQx1jBeENGA497HK20y6CPGYL1ZnJLeoQ8rrc3UfmOM82sRxtzpcoCkUMy4CS0RGylfuVhuFjBgg==} + react-smooth@4.0.1: + resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9795,6 +9319,10 @@ packages: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -9832,19 +9360,15 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} - - recast@0.23.4: - resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} + recast@0.23.8: + resolution: {integrity: sha512-D8izEmRtY34O+B5k2kgNmPx4b/be4MGPGFiNzWUGtezDCWDyj/1w1uQQvzySRzAO/b+6TD05FwGPuYR4X52sVw==} engines: {node: '>= 4'} recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} - recharts@2.12.2: - resolution: {integrity: sha512-9bpxjXSF5g81YsKkTSlaX7mM4b6oYI1mIYck6YkUcWuL3tomADccI51/6thY4LmvhYuRTwpfrOvE80Zc3oBRfQ==} + recharts@2.12.7: + resolution: {integrity: sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==} engines: {node: '>=14'} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 @@ -9854,15 +9378,15 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} - reflect-metadata@0.2.1: - resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} regenerate-unicode-properties@10.1.1: @@ -9988,14 +9512,17 @@ packages: rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@4.4.1: @@ -10003,21 +9530,16 @@ packages: engines: {node: '>=14'} hasBin: true - rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} + rimraf@5.0.7: + resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} + engines: {node: '>=14.18'} hasBin: true ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -10049,13 +9571,10 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} - safe-buffer@5.1.1: - resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -10092,15 +9611,15 @@ packages: sass-embedded: optional: true - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -10135,8 +9654,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true @@ -10147,20 +9666,16 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - seroval-plugins@1.0.5: - resolution: {integrity: sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ==} + seroval-plugins@1.0.7: + resolution: {integrity: sha512-GO7TkWvodGp6buMEX9p7tNyIkbwlyuAWbI6G9Ec5bhcm7mQdu3JOK1IXbEUwb3FVzSc363GraG/wLW23NSavIw==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.0.5: - resolution: {integrity: sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA==} + seroval@1.0.7: + resolution: {integrity: sha512-n6ZMQX5q0Vn19Zq7CIKNIo7E75gPkGCFUEqDpa8jgwpYr/vScjqnQ6H09t1uIiZ0ZSK0ypEGvrYK2bhBGWsGdw==} engines: {node: '>=10'} - serve-favicon@2.5.0: - resolution: {integrity: sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==} - engines: {node: '>= 0.8.0'} - serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -10171,12 +9686,12 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} setimmediate@1.0.5: @@ -10193,6 +9708,10 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -10209,16 +9728,13 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} hasBin: true - side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -10231,9 +9747,14 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -10264,8 +9785,8 @@ packages: resolution: {integrity: sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==} engines: {node: '>=10.2.0'} - solid-js@1.8.16: - resolution: {integrity: sha512-rja94MNU9flF3qQRLNsu60QHKBDKBkVE1DldJZPIfn2ypIn3NV2WpSbGTQIvsyGPBo+9E2IMjwqnqpbgfWuzeg==} + solid-js@1.8.17: + resolution: {integrity: sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==} solid-swr-store@0.10.7: resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==} @@ -10274,8 +9795,8 @@ packages: solid-js: ^1.2 swr-store: ^0.10 - sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} sonner@0.6.2: resolution: {integrity: sha512-bh4FWhYoNN481ZIW94W4e0kSLBTMGislYg2YXvDS1px1AJJz4erQe9jHV8s5pS1VMVDgfh3CslNSFLaU6Ldrnw==} @@ -10328,9 +9849,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -10340,8 +9858,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} @@ -10384,11 +9902,11 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} - store2@2.14.2: - resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} + store2@2.14.3: + resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} - storybook@7.4.0: - resolution: {integrity: sha512-jSwbyxHlr2dTY51Pv0mzenjrMDJNZH7DQhHu4ZezpjV+QK/rLCnD+Gt/7iDSaNlsmZJejQcmURDoEybWggMOqw==} + storybook@7.6.19: + resolution: {integrity: sha512-xWD1C4vD/4KMffCrBBrUpsLUO/9uNpm8BVW8+Vcb30gkQDfficZ0oziWkmLexpT53VSioa24iazGXMwBqllYjQ==} hasBin: true stream-browserify@3.0.0: @@ -10404,6 +9922,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + streamx@2.18.0: + resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -10412,18 +9933,20 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -10431,10 +9954,6 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -10463,6 +9982,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -10471,15 +9994,15 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} strip-outer@2.0.0: resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - stripe@14.18.0: - resolution: {integrity: sha512-yLqKPqYgGJbMxrQiE4+i2i00ZVA2NRIZbZ1rejzj5XR3F3Uc+1iy9QE133knZudhVGMw367b8vTpB8D9pYMETw==} + stripe@14.25.0: + resolution: {integrity: sha512-wQS3GNMofCXwH8TSje8E1SE8zr6ODiGtHQgPtO95p9Mb4FhKC9jvXR2NUTpZ9ZINlckJcFidCmaTFV4P6vsb9g==} engines: {node: '>=12.*'} strnum@1.0.5: @@ -10516,10 +10039,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -10540,8 +10059,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte@4.2.12: - resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} + svelte@4.2.17: + resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} engines: {node: '>=16'} svg-pathdata@6.0.3: @@ -10584,27 +10103,24 @@ packages: synchronous-promise@2.0.17: resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - tailwind-merge@1.13.2: - resolution: {integrity: sha512-R2/nULkdg1VR/EL4RXg4dEohdoxNUJGLMnWIQnPKL+O9Twu7Cn3Rxi4dlXkDzZrEGtR+G+psSXFouWlpTyLhCQ==} - tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} - tailwindcss-animate@1.0.6: - resolution: {integrity: sha512-4WigSGMvbl3gCCact62ZvOngA+PRqhAn7si3TQ3/ZuPuQZcIEtVap+ENSXbzWhpojKB8CpvnIsrwBu8/RnHtuw==} + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.3.3: - resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + tailwindcss@3.4.0: + resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@3.4.0: - resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} engines: {node: '>=14.0.0'} hasBin: true @@ -10615,14 +10131,24 @@ packages: tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} @@ -10666,8 +10192,8 @@ packages: uglify-js: optional: true - terser@5.27.1: - resolution: {integrity: sha512-29wAr6UU/oQpnTw5HoadwjUZnFQXGdOfj0LjZ4sVxzqwHh/QVkvr7m8y9WoR4iN3FRitVduTc6KdjcW38Npsug==} + terser@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} engines: {node: '>=10'} hasBin: true @@ -10675,6 +10201,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.1.0: + resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + text-segmentation@1.0.3: resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} @@ -10688,12 +10217,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} - - throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -10701,6 +10226,10 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + timers-browserify@2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} @@ -10708,14 +10237,14 @@ packages: tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} tinyspy@2.2.1: @@ -10725,13 +10254,13 @@ packages: tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - tiptap-markdown@0.8.9: - resolution: {integrity: sha512-TykSDcsb94VFCzPbSSTfB6Kh2HJi7x4B9J3Jm9uSOAMPy8App1YfrLW/rEJLajTxwMVhWBdOo4nidComSlLQsQ==} + tiptap-markdown@0.8.10: + resolution: {integrity: sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ==} peerDependencies: '@tiptap/core': ^2.0.3 - tlds@1.248.0: - resolution: {integrity: sha512-noj0KdpWTBhwsKxMOXk0rN9otg4kTgLm4WohERRHbJ9IY+kSDKr3RmjitaQ3JFzny+DyvBOQKlFZhp0G0qNSfg==} + tlds@1.252.0: + resolution: {integrity: sha512-GA16+8HXvqtfEnw/DTcwB0UU354QE1n3+wh08oFjr6Znl7ZLAeUgYzCcK+/CCrOyE0vnHR8/pu3XXG3vDijXpQ==} hasBin: true tmp@0.0.33: @@ -10753,8 +10282,8 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tocbot@4.25.0: - resolution: {integrity: sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==} + tocbot@4.28.2: + resolution: {integrity: sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==} toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} @@ -10770,8 +10299,8 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} tr46@0.0.3: @@ -10785,11 +10314,6 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} - tree-cli@0.6.7: - resolution: {integrity: sha512-jfnB5YKY6Glf6bsFmQ9W97TtkPVLnHsjOR6ZdRf4zhyFRQeLheasvzE5XBJI2Hxt7ZyMyIbXUV7E2YPZbixgtA==} - engines: {node: '>=8.10.9'} - hasBin: true - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -10797,10 +10321,6 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - trim-repeated@2.0.0: resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} engines: {node: '>=12'} @@ -10867,6 +10387,9 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + turbo-darwin-64@1.13.3: resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==} cpu: [x64] @@ -10912,10 +10435,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -10948,20 +10467,21 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.1: - resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -10981,14 +10501,16 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true - uc.micro@2.0.0: - resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==} + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -11078,15 +10600,16 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@1.7.1: - resolution: {integrity: sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==} + unplugin@1.10.1: + resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + engines: {node: '>=14.0.0'} untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -11103,8 +10626,8 @@ packages: url@0.11.3: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} - use-callback-ref@1.3.1: - resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11135,8 +10658,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11161,10 +10684,6 @@ packages: deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true @@ -11181,10 +10700,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - valid-data-url@3.0.1: resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} engines: {node: '>=10'} @@ -11192,8 +10707,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} vary@1.1.2: @@ -11206,44 +10721,16 @@ packages: vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - victory-vendor@36.9.1: - resolution: {integrity: sha512-+pZIP+U3pEJdDCeFmsXwHzV7vNHQC/eIbHklfe2ZCZqayYRH7lQbHcVgsJ0XOOv27hWs4jH4MONgXxHMObTMSA==} - - vite-node@1.2.0: - resolution: {integrity: sha512-ETnQTHeAbbOxl7/pyBck9oAPZZZo+kYnFt1uQDD+hPReOc+wCjXw4r4jHriBRuVDB5isHmPXxrfc1yJnfBERqg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} - vite@5.1.3: - resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@5.2.6: - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + vite@5.2.12: + resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -11270,15 +10757,15 @@ packages: terser: optional: true - vitest@1.2.0: - resolution: {integrity: sha512-Ixs5m7BjqvLHXcibkzKRQUvD/XLw0E3rvqaCMlrm/0LMsA0309ZqYvTlPzkhh81VlEyVZXFlwWnkhb6/UMtcaQ==} + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -11302,8 +10789,8 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - vue@3.4.21: - resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + vue@3.4.27: + resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -11354,8 +10841,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-dev-middleware@6.1.1: - resolution: {integrity: sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==} + webpack-dev-middleware@6.1.3: + resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} engines: {node: '>= 14.15.0'} peerDependencies: webpack: ^5.0.0 @@ -11390,16 +10877,6 @@ packages: webpack-cli: optional: true - webpack@5.90.2: - resolution: {integrity: sha512-ziXu8ABGr0InCMEYFnHrYweinHK2PWrMqnwdHk2oK3rRhv/1B+2FnfwYv5oD+RrknK/Pp/Hmyvu+eAsaMYhzCw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webpack@5.91.0: resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} engines: {node: '>=10.13.0'} @@ -11444,14 +10921,15 @@ packages: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} which@1.3.1: @@ -11472,6 +10950,10 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -11520,8 +11002,8 @@ packages: utf-8-validate: optional: true - ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11603,18 +11085,15 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} + hasBin: true yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -11623,10 +11102,6 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -11646,34 +11121,32 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - yup@1.0.2: - resolution: {integrity: sha512-Lpi8nITFKjWtCoK3yQP8MUk78LJmHWqbFd0OOMXTar+yjejlQ4OIIoZgnTW1bnEUKDw6dZBcy3/IdXnt2KDUow==} + yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} - zod-to-json-schema@3.22.5: - resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} + zod-to-json-schema@3.23.0: + resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} peerDependencies: - zod: ^3.22.4 + zod: ^3.23.3 zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.2.1': + '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@angular-devkit/core@17.1.2(chokidar@3.6.0)': dependencies: @@ -11722,13 +11195,13 @@ snapshots: '@aws-crypto/crc32@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.521.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 '@aws-crypto/crc32c@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.521.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 '@aws-crypto/ie11-detection@3.0.0': @@ -11740,8 +11213,8 @@ snapshots: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-locate-window': 3.568.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -11751,15 +11224,15 @@ snapshots: '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-locate-window': 3.568.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/sha256-js@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.521.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 '@aws-crypto/supports-web-crypto@3.0.0': @@ -11768,1282 +11241,1278 @@ snapshots: '@aws-crypto/util@3.0.0': dependencies: - '@aws-sdk/types': 3.521.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - '@aws-sdk/client-s3@3.521.0': + '@aws-sdk/client-s3@3.587.0': dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/core': 3.521.0 - '@aws-sdk/credential-provider-node': 3.521.0 - '@aws-sdk/middleware-bucket-endpoint': 3.521.0 - '@aws-sdk/middleware-expect-continue': 3.521.0 - '@aws-sdk/middleware-flexible-checksums': 3.521.0 - '@aws-sdk/middleware-host-header': 3.521.0 - '@aws-sdk/middleware-location-constraint': 3.521.0 - '@aws-sdk/middleware-logger': 3.521.0 - '@aws-sdk/middleware-recursion-detection': 3.521.0 - '@aws-sdk/middleware-sdk-s3': 3.521.0 - '@aws-sdk/middleware-signing': 3.521.0 - '@aws-sdk/middleware-ssec': 3.521.0 - '@aws-sdk/middleware-user-agent': 3.521.0 - '@aws-sdk/region-config-resolver': 3.521.0 - '@aws-sdk/signature-v4-multi-region': 3.521.0 - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-endpoints': 3.521.0 - '@aws-sdk/util-user-agent-browser': 3.521.0 - '@aws-sdk/util-user-agent-node': 3.521.0 - '@aws-sdk/xml-builder': 3.521.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.0 - '@smithy/eventstream-serde-browser': 2.2.0 - '@smithy/eventstream-serde-config-resolver': 2.2.0 - '@smithy/eventstream-serde-node': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-blob-browser': 2.2.0 - '@smithy/hash-node': 2.2.0 - '@smithy/hash-stream-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/md5-js': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.0 - '@smithy/middleware-retry': 2.2.0 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.2.0 - '@smithy/util-defaults-mode-node': 2.3.0 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-stream': 2.2.0 - '@smithy/util-utf8': 2.1.1 - '@smithy/util-waiter': 2.2.0 - fast-xml-parser: 4.2.5 + '@aws-sdk/client-sso-oidc': 3.587.0(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/client-sts': 3.587.0 + '@aws-sdk/core': 3.587.0 + '@aws-sdk/credential-provider-node': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/middleware-bucket-endpoint': 3.587.0 + '@aws-sdk/middleware-expect-continue': 3.577.0 + '@aws-sdk/middleware-flexible-checksums': 3.587.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-location-constraint': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-sdk-s3': 3.587.0 + '@aws-sdk/middleware-signing': 3.587.0 + '@aws-sdk/middleware-ssec': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/signature-v4-multi-region': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@aws-sdk/xml-builder': 3.575.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.1.1 + '@smithy/eventstream-serde-browser': 3.0.0 + '@smithy/eventstream-serde-config-resolver': 3.0.0 + '@smithy/eventstream-serde-node': 3.0.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-blob-browser': 3.0.0 + '@smithy/hash-node': 3.0.0 + '@smithy/hash-stream-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/md5-js': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-retry': 3.0.0 + '@smithy/util-stream': 3.0.1 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.521.0(@aws-sdk/credential-provider-node@3.521.0)': + '@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/core': 3.521.0 - '@aws-sdk/credential-provider-node': 3.521.0 - '@aws-sdk/middleware-host-header': 3.521.0 - '@aws-sdk/middleware-logger': 3.521.0 - '@aws-sdk/middleware-recursion-detection': 3.521.0 - '@aws-sdk/middleware-user-agent': 3.521.0 - '@aws-sdk/region-config-resolver': 3.521.0 - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-endpoints': 3.521.0 - '@aws-sdk/util-user-agent-browser': 3.521.0 - '@aws-sdk/util-user-agent-node': 3.521.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.0 - '@smithy/middleware-retry': 2.2.0 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.2.0 - '@smithy/util-defaults-mode-node': 2.3.0 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.1.1 + '@aws-sdk/client-sts': 3.587.0 + '@aws-sdk/core': 3.587.0 + '@aws-sdk/credential-provider-node': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.1.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/client-sso@3.521.0': + '@aws-sdk/client-sso@3.587.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.521.0 - '@aws-sdk/middleware-host-header': 3.521.0 - '@aws-sdk/middleware-logger': 3.521.0 - '@aws-sdk/middleware-recursion-detection': 3.521.0 - '@aws-sdk/middleware-user-agent': 3.521.0 - '@aws-sdk/region-config-resolver': 3.521.0 - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-endpoints': 3.521.0 - '@aws-sdk/util-user-agent-browser': 3.521.0 - '@aws-sdk/util-user-agent-node': 3.521.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.0 - '@smithy/middleware-retry': 2.2.0 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.2.0 - '@smithy/util-defaults-mode-node': 2.3.0 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.1.1 + '@aws-sdk/core': 3.587.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.1.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.521.0(@aws-sdk/credential-provider-node@3.521.0)': + '@aws-sdk/client-sts@3.587.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.521.0 - '@aws-sdk/credential-provider-node': 3.521.0 - '@aws-sdk/middleware-host-header': 3.521.0 - '@aws-sdk/middleware-logger': 3.521.0 - '@aws-sdk/middleware-recursion-detection': 3.521.0 - '@aws-sdk/middleware-user-agent': 3.521.0 - '@aws-sdk/region-config-resolver': 3.521.0 - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-endpoints': 3.521.0 - '@aws-sdk/util-user-agent-browser': 3.521.0 - '@aws-sdk/util-user-agent-node': 3.521.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.0 - '@smithy/middleware-retry': 2.2.0 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.2.0 - '@smithy/util-defaults-mode-node': 2.3.0 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.1.1 - fast-xml-parser: 4.2.5 + '@aws-sdk/client-sso-oidc': 3.587.0(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/core': 3.587.0 + '@aws-sdk/credential-provider-node': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.1.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.521.0': + '@aws-sdk/core@3.587.0': dependencies: - '@smithy/core': 1.4.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.1.1 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 + '@smithy/core': 2.1.1 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + fast-xml-parser: 4.2.5 tslib: 2.6.2 - '@aws-sdk/credential-provider-env@3.521.0': + '@aws-sdk/credential-provider-env@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-http@3.521.0': + '@aws-sdk/credential-provider-http@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/property-provider': 2.1.1 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-stream': 2.2.0 + '@aws-sdk/types': 3.577.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/node-http-handler': 3.0.0 + '@smithy/property-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@aws-sdk/credential-provider-ini@3.521.0(@aws-sdk/credential-provider-node@3.521.0)': - dependencies: - '@aws-sdk/client-sts': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/credential-provider-env': 3.521.0 - '@aws-sdk/credential-provider-process': 3.521.0 - '@aws-sdk/credential-provider-sso': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/credential-provider-web-identity': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/types': 3.521.0 - '@smithy/credential-provider-imds': 2.2.1 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.12.0 + '@aws-sdk/credential-provider-ini@3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))(@aws-sdk/client-sts@3.587.0)': + dependencies: + '@aws-sdk/client-sts': 3.587.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0)) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' + - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.521.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.521.0 - '@aws-sdk/credential-provider-http': 3.521.0 - '@aws-sdk/credential-provider-ini': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/credential-provider-process': 3.521.0 - '@aws-sdk/credential-provider-sso': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/credential-provider-web-identity': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/types': 3.521.0 - '@smithy/credential-provider-imds': 2.2.1 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.12.0 + '@aws-sdk/credential-provider-node@3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))(@aws-sdk/client-sts@3.587.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0)) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-process@3.521.0': + '@aws-sdk/credential-provider-process@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-sso@3.521.0(@aws-sdk/credential-provider-node@3.521.0)': + '@aws-sdk/credential-provider-sso@3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))': dependencies: - '@aws-sdk/client-sso': 3.521.0 - '@aws-sdk/token-providers': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/types': 3.521.0 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.12.0 + '@aws-sdk/client-sso': 3.587.0 + '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0)) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' + - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.521.0(@aws-sdk/credential-provider-node@3.521.0)': + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.587.0)': dependencies: - '@aws-sdk/client-sts': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/types': 3.521.0 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.12.0 + '@aws-sdk/client-sts': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.521.0': + '@aws-sdk/middleware-bucket-endpoint@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-arn-parser': 3.495.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.2.1 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-expect-continue@3.521.0': + '@aws-sdk/middleware-expect-continue@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-flexible-checksums@3.521.0': + '@aws-sdk/middleware-flexible-checksums@3.587.0': dependencies: '@aws-crypto/crc32': 3.0.0 '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.521.0 - '@smithy/is-array-buffer': 2.1.1 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-utf8': 2.1.1 + '@aws-sdk/types': 3.577.0 + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-host-header@3.521.0': + '@aws-sdk/middleware-host-header@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-location-constraint@3.521.0': + '@aws-sdk/middleware-location-constraint@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-logger@3.521.0': + '@aws-sdk/middleware-logger@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-recursion-detection@3.521.0': + '@aws-sdk/middleware-recursion-detection@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-sdk-s3@3.521.0': + '@aws-sdk/middleware-sdk-s3@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-arn-parser': 3.495.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.1.1 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.2.1 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-signing@3.521.0': + '@aws-sdk/middleware-signing@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/property-provider': 2.1.1 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.1.1 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-ssec@3.521.0': + '@aws-sdk/middleware-ssec@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-user-agent@3.521.0': + '@aws-sdk/middleware-user-agent@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@aws-sdk/util-endpoints': 3.521.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/region-config-resolver@3.521.0': + '@aws-sdk/region-config-resolver@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.2.1 - '@smithy/util-middleware': 2.2.0 + '@aws-sdk/types': 3.577.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@aws-sdk/signature-v4-multi-region@3.521.0': + '@aws-sdk/signature-v4-multi-region@3.587.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.521.0 - '@aws-sdk/types': 3.521.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/signature-v4': 2.1.1 - '@smithy/types': 2.12.0 + '@aws-sdk/middleware-sdk-s3': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/token-providers@3.521.0(@aws-sdk/credential-provider-node@3.521.0)': + '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.587.0(@aws-sdk/client-sts@3.587.0))': dependencies: - '@aws-sdk/client-sso-oidc': 3.521.0(@aws-sdk/credential-provider-node@3.521.0) - '@aws-sdk/types': 3.521.0 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.12.0 + '@aws-sdk/client-sso-oidc': 3.587.0(@aws-sdk/client-sts@3.587.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - '@aws-sdk/types@3.521.0': + '@aws-sdk/types@3.577.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/util-arn-parser@3.495.0': + '@aws-sdk/util-arn-parser@3.568.0': dependencies: tslib: 2.6.2 - '@aws-sdk/util-endpoints@3.521.0': + '@aws-sdk/util-endpoints@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/types': 2.12.0 - '@smithy/util-endpoints': 1.2.0 + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + '@smithy/util-endpoints': 2.0.1 tslib: 2.6.2 - '@aws-sdk/util-locate-window@3.495.0': + '@aws-sdk/util-locate-window@3.568.0': dependencies: tslib: 2.6.2 - '@aws-sdk/util-user-agent-browser@3.521.0': + '@aws-sdk/util-user-agent-browser@3.577.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 bowser: 2.11.0 tslib: 2.6.2 - '@aws-sdk/util-user-agent-node@3.521.0': + '@aws-sdk/util-user-agent-node@3.587.0': dependencies: - '@aws-sdk/types': 3.521.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 + '@aws-sdk/types': 3.577.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.6.2 - '@aws-sdk/xml-builder@3.521.0': + '@aws-sdk/xml-builder@3.575.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@babel/code-frame@7.23.5': + '@babel/code-frame@7.24.6': dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 - '@babel/compat-data@7.23.5': {} + '@babel/compat-data@7.24.6': {} - '@babel/core@7.23.9': + '@babel/core@7.24.5': dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helpers': 7.23.9 - '@babel/parser': 7.23.9 - '@babel/template': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.5) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.24.6': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + convert-source-map: 2.0.0 + debug: 4.3.5 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.23.6': + '@babel/generator@7.24.6': dependencies: - '@babel/types': 7.23.9 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@babel/types': 7.24.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.22.5': + '@babel/helper-annotate-as-pure@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.24.6': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-create-class-features-plugin@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9)': + '@babel/helper-create-regexp-features-plugin@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.9)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + debug: 4.3.5 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.6': {} + + '@babel/helper-function-name@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/helper-function-name@7.23.0': + '@babel/helper-hoist-variables@7.24.6': dependencies: - '@babel/template': 7.23.9 - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-member-expression-to-functions@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-member-expression-to-functions@7.23.0': + '@babel/helper-module-imports@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-module-imports@7.22.15': + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.5)': dependencies: - '@babel/types': 7.23.9 + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 - '@babel/helper-optimise-call-expression@7.22.5': + '@babel/helper-optimise-call-expression@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-plugin-utils@7.22.5': {} + '@babel/helper-plugin-utils@7.24.6': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9)': + '@babel/helper-remap-async-to-generator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-wrap-function': 7.24.6 - '@babel/helper-replace-supers@7.22.20(@babel/core@7.23.9)': + '@babel/helper-replace-supers@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 - '@babel/helper-simple-access@7.22.5': + '@babel/helper-simple-access@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helper-split-export-declaration@7.24.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 - '@babel/helper-string-parser@7.23.4': {} + '@babel/helper-string-parser@7.24.6': {} - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-validator-identifier@7.24.6': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.24.6': {} - '@babel/helper-wrap-function@7.22.20': + '@babel/helper-wrap-function@7.24.6': dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.23.9 - '@babel/types': 7.23.9 + '@babel/helper-function-name': 7.24.6 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/helpers@7.23.9': + '@babel/helpers@7.24.6': dependencies: - '@babel/template': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/highlight@7.23.4': + '@babel/highlight@7.24.6': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.1 - '@babel/parser@7.23.9': - dependencies: - '@babel/types': 7.23.9 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.9)': + '@babel/parser@7.24.5': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.24.6 - '@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.9)': + '@babel/parser@7.24.6': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/types': 7.24.6 - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.9)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.9)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.9)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.9)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-flow@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-import-assertions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-import-attributes@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-arrow-functions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.23.9)': + '@babel/plugin-transform-async-generator-functions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) - '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-async-to-generator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-block-scoped-functions@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-block-scoping@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-class-properties@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-class-static-block@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.6) - '@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.9)': + '@babel/plugin-transform-classes@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + '@babel/helper-split-export-declaration': 7.24.6 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-computed-properties@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.23.9 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/template': 7.24.6 - '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-destructuring@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-dotall-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-duplicate-keys@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-dynamic-import@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-exponentiation-operator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-export-namespace-from@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-flow-strip-types@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-flow': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.9)': + '@babel/plugin-transform-for-of@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 - '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-function-name@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-json-strings@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-logical-assignment-operators@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-member-expression-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-modules-amd@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-modules-commonjs@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-simple-access': 7.24.6 - '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.23.9)': + '@babel/plugin-transform-modules-systemjs@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 - '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-modules-umd@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9)': + '@babel/plugin-transform-named-capturing-groups-regex@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-new-target@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-nullish-coalescing-operator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-numeric-separator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-object-rest-spread@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-object-super@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-optional-catch-binding@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-optional-chaining@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-parameters@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-private-methods@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-private-property-in-object@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.6) - '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-property-literals@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-react-display-name@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.9)': + '@babel/plugin-transform-react-jsx-development@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-react-jsx-self@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-react-jsx-source@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.9)': + '@babel/plugin-transform-react-jsx@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) - '@babel/types': 7.23.9 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 - '@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-react-pure-annotations@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-regenerator@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.9)': + '@babel/plugin-transform-reserved-words@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-runtime@7.23.9(@babel/core@7.23.9)': + '@babel/plugin-transform-runtime@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.6) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.6) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - - '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) - - '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.9)': - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) - '@babel/helper-plugin-utils': 7.22.5 - - '@babel/preset-env@7.23.9(@babel/core@7.23.9)': - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.23.9) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.9) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.23.9) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) - core-js-compat: 3.36.0 + '@babel/plugin-transform-shorthand-properties@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-spread@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + + '@babel/plugin-transform-sticky-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-template-literals@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-typeof-symbol@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-typescript@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-transform-unicode-escapes@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-unicode-property-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-unicode-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-unicode-sets-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/preset-env@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/compat-data': 7.24.6 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-import-assertions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-import-attributes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.6) + '@babel/plugin-transform-arrow-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-async-generator-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-async-to-generator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-block-scoped-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-block-scoping': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-static-block': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-classes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-computed-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-destructuring': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-dotall-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-duplicate-keys': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-dynamic-import': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-exponentiation-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-export-namespace-from': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-for-of': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-function-name': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-json-strings': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-logical-assignment-operators': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-member-expression-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-amd': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-systemjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-umd': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-new-target': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-numeric-separator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-rest-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-super': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-catch-binding': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-methods': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-property-in-object': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-property-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-regenerator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-reserved-words': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-shorthand-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-sticky-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-template-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-typeof-symbol': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-escapes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-property-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-sets-regex': 7.24.6(@babel/core@7.24.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.6) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.6) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.6) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.6) + core-js-compat: 3.37.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.23.3(@babel/core@7.23.9)': + '@babel/preset-flow@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-transform-flow-strip-types': 7.24.6(@babel/core@7.24.6) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.9 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/types': 7.24.6 esutils: 2.0.3 - '@babel/preset-react@7.23.3(@babel/core@7.23.9)': + '@babel/preset-react@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.9) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-transform-react-display-name': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx-development': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-pure-annotations': 7.24.6(@babel/core@7.24.6) - '@babel/preset-typescript@7.23.3(@babel/core@7.23.9)': + '@babel/preset-typescript@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.24.6) - '@babel/register@7.23.7(@babel/core@7.23.9)': + '@babel/register@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.6 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -13052,44 +12521,73 @@ snapshots: '@babel/regjsgen@0.8.0': {} - '@babel/runtime@7.23.9': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/runtime@7.24.1': + '@babel/runtime@7.24.6': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.23.9': + '@babel/template@7.24.6': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 - '@babel/traverse@7.23.9': + '@babel/traverse@7.24.6': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 - debug: 4.3.4 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.9': + '@babel/types@7.24.6': dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 '@base2/pretty-print-object@1.0.1': {} - '@bcoe/v8-coverage@0.2.3': {} + '@biomejs/biome@1.7.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.7.3 + '@biomejs/cli-darwin-x64': 1.7.3 + '@biomejs/cli-linux-arm64': 1.7.3 + '@biomejs/cli-linux-arm64-musl': 1.7.3 + '@biomejs/cli-linux-x64': 1.7.3 + '@biomejs/cli-linux-x64-musl': 1.7.3 + '@biomejs/cli-win32-arm64': 1.7.3 + '@biomejs/cli-win32-x64': 1.7.3 + + '@biomejs/cli-darwin-arm64@1.7.3': + optional: true + + '@biomejs/cli-darwin-x64@1.7.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.7.3': + optional: true + + '@biomejs/cli-linux-arm64@1.7.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.7.3': + optional: true + + '@biomejs/cli-linux-x64@1.7.3': + optional: true + + '@biomejs/cli-win32-arm64@1.7.3': + optional: true + + '@biomejs/cli-win32-x64@1.7.3': + optional: true '@colors/colors@1.5.0': optional: true @@ -13143,16 +12641,13 @@ snapshots: '@emotion/memoize@0.7.4': optional: true - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 '@esbuild/aix-ppc64@0.19.11': optional: true - '@esbuild/aix-ppc64@0.19.12': - optional: true - '@esbuild/aix-ppc64@0.20.2': optional: true @@ -13162,9 +12657,6 @@ snapshots: '@esbuild/android-arm64@0.19.11': optional: true - '@esbuild/android-arm64@0.19.12': - optional: true - '@esbuild/android-arm64@0.20.2': optional: true @@ -13174,9 +12666,6 @@ snapshots: '@esbuild/android-arm@0.19.11': optional: true - '@esbuild/android-arm@0.19.12': - optional: true - '@esbuild/android-arm@0.20.2': optional: true @@ -13186,9 +12675,6 @@ snapshots: '@esbuild/android-x64@0.19.11': optional: true - '@esbuild/android-x64@0.19.12': - optional: true - '@esbuild/android-x64@0.20.2': optional: true @@ -13198,9 +12684,6 @@ snapshots: '@esbuild/darwin-arm64@0.19.11': optional: true - '@esbuild/darwin-arm64@0.19.12': - optional: true - '@esbuild/darwin-arm64@0.20.2': optional: true @@ -13210,9 +12693,6 @@ snapshots: '@esbuild/darwin-x64@0.19.11': optional: true - '@esbuild/darwin-x64@0.19.12': - optional: true - '@esbuild/darwin-x64@0.20.2': optional: true @@ -13222,9 +12702,6 @@ snapshots: '@esbuild/freebsd-arm64@0.19.11': optional: true - '@esbuild/freebsd-arm64@0.19.12': - optional: true - '@esbuild/freebsd-arm64@0.20.2': optional: true @@ -13234,9 +12711,6 @@ snapshots: '@esbuild/freebsd-x64@0.19.11': optional: true - '@esbuild/freebsd-x64@0.19.12': - optional: true - '@esbuild/freebsd-x64@0.20.2': optional: true @@ -13246,9 +12720,6 @@ snapshots: '@esbuild/linux-arm64@0.19.11': optional: true - '@esbuild/linux-arm64@0.19.12': - optional: true - '@esbuild/linux-arm64@0.20.2': optional: true @@ -13258,9 +12729,6 @@ snapshots: '@esbuild/linux-arm@0.19.11': optional: true - '@esbuild/linux-arm@0.19.12': - optional: true - '@esbuild/linux-arm@0.20.2': optional: true @@ -13270,9 +12738,6 @@ snapshots: '@esbuild/linux-ia32@0.19.11': optional: true - '@esbuild/linux-ia32@0.19.12': - optional: true - '@esbuild/linux-ia32@0.20.2': optional: true @@ -13282,9 +12747,6 @@ snapshots: '@esbuild/linux-loong64@0.19.11': optional: true - '@esbuild/linux-loong64@0.19.12': - optional: true - '@esbuild/linux-loong64@0.20.2': optional: true @@ -13294,9 +12756,6 @@ snapshots: '@esbuild/linux-mips64el@0.19.11': optional: true - '@esbuild/linux-mips64el@0.19.12': - optional: true - '@esbuild/linux-mips64el@0.20.2': optional: true @@ -13306,9 +12765,6 @@ snapshots: '@esbuild/linux-ppc64@0.19.11': optional: true - '@esbuild/linux-ppc64@0.19.12': - optional: true - '@esbuild/linux-ppc64@0.20.2': optional: true @@ -13318,9 +12774,6 @@ snapshots: '@esbuild/linux-riscv64@0.19.11': optional: true - '@esbuild/linux-riscv64@0.19.12': - optional: true - '@esbuild/linux-riscv64@0.20.2': optional: true @@ -13330,9 +12783,6 @@ snapshots: '@esbuild/linux-s390x@0.19.11': optional: true - '@esbuild/linux-s390x@0.19.12': - optional: true - '@esbuild/linux-s390x@0.20.2': optional: true @@ -13342,9 +12792,6 @@ snapshots: '@esbuild/linux-x64@0.19.11': optional: true - '@esbuild/linux-x64@0.19.12': - optional: true - '@esbuild/linux-x64@0.20.2': optional: true @@ -13354,9 +12801,6 @@ snapshots: '@esbuild/netbsd-x64@0.19.11': optional: true - '@esbuild/netbsd-x64@0.19.12': - optional: true - '@esbuild/netbsd-x64@0.20.2': optional: true @@ -13366,9 +12810,6 @@ snapshots: '@esbuild/openbsd-x64@0.19.11': optional: true - '@esbuild/openbsd-x64@0.19.12': - optional: true - '@esbuild/openbsd-x64@0.20.2': optional: true @@ -13378,9 +12819,6 @@ snapshots: '@esbuild/sunos-x64@0.19.11': optional: true - '@esbuild/sunos-x64@0.19.12': - optional: true - '@esbuild/sunos-x64@0.20.2': optional: true @@ -13390,9 +12828,6 @@ snapshots: '@esbuild/win32-arm64@0.19.11': optional: true - '@esbuild/win32-arm64@0.19.12': - optional: true - '@esbuild/win32-arm64@0.20.2': optional: true @@ -13402,9 +12837,6 @@ snapshots: '@esbuild/win32-ia32@0.19.11': optional: true - '@esbuild/win32-ia32@0.19.12': - optional: true - '@esbuild/win32-ia32@0.20.2': optional: true @@ -13414,9 +12846,6 @@ snapshots: '@esbuild/win32-x64@0.19.11': optional: true - '@esbuild/win32-x64@0.19.12': - optional: true - '@esbuild/win32-x64@0.20.2': optional: true @@ -13435,7 +12864,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -13454,22 +12883,28 @@ snapshots: '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - '@floating-ui/core@1.6.0': + '@floating-ui/core@1.6.2': dependencies: - '@floating-ui/utils': 0.2.1 + '@floating-ui/utils': 0.2.2 - '@floating-ui/dom@1.6.3': + '@floating-ui/dom@1.6.5': dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 - '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.1.0(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.6.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + + '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@floating-ui/utils@0.2.1': {} + '@floating-ui/utils@0.2.2': {} '@hapi/hoek@9.3.0': {} @@ -13477,21 +12912,21 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hookform/resolvers@2.9.11(react-hook-form@7.43.4(react@18.2.0))': + '@hookform/resolvers@2.9.11(react-hook-form@7.51.5(react@18.3.1))': dependencies: - react-hook-form: 7.43.4(react@18.2.0) + react-hook-form: 7.51.5(react@18.3.1) '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.2': {} + '@humanwhocodes/object-schema@2.0.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -13516,14 +12951,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 18.19.33 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.30 + '@types/node': 18.19.33 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13534,9 +12969,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.6 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -13545,7 +12980,7 @@ snapshots: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -13556,7 +12991,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 18.19.33 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -13565,28 +13000,28 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 18.19.33 '@types/yargs': 17.0.32 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.5': + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.22': + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 @@ -13604,11 +13039,11 @@ snapshots: '@lukeed/csprng@1.1.0': {} - '@mdx-js/react@2.3.0(react@18.2.0)': + '@mdx-js/react@2.3.0(react@18.3.1)': dependencies: - '@types/mdx': 2.0.11 - '@types/react': 18.2.74 - react: 18.2.0 + '@types/mdx': 2.0.13 + '@types/react': 18.3.3 + react: 18.3.1 '@microsoft/tsdoc@0.14.2': {} @@ -13635,25 +13070,25 @@ snapshots: pump: 3.0.0 tar-fs: 2.1.1 - '@nestjs-modules/mailer@1.11.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(nodemailer@6.9.10)': + '@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13)': dependencies: '@css-inline/css-inline': 0.13.0 - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) glob: 10.3.10 mjml: 4.15.3 - nodemailer: 6.9.10 + nodemailer: 6.9.13 preview-email: 3.0.19 optionalDependencies: '@types/ejs': 3.1.5 '@types/pug': 2.0.10 - ejs: 3.1.9 + ejs: 3.1.10 handlebars: 4.7.8 - pug: 3.0.2 + pug: 3.0.3 transitivePeerDependencies: - encoding - '@nestjs/cli@10.3.2(@swc/cli@0.3.9(@swc/core@1.4.2(@swc/helpers@0.5.5))(chokidar@3.6.0))(@swc/core@1.4.2(@swc/helpers@0.5.5))': + '@nestjs/cli@10.3.2(@swc/cli@0.3.12(@swc/core@1.5.24(@swc/helpers@0.5.5))(chokidar@3.6.0))(@swc/core@1.5.24(@swc/helpers@0.5.5))': dependencies: '@angular-devkit/core': 17.1.2(chokidar@3.6.0) '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) @@ -13663,7 +13098,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5))) glob: 10.3.10 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -13675,20 +13110,20 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5)) + webpack: 5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5)) webpack-node-externals: 3.0.0 optionalDependencies: - '@swc/cli': 0.3.9(@swc/core@1.4.2(@swc/helpers@0.5.5))(chokidar@3.6.0) - '@swc/core': 1.4.2(@swc/helpers@0.5.5) + '@swc/cli': 0.3.12(@swc/core@1.5.24(@swc/helpers@0.5.5))(chokidar@3.6.0) + '@swc/core': 1.5.24(@swc/helpers@0.5.5) transitivePeerDependencies: - esbuild - uglify-js - webpack-cli - '@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)': + '@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: iterare: 1.2.1 - reflect-metadata: 0.2.1 + reflect-metadata: 0.2.2 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 @@ -13696,63 +13131,63 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/config@3.2.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(rxjs@7.8.1)': + '@nestjs/config@3.2.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - dotenv: 16.4.1 + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + dotenv: 16.4.5 dotenv-expand: 10.0.0 lodash: 4.17.21 rxjs: 7.8.1 uuid: 9.0.1 - '@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1)': + '@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 - reflect-metadata: 0.2.1 + reflect-metadata: 0.2.2 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 optionalDependencies: - '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3) + '@nestjs/platform-express': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8) transitivePeerDependencies: - encoding - '@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))': + '@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) eventemitter2: 6.4.9 - '@nestjs/jwt@10.2.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))': + '@nestjs/jwt@10.2.0(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 - '@nestjs/mapped-types@2.0.5(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)': + '@nestjs/mapped-types@2.0.5(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - reflect-metadata: 0.2.1 + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + reflect-metadata: 0.2.2 optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/passport@10.0.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(passport@0.7.0)': + '@nestjs/passport@10.0.3(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(passport@0.7.0)': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) passport: 0.7.0 - '@nestjs/platform-express@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3)': + '@nestjs/platform-express@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8)': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) body-parser: 1.20.2 cors: 2.8.5 - express: 4.18.2 + express: 4.19.2 multer: 1.4.4-lts.1 tslib: 2.6.2 transitivePeerDependencies: @@ -13769,49 +13204,52 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.3.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)': + '@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.4.5)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + comment-json: 4.2.3 + jsonc-parser: 3.2.1 + pluralize: 8.0.0 + typescript: 5.4.5 + transitivePeerDependencies: + - chokidar + + '@nestjs/swagger@7.3.1(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.14.2 - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.2.0 - reflect-metadata: 0.2.1 + reflect-metadata: 0.2.2 swagger-ui-dist: 5.11.2 optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/throttler@5.1.2(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1)': + '@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) - reflect-metadata: 0.2.1 + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) + reflect-metadata: 0.2.2 '@next/env@13.4.20-canary.15': {} - '@next/env@14.1.0': {} + '@next/env@14.1.4': {} '@next/env@14.2.3': {} - '@next/eslint-plugin-next@12.3.4': - dependencies: - glob: 7.1.7 - '@next/eslint-plugin-next@13.2.4': dependencies: glob: 7.1.7 - '@next/eslint-plugin-next@13.5.6': - dependencies: - glob: 7.1.7 - '@next/swc-darwin-arm64@13.4.20-canary.15': optional: true - '@next/swc-darwin-arm64@14.1.0': + '@next/swc-darwin-arm64@14.1.4': optional: true '@next/swc-darwin-arm64@14.2.3': @@ -13820,7 +13258,7 @@ snapshots: '@next/swc-darwin-x64@13.4.20-canary.15': optional: true - '@next/swc-darwin-x64@14.1.0': + '@next/swc-darwin-x64@14.1.4': optional: true '@next/swc-darwin-x64@14.2.3': @@ -13829,7 +13267,7 @@ snapshots: '@next/swc-linux-arm64-gnu@13.4.20-canary.15': optional: true - '@next/swc-linux-arm64-gnu@14.1.0': + '@next/swc-linux-arm64-gnu@14.1.4': optional: true '@next/swc-linux-arm64-gnu@14.2.3': @@ -13838,7 +13276,7 @@ snapshots: '@next/swc-linux-arm64-musl@13.4.20-canary.15': optional: true - '@next/swc-linux-arm64-musl@14.1.0': + '@next/swc-linux-arm64-musl@14.1.4': optional: true '@next/swc-linux-arm64-musl@14.2.3': @@ -13847,7 +13285,7 @@ snapshots: '@next/swc-linux-x64-gnu@13.4.20-canary.15': optional: true - '@next/swc-linux-x64-gnu@14.1.0': + '@next/swc-linux-x64-gnu@14.1.4': optional: true '@next/swc-linux-x64-gnu@14.2.3': @@ -13856,7 +13294,7 @@ snapshots: '@next/swc-linux-x64-musl@13.4.20-canary.15': optional: true - '@next/swc-linux-x64-musl@14.1.0': + '@next/swc-linux-x64-musl@14.1.4': optional: true '@next/swc-linux-x64-musl@14.2.3': @@ -13865,7 +13303,7 @@ snapshots: '@next/swc-win32-arm64-msvc@13.4.20-canary.15': optional: true - '@next/swc-win32-arm64-msvc@14.1.0': + '@next/swc-win32-arm64-msvc@14.1.4': optional: true '@next/swc-win32-arm64-msvc@14.2.3': @@ -13874,7 +13312,7 @@ snapshots: '@next/swc-win32-ia32-msvc@13.4.20-canary.15': optional: true - '@next/swc-win32-ia32-msvc@14.1.0': + '@next/swc-win32-ia32-msvc@14.1.4': optional: true '@next/swc-win32-ia32-msvc@14.2.3': @@ -13883,7 +13321,7 @@ snapshots: '@next/swc-win32-x64-msvc@13.4.20-canary.15': optional: true - '@next/swc-win32-x64-msvc@14.1.0': + '@next/swc-win32-x64-msvc@14.1.4': optional: true '@next/swc-win32-x64-msvc@14.2.3': @@ -13892,12 +13330,12 @@ snapshots: '@node-saml/node-saml@5.0.0': dependencies: '@types/debug': 4.1.12 - '@types/qs': 6.9.11 + '@types/qs': 6.9.15 '@types/xml-encryption': 1.2.4 '@types/xml2js': 0.4.14 '@xmldom/is-dom-node': 1.0.1 '@xmldom/xmldom': 0.8.10 - debug: 4.3.4 + debug: 4.3.5 xml-crypto: 6.0.0 xml-encryption: 3.0.2 xml2js: 0.6.2 @@ -13946,29 +13384,27 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pmmmwh/react-refresh-webpack-plugin@0.5.11(@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.13(@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))(react-refresh@0.14.2)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))': dependencies: ansi-html-community: 0.0.8 - common-path-prefix: 3.0.0 - core-js-pure: 3.36.0 + core-js-pure: 3.37.1 error-stack-parser: 2.1.4 - find-up: 5.0.0 - html-entities: 2.4.0 + html-entities: 2.5.2 loader-utils: 2.0.4 - react-refresh: 0.11.0 + react-refresh: 0.14.2 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + '@types/webpack': 5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) type-fest: 2.19.0 webpack-hot-middleware: 2.26.1 '@popperjs/core@2.11.8': {} - '@prisma/client@5.10.2(prisma@5.10.2)': + '@prisma/client@5.14.0(prisma@5.14.0)': optionalDependencies: - prisma: 5.10.2 + prisma: 5.14.0 '@prisma/debug@5.0.0': dependencies: @@ -13978,18 +13414,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@prisma/debug@5.10.2': {} + '@prisma/debug@5.14.0': {} - '@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9': {} + '@prisma/engines-version@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48': {} '@prisma/engines@5.0.0': {} - '@prisma/engines@5.10.2': + '@prisma/engines@5.14.0': dependencies: - '@prisma/debug': 5.10.2 - '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 - '@prisma/fetch-engine': 5.10.2 - '@prisma/get-platform': 5.10.2 + '@prisma/debug': 5.14.0 + '@prisma/engines-version': 5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48 + '@prisma/fetch-engine': 5.14.0 + '@prisma/get-platform': 5.14.0 '@prisma/fetch-engine@5.0.0': dependencies: @@ -14014,11 +13450,11 @@ snapshots: - encoding - supports-color - '@prisma/fetch-engine@5.10.2': + '@prisma/fetch-engine@5.14.0': dependencies: - '@prisma/debug': 5.10.2 - '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 - '@prisma/get-platform': 5.10.2 + '@prisma/debug': 5.14.0 + '@prisma/engines-version': 5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48 + '@prisma/get-platform': 5.14.0 '@prisma/generator-helper@5.0.0': dependencies: @@ -14044,9 +13480,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@prisma/get-platform@5.10.2': + '@prisma/get-platform@5.14.0': dependencies: - '@prisma/debug': 5.10.2 + '@prisma/debug': 5.14.0 '@prisma/internals@5.0.0': dependencies: @@ -14103,959 +13539,865 @@ snapshots: '@radix-ui/number@1.0.1': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive@1.0.1': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 - '@radix-ui/react-alert-dialog@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 - - '@radix-ui/react-avatar@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 - - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.58)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.58 - - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-context@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-context@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-context@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-direction@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-direction@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-id@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-id@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-id@1.0.1(@types/react@18.2.74)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.74 - - '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 - '@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-label@2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) aria-hidden: 1.2.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.0.7(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.0.28)(react@18.2.0) - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.0.28)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.0.28)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.0.28)(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 - - '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.1 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/rect': 1.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 - - '@radix-ui/react-popper@1.1.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.23.9 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.0.28)(react@18.2.0) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.1.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@floating-ui/react-dom': 2.1.0(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.0.28)(react@18.3.1) '@radix-ui/rect': 1.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.23.9 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0) + '@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.6 + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/rect': 1.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-portal@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-slot': 1.0.2(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 '@types/react-dom': 18.0.11 - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-select@1.2.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-select@1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-separator@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.0.2(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-slot@1.0.2(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-slot@1.0.2(@types/react@18.2.58)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.58)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.58 - - '@radix-ui/react-slot@1.0.2(@types/react@18.2.74)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.74 - - '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-slot@1.0.2(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 - '@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-toggle@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 - react: 18.2.0 + '@babel/runtime': 7.24.6 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-use-rect@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-use-rect@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/rect': 1.0.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-rect@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@radix-ui/rect': 1.0.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-use-size@1.0.1(@types/react@18.0.28)(react@18.2.0)': + '@radix-ui/react-use-size@1.0.1(@types/react@18.0.28)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.28)(react@18.3.1) + react: 18.3.1 optionalDependencies: '@types/react': 18.0.28 - '@radix-ui/react-use-size@1.0.1(@types/react@18.2.74)(react@18.2.0)': + '@radix-ui/react-use-size@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 '@radix-ui/rect@1.0.1': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 - '@react-email/body@0.0.7(react@18.2.0)': + '@react-email/body@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/button@0.0.14(react@18.2.0)': + '@react-email/button@0.0.14(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/code-block@0.0.3(react@18.2.0)': + '@react-email/code-block@0.0.3(react@18.3.1)': dependencies: prismjs: 1.29.0 - react: 18.2.0 + react: 18.3.1 - '@react-email/code-inline@0.0.1(react@18.2.0)': + '@react-email/code-inline@0.0.1(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/column@0.0.9(react@18.2.0)': + '@react-email/column@0.0.9(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/components@0.0.15(@types/react@18.2.58)(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0)': - dependencies: - '@react-email/body': 0.0.7(react@18.2.0) - '@react-email/button': 0.0.14(react@18.2.0) - '@react-email/code-block': 0.0.3(react@18.2.0) - '@react-email/code-inline': 0.0.1(react@18.2.0) - '@react-email/column': 0.0.9(react@18.2.0) - '@react-email/container': 0.0.11(react@18.2.0) - '@react-email/font': 0.0.5(react@18.2.0) - '@react-email/head': 0.0.7(react@18.2.0) - '@react-email/heading': 0.0.11(@types/react@18.2.58)(react@18.2.0) - '@react-email/hr': 0.0.7(react@18.2.0) - '@react-email/html': 0.0.7(react@18.2.0) - '@react-email/img': 0.0.7(react@18.2.0) - '@react-email/link': 0.0.7(react@18.2.0) - '@react-email/markdown': 0.0.8(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0) - '@react-email/preview': 0.0.8(react@18.2.0) - '@react-email/render': 0.0.12 - '@react-email/row': 0.0.7(react@18.2.0) - '@react-email/section': 0.0.11(react@18.2.0) - '@react-email/tailwind': 0.0.14(react@18.2.0) - '@react-email/text': 0.0.7(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - '@types/react' - - react-email - - '@react-email/components@0.0.15(@types/react@18.2.74)(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0)': - dependencies: - '@react-email/body': 0.0.7(react@18.2.0) - '@react-email/button': 0.0.14(react@18.2.0) - '@react-email/code-block': 0.0.3(react@18.2.0) - '@react-email/code-inline': 0.0.1(react@18.2.0) - '@react-email/column': 0.0.9(react@18.2.0) - '@react-email/container': 0.0.11(react@18.2.0) - '@react-email/font': 0.0.5(react@18.2.0) - '@react-email/head': 0.0.7(react@18.2.0) - '@react-email/heading': 0.0.11(@types/react@18.2.74)(react@18.2.0) - '@react-email/hr': 0.0.7(react@18.2.0) - '@react-email/html': 0.0.7(react@18.2.0) - '@react-email/img': 0.0.7(react@18.2.0) - '@react-email/link': 0.0.7(react@18.2.0) - '@react-email/markdown': 0.0.8(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0) - '@react-email/preview': 0.0.8(react@18.2.0) + '@react-email/components@0.0.15(@types/react@18.3.3)(react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)))(react@18.3.1)': + dependencies: + '@react-email/body': 0.0.7(react@18.3.1) + '@react-email/button': 0.0.14(react@18.3.1) + '@react-email/code-block': 0.0.3(react@18.3.1) + '@react-email/code-inline': 0.0.1(react@18.3.1) + '@react-email/column': 0.0.9(react@18.3.1) + '@react-email/container': 0.0.11(react@18.3.1) + '@react-email/font': 0.0.5(react@18.3.1) + '@react-email/head': 0.0.7(react@18.3.1) + '@react-email/heading': 0.0.11(@types/react@18.3.3)(react@18.3.1) + '@react-email/hr': 0.0.7(react@18.3.1) + '@react-email/html': 0.0.7(react@18.3.1) + '@react-email/img': 0.0.7(react@18.3.1) + '@react-email/link': 0.0.7(react@18.3.1) + '@react-email/markdown': 0.0.8(react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)))(react@18.3.1) + '@react-email/preview': 0.0.8(react@18.3.1) '@react-email/render': 0.0.12 - '@react-email/row': 0.0.7(react@18.2.0) - '@react-email/section': 0.0.11(react@18.2.0) - '@react-email/tailwind': 0.0.14(react@18.2.0) - '@react-email/text': 0.0.7(react@18.2.0) - react: 18.2.0 + '@react-email/row': 0.0.7(react@18.3.1) + '@react-email/section': 0.0.11(react@18.3.1) + '@react-email/tailwind': 0.0.14(react@18.3.1) + '@react-email/text': 0.0.7(react@18.3.1) + react: 18.3.1 transitivePeerDependencies: - '@types/react' - react-email - '@react-email/container@0.0.11(react@18.2.0)': + '@react-email/container@0.0.11(react@18.3.1)': dependencies: - react: 18.2.0 - - '@react-email/font@0.0.5(react@18.2.0)': - dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/head@0.0.7(react@18.2.0)': + '@react-email/font@0.0.5(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/heading@0.0.11(@types/react@18.2.58)(react@18.2.0)': + '@react-email/head@0.0.7(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.58)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - '@types/react' + react: 18.3.1 - '@react-email/heading@0.0.11(@types/react@18.2.74)(react@18.2.0)': + '@react-email/heading@0.0.11(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - react: 18.2.0 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 transitivePeerDependencies: - '@types/react' - '@react-email/hr@0.0.7(react@18.2.0)': + '@react-email/hr@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/html@0.0.7(react@18.2.0)': + '@react-email/html@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/img@0.0.7(react@18.2.0)': + '@react-email/img@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/link@0.0.7(react@18.2.0)': + '@react-email/link@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/markdown@0.0.8(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0)': + '@react-email/markdown@0.0.8(react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)))(react@18.3.1)': dependencies: - md-to-react-email: 4.1.0(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0) - react: 18.2.0 + md-to-react-email: 4.1.0(react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)))(react@18.3.1) + react: 18.3.1 transitivePeerDependencies: - react-email - '@react-email/preview@0.0.8(react@18.2.0)': + '@react-email/preview@0.0.8(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 '@react-email/render@0.0.12': dependencies: @@ -15071,123 +14413,73 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-email/row@0.0.7(react@18.2.0)': + '@react-email/row@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/section@0.0.11(react@18.2.0)': + '@react-email/section@0.0.11(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/tailwind@0.0.14(react@18.2.0)': + '@react-email/tailwind@0.0.14(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@react-email/text@0.0.7(react@18.2.0)': + '@react-email/text@0.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 '@remirror/core-constants@2.0.2': {} - '@remirror/core-helpers@3.0.0': - dependencies: - '@remirror/core-constants': 2.0.2 - '@remirror/types': 1.0.1 - '@types/object.omit': 3.0.3 - '@types/object.pick': 1.3.4 - '@types/throttle-debounce': 2.1.0 - case-anything: 2.1.13 - dash-get: 1.0.2 - deepmerge: 4.3.1 - fast-deep-equal: 3.1.3 - make-error: 1.3.6 - object.omit: 3.0.0 - object.pick: 1.3.0 - throttle-debounce: 3.0.1 - - '@remirror/types@1.0.1': - dependencies: - type-fest: 2.19.0 - - '@rollup/rollup-android-arm-eabi@4.12.0': - optional: true - - '@rollup/rollup-android-arm-eabi@4.13.0': - optional: true - - '@rollup/rollup-android-arm64@4.12.0': - optional: true - - '@rollup/rollup-android-arm64@4.13.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.12.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.13.0': - optional: true - - '@rollup/rollup-darwin-x64@4.12.0': - optional: true - - '@rollup/rollup-darwin-x64@4.13.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.12.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.12.0': + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.13.0': + '@rollup/rollup-android-arm64@4.18.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.12.0': + '@rollup/rollup-darwin-arm64@4.18.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.13.0': + '@rollup/rollup-darwin-x64@4.18.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.12.0': + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.13.0': + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.12.0': + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.13.0': + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true - '@rollup/rollup-linux-x64-musl@4.12.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true - '@rollup/rollup-linux-x64-musl@4.13.0': + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.12.0': + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.13.0': + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.12.0': + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.13.0': + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.12.0': + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.13.0': + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - '@rushstack/eslint-patch@1.7.2': {} + '@rushstack/eslint-patch@1.10.3': {} '@selderee/plugin-htmlparser2@0.10.0': dependencies: @@ -15219,471 +14511,370 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@2.2.0': + '@smithy/abort-controller@3.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/chunked-blob-reader-native@2.2.0': + '@smithy/chunked-blob-reader-native@3.0.0': dependencies: - '@smithy/util-base64': 2.3.0 + '@smithy/util-base64': 3.0.0 tslib: 2.6.2 - '@smithy/chunked-blob-reader@2.2.0': + '@smithy/chunked-blob-reader@3.0.0': dependencies: tslib: 2.6.2 - '@smithy/config-resolver@2.2.0': + '@smithy/config-resolver@3.0.1': dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-config-provider': 2.3.0 - '@smithy/util-middleware': 2.2.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@smithy/core@1.4.0': + '@smithy/core@2.1.1': dependencies: - '@smithy/middleware-endpoint': 2.5.0 - '@smithy/middleware-retry': 2.2.0 - '@smithy/middleware-serde': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@smithy/credential-provider-imds@2.2.1': + '@smithy/credential-provider-imds@3.1.0': dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 tslib: 2.6.2 - '@smithy/credential-provider-imds@2.3.0': - dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - tslib: 2.6.2 - - '@smithy/eventstream-codec@2.1.1': - dependencies: - '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.12.0 - '@smithy/util-hex-encoding': 2.1.1 - tslib: 2.6.2 - - '@smithy/eventstream-codec@2.2.0': + '@smithy/eventstream-codec@3.0.0': dependencies: '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.12.0 - '@smithy/util-hex-encoding': 2.2.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-browser@2.2.0': - dependencies: - '@smithy/eventstream-serde-universal': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-config-resolver@2.2.0': - dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-node@2.2.0': - dependencies: - '@smithy/eventstream-serde-universal': 2.2.0 - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 tslib: 2.6.2 - '@smithy/eventstream-serde-universal@2.2.0': + '@smithy/eventstream-serde-browser@3.0.0': dependencies: - '@smithy/eventstream-codec': 2.2.0 - '@smithy/types': 2.12.0 + '@smithy/eventstream-serde-universal': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/fetch-http-handler@2.5.0': + '@smithy/eventstream-serde-config-resolver@3.0.0': dependencies: - '@smithy/protocol-http': 3.3.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 - '@smithy/util-base64': 2.3.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/hash-blob-browser@2.2.0': + '@smithy/eventstream-serde-node@3.0.0': dependencies: - '@smithy/chunked-blob-reader': 2.2.0 - '@smithy/chunked-blob-reader-native': 2.2.0 - '@smithy/types': 2.12.0 + '@smithy/eventstream-serde-universal': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/hash-node@2.2.0': + '@smithy/eventstream-serde-universal@3.0.0': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-utf8': 2.3.0 + '@smithy/eventstream-codec': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/hash-stream-node@2.2.0': + '@smithy/fetch-http-handler@3.0.1': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-utf8': 2.3.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/querystring-builder': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-base64': 3.0.0 tslib: 2.6.2 - '@smithy/invalid-dependency@2.2.0': + '@smithy/hash-blob-browser@3.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/chunked-blob-reader': 3.0.0 + '@smithy/chunked-blob-reader-native': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/is-array-buffer@2.1.1': + '@smithy/hash-node@3.0.0': dependencies: + '@smithy/types': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@smithy/is-array-buffer@2.2.0': + '@smithy/hash-stream-node@3.0.0': dependencies: + '@smithy/types': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@smithy/md5-js@2.2.0': + '@smithy/invalid-dependency@3.0.0': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-utf8': 2.3.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/middleware-content-length@2.2.0': + '@smithy/is-array-buffer@3.0.0': dependencies: - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 tslib: 2.6.2 - '@smithy/middleware-endpoint@2.5.0': + '@smithy/md5-js@3.0.0': dependencies: - '@smithy/middleware-serde': 2.3.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-middleware': 2.2.0 + '@smithy/types': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@smithy/middleware-retry@2.2.0': + '@smithy/middleware-content-length@3.0.0': dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/service-error-classification': 2.1.5 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - uuid: 8.3.2 - '@smithy/middleware-serde@2.3.0': + '@smithy/middleware-endpoint@3.0.1': dependencies: - '@smithy/types': 2.12.0 + '@smithy/middleware-serde': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@smithy/middleware-stack@2.2.0': + '@smithy/middleware-retry@3.0.3': dependencies: - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/node-config-provider@2.3.0': - dependencies: - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/node-http-handler@2.5.0': - dependencies: - '@smithy/abort-controller': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/querystring-builder': 2.2.0 - '@smithy/types': 2.12.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/service-error-classification': 3.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 tslib: 2.6.2 + uuid: 9.0.1 - '@smithy/property-provider@2.1.1': + '@smithy/middleware-serde@3.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/property-provider@2.2.0': + '@smithy/middleware-stack@3.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/protocol-http@3.3.0': + '@smithy/node-config-provider@3.1.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/querystring-builder@2.2.0': + '@smithy/node-http-handler@3.0.0': dependencies: - '@smithy/types': 2.12.0 - '@smithy/util-uri-escape': 2.2.0 + '@smithy/abort-controller': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/querystring-builder': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/querystring-parser@2.2.0': + '@smithy/property-provider@3.1.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/service-error-classification@2.1.5': - dependencies: - '@smithy/types': 2.12.0 - - '@smithy/shared-ini-file-loader@2.3.1': + '@smithy/protocol-http@4.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/shared-ini-file-loader@2.4.0': + '@smithy/querystring-builder@3.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 + '@smithy/util-uri-escape': 3.0.0 tslib: 2.6.2 - '@smithy/signature-v4@2.1.1': + '@smithy/querystring-parser@3.0.0': dependencies: - '@smithy/eventstream-codec': 2.1.1 - '@smithy/is-array-buffer': 2.1.1 - '@smithy/types': 2.12.0 - '@smithy/util-hex-encoding': 2.1.1 - '@smithy/util-middleware': 2.1.1 - '@smithy/util-uri-escape': 2.1.1 - '@smithy/util-utf8': 2.1.1 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/smithy-client@2.5.0': + '@smithy/service-error-classification@3.0.0': dependencies: - '@smithy/middleware-endpoint': 2.5.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/types': 2.12.0 - '@smithy/util-stream': 2.2.0 - tslib: 2.6.2 + '@smithy/types': 3.0.0 - '@smithy/types@2.12.0': + '@smithy/shared-ini-file-loader@3.1.0': dependencies: + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/url-parser@2.2.0': + '@smithy/signature-v4@3.0.0': dependencies: - '@smithy/querystring-parser': 2.2.0 - '@smithy/types': 2.12.0 + '@smithy/is-array-buffer': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@smithy/util-base64@2.1.1': + '@smithy/smithy-client@3.1.1': dependencies: - '@smithy/util-buffer-from': 2.1.1 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-stack': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@smithy/util-base64@2.3.0': + '@smithy/types@3.0.0': dependencies: - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - '@smithy/util-body-length-browser@2.1.1': + '@smithy/url-parser@3.0.0': dependencies: + '@smithy/querystring-parser': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-body-length-node@2.2.1': + '@smithy/util-base64@3.0.0': dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@smithy/util-buffer-from@2.1.1': + '@smithy/util-body-length-browser@3.0.0': dependencies: - '@smithy/is-array-buffer': 2.1.1 tslib: 2.6.2 - '@smithy/util-buffer-from@2.2.0': + '@smithy/util-body-length-node@3.0.0': dependencies: - '@smithy/is-array-buffer': 2.2.0 tslib: 2.6.2 - '@smithy/util-config-provider@2.2.1': + '@smithy/util-buffer-from@3.0.0': dependencies: + '@smithy/is-array-buffer': 3.0.0 tslib: 2.6.2 - '@smithy/util-config-provider@2.3.0': + '@smithy/util-config-provider@3.0.0': dependencies: tslib: 2.6.2 - '@smithy/util-defaults-mode-browser@2.2.0': + '@smithy/util-defaults-mode-browser@3.0.3': dependencies: - '@smithy/property-provider': 2.2.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 + '@smithy/property-provider': 3.1.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 bowser: 2.11.0 tslib: 2.6.2 - '@smithy/util-defaults-mode-node@2.3.0': - dependencies: - '@smithy/config-resolver': 2.2.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/smithy-client': 2.5.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/util-endpoints@1.2.0': - dependencies: - '@smithy/node-config-provider': 2.3.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@smithy/util-hex-encoding@2.1.1': + '@smithy/util-defaults-mode-node@3.0.3': dependencies: + '@smithy/config-resolver': 3.0.1 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-hex-encoding@2.2.0': + '@smithy/util-endpoints@2.0.1': dependencies: + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-middleware@2.1.1': + '@smithy/util-hex-encoding@3.0.0': dependencies: - '@smithy/types': 2.12.0 tslib: 2.6.2 - '@smithy/util-middleware@2.2.0': + '@smithy/util-middleware@3.0.0': dependencies: - '@smithy/types': 2.12.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-retry@2.2.0': + '@smithy/util-retry@3.0.0': dependencies: - '@smithy/service-error-classification': 2.1.5 - '@smithy/types': 2.12.0 + '@smithy/service-error-classification': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-stream@2.2.0': + '@smithy/util-stream@3.0.1': dependencies: - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/types': 2.12.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-buffer-from': 2.2.0 - '@smithy/util-hex-encoding': 2.2.0 - '@smithy/util-utf8': 2.3.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/node-http-handler': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 - '@smithy/util-uri-escape@2.1.1': + '@smithy/util-uri-escape@3.0.0': dependencies: tslib: 2.6.2 - '@smithy/util-uri-escape@2.2.0': + '@smithy/util-utf8@3.0.0': dependencies: + '@smithy/util-buffer-from': 3.0.0 tslib: 2.6.2 - '@smithy/util-utf8@2.1.1': + '@smithy/util-waiter@3.0.0': dependencies: - '@smithy/util-buffer-from': 2.1.1 + '@smithy/abort-controller': 3.0.0 + '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.6.2 - - '@smithy/util-waiter@2.2.0': - dependencies: - '@smithy/abort-controller': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - - '@socket.io/component-emitter@3.1.0': {} + '@socket.io/component-emitter@3.1.2': {} - '@storybook/addon-actions@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-actions@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.0 + '@storybook/core-events': 7.6.19 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@types/uuid': 9.0.8 dequal: 2.0.3 - lodash: 4.17.21 polished: 4.3.1 - prop-types: 15.8.1 - react-inspector: 6.0.2(react@18.2.0) - telejson: 7.2.0 - ts-dedent: 2.2.0 uuid: 9.0.1 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - '@storybook/addon-backgrounds@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-backgrounds@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.0 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 memoizerific: 1.11.3 ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - '@storybook/addon-controls@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/blocks': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/node-logger': 7.4.0 - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@storybook/addon-controls@7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@storybook/blocks': 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lodash: 4.17.21 ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - encoding + - react + - react-dom - supports-color - '@storybook/addon-docs@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-docs@7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@jest/transform': 29.7.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/csf-plugin': 7.4.0 - '@storybook/csf-tools': 7.4.0 + '@mdx-js/react': 2.3.0(react@18.3.1) + '@storybook/blocks': 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/client-logger': 7.6.19 + '@storybook/components': 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/csf-plugin': 7.6.19 + '@storybook/csf-tools': 7.6.19 '@storybook/global': 5.0.0 '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.4.0 - '@storybook/postinstall': 7.4.0 - '@storybook/preview-api': 7.4.0 - '@storybook/react-dom-shim': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@storybook/node-logger': 7.6.19 + '@storybook/postinstall': 7.6.19 + '@storybook/preview-api': 7.6.19 + '@storybook/react-dom-shim': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/theming': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.19 fs-extra: 11.2.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) remark-external-links: 8.0.0 remark-slug: 6.1.0 ts-dedent: 2.2.0 @@ -15693,23 +14884,23 @@ snapshots: - encoding - supports-color - '@storybook/addon-essentials@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/addon-actions': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-backgrounds': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-docs': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-highlight': 7.4.0 - '@storybook/addon-measure': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-outline': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-toolbars': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-viewport': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 7.4.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/node-logger': 7.4.0 - '@storybook/preview-api': 7.4.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@storybook/addon-essentials@7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@storybook/addon-actions': 7.6.19 + '@storybook/addon-backgrounds': 7.6.19 + '@storybook/addon-controls': 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/addon-docs': 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/addon-highlight': 7.6.19 + '@storybook/addon-measure': 7.6.19 + '@storybook/addon-outline': 7.6.19 + '@storybook/addon-toolbars': 7.6.19 + '@storybook/addon-viewport': 7.6.19 + '@storybook/core-common': 7.6.19 + '@storybook/manager-api': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/node-logger': 7.6.19 + '@storybook/preview-api': 7.6.19 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -15717,153 +14908,77 @@ snapshots: - encoding - supports-color - '@storybook/addon-highlight@7.4.0': + '@storybook/addon-highlight@7.6.19': dependencies: - '@storybook/core-events': 7.4.0 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.4.0 - '@storybook/addon-interactions@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-interactions@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 7.4.0 - '@storybook/core-events': 7.4.0 '@storybook/global': 5.0.0 - '@storybook/instrumenter': 7.4.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@storybook/types': 7.6.19 jest-mock: 27.5.1 polished: 4.3.1 ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - '@storybook/addon-links@7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-links@7.6.19(react@18.3.1)': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/csf': 0.1.2 + '@storybook/csf': 0.1.7 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/router': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 - prop-types: 15.8.1 ts-dedent: 2.2.0 optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 - '@storybook/addon-measure@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-measure@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.0 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/types': 7.4.0 - tiny-invariant: 1.3.1 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' + tiny-invariant: 1.3.3 - '@storybook/addon-onboarding@1.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-onboarding@1.0.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@storybook/telemetry': 7.6.16 - react: 18.2.0 - react-confetti: 6.1.0(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) + '@storybook/telemetry': 7.6.19 + react: 18.3.1 + react-confetti: 6.1.0(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - encoding - supports-color - '@storybook/addon-outline@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-outline@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.0 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/types': 7.4.0 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-toolbars@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' + ts-dedent: 2.2.0 + + '@storybook/addon-toolbars@7.6.19': {} - '@storybook/addon-viewport@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/addon-viewport@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.0 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) memoizerific: 1.11.3 - prop-types: 15.8.1 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - '@storybook/blocks@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/blocks@7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@storybook/channels': 7.4.0 - '@storybook/client-logger': 7.4.0 - '@storybook/components': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.0 - '@storybook/csf': 0.1.2 - '@storybook/docs-tools': 7.4.0 + '@storybook/channels': 7.6.19 + '@storybook/client-logger': 7.6.19 + '@storybook/components': 7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/core-events': 7.6.19 + '@storybook/csf': 0.1.7 + '@storybook/docs-tools': 7.6.19 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 - '@types/lodash': 4.14.202 + '@storybook/manager-api': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/preview-api': 7.6.19 + '@storybook/theming': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.19 + '@types/lodash': 4.17.4 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.4.1(react@18.2.0) + markdown-to-jsx: 7.4.7(react@18.3.1) memoizerific: 1.11.3 polished: 4.3.1 - react: 18.2.0 - react-colorful: 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) telejson: 7.2.0 - tocbot: 4.25.0 + tocbot: 4.28.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 transitivePeerDependencies: @@ -15872,20 +14987,20 @@ snapshots: - encoding - supports-color - '@storybook/builder-manager@7.4.0': + '@storybook/builder-manager@7.6.19': dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.4.0 - '@storybook/manager': 7.4.0 - '@storybook/node-logger': 7.4.0 + '@storybook/core-common': 7.6.19 + '@storybook/manager': 7.6.19 + '@storybook/node-logger': 7.6.19 '@types/ejs': 3.1.5 '@types/find-cache-dir': 3.2.1 '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.20) browser-assert: 1.2.1 - ejs: 3.1.9 + ejs: 3.1.10 esbuild: 0.18.20 esbuild-plugin-alias: 0.2.1 - express: 4.18.2 + express: 4.19.2 find-cache-dir: 3.3.2 fs-extra: 11.2.0 process: 0.11.10 @@ -15894,46 +15009,48 @@ snapshots: - encoding - supports-color - '@storybook/builder-webpack5@7.4.0(@swc/helpers@0.5.5)(esbuild@0.18.20)(typescript@5.3.3)': - dependencies: - '@babel/core': 7.23.9 - '@storybook/channels': 7.4.0 - '@storybook/client-logger': 7.4.0 - '@storybook/core-common': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/core-webpack': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/preview': 7.4.0 - '@storybook/preview-api': 7.4.0 - '@swc/core': 1.4.8(@swc/helpers@0.5.5) - '@types/node': 16.18.82 - '@types/semver': 7.5.7 - babel-loader: 9.1.3(@babel/core@7.23.9)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - babel-plugin-named-exports-order: 0.0.2 + '@storybook/builder-webpack5@7.6.19(@swc/helpers@0.5.5)(esbuild@0.18.20)(typescript@5.4.5)': + dependencies: + '@babel/core': 7.24.6 + '@storybook/channels': 7.6.19 + '@storybook/client-logger': 7.6.19 + '@storybook/core-common': 7.6.19 + '@storybook/core-events': 7.6.19 + '@storybook/core-webpack': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/preview': 7.6.19 + '@storybook/preview-api': 7.6.19 + '@swc/core': 1.5.24(@swc/helpers@0.5.5) + '@types/node': 18.19.33 + '@types/semver': 7.5.8 + babel-loader: 9.1.3(@babel/core@7.24.6)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 + cjs-module-lexer: 1.3.1 constants-browserify: 1.0.0 - css-loader: 6.10.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - express: 4.18.2 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.3.3)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + css-loader: 6.11.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + es-module-lexer: 1.5.3 + express: 4.19.2 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.4.5)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) fs-extra: 11.2.0 - html-webpack-plugin: 5.6.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + html-webpack-plugin: 5.6.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + magic-string: 0.30.10 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.6.0 - style-loader: 3.3.4(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - swc-loader: 0.2.6(@swc/core@1.4.8(@swc/helpers@0.5.5))(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - terser-webpack-plugin: 5.3.10(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + semver: 7.6.2 + style-loader: 3.3.4(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + swc-loader: 0.2.6(@swc/core@1.5.24(@swc/helpers@0.5.5))(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + terser-webpack-plugin: 5.3.10(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) ts-dedent: 2.2.0 url: 0.11.3 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) - webpack-dev-middleware: 6.1.1(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack-dev-middleware: 6.1.3(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: - '@rspack/core' - '@swc/helpers' @@ -15943,62 +15060,53 @@ snapshots: - uglify-js - webpack-cli - '@storybook/channels@7.4.0': - dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/global': 5.0.0 - qs: 6.11.2 - telejson: 7.2.0 - tiny-invariant: 1.3.1 - - '@storybook/channels@7.6.16': + '@storybook/channels@7.6.19': dependencies: - '@storybook/client-logger': 7.6.16 - '@storybook/core-events': 7.6.16 + '@storybook/client-logger': 7.6.19 + '@storybook/core-events': 7.6.19 '@storybook/global': 5.0.0 - qs: 6.11.2 + qs: 6.12.1 telejson: 7.2.0 - tiny-invariant: 1.3.1 + tiny-invariant: 1.3.3 - '@storybook/cli@7.4.0': + '@storybook/cli@7.6.19': dependencies: - '@babel/core': 7.23.9 - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - '@babel/types': 7.23.9 + '@babel/core': 7.24.6 + '@babel/preset-env': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 7.4.0 - '@storybook/core-common': 7.4.0 - '@storybook/core-server': 7.4.0 - '@storybook/csf-tools': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/telemetry': 7.4.0 - '@storybook/types': 7.4.0 - '@types/semver': 7.5.7 + '@storybook/codemod': 7.6.19 + '@storybook/core-common': 7.6.19 + '@storybook/core-events': 7.6.19 + '@storybook/core-server': 7.6.19 + '@storybook/csf-tools': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/telemetry': 7.6.19 + '@storybook/types': 7.6.19 + '@types/semver': 7.5.8 '@yarnpkg/fslib': 2.10.3 '@yarnpkg/libzip': 2.3.0 chalk: 4.1.2 commander: 6.2.1 cross-spawn: 7.0.3 detect-indent: 6.1.0 - envinfo: 7.11.1 + envinfo: 7.13.0 execa: 5.1.1 - express: 4.18.2 + express: 4.19.2 find-up: 5.0.0 fs-extra: 11.2.0 get-npm-tarball-url: 2.1.0 get-port: 5.1.1 - giget: 1.2.1 + giget: 1.2.3 globby: 11.1.0 - jscodeshift: 0.14.0(@babel/preset-env@7.23.9(@babel/core@7.23.9)) + jscodeshift: 0.15.2(@babel/preset-env@7.24.6(@babel/core@7.24.6)) leven: 3.1.0 ora: 5.4.1 prettier: 2.8.8 prompts: 2.4.2 puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 - semver: 7.6.0 - simple-update-notifier: 2.0.0 + semver: 7.6.2 strip-json-comments: 3.1.1 tempy: 1.0.1 ts-dedent: 2.2.0 @@ -16009,91 +15117,59 @@ snapshots: - supports-color - utf-8-validate - '@storybook/client-logger@7.4.0': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/client-logger@7.6.16': + '@storybook/client-logger@7.6.19': dependencies: '@storybook/global': 5.0.0 - '@storybook/codemod@7.4.0': + '@storybook/codemod@7.6.19': dependencies: - '@babel/core': 7.23.9 - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - '@babel/types': 7.23.9 - '@storybook/csf': 0.1.2 - '@storybook/csf-tools': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/types': 7.4.0 + '@babel/core': 7.24.6 + '@babel/preset-env': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 + '@storybook/csf': 0.1.7 + '@storybook/csf-tools': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/types': 7.6.19 '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.3 globby: 11.1.0 - jscodeshift: 0.14.0(@babel/preset-env@7.23.9(@babel/core@7.23.9)) + jscodeshift: 0.15.2(@babel/preset-env@7.24.6(@babel/core@7.24.6)) lodash: 4.17.21 prettier: 2.8.8 - recast: 0.23.4 + recast: 0.23.8 transitivePeerDependencies: - supports-color - '@storybook/components@7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/components@7.6.19(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 7.4.0 - '@storybook/csf': 0.1.2 + '@radix-ui/react-select': 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/client-logger': 7.6.19 + '@storybook/csf': 0.1.7 '@storybook/global': 5.0.0 - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@storybook/theming': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.19 memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - use-resize-observer: 9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-resize-observer: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' - '@types/react-dom' - '@storybook/core-client@7.4.0': - dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/preview-api': 7.4.0 - - '@storybook/core-common@7.4.0': + '@storybook/core-client@7.6.19': dependencies: - '@storybook/node-logger': 7.4.0 - '@storybook/types': 7.4.0 - '@types/find-cache-dir': 3.2.1 - '@types/node': 16.18.82 - '@types/node-fetch': 2.6.11 - '@types/pretty-hrtime': 1.0.3 - chalk: 4.1.2 - esbuild: 0.18.20 - esbuild-register: 3.5.0(esbuild@0.18.20) - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.2.0 - glob: 10.3.10 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0 - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - supports-color + '@storybook/client-logger': 7.6.19 + '@storybook/preview-api': 7.6.19 - '@storybook/core-common@7.6.16': + '@storybook/core-common@7.6.19': dependencies: - '@storybook/core-events': 7.6.16 - '@storybook/node-logger': 7.6.16 - '@storybook/types': 7.6.16 + '@storybook/core-events': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/types': 7.6.19 '@types/find-cache-dir': 3.2.1 - '@types/node': 18.15.3 + '@types/node': 18.19.33 '@types/node-fetch': 2.6.11 '@types/pretty-hrtime': 1.0.3 chalk: 4.1.2 @@ -16103,7 +15179,7 @@ snapshots: find-cache-dir: 3.3.2 find-up: 5.0.0 fs-extra: 11.2.0 - glob: 10.3.10 + glob: 10.4.1 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 node-fetch: 2.7.0 @@ -16116,122 +15192,104 @@ snapshots: - encoding - supports-color - '@storybook/core-events@7.4.0': + '@storybook/core-events@7.6.19': dependencies: ts-dedent: 2.2.0 - '@storybook/core-events@7.6.16': - dependencies: - ts-dedent: 2.2.0 - - '@storybook/core-server@7.4.0': + '@storybook/core-server@7.6.19': dependencies: '@aw-web-design/x-default-browser': 1.4.126 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.4.0 - '@storybook/channels': 7.4.0 - '@storybook/core-common': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/csf': 0.1.2 - '@storybook/csf-tools': 7.4.0 + '@storybook/builder-manager': 7.6.19 + '@storybook/channels': 7.6.19 + '@storybook/core-common': 7.6.19 + '@storybook/core-events': 7.6.19 + '@storybook/csf': 0.1.7 + '@storybook/csf-tools': 7.6.19 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/preview-api': 7.4.0 - '@storybook/telemetry': 7.4.0 - '@storybook/types': 7.4.0 + '@storybook/manager': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/preview-api': 7.6.19 + '@storybook/telemetry': 7.6.19 + '@storybook/types': 7.6.19 '@types/detect-port': 1.3.5 - '@types/node': 16.18.82 + '@types/node': 18.19.33 '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.5.7 + '@types/semver': 7.5.8 better-opn: 3.0.2 chalk: 4.1.2 - cli-table3: 0.6.3 + cli-table3: 0.6.5 compression: 1.7.4 - detect-port: 1.5.1 - express: 4.18.2 + detect-port: 1.6.1 + express: 4.19.2 fs-extra: 11.2.0 globby: 11.1.0 - ip: 2.0.0 + ip: 2.0.1 lodash: 4.17.21 open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 - semver: 7.6.0 - serve-favicon: 2.5.0 + semver: 7.6.2 telejson: 7.2.0 - tiny-invariant: 1.3.1 + tiny-invariant: 1.3.3 ts-dedent: 2.2.0 util: 0.12.5 util-deprecate: 1.0.2 - watchpack: 2.4.0 - ws: 8.16.0 + watchpack: 2.4.1 + ws: 8.17.0 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@storybook/core-webpack@7.4.0': + '@storybook/core-webpack@7.6.19': dependencies: - '@storybook/core-common': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/types': 7.4.0 - '@types/node': 16.18.82 + '@storybook/core-common': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/types': 7.6.19 + '@types/node': 18.19.33 ts-dedent: 2.2.0 transitivePeerDependencies: - encoding - supports-color - '@storybook/csf-plugin@7.4.0': - dependencies: - '@storybook/csf-tools': 7.4.0 - unplugin: 1.7.1 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-tools@7.4.0': + '@storybook/csf-plugin@7.6.19': dependencies: - '@babel/generator': 7.23.6 - '@babel/parser': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 - '@storybook/csf': 0.1.2 - '@storybook/types': 7.4.0 - fs-extra: 11.2.0 - recast: 0.23.4 - ts-dedent: 2.2.0 + '@storybook/csf-tools': 7.6.19 + unplugin: 1.10.1 transitivePeerDependencies: - supports-color - '@storybook/csf-tools@7.6.16': + '@storybook/csf-tools@7.6.19': dependencies: - '@babel/generator': 7.23.6 - '@babel/parser': 7.23.9 - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 - '@storybook/csf': 0.1.2 - '@storybook/types': 7.6.16 + '@babel/generator': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + '@storybook/csf': 0.1.7 + '@storybook/types': 7.6.19 fs-extra: 11.2.0 - recast: 0.23.4 + recast: 0.23.8 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - '@storybook/csf@0.1.2': + '@storybook/csf@0.1.7': dependencies: type-fest: 2.19.0 '@storybook/docs-mdx@0.1.0': {} - '@storybook/docs-tools@7.4.0': + '@storybook/docs-tools@7.6.19': dependencies: - '@storybook/core-common': 7.4.0 - '@storybook/preview-api': 7.4.0 - '@storybook/types': 7.4.0 + '@storybook/core-common': 7.6.19 + '@storybook/preview-api': 7.6.19 + '@storybook/types': 7.6.19 '@types/doctrine': 0.0.3 + assert: 2.1.0 doctrine: 3.0.0 lodash: 4.17.21 transitivePeerDependencies: @@ -16240,90 +15298,83 @@ snapshots: '@storybook/global@5.0.0': {} - '@storybook/instrumenter@7.4.0': - dependencies: - '@storybook/channels': 7.4.0 - '@storybook/client-logger': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.4.0 - - '@storybook/manager-api@7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/manager-api@7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@storybook/channels': 7.4.0 - '@storybook/client-logger': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/csf': 0.1.2 + '@storybook/channels': 7.6.19 + '@storybook/client-logger': 7.6.19 + '@storybook/core-events': 7.6.19 + '@storybook/csf': 0.1.7 '@storybook/global': 5.0.0 - '@storybook/router': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/theming': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@storybook/router': 7.6.19 + '@storybook/theming': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.19 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - semver: 7.6.0 - store2: 2.14.2 + store2: 2.14.3 telejson: 7.2.0 ts-dedent: 2.2.0 + transitivePeerDependencies: + - react + - react-dom - '@storybook/manager@7.4.0': {} + '@storybook/manager@7.6.19': {} '@storybook/mdx2-csf@1.1.0': {} - '@storybook/nextjs@7.4.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(@swc/helpers@0.5.5)(@types/react-dom@18.2.24)(@types/react@18.2.74)(@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@2.19.0)(typescript@5.3.3)(webpack-hot-middleware@2.26.1)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))': - dependencies: - '@babel/core': 7.23.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.23.9) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.9) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - '@babel/preset-react': 7.23.3(@babel/core@7.23.9) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) - '@babel/runtime': 7.23.9 - '@storybook/addon-actions': 7.4.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/builder-webpack5': 7.4.0(@swc/helpers@0.5.5)(esbuild@0.18.20)(typescript@5.3.3) - '@storybook/core-common': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/preset-react-webpack': 7.4.0(@babel/core@7.23.9)(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@2.19.0)(typescript@5.3.3)(webpack-hot-middleware@2.26.1) - '@storybook/preview-api': 7.4.0 - '@storybook/react': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.3.3) - '@types/node': 16.18.82 - css-loader: 6.10.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + '@storybook/nextjs@7.6.19(@swc/core@1.5.24(@swc/helpers@0.5.5))(@swc/helpers@0.5.5)(@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(type-fest@2.19.0)(typescript@5.4.5)(webpack-hot-middleware@2.26.1)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))': + dependencies: + '@babel/core': 7.24.6 + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-import-assertions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-export-namespace-from': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-numeric-separator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-rest-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-runtime': 7.24.6(@babel/core@7.24.6) + '@babel/preset-env': 7.24.6(@babel/core@7.24.6) + '@babel/preset-react': 7.24.6(@babel/core@7.24.6) + '@babel/preset-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/runtime': 7.24.6 + '@storybook/addon-actions': 7.6.19 + '@storybook/builder-webpack5': 7.6.19(@swc/helpers@0.5.5)(esbuild@0.18.20)(typescript@5.4.5) + '@storybook/core-common': 7.6.19 + '@storybook/core-events': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/preset-react-webpack': 7.6.19(@babel/core@7.24.6)(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(type-fest@2.19.0)(typescript@5.4.5)(webpack-hot-middleware@2.26.1) + '@storybook/preview-api': 7.6.19 + '@storybook/react': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@types/node': 18.19.33 + '@types/semver': 7.5.8 + css-loader: 6.11.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) find-up: 5.0.0 fs-extra: 11.2.0 image-size: 1.1.1 - loader-utils: 3.2.1 - next: 14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - node-polyfill-webpack-plugin: 2.0.1(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - pnp-webpack-plugin: 1.7.0(typescript@5.3.3) - postcss: 8.4.26 - postcss-loader: 7.3.4(postcss@8.4.26)(typescript@5.3.3)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + loader-utils: 3.2.2 + next: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + node-polyfill-webpack-plugin: 2.0.1(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + pnp-webpack-plugin: 1.7.0(typescript@5.4.5) + postcss: 8.4.38 + postcss-loader: 7.3.4(postcss@8.4.38)(typescript@5.4.5)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) resolve-url-loader: 5.0.0 - sass-loader: 12.6.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - semver: 7.6.0 - style-loader: 3.3.4(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0) + sass-loader: 12.6.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + semver: 7.6.2 + sharp: 0.32.6 + style-loader: 3.3.4(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.3.1) ts-dedent: 2.2.0 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 optionalDependencies: - typescript: 5.3.3 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + typescript: 5.4.5 + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) transitivePeerDependencies: - '@rspack/core' - '@swc/core' - '@swc/helpers' - - '@types/react' - - '@types/react-dom' - '@types/webpack' - babel-plugin-macros - encoding @@ -16341,35 +15392,34 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/node-logger@7.4.0': {} - - '@storybook/node-logger@7.6.16': {} + '@storybook/node-logger@7.6.19': {} - '@storybook/postinstall@7.4.0': {} + '@storybook/postinstall@7.6.19': {} - '@storybook/preset-react-webpack@7.4.0(@babel/core@7.23.9)(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@2.19.0)(typescript@5.3.3)(webpack-hot-middleware@2.26.1)': + '@storybook/preset-react-webpack@7.6.19(@babel/core@7.24.6)(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))(esbuild@0.18.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(type-fest@2.19.0)(typescript@5.4.5)(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.23.3(@babel/core@7.23.9) - '@babel/preset-react': 7.23.3(@babel/core@7.23.9) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - '@storybook/core-webpack': 7.4.0 - '@storybook/docs-tools': 7.4.0 - '@storybook/node-logger': 7.4.0 - '@storybook/react': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.3.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.3.3)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - '@types/node': 16.18.82 - '@types/semver': 7.5.7 + '@babel/preset-flow': 7.24.6(@babel/core@7.24.6) + '@babel/preset-react': 7.24.6(@babel/core@7.24.6) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.13(@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))(react-refresh@0.14.2)(type-fest@2.19.0)(webpack-hot-middleware@2.26.1)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + '@storybook/core-webpack': 7.6.19 + '@storybook/docs-tools': 7.6.19 + '@storybook/node-logger': 7.6.19 + '@storybook/react': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.4.5)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) + '@types/node': 18.19.33 + '@types/semver': 7.5.8 babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-react-docgen: 4.2.1 fs-extra: 11.2.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-refresh: 0.11.0 - semver: 7.6.0 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + magic-string: 0.30.10 + react: 18.3.1 + react-docgen: 7.0.3 + react-dom: 18.3.1(react@18.3.1) + react-refresh: 0.14.2 + semver: 7.6.2 + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) optionalDependencies: - '@babel/core': 7.23.9 - typescript: 5.3.3 + '@babel/core': 7.24.6 + typescript: 5.4.5 transitivePeerDependencies: - '@swc/core' - '@types/webpack' @@ -16384,56 +15434,56 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preview-api@7.4.0': + '@storybook/preview-api@7.6.19': dependencies: - '@storybook/channels': 7.4.0 - '@storybook/client-logger': 7.4.0 - '@storybook/core-events': 7.4.0 - '@storybook/csf': 0.1.2 + '@storybook/channels': 7.6.19 + '@storybook/client-logger': 7.6.19 + '@storybook/core-events': 7.6.19 + '@storybook/csf': 0.1.7 '@storybook/global': 5.0.0 - '@storybook/types': 7.4.0 - '@types/qs': 6.9.11 + '@storybook/types': 7.6.19 + '@types/qs': 6.9.15 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 - qs: 6.11.2 + qs: 6.12.1 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - '@storybook/preview@7.4.0': {} + '@storybook/preview@7.6.19': {} - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.3.3)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.4.5)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20))': dependencies: - debug: 4.3.4 + debug: 4.3.5 endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 - micromatch: 4.0.5 - react-docgen-typescript: 2.2.2(typescript@5.3.3) + micromatch: 4.0.7 + react-docgen-typescript: 2.2.2(typescript@5.4.5) tslib: 2.6.2 - typescript: 5.3.3 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + typescript: 5.4.5 + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) transitivePeerDependencies: - supports-color - '@storybook/react-dom-shim@7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/react-dom-shim@7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@storybook/react@7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.3.3)': + '@storybook/react@7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)': dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/core-client': 7.4.0 - '@storybook/docs-tools': 7.4.0 + '@storybook/client-logger': 7.6.19 + '@storybook/core-client': 7.6.19 + '@storybook/docs-tools': 7.6.19 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.4.0 - '@storybook/react-dom-shim': 7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.0 + '@storybook/preview-api': 7.6.19 + '@storybook/react-dom-shim': 7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.19 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 - '@types/node': 16.18.82 + '@types/node': 18.19.33 acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) acorn-walk: 7.2.0 @@ -16441,45 +15491,29 @@ snapshots: html-tags: 3.3.1 lodash: 4.17.21 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-element-to-jsx-string: 15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.2.0 type-fest: 2.19.0 util-deprecate: 1.0.2 optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 transitivePeerDependencies: - encoding - supports-color - '@storybook/router@7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/router@7.6.19': dependencies: - '@storybook/client-logger': 7.4.0 + '@storybook/client-logger': 7.6.19 memoizerific: 1.11.3 - qs: 6.11.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/telemetry@7.4.0': - dependencies: - '@storybook/client-logger': 7.4.0 - '@storybook/core-common': 7.4.0 - '@storybook/csf-tools': 7.4.0 - chalk: 4.1.2 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 11.2.0 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - supports-color + qs: 6.12.1 - '@storybook/telemetry@7.6.16': + '@storybook/telemetry@7.6.19': dependencies: - '@storybook/client-logger': 7.6.16 - '@storybook/core-common': 7.6.16 - '@storybook/csf-tools': 7.6.16 + '@storybook/client-logger': 7.6.19 + '@storybook/core-common': 7.6.19 + '@storybook/csf-tools': 7.6.19 chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 @@ -16489,46 +15523,62 @@ snapshots: - encoding - supports-color - '@storybook/testing-library@0.2.0': + '@storybook/testing-library@0.2.2': dependencies: '@testing-library/dom': 9.3.4 '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) ts-dedent: 2.2.0 - '@storybook/theming@7.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/theming@7.6.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@storybook/client-logger': 7.4.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) + '@storybook/client-logger': 7.6.19 '@storybook/global': 5.0.0 memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@storybook/types@7.4.0': + '@storybook/types@7.6.19': dependencies: - '@storybook/channels': 7.4.0 + '@storybook/channels': 7.6.19 '@types/babel__core': 7.20.5 '@types/express': 4.17.21 - '@types/react': 16.14.56 file-system-cache: 2.3.0 - '@storybook/types@7.6.16': + '@swc-node/core@1.13.1(@swc/core@1.5.24(@swc/helpers@0.5.5))(@swc/types@0.1.7)': dependencies: - '@storybook/channels': 7.6.16 - '@types/babel__core': 7.20.5 - '@types/express': 4.17.21 - file-system-cache: 2.3.0 + '@swc/core': 1.5.24(@swc/helpers@0.5.5) + '@swc/types': 0.1.7 + + '@swc-node/register@1.9.1(@swc/core@1.5.24(@swc/helpers@0.5.5))(@swc/types@0.1.7)(typescript@5.4.5)': + dependencies: + '@swc-node/core': 1.13.1(@swc/core@1.5.24(@swc/helpers@0.5.5))(@swc/types@0.1.7) + '@swc-node/sourcemap-support': 0.5.0 + '@swc/core': 1.5.24(@swc/helpers@0.5.5) + colorette: 2.0.20 + debug: 4.3.5 + pirates: 4.0.6 + tslib: 2.6.2 + typescript: 5.4.5 + transitivePeerDependencies: + - '@swc/types' + - supports-color + + '@swc-node/sourcemap-support@0.5.0': + dependencies: + source-map-support: 0.5.21 + tslib: 2.6.2 - '@swc/cli@0.3.9(@swc/core@1.4.2(@swc/helpers@0.5.5))(chokidar@3.6.0)': + '@swc/cli@0.3.12(@swc/core@1.5.24(@swc/helpers@0.5.5))(chokidar@3.6.0)': dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.4.2(@swc/helpers@0.5.5) + '@swc/core': 1.5.24(@swc/helpers@0.5.5) '@swc/counter': 0.1.3 - commander: 7.2.0 + commander: 8.3.0 fast-glob: 3.3.2 - minimatch: 9.0.3 - piscina: 4.4.0 - semver: 7.6.0 + minimatch: 9.0.4 + piscina: 4.5.1 + semver: 7.6.2 slash: 3.0.0 source-map: 0.7.4 optionalDependencies: @@ -16537,97 +15587,67 @@ snapshots: '@swc/core-darwin-arm64@1.3.101': optional: true - '@swc/core-darwin-arm64@1.4.2': - optional: true - - '@swc/core-darwin-arm64@1.4.8': + '@swc/core-darwin-arm64@1.5.24': optional: true '@swc/core-darwin-x64@1.3.101': optional: true - '@swc/core-darwin-x64@1.4.2': - optional: true - - '@swc/core-darwin-x64@1.4.8': + '@swc/core-darwin-x64@1.5.24': optional: true '@swc/core-linux-arm-gnueabihf@1.3.101': optional: true - '@swc/core-linux-arm-gnueabihf@1.4.2': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.4.8': + '@swc/core-linux-arm-gnueabihf@1.5.24': optional: true '@swc/core-linux-arm64-gnu@1.3.101': optional: true - '@swc/core-linux-arm64-gnu@1.4.2': - optional: true - - '@swc/core-linux-arm64-gnu@1.4.8': + '@swc/core-linux-arm64-gnu@1.5.24': optional: true '@swc/core-linux-arm64-musl@1.3.101': optional: true - '@swc/core-linux-arm64-musl@1.4.2': - optional: true - - '@swc/core-linux-arm64-musl@1.4.8': + '@swc/core-linux-arm64-musl@1.5.24': optional: true '@swc/core-linux-x64-gnu@1.3.101': optional: true - '@swc/core-linux-x64-gnu@1.4.2': - optional: true - - '@swc/core-linux-x64-gnu@1.4.8': + '@swc/core-linux-x64-gnu@1.5.24': optional: true '@swc/core-linux-x64-musl@1.3.101': optional: true - '@swc/core-linux-x64-musl@1.4.2': - optional: true - - '@swc/core-linux-x64-musl@1.4.8': + '@swc/core-linux-x64-musl@1.5.24': optional: true '@swc/core-win32-arm64-msvc@1.3.101': optional: true - '@swc/core-win32-arm64-msvc@1.4.2': - optional: true - - '@swc/core-win32-arm64-msvc@1.4.8': + '@swc/core-win32-arm64-msvc@1.5.24': optional: true '@swc/core-win32-ia32-msvc@1.3.101': optional: true - '@swc/core-win32-ia32-msvc@1.4.2': - optional: true - - '@swc/core-win32-ia32-msvc@1.4.8': + '@swc/core-win32-ia32-msvc@1.5.24': optional: true '@swc/core-win32-x64-msvc@1.3.101': optional: true - '@swc/core-win32-x64-msvc@1.4.2': - optional: true - - '@swc/core-win32-x64-msvc@1.4.8': + '@swc/core-win32-x64-msvc@1.5.24': optional: true '@swc/core@1.3.101(@swc/helpers@0.5.5)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.6 + '@swc/types': 0.1.7 optionalDependencies: '@swc/core-darwin-arm64': 1.3.101 '@swc/core-darwin-x64': 1.3.101 @@ -16641,38 +15661,21 @@ snapshots: '@swc/core-win32-x64-msvc': 1.3.101 '@swc/helpers': 0.5.5 - '@swc/core@1.4.2(@swc/helpers@0.5.5)': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.5 - optionalDependencies: - '@swc/core-darwin-arm64': 1.4.2 - '@swc/core-darwin-x64': 1.4.2 - '@swc/core-linux-arm-gnueabihf': 1.4.2 - '@swc/core-linux-arm64-gnu': 1.4.2 - '@swc/core-linux-arm64-musl': 1.4.2 - '@swc/core-linux-x64-gnu': 1.4.2 - '@swc/core-linux-x64-musl': 1.4.2 - '@swc/core-win32-arm64-msvc': 1.4.2 - '@swc/core-win32-ia32-msvc': 1.4.2 - '@swc/core-win32-x64-msvc': 1.4.2 - '@swc/helpers': 0.5.5 - - '@swc/core@1.4.8(@swc/helpers@0.5.5)': + '@swc/core@1.5.24(@swc/helpers@0.5.5)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.5 + '@swc/types': 0.1.7 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.8 - '@swc/core-darwin-x64': 1.4.8 - '@swc/core-linux-arm-gnueabihf': 1.4.8 - '@swc/core-linux-arm64-gnu': 1.4.8 - '@swc/core-linux-arm64-musl': 1.4.8 - '@swc/core-linux-x64-gnu': 1.4.8 - '@swc/core-linux-x64-musl': 1.4.8 - '@swc/core-win32-arm64-msvc': 1.4.8 - '@swc/core-win32-ia32-msvc': 1.4.8 - '@swc/core-win32-x64-msvc': 1.4.8 + '@swc/core-darwin-arm64': 1.5.24 + '@swc/core-darwin-x64': 1.5.24 + '@swc/core-linux-arm-gnueabihf': 1.5.24 + '@swc/core-linux-arm64-gnu': 1.5.24 + '@swc/core-linux-arm64-musl': 1.5.24 + '@swc/core-linux-x64-gnu': 1.5.24 + '@swc/core-linux-x64-musl': 1.5.24 + '@swc/core-win32-arm64-msvc': 1.5.24 + '@swc/core-win32-ia32-msvc': 1.5.24 + '@swc/core-win32-x64-msvc': 1.5.24 '@swc/helpers': 0.5.5 '@swc/counter@0.1.3': {} @@ -16690,9 +15693,7 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.2 - '@swc/types@0.1.5': {} - - '@swc/types@0.1.6': + '@swc/types@0.1.7': dependencies: '@swc/counter': 0.1.3 @@ -16700,20 +15701,20 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tanstack/query-core@4.32.6': {} + '@tanstack/query-core@4.36.1': {} - '@tanstack/react-query@4.32.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-core': 4.32.6 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) + '@tanstack/query-core': 4.36.1 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.9 + '@babel/code-frame': 7.24.6 + '@babel/runtime': 7.24.6 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -16721,216 +15722,216 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react@14.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.2.24 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)': dependencies: '@testing-library/dom': 9.3.4 - '@tiptap/core@2.2.3(@tiptap/pm@2.2.3)': + '@tiptap/core@2.4.0(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/pm': 2.2.3 + '@tiptap/pm': 2.4.0 - '@tiptap/extension-blockquote@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-blockquote@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-bold@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-bold@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-bubble-menu@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-bubble-menu@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-bullet-list@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-code-block@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-code-block@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-code@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-code@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-color@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/extension-text-style@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)))': + '@tiptap/extension-color@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/extension-text-style@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/extension-text-style': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/extension-text-style': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) - '@tiptap/extension-document@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-document@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-dropcursor@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-dropcursor@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-floating-menu@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-floating-menu@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-gapcursor@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-hard-break@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-hard-break@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-heading@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-heading@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-highlight@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-highlight@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-history@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-history@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-horizontal-rule@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-horizontal-rule@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-image@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-image@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-italic@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-italic@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-link@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-link@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 linkifyjs: 4.1.3 - '@tiptap/extension-list-item@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-list-item@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-ordered-list@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-ordered-list@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-paragraph@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-paragraph@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-placeholder@2.0.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-placeholder@2.0.3(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-strike@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-strike@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-task-item@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/extension-task-item@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 - '@tiptap/extension-task-list@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-task-list@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-text-style@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-text-style@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-text@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-text@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/extension-underline@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))': + '@tiptap/extension-underline@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) - '@tiptap/pm@2.2.3': + '@tiptap/pm@2.4.0': dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 prosemirror-commands: 1.5.2 prosemirror-dropcursor: 1.8.1 prosemirror-gapcursor: 1.3.2 - prosemirror-history: 1.3.2 + prosemirror-history: 1.4.0 prosemirror-inputrules: 1.4.0 prosemirror-keymap: 1.2.2 - prosemirror-markdown: 1.12.0 + prosemirror-markdown: 1.13.0 prosemirror-menu: 1.2.4 - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-schema-basic: 1.2.2 prosemirror-schema-list: 1.3.0 prosemirror-state: 1.4.3 - prosemirror-tables: 1.3.5 - prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.1) - prosemirror-transform: 1.8.0 - prosemirror-view: 1.33.1 - - '@tiptap/react@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/extension-bubble-menu': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-floating-menu': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@tiptap/starter-kit@2.2.3(@tiptap/pm@2.2.3)': - dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/extension-blockquote': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-bold': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-bullet-list': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-code': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-code-block': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-document': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-dropcursor': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-gapcursor': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-hard-break': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-heading': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-history': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-horizontal-rule': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-italic': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-list-item': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-ordered-list': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-paragraph': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-strike': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-text': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) + prosemirror-tables: 1.3.7 + prosemirror-trailing-node: 2.0.8(prosemirror-model@1.21.0)(prosemirror-state@1.4.3)(prosemirror-view@1.33.7) + prosemirror-transform: 1.9.0 + prosemirror-view: 1.33.7 + + '@tiptap/react@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/extension-bubble-menu': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-floating-menu': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + + '@tiptap/starter-kit@2.4.0(@tiptap/pm@2.4.0)': + dependencies: + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/extension-blockquote': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-bold': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-bullet-list': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-code': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-code-block': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-document': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-dropcursor': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-gapcursor': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-hard-break': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-heading': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-history': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-horizontal-rule': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-italic': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-list-item': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-ordered-list': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-paragraph': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-strike': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-text': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) transitivePeerDependencies: - '@tiptap/pm' - '@tiptap/suggestion@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)': + '@tiptap/suggestion@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)': dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/pm': 2.2.3 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/pm': 2.4.0 '@tokenizer/token@0.3.0': {} '@tootallnate/once@2.0.0': {} - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -16942,42 +15943,42 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.11.20 + '@types/node': 20.12.13 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/responselike': 1.0.3 '@types/connect@3.4.38': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 - '@types/cookie-parser@1.4.6': + '@types/cookie-parser@1.4.7': dependencies: '@types/express': 4.17.21 @@ -16985,15 +15986,15 @@ snapshots: '@types/cors@2.8.17': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/cross-spawn@6.0.2': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 20.11.30 + '@types/node': 18.19.33 '@types/d3-array@3.2.1': {} @@ -17031,18 +16032,20 @@ snapshots: '@types/doctrine@0.0.3': {} + '@types/doctrine@0.0.9': {} + '@types/ejs@3.1.5': {} - '@types/emscripten@1.39.10': {} + '@types/emscripten@1.39.13': {} '@types/escodegen@0.0.6': {} '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 8.56.2 + '@types/eslint': 8.56.10 '@types/estree': 1.0.5 - '@types/eslint@8.56.2': + '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -17051,29 +16054,29 @@ snapshots: '@types/estree@1.0.5': {} - '@types/express-serve-static-core@4.17.43': + '@types/express-serve-static-core@4.19.3': dependencies: - '@types/node': 20.11.20 - '@types/qs': 6.9.11 + '@types/node': 20.12.13 + '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.11 - '@types/serve-static': 1.15.5 + '@types/express-serve-static-core': 4.19.3 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 '@types/find-cache-dir@3.2.1': {} '@types/formidable@3.4.5': dependencies: - '@types/node': 18.15.3 + '@types/node': 18.19.33 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.11.30 + '@types/node': 18.19.33 '@types/hast@2.3.10': dependencies: @@ -17097,7 +16100,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.11.30 + '@types/node': 18.19.33 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 @@ -17107,17 +16110,21 @@ snapshots: '@types/jsonwebtoken@9.0.5': dependencies: - '@types/node': 20.11.20 + '@types/node': 20.12.13 + + '@types/jsonwebtoken@9.0.6': + dependencies: + '@types/node': 20.12.13 '@types/keyv@3.1.4': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/linkify-it@3.0.5': {} - '@types/lodash@4.14.202': {} + '@types/lodash@4.17.4': {} - '@types/markdown-it@12.2.3': + '@types/markdown-it@13.0.8': dependencies: '@types/linkify-it': 3.0.5 '@types/mdurl': 1.0.5 @@ -17128,16 +16135,12 @@ snapshots: '@types/mdurl@1.0.5': {} - '@types/mdx@2.0.11': {} + '@types/mdx@2.0.13': {} '@types/mime-types@2.1.4': {} '@types/mime@1.3.5': {} - '@types/mime@3.0.4': {} - - '@types/minimist@1.2.5': {} - '@types/ms@0.7.34': {} '@types/multer@1.4.11': @@ -17146,38 +16149,30 @@ snapshots: '@types/node-fetch@2.6.11': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 form-data: 4.0.0 - '@types/node@16.18.82': {} - - '@types/node@18.14.6': {} - '@types/node@18.15.3': {} - '@types/node@20.11.20': + '@types/node@18.19.33': dependencies: undici-types: 5.26.5 - '@types/node@20.11.30': + '@types/node@20.12.13': dependencies: undici-types: 5.26.5 - '@types/nodemailer@6.4.14': + '@types/nodemailer@6.4.15': dependencies: - '@types/node': 20.11.20 + '@types/node': 20.12.13 '@types/normalize-package-data@2.4.4': {} - '@types/nprogress@0.2.0': {} + '@types/nprogress@0.2.3': {} - '@types/oauth@0.9.4': + '@types/oauth@0.9.5': dependencies: - '@types/node': 20.11.30 - - '@types/object.omit@3.0.3': {} - - '@types/object.pick@1.3.4': {} + '@types/node': 20.12.13 '@types/parse-json@4.0.2': {} @@ -17185,23 +16180,23 @@ snapshots: dependencies: '@types/express': 4.17.21 '@types/passport': 1.0.16 - '@types/passport-oauth2': 1.4.15 + '@types/passport-oauth2': 1.4.17 - '@types/passport-google-oauth20@2.0.14': + '@types/passport-google-oauth20@2.0.16': dependencies: '@types/express': 4.17.21 '@types/passport': 1.0.16 - '@types/passport-oauth2': 1.4.15 + '@types/passport-oauth2': 1.4.17 '@types/passport-jwt@4.0.1': dependencies: - '@types/jsonwebtoken': 9.0.5 + '@types/jsonwebtoken': 9.0.6 '@types/passport-strategy': 0.2.38 - '@types/passport-oauth2@1.4.15': + '@types/passport-oauth2@1.4.17': dependencies: '@types/express': 4.17.21 - '@types/oauth': 0.9.4 + '@types/oauth': 0.9.5 '@types/passport': 1.0.16 '@types/passport-strategy@0.2.38': @@ -17215,9 +16210,7 @@ snapshots: '@types/pretty-hrtime@1.0.3': {} - '@types/prismjs@1.26.3': {} - - '@types/prop-types@15.7.11': {} + '@types/prismjs@1.26.4': {} '@types/prop-types@15.7.12': {} @@ -17226,9 +16219,9 @@ snapshots: '@types/qrcode@1.5.5': dependencies: - '@types/node': 18.15.3 + '@types/node': 18.19.33 - '@types/qs@6.9.11': {} + '@types/qs@6.9.15': {} '@types/raf@3.4.3': optional: true @@ -17237,69 +16230,59 @@ snapshots: '@types/react-dom@18.0.11': dependencies: - '@types/react': 18.2.74 - - '@types/react-dom@18.2.24': - dependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - '@types/react@16.14.56': + '@types/react-dom@18.3.0': dependencies: - '@types/prop-types': 15.7.12 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 + '@types/react': 18.3.3 '@types/react@18.0.28': dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 - - '@types/react@18.2.58': - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 + '@types/scheduler': 0.23.0 csstype: 3.1.3 - '@types/react@18.2.74': + '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/resolve@1.20.6': {} + '@types/responselike@1.0.3': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/retry@0.12.0': {} - '@types/scheduler@0.16.8': {} + '@types/scheduler@0.23.0': {} - '@types/semver@7.5.7': {} + '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.11.30 + '@types/node': 20.12.13 - '@types/serve-static@1.15.5': + '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 18.15.3 + '@types/node': 20.12.13 + '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} - '@types/throttle-debounce@2.1.0': {} - '@types/tough-cookie@4.0.5': {} '@types/unist@2.0.10': {} - '@types/validator@13.11.9': {} + '@types/uuid@9.0.8': {} + + '@types/validator@13.11.10': {} '@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.5))(esbuild@0.19.11)': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 tapable: 2.2.1 webpack: 5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.5))(esbuild@0.19.11) transitivePeerDependencies: @@ -17308,11 +16291,11 @@ snapshots: - uglify-js - webpack-cli - '@types/webpack@5.28.5(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)': + '@types/webpack@5.28.5(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 tapable: 2.2.1 - webpack: 5.91.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) transitivePeerDependencies: - '@swc/core' - esbuild @@ -17322,11 +16305,11 @@ snapshots: '@types/xml-encryption@1.2.4': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/xml2js@0.4.14': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 '@types/yargs-parser@21.0.3': {} @@ -17343,25 +16326,13 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.3.4 + debug: 4.3.5 eslint: 8.36.0 optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.57.0 - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -17373,30 +16344,16 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 + semver: 7.6.2 tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -17406,7 +16363,7 @@ snapshots: '@upstash/core-analytics@0.0.6': dependencies: - '@upstash/redis': 1.29.0 + '@upstash/redis': 1.31.3 '@upstash/ratelimit@0.4.4': dependencies: @@ -17416,13 +16373,23 @@ snapshots: dependencies: crypto-js: 4.2.0 - '@upstash/redis@1.29.0': + '@upstash/redis@1.31.3': dependencies: crypto-js: 4.2.0 - '@vercel/analytics@1.1.2': + '@vercel/analytics@1.3.1(next@13.4.20-canary.15(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + server-only: 0.0.1 + optionalDependencies: + next: 13.4.20-canary.15(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + react: 18.3.1 + + '@vercel/analytics@1.3.1(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: server-only: 0.0.1 + optionalDependencies: + next: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@vercel/blob@0.9.3': dependencies: @@ -17438,103 +16405,98 @@ snapshots: dependencies: '@upstash/redis': 1.24.3 - '@vitejs/plugin-react@4.2.1(vite@5.2.6(@types/node@18.14.6)(terser@5.27.1))': + '@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@18.19.33)(terser@5.31.0))': dependencies: - '@babel/core': 7.23.9 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6) '@types/babel__core': 7.20.5 - react-refresh: 0.14.0 - vite: 5.2.6(@types/node@18.14.6)(terser@5.27.1) + react-refresh: 0.14.2 + vite: 5.2.12(@types/node@18.19.33)(terser@5.31.0) transitivePeerDependencies: - supports-color - '@vitest/expect@1.2.0': + '@vitest/expect@1.6.0': dependencies: - '@vitest/spy': 1.2.0 - '@vitest/utils': 1.2.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 chai: 4.4.1 - '@vitest/runner@1.2.0': + '@vitest/runner@1.6.0': dependencies: - '@vitest/utils': 1.2.0 + '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@1.2.0': + '@vitest/snapshot@1.6.0': dependencies: - magic-string: 0.30.7 + magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@1.2.0': + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 - '@vitest/utils@1.2.0': + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 - '@vue/compiler-core@3.4.21': + '@vue/compiler-core@3.4.27': dependencies: - '@babel/parser': 7.23.9 - '@vue/shared': 3.4.21 + '@babel/parser': 7.24.6 + '@vue/shared': 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-dom@3.4.21': + '@vue/compiler-dom@3.4.27': dependencies: - '@vue/compiler-core': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 - '@vue/compiler-sfc@3.4.21': + '@vue/compiler-sfc@3.4.27': dependencies: - '@babel/parser': 7.23.9 - '@vue/compiler-core': 3.4.21 - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-ssr': 3.4.21 - '@vue/shared': 3.4.21 + '@babel/parser': 7.24.6 + '@vue/compiler-core': 3.4.27 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 estree-walker: 2.0.2 - magic-string: 0.30.7 + magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 - '@vue/compiler-ssr@3.4.21': + '@vue/compiler-ssr@3.4.27': dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 - '@vue/reactivity@3.4.21': + '@vue/reactivity@3.4.27': dependencies: - '@vue/shared': 3.4.21 + '@vue/shared': 3.4.27 - '@vue/runtime-core@3.4.21': + '@vue/runtime-core@3.4.27': dependencies: - '@vue/reactivity': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/reactivity': 3.4.27 + '@vue/shared': 3.4.27 - '@vue/runtime-dom@3.4.21': + '@vue/runtime-dom@3.4.27': dependencies: - '@vue/runtime-core': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/runtime-core': 3.4.27 + '@vue/shared': 3.4.27 csstype: 3.1.3 - '@vue/server-renderer@3.4.21(vue@3.4.21(typescript@5.3.3))': + '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))': dependencies: - '@vue/compiler-ssr': 3.4.21 - '@vue/shared': 3.4.21 - vue: 3.4.21(typescript@5.3.3) - - '@vue/shared@3.4.21': {} + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + vue: 3.4.27(typescript@5.4.5) - '@webassemblyjs/ast@1.11.6': - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@vue/shared@3.4.27': {} '@webassemblyjs/ast@1.12.1': dependencies: @@ -17545,8 +16507,6 @@ snapshots: '@webassemblyjs/helper-api-error@1.11.6': {} - '@webassemblyjs/helper-buffer@1.11.6': {} - '@webassemblyjs/helper-buffer@1.12.1': {} '@webassemblyjs/helper-numbers@1.11.6': @@ -17557,13 +16517,6 @@ snapshots: '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - '@webassemblyjs/helper-wasm-section@1.11.6': - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 @@ -17581,17 +16534,6 @@ snapshots: '@webassemblyjs/utf8@1.11.6': {} - '@webassemblyjs/wasm-edit@1.11.6': - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 @@ -17603,14 +16545,6 @@ snapshots: '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - '@webassemblyjs/wasm-gen@1.11.6': - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 @@ -17619,13 +16553,6 @@ snapshots: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-opt@1.11.6': - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 @@ -17633,15 +16560,6 @@ snapshots: '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wasm-parser@1.11.6': - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 @@ -17651,19 +16569,14 @@ snapshots: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wast-printer@1.11.6': - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webtre/nestjs-mailer-react-adapter@0.1.2(@nestjs-modules/mailer@1.11.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(nodemailer@6.9.10))': + '@webtre/nestjs-mailer-react-adapter@0.1.2(@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13))': dependencies: - '@nestjs-modules/mailer': 1.11.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.3(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1))(nodemailer@6.9.10) + '@nestjs-modules/mailer': 1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13) '@react-email/render': 0.0.7 locter: 1.3.0 @@ -17687,7 +16600,7 @@ snapshots: '@yarnpkg/libzip@2.3.0': dependencies: - '@types/emscripten': 1.39.10 + '@types/emscripten': 1.39.13 tslib: 1.14.1 abab@2.0.6: {} @@ -17739,13 +16652,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color - agent-base@7.1.0: + agent-base@7.1.1: dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -17758,32 +16671,36 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@2.2.37(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21(typescript@5.3.3)): + ai@2.2.37(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5)): dependencies: eventsource-parser: 1.0.0 nanoid: 3.3.6 - solid-swr-store: 0.10.7(solid-js@1.8.16)(swr-store@0.10.6) - sswr: 2.0.0(svelte@4.2.12) - swr: 2.2.0(react@18.2.0) + solid-swr-store: 0.10.7(solid-js@1.8.17)(swr-store@0.10.6) + sswr: 2.0.0(svelte@4.2.17) + swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.4.21(typescript@5.3.3)) + swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) optionalDependencies: - react: 18.2.0 - solid-js: 1.8.16 - svelte: 4.2.12 - vue: 3.4.21(typescript@5.3.3) + react: 18.3.1 + solid-js: 1.8.17 + svelte: 4.2.17 + vue: 3.4.27(typescript@5.4.5) ajv-formats@2.1.1(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 + ajv-formats@2.1.1(ajv@8.14.0): + optionalDependencies: + ajv: 8.14.0 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.12.0): + ajv-keywords@5.1.0(ajv@8.14.0): dependencies: - ajv: 8.12.0 + ajv: 8.14.0 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -17800,6 +16717,13 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.14.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + alce@1.2.0: dependencies: esprima: 1.2.5 @@ -17813,14 +16737,10 @@ snapshots: ansi-html-community@0.0.8: {} - ansi-regex@2.1.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} - ansi-styles@2.2.1: {} - ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -17886,11 +16806,11 @@ snapshots: arg@5.0.2: {} - argon2@0.40.1: + argon2@0.40.3: dependencies: '@phc/format': 1.0.0 - node-addon-api: 7.1.0 - node-gyp-build: 4.8.0 + node-addon-api: 8.0.0 + node-gyp-build: 4.8.1 argparse@1.0.10: dependencies: @@ -17898,10 +16818,6 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.3: - dependencies: - tslib: 2.6.2 - aria-hidden@1.2.4: dependencies: tslib: 2.6.2 @@ -17921,11 +16837,12 @@ snapshots: array-flatten@1.1.1: {} - array-includes@3.1.7: + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -17933,41 +16850,50 @@ snapshots: array-union@2.1.0: {} - array.prototype.filter@1.0.3: + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 - array.prototype.findlastindex@1.2.4: + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -17976,22 +16902,19 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.2 - - arrify@1.0.1: {} + is-shared-array-buffer: 1.0.3 asap@2.0.6: {} - asn1.js@5.4.1: + asn1.js@4.10.1: dependencies: bn.js: 4.12.0 inherits: 2.0.4 minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 assert-never@1.2.1: {} @@ -17999,7 +16922,7 @@ snapshots: dependencies: call-bind: 1.0.7 is-nan: 1.3.2 - object-is: 1.1.5 + object-is: 1.1.6 object.assign: 4.1.5 util: 0.12.5 @@ -18007,14 +16930,6 @@ snapshots: ast-types-flow@0.0.8: {} - ast-types@0.14.2: - dependencies: - tslib: 2.6.2 - - ast-types@0.15.2: - dependencies: - tslib: 2.6.2 - ast-types@0.16.1: dependencies: tslib: 2.6.2 @@ -18025,43 +16940,41 @@ snapshots: async@3.2.5: {} - asynciterator.prototype@1.0.0: - dependencies: - has-symbols: 1.0.3 - asynckit@0.4.0: {} atob@2.1.2: {} atomic-sleep@1.0.0: {} - autoprefixer@10.4.14(postcss@8.4.26): + autoprefixer@10.4.14(postcss@8.4.38): dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001587 + caniuse-lite: 1.0.30001625 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.26 + picocolors: 1.0.1 + postcss: 8.4.38 postcss-value-parser: 4.2.0 - autoprefixer@10.4.14(postcss@8.4.35): + autoprefixer@10.4.19(postcss@8.4.38): dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001587 + caniuse-lite: 1.0.30001625 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.35 + picocolors: 1.0.1 + postcss: 8.4.38 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.6: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 axe-core@4.7.0: {} - axios@1.3.4: + axios@1.7.2: dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -18075,22 +16988,24 @@ snapshots: dependencies: dequal: 2.0.3 - babel-core@7.0.0-bridge.0(@babel/core@7.23.9): + b4a@1.6.6: {} + + babel-core@7.0.0-bridge.0(@babel/core@7.24.6): dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.6 - babel-loader@9.1.3(@babel/core@7.23.9)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + babel-loader@9.1.3(@babel/core@7.24.6)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.6 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) babel-plugin-add-react-displayname@0.0.5: {} babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -18098,48 +17013,61 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-named-exports-order@0.0.2: {} - - babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.6): dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) + '@babel/compat-data': 7.24.6 + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.23.9): - dependencies: - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) - core-js-compat: 3.36.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.9): + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.6): dependencies: - '@babel/core': 7.23.9 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6) + core-js-compat: 3.37.1 transitivePeerDependencies: - supports-color - babel-plugin-react-docgen@4.2.1: + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.6): dependencies: - ast-types: 0.14.2 - lodash: 4.17.21 - react-docgen: 5.4.3 + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6) transitivePeerDependencies: - supports-color babel-walk@3.0.0-canary-5: dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.6 bail@2.0.2: {} balanced-match@1.0.2: {} + bare-events@2.3.1: + optional: true + + bare-fs@2.3.0: + dependencies: + bare-events: 2.3.1 + bare-path: 2.1.3 + bare-stream: 1.0.0 + optional: true + + bare-os@2.3.0: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.3.0 + optional: true + + bare-stream@1.0.0: + dependencies: + streamx: 2.18.0 + optional: true + base64-arraybuffer@1.0.2: {} base64-js@1.5.1: {} @@ -18168,7 +17096,7 @@ snapshots: bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 - semver: 7.6.0 + semver: 7.6.2 semver-truncate: 3.0.0 bin-version@6.0.0: @@ -18176,7 +17104,7 @@ snapshots: execa: 5.1.1 find-versions: 5.1.0 - binary-extensions@2.2.0: {} + binary-extensions@2.3.0: {} bl@4.1.0: dependencies: @@ -18184,29 +17112,10 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bluebird@3.7.2: {} - bn.js@4.12.0: {} bn.js@5.2.1: {} - body-parser@1.20.1: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@1.20.2: dependencies: bytes: 3.1.2 @@ -18241,9 +17150,9 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 brorand@1.1.0: {} @@ -18276,16 +17185,17 @@ snapshots: bn.js: 5.2.1 randombytes: 2.1.0 - browserify-sign@4.2.2: + browserify-sign@4.2.3: dependencies: bn.js: 5.2.1 browserify-rsa: 4.1.0 create-hash: 1.2.0 create-hmac: 1.1.7 - elliptic: 6.5.4 + elliptic: 6.5.5 + hash-base: 3.0.4 inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.2 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 safe-buffer: 5.2.1 browserify-zlib@0.1.4: @@ -18298,10 +17208,10 @@ snapshots: browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.672 + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.787 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.0) bser@2.1.1: dependencies: @@ -18337,21 +17247,6 @@ snapshots: bytes@3.1.2: {} - c8@7.14.0: - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - cac@6.7.14: {} cacheable-lookup@5.0.4: {} @@ -18372,7 +17267,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 callsites@3.1.0: {} @@ -18388,23 +17283,15 @@ snapshots: camelcase-css@2.0.1: {} - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - camelcase@5.3.1: {} - caniuse-lite@1.0.30001587: {} - - caniuse-lite@1.0.30001600: {} + caniuse-lite@1.0.30001625: {} canvg@3.0.10: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 '@types/raf': 3.4.3 - core-js: 3.37.0 + core-js: 3.37.1 raf: 3.4.1 regenerator-runtime: 0.13.11 rgbcolor: 1.0.1 @@ -18412,8 +17299,6 @@ snapshots: svg-pathdata: 6.0.3 optional: true - case-anything@2.1.13: {} - case-sensitive-paths-webpack-plugin@2.4.0: {} chai@4.4.1: @@ -18426,14 +17311,6 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 - chalk@1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -18498,7 +17375,7 @@ snapshots: chokidar@3.5.3: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -18510,7 +17387,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -18523,7 +17400,7 @@ snapshots: chownr@2.0.0: {} - chrome-trace-event@1.0.3: {} + chrome-trace-event@1.0.4: {} ci-info@3.8.0: {} @@ -18538,13 +17415,15 @@ snapshots: dependencies: consola: 3.2.3 + cjs-module-lexer@1.3.1: {} + class-transformer@0.5.1: {} class-validator@0.14.1: dependencies: - '@types/validator': 13.11.9 - libphonenumber-js: 1.10.56 - validator: 13.11.0 + '@types/validator': 13.11.10 + libphonenumber-js: 1.11.2 + validator: 13.12.0 class-variance-authority@0.6.1: dependencies: @@ -18564,8 +17443,6 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-spinner@0.2.10: {} - cli-spinners@2.9.2: {} cli-table3@0.6.3: @@ -18574,6 +17451,12 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 @@ -18591,12 +17474,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -18619,6 +17496,8 @@ snapshots: clsx@2.1.0: {} + clsx@2.1.1: {} + code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -18639,6 +17518,18 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.19: {} + colorette@2.0.20: {} combined-stream@1.0.8: @@ -18657,8 +17548,6 @@ snapshots: commander@6.2.1: {} - commander@7.2.0: {} - commander@8.3.0: {} comment-json@4.2.3: @@ -18705,24 +17594,14 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 - concurrently@8.2.2: - 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 - condense-newlines@0.2.1: dependencies: extend-shallow: 2.0.1 is-whitespace: 0.3.0 kind-of: 3.2.2 + confbox@0.1.7: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -18736,8 +17615,8 @@ snapshots: constantinople@4.0.1: dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 constants-browserify@1.0.0: {} @@ -18764,17 +17643,15 @@ snapshots: cookie@0.4.2: {} - cookie@0.5.0: {} - cookie@0.6.0: {} - core-js-compat@3.36.0: + core-js-compat@3.37.1: dependencies: browserslist: 4.23.0 - core-js-pure@3.36.0: {} + core-js-pure@3.37.1: {} - core-js@3.37.0: + core-js@3.37.1: optional: true core-util-is@1.0.3: {} @@ -18801,6 +17678,15 @@ snapshots: optionalDependencies: typescript: 5.3.3 + cosmiconfig@8.3.6(typescript@5.4.5): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.4.5 + crc-32@1.2.2: {} crc32-stream@4.0.3: @@ -18811,7 +17697,7 @@ snapshots: create-ecdh@4.0.4: dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.5.5 create-hash@1.2.0: dependencies: @@ -18857,7 +17743,7 @@ snapshots: crypto-browserify@3.12.0: dependencies: browserify-cipher: 1.0.1 - browserify-sign: 4.2.2 + browserify-sign: 4.2.3 create-ecdh: 4.0.4 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -18876,18 +17762,18 @@ snapshots: dependencies: utrie: 1.0.2 - css-loader@6.10.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + css-loader@6.11.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) - postcss-modules-scope: 3.1.1(postcss@8.4.38) + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 - semver: 7.6.0 + semver: 7.6.2 optionalDependencies: - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) css-select@4.3.0: dependencies: @@ -18968,8 +17854,6 @@ snapshots: damerau-levenshtein@1.0.8: {} - dash-get@1.0.2: {} - data-urls@3.0.2: dependencies: abab: 2.0.6 @@ -18981,9 +17865,27 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + date-fns@2.30.0: dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 dateformat@4.6.3: {} @@ -19001,10 +17903,9 @@ snapshots: dependencies: ms: 2.1.2 - decamelize-keys@1.1.1: + debug@4.3.5: dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 + ms: 2.1.2 decamelize@1.2.0: {} @@ -19036,16 +17937,16 @@ snapshots: is-array-buffer: 3.0.4 is-date-object: 1.0.5 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 isarray: 2.0.5 - object-is: 1.1.5 + object-is: 1.1.6 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - side-channel: 1.0.5 + side-channel: 1.0.6 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 deep-extend@0.6.0: {} @@ -19102,12 +18003,14 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - destr@2.0.2: {} + destr@2.0.3: {} destroy@1.2.0: {} detect-indent@6.1.0: {} + detect-libc@2.0.3: {} + detect-newline@3.1.0: {} detect-node-es@1.1.0: {} @@ -19118,10 +18021,10 @@ snapshots: dependencies: execa: 5.1.1 - detect-port@1.5.1: + detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -19170,7 +18073,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 csstype: 3.1.3 dom-serializer@1.4.1: @@ -19205,7 +18108,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@2.5.3: + dompurify@2.5.5: optional: true domutils@2.8.0: @@ -19229,9 +18132,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.4.1: {} - - dotenv@16.4.4: {} + dotenv@16.4.5: {} duplexify@3.7.1: dependencies: @@ -19253,17 +18154,17 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.6.0 + semver: 7.6.2 ee-first@1.1.1: {} - ejs@3.1.9: + ejs@3.1.10: dependencies: - jake: 10.8.7 + jake: 10.9.1 - electron-to-chromium@1.4.672: {} + electron-to-chromium@1.4.787: {} - elliptic@6.5.4: + elliptic@6.5.5: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -19285,6 +18186,8 @@ snapshots: encoding-japanese@2.0.0: {} + encoding-japanese@2.1.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -19297,8 +18200,8 @@ snapshots: engine.io-client@6.5.3: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 engine.io-parser: 5.2.2 ws: 8.11.0 xmlhttprequest-ssl: 2.0.0 @@ -19313,12 +18216,12 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.11.30 + '@types/node': 20.12.13 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.5 engine.io-parser: 5.2.2 ws: 8.11.0 transitivePeerDependencies: @@ -19326,25 +18229,18 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.15.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - enhanced-resolve@5.16.0: + enhanced-resolve@5.16.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 entities@2.2.0: {} - entities@3.0.1: {} - entities@4.5.0: {} env-paths@2.2.1: {} - envinfo@7.11.1: {} + envinfo@7.13.0: {} error-ex@1.3.2: dependencies: @@ -19354,31 +18250,36 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.22.4: + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 @@ -19386,19 +18287,17 @@ snapshots: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.1 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 - - es-array-method-boxes-properly@1.0.0: {} + which-typed-array: 1.1.15 es-define-property@1.0.0: dependencies: @@ -19412,43 +18311,44 @@ snapshots: get-intrinsic: 1.2.4 has-symbols: 1.0.3 is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - es-iterator-helpers@1.0.17: + es-iterator-helpers@1.0.19: dependencies: - asynciterator.prototype: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 + es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 has-property-descriptors: 1.0.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 - es-module-lexer@1.4.1: {} + es-module-lexer@1.5.3: {} - es-module-lexer@1.4.2: {} + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 - es-set-tostringtag@2.0.2: + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: @@ -19460,7 +18360,7 @@ snapshots: esbuild-register@3.5.0(esbuild@0.18.20): dependencies: - debug: 4.3.4 + debug: 4.3.5 esbuild: 0.18.20 transitivePeerDependencies: - supports-color @@ -19516,32 +18416,6 @@ snapshots: '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 @@ -19592,75 +18466,24 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-custom@0.0.0(eslint@8.57.0)(typescript@5.3.3): - dependencies: - eslint-config-next: 12.3.4(eslint@8.57.0)(typescript@5.3.3) - eslint-config-prettier: 8.10.0(eslint@8.57.0) - eslint-plugin-react: 7.28.0(eslint@8.57.0) - transitivePeerDependencies: - - eslint - - eslint-import-resolver-webpack - - supports-color - - typescript - - eslint-config-next@12.3.4(eslint@8.57.0)(typescript@5.3.3): - dependencies: - '@next/eslint-plugin-next': 12.3.4 - '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.33.2(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - eslint-config-next@13.2.4(eslint@8.36.0)(typescript@4.9.5): dependencies: '@next/eslint-plugin-next': 13.2.4 - '@rushstack/eslint-patch': 1.7.2 + '@rushstack/eslint-patch': 1.10.3 '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.5) eslint: 8.36.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.36.0) - eslint-plugin-react: 7.33.2(eslint@8.36.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.36.0) + eslint-plugin-react: 7.34.2(eslint@8.36.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.36.0) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - eslint-config-next@13.5.6(eslint@8.57.0)(typescript@5.3.3): - dependencies: - '@next/eslint-plugin-next': 13.5.6 - '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.33.2(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - - eslint-config-prettier@8.10.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-config-prettier@9.0.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -19670,11 +18493,6 @@ snapshots: eslint: 8.57.0 eslint-plugin-turbo: 1.10.12(eslint@8.57.0) - eslint-config-turbo@1.12.4(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-plugin-turbo: 1.12.4(eslint@8.57.0) - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -19683,161 +18501,56 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0): - dependencies: - debug: 4.3.4 - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0) - glob: 7.2.3 - is-glob: 4.0.3 - resolve: 1.22.8 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0): dependencies: - debug: 4.3.4 - enhanced-resolve: 5.15.0 + debug: 4.3.5 + enhanced-resolve: 5.16.1 eslint: 8.36.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0))(eslint@8.36.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0))(eslint@8.36.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - dependencies: - debug: 4.3.4 - enhanced-resolve: 5.15.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.5 is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0))(eslint@8.36.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.5) - eslint: 8.36.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0): - dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.36.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0))(eslint@8.36.0) - hasown: 2.0.1 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.0): - dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.1 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 - semver: 6.3.1 - tsconfig-paths: 3.15.0 + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0))(eslint@8.36.0): + dependencies: + debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.5) + eslint: 8.36.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0) transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0): dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 8.36.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.1 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.36.0))(eslint@8.36.0) + hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -19845,120 +18558,55 @@ snapshots: eslint-plugin-jsx-a11y@6.8.0(eslint@8.36.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 aria-query: 5.3.0 - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.7.0 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.19 eslint: 8.36.0 - hasown: 2.0.1 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): - dependencies: - '@babel/runtime': 7.24.1 - aria-query: 5.3.0 - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.7.0 - axobject-query: 3.2.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 - eslint: 8.57.0 - hasown: 2.0.1 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 - eslint-plugin-react-hooks@4.6.0(eslint@8.36.0): + eslint-plugin-react-hooks@4.6.2(eslint@8.36.0): dependencies: eslint: 8.36.0 - eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-react@7.28.0(eslint@8.57.0): - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - doctrine: 2.1.0 - eslint: 8.57.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.10 - - eslint-plugin-react@7.33.2(eslint@8.36.0): + eslint-plugin-react@7.34.2(eslint@8.36.0): dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.19 eslint: 8.36.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.10 - - eslint-plugin-react@7.33.2(eslint@8.57.0): - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.3 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 - eslint: 8.57.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 eslint-plugin-turbo@1.10.12(eslint@8.57.0): dependencies: dotenv: 16.0.3 eslint: 8.57.0 - eslint-plugin-turbo@1.12.4(eslint@8.57.0): - dependencies: - dotenv: 16.0.3 - eslint: 8.57.0 - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -19983,7 +18631,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -20009,7 +18657,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -20029,7 +18677,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -20053,12 +18701,14 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color + esm@3.2.25: {} + espree@9.6.1: dependencies: acorn: 8.11.3 @@ -20083,14 +18733,6 @@ snapshots: estraverse@5.3.0: {} - estree-to-babel@3.2.1: - dependencies: - '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 - c8: 7.14.0 - transitivePeerDependencies: - - supports-color - estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -20157,7 +18799,7 @@ snapshots: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.2.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -20166,6 +18808,8 @@ snapshots: dependencies: pify: 2.3.0 + expand-template@2.0.3: {} + express-session@1.18.0: dependencies: cookie: 0.6.0 @@ -20179,42 +18823,6 @@ snapshots: transitivePeerDependencies: - supports-color - express@4.18.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@4.19.2: dependencies: accepts: 1.3.8 @@ -20283,19 +18891,21 @@ snapshots: transitivePeerDependencies: - supports-color - fast-copy@3.0.1: {} + fast-copy@3.0.2: {} fast-deep-equal@3.1.3: {} fast-equals@5.0.1: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-parse@1.0.3: {} @@ -20303,7 +18913,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-redact@3.3.0: {} + fast-redact@3.5.0: {} fast-safe-stringify@2.1.1: {} @@ -20365,7 +18975,7 @@ snapshots: strip-outer: 2.0.0 trim-repeated: 2.0.0 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -20434,35 +19044,30 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 flat@5.0.2: {} - flatted@3.2.9: {} + flatted@3.3.1: {} - flow-parser@0.229.0: {} + flow-parser@0.237.1: {} - follow-redirects@1.15.5: {} + follow-redirects@1.15.6: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 - foreground-child@2.0.0: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.3.3)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.4.5)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.6 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -20472,14 +19077,14 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.6.0 + semver: 7.6.2 tapable: 2.2.1 - typescript: 5.3.3 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + typescript: 5.4.5 + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5))): dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.6 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 8.3.6(typescript@5.3.3) @@ -20489,10 +19094,10 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.6.0 + semver: 7.6.2 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5)) + webpack: 5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5)) form-data-encoder@1.7.2: {} @@ -20513,21 +19118,21 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@10.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + framer-motion@10.17.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - framer-motion@10.17.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) fresh@0.5.2: {} @@ -20559,7 +19164,7 @@ snapshots: dependencies: minipass: 3.3.6 - fs-monkey@1.0.5: {} + fs-monkey@1.0.6: {} fs.realpath@1.0.0: {} @@ -20572,7 +19177,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} @@ -20587,9 +19192,9 @@ snapshots: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 get-nonce@1.0.1: {} @@ -20615,20 +19220,24 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.2: + get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 - giget@1.2.1: + getopts@2.3.0: {} + + giget@1.2.3: dependencies: citty: 0.1.6 consola: 3.2.3 defu: 6.1.4 - node-fetch-native: 1.6.2 - nypm: 0.3.6 + node-fetch-native: 1.6.4 + nypm: 0.3.8 ohash: 1.1.3 pathe: 1.1.2 - tar: 6.2.0 + tar: 6.2.1 + + github-from-package@0.0.0: {} github-slugger@1.5.0: {} @@ -20646,17 +19255,25 @@ snapshots: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 glob@10.3.4: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@10.4.1: + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.1.2 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 glob@7.1.7: dependencies: @@ -20689,7 +19306,7 @@ snapshots: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 - path-scurry: 1.10.1 + path-scurry: 1.11.1 global-dirs@3.0.1: dependencies: @@ -20701,9 +19318,10 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.0.1 globby@11.1.0: dependencies: @@ -20756,12 +19374,6 @@ snapshots: optionalDependencies: uglify-js: 3.17.4 - hard-rejection@2.1.0: {} - - has-ansi@2.0.0: - dependencies: - ansi-regex: 2.1.1 - has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -20774,7 +19386,7 @@ snapshots: dependencies: es-define-property: 1.0.0 - has-proto@1.0.1: {} + has-proto@1.0.3: {} has-symbols@1.0.3: {} @@ -20782,6 +19394,11 @@ snapshots: dependencies: has-symbols: 1.0.3 + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + hash-base@3.1.0: dependencies: inherits: 2.0.4 @@ -20798,7 +19415,7 @@ snapshots: is-stream: 2.0.1 type-fest: 0.8.1 - hasown@2.0.1: + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -20824,9 +19441,7 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 - html-entities@2.4.0: {} - - html-escaper@2.0.2: {} + html-entities@2.5.2: {} html-minifier-terser@6.1.0: dependencies: @@ -20836,7 +19451,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.27.1 + terser: 5.31.0 html-minifier@4.0.0: dependencies: @@ -20866,7 +19481,7 @@ snapshots: htmlparser2: 8.0.2 selderee: 0.11.0 - html-webpack-plugin@5.6.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + html-webpack-plugin@5.6.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -20874,7 +19489,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) html2canvas@1.4.1: dependencies: @@ -20923,21 +19538,21 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color http-proxy-agent@7.0.0: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -20951,28 +19566,28 @@ snapshots: https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.0: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.4: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -21069,18 +19684,20 @@ snapshots: internal-slot@1.0.7: dependencies: es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.5 + hasown: 2.0.2 + side-channel: 1.0.6 internmap@2.0.3: {} interpret@1.4.0: {} + interpret@2.2.0: {} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 - ip@2.0.0: {} + ip@2.0.1: {} ipaddr.js@1.9.1: {} @@ -21098,6 +19715,8 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 @@ -21108,7 +19727,7 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 is-boolean-object@1.1.2: dependencies: @@ -21123,7 +19742,11 @@ snapshots: is-core-module@2.13.1: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 is-date-object@1.0.5: dependencies: @@ -21140,10 +19763,6 @@ snapshots: is-extendable@0.1.1: {} - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -21164,14 +19783,14 @@ snapshots: is-interactive@1.0.0: {} - is-map@2.0.2: {} + is-map@2.0.3: {} is-nan@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - is-negative-zero@2.0.2: {} + is-negative-zero@2.0.3: {} is-number-object@1.0.7: dependencies: @@ -21206,9 +19825,9 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-set@2.0.2: {} + is-set@2.0.3: {} - is-shared-array-buffer@1.0.2: + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 @@ -21228,19 +19847,19 @@ snapshots: is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 is-unicode-supported@0.1.0: {} is-unicode-supported@1.3.0: {} - is-weakmap@2.0.1: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.2: + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -21265,25 +19884,14 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.23.9 - '@babel/parser': 7.23.9 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-reports@3.1.6: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - iterare@1.2.1: {} iterator.prototype@1.1.2: @@ -21291,8 +19899,8 @@ snapshots: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 - set-function-name: 2.0.1 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 jackspeak@2.3.6: dependencies: @@ -21300,7 +19908,13 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.8.7: + jackspeak@3.1.2: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.1: dependencies: async: 3.2.5 chalk: 4.1.2 @@ -21313,7 +19927,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.11.30 + '@types/node': 18.19.33 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -21326,26 +19940,26 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.30 + '@types/node': 18.19.33 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.6 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -21353,12 +19967,12 @@ snapshots: jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 20.11.30 + '@types/node': 18.19.33 jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 18.19.33 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -21366,7 +19980,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 18.19.33 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -21374,20 +19988,20 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.13 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 20.11.30 + '@types/node': 18.19.33 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jiti@1.21.0: {} - joi@17.12.2: + joi@17.13.1: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -21401,9 +20015,9 @@ snapshots: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 10.3.10 + glob: 10.4.1 js-cookie: 3.0.5 - nopt: 7.2.0 + nopt: 7.2.1 js-cookie@3.0.5: {} @@ -21413,6 +20027,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.0: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -21422,28 +20038,30 @@ snapshots: dependencies: argparse: 2.0.1 - jscodeshift@0.14.0(@babel/preset-env@7.23.9(@babel/core@7.23.9)): - dependencies: - '@babel/core': 7.23.9 - '@babel/parser': 7.23.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) - '@babel/preset-env': 7.23.9(@babel/core@7.23.9) - '@babel/preset-flow': 7.23.3(@babel/core@7.23.9) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) - '@babel/register': 7.23.7(@babel/core@7.23.9) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.9) + jscodeshift@0.15.2(@babel/preset-env@7.24.6(@babel/core@7.24.6)): + dependencies: + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/plugin-transform-class-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-methods': 7.24.6(@babel/core@7.24.6) + '@babel/preset-flow': 7.24.6(@babel/core@7.24.6) + '@babel/preset-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/register': 7.24.6(@babel/core@7.24.6) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.6) chalk: 4.1.2 - flow-parser: 0.229.0 + flow-parser: 0.237.1 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 neo-async: 2.6.2 node-dir: 0.1.17 - recast: 0.21.5 + recast: 0.23.8 temp: 0.8.4 write-file-atomic: 2.4.3 + optionalDependencies: + '@babel/preset-env': 7.24.6(@babel/core@7.24.6) transitivePeerDependencies: - supports-color @@ -21463,17 +20081,17 @@ snapshots: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 + nwsapi: 2.2.10 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.16.0 + ws: 8.17.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -21495,13 +20113,13 @@ snapshots: rrweb-cssom: 0.6.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.16.0 + ws: 8.17.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -21549,18 +20167,18 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.0 + semver: 7.6.2 jspdf@2.5.1: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 atob: 2.1.2 btoa: 1.2.1 fflate: 0.4.8 optionalDependencies: canvg: 3.0.10 - core-js: 3.37.0 - dompurify: 2.5.3 + core-js: 3.37.1 + dompurify: 2.5.5 html2canvas: 1.4.1 jstransformer@1.0.0: @@ -21570,10 +20188,10 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 juice@10.0.0: dependencies: @@ -21612,16 +20230,37 @@ snapshots: klona@2.0.6: {} - language-subtag-registry@0.3.22: {} + knex@3.1.0(pg@8.11.5): + dependencies: + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.1.2 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.17.21 + pg-connection-string: 2.6.2 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.0.2 + tildify: 2.0.0 + optionalDependencies: + pg: 8.11.5 + transitivePeerDependencies: + - supports-color + + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 lazy-universal-dotenv@4.0.0: dependencies: app-root-dir: 1.0.2 - dotenv: 16.4.4 + dotenv: 16.4.5 dotenv-expand: 10.0.0 lazystream@1.0.1: @@ -21639,6 +20278,8 @@ snapshots: libbase64@1.2.1: {} + libbase64@1.3.0: {} + libmime@5.2.0: dependencies: encoding-japanese: 2.0.0 @@ -21646,30 +20287,28 @@ snapshots: libbase64: 1.2.1 libqp: 2.0.1 - libmime@5.2.1: + libmime@5.3.5: dependencies: - encoding-japanese: 2.0.0 + encoding-japanese: 2.1.0 iconv-lite: 0.6.3 - libbase64: 1.2.1 - libqp: 2.0.1 + libbase64: 1.3.0 + libqp: 2.1.0 - libphonenumber-js@1.10.56: {} + libphonenumber-js@1.11.2: {} libqp@2.0.1: {} + libqp@2.1.0: {} + lilconfig@2.1.0: {} - lilconfig@3.1.0: {} + lilconfig@3.1.1: {} lines-and-columns@1.2.4: {} - linkify-it@4.0.1: - dependencies: - uc.micro: 1.0.6 - linkify-it@5.0.0: dependencies: - uc.micro: 2.0.0 + uc.micro: 2.1.0 linkifyjs@4.1.3: {} @@ -21681,12 +20320,12 @@ snapshots: emojis-list: 3.0.0 json5: 2.2.3 - loader-utils@3.2.1: {} + loader-utils@3.2.2: {} local-pkg@0.5.0: dependencies: - mlly: 1.5.0 - pkg-types: 1.0.3 + mlly: 1.7.0 + pkg-types: 1.1.1 locate-character@3.0.0: {} @@ -21709,12 +20348,12 @@ snapshots: locter@1.3.0: dependencies: - destr: 2.0.2 + destr: 2.0.3 ebec: 2.3.0 fast-glob: 3.3.2 flat: 5.0.2 jiti: 1.21.0 - yaml: 2.3.4 + yaml: 2.4.2 lodash.debounce@4.0.8: {} @@ -21753,11 +20392,11 @@ snapshots: dependencies: js-tokens: 4.0.0 - lottie-react@2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + lottie-react@2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: lottie-web: 5.12.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) lottie-web@5.12.2: {} @@ -21773,7 +20412,7 @@ snapshots: lowercase-keys@2.0.0: {} - lru-cache@10.2.0: {} + lru-cache@10.2.2: {} lru-cache@4.1.5: dependencies: @@ -21784,35 +20423,32 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: + lucide-react@0.244.0(react@18.3.1): dependencies: - yallist: 4.0.0 - - lucide-react@0.244.0(react@18.2.0): - dependencies: - react: 18.2.0 + react: 18.3.1 lz-string@1.5.0: {} - magic-string@0.30.5: + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magic-string@0.30.7: + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - mailparser@3.6.7: + mailparser@3.7.1: dependencies: - encoding-japanese: 2.0.0 + encoding-japanese: 2.1.0 he: 1.2.0 html-to-text: 9.0.5 iconv-lite: 0.6.3 - libmime: 5.2.1 + libmime: 5.3.5 linkify-it: 5.0.0 mailsplit: 5.4.0 - nodemailer: 6.9.9 - tlds: 1.248.0 + nodemailer: 6.9.13 + punycode.js: 2.3.1 + tlds: 1.252.0 mailsplit@5.4.0: dependencies: @@ -21829,52 +20465,36 @@ snapshots: dependencies: semver: 6.3.1 - make-dir@4.0.0: - dependencies: - semver: 7.6.0 - make-error@1.3.6: {} makeerror@1.0.12: dependencies: tmpl: 1.0.5 - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - map-or-similar@1.5.0: {} markdown-it-task-lists@2.1.1: {} - markdown-it@13.0.2: - dependencies: - argparse: 2.0.1 - entities: 3.0.1 - linkify-it: 4.0.1 - mdurl: 1.0.1 - uc.micro: 1.0.6 - - markdown-it@14.0.0: + markdown-it@14.1.0: dependencies: argparse: 2.0.1 entities: 4.5.0 linkify-it: 5.0.0 mdurl: 2.0.0 punycode.js: 2.3.1 - uc.micro: 2.0.0 + uc.micro: 2.1.0 - markdown-to-jsx@7.4.1(react@18.2.0): + markdown-to-jsx@7.4.7(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 marked@7.0.4: {} - md-to-react-email@4.1.0(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0): + md-to-react-email@4.1.0(react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)))(react@18.3.1): dependencies: marked: 7.0.4 - react: 18.2.0 - react-email: 2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)) + react: 18.3.1 + react-email: 2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)) md5.js@1.3.5: dependencies: @@ -21928,15 +20548,13 @@ snapshots: mdn-data@2.0.30: {} - mdurl@1.0.1: {} - mdurl@2.0.0: {} media-typer@0.3.0: {} memfs@3.5.3: dependencies: - fs-monkey: 1.0.5 + fs-monkey: 1.0.6 memoizerific@1.11.3: dependencies: @@ -21944,20 +20562,6 @@ snapshots: mensch@0.3.4: {} - meow@7.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - merge-descriptors@1.0.1: {} merge-stream@2.0.0: {} @@ -22080,7 +20684,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.5 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -22099,9 +20703,9 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.7: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 miller-rabin@4.0.1: @@ -22149,16 +20753,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.3: + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} minipass@3.3.6: @@ -22169,7 +20767,7 @@ snapshots: minipass@5.0.0: {} - minipass@7.0.4: {} + minipass@7.1.2: {} minizlib@2.1.2: dependencies: @@ -22178,7 +20776,7 @@ snapshots: mjml-accordion@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22186,7 +20784,7 @@ snapshots: mjml-body@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22194,7 +20792,7 @@ snapshots: mjml-button@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22202,7 +20800,7 @@ snapshots: mjml-carousel@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22210,13 +20808,13 @@ snapshots: mjml-cli@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 chokidar: 3.6.0 glob: 10.3.10 html-minifier: 4.0.0 js-beautify: 1.15.1 lodash: 4.17.21 - minimatch: 9.0.3 + minimatch: 9.0.4 mjml-core: 4.15.3 mjml-migrate: 4.15.3 mjml-parser-xml: 4.15.3 @@ -22227,7 +20825,7 @@ snapshots: mjml-column@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22235,7 +20833,7 @@ snapshots: mjml-core@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 cheerio: 1.0.0-rc.12 detect-node: 2.1.0 html-minifier: 4.0.0 @@ -22250,7 +20848,7 @@ snapshots: mjml-divider@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22258,7 +20856,7 @@ snapshots: mjml-group@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22266,7 +20864,7 @@ snapshots: mjml-head-attributes@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22274,7 +20872,7 @@ snapshots: mjml-head-breakpoint@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22282,7 +20880,7 @@ snapshots: mjml-head-font@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22290,7 +20888,7 @@ snapshots: mjml-head-html-attributes@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22298,7 +20896,7 @@ snapshots: mjml-head-preview@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22306,7 +20904,7 @@ snapshots: mjml-head-style@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22314,7 +20912,7 @@ snapshots: mjml-head-title@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22322,7 +20920,7 @@ snapshots: mjml-head@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22330,7 +20928,7 @@ snapshots: mjml-hero@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22338,7 +20936,7 @@ snapshots: mjml-image@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22346,7 +20944,7 @@ snapshots: mjml-migrate@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 js-beautify: 1.15.1 lodash: 4.17.21 mjml-core: 4.15.3 @@ -22357,7 +20955,7 @@ snapshots: mjml-navbar@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22365,14 +20963,14 @@ snapshots: mjml-parser-xml@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 detect-node: 2.1.0 htmlparser2: 9.1.0 lodash: 4.17.21 mjml-preset-core@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 mjml-accordion: 4.15.3 mjml-body: 4.15.3 mjml-button: 4.15.3 @@ -22403,7 +21001,7 @@ snapshots: mjml-raw@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22411,7 +21009,7 @@ snapshots: mjml-section@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22419,7 +21017,7 @@ snapshots: mjml-social@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22427,7 +21025,7 @@ snapshots: mjml-spacer@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22435,7 +21033,7 @@ snapshots: mjml-table@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22443,7 +21041,7 @@ snapshots: mjml-text@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -22451,11 +21049,11 @@ snapshots: mjml-validator@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 mjml-wrapper@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 lodash: 4.17.21 mjml-core: 4.15.3 mjml-section: 4.15.3 @@ -22464,7 +21062,7 @@ snapshots: mjml@4.15.3: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 mjml-cli: 4.15.3 mjml-core: 4.15.3 mjml-migrate: 4.15.3 @@ -22481,19 +21079,17 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.5.0: + mlly@1.7.0: dependencies: acorn: 8.11.3 pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 + pkg-types: 1.1.1 + ufo: 1.5.3 mri@1.2.0: {} ms@2.0.0: {} - ms@2.1.1: {} - ms@2.1.2: {} ms@2.1.3: {} @@ -22508,9 +21104,9 @@ snapshots: type-is: 1.6.18 xtend: 4.0.2 - multiselect-react-dropdown@2.0.25(react@18.2.0): + multiselect-react-dropdown@2.0.25(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 mute-stream@0.0.8: {} @@ -22526,41 +21122,43 @@ snapshots: nanoid@3.3.7: {} + napi-build-utils@1.0.2: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} neo-async@2.6.2: {} - nestjs-pino@4.0.0(@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(pino-http@9.0.0): + nestjs-pino@4.1.0(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(pino-http@9.0.0): dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) pino-http: 9.0.0 new-github-issue-url@0.2.1: {} - next-seo@5.15.0(next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-seo@5.15.0(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + next: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-themes@0.2.1(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + next: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - next@13.4.20-canary.15(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@13.4.20-canary.15(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 13.4.20-canary.15 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001600 + caniuse-lite: 1.0.30001625 postcss: 8.4.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.3.1) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -22578,43 +21176,43 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.1.0(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@14.1.4(@babel/core@7.24.5)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.1.0 + '@next/env': 14.1.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001600 + caniuse-lite: 1.0.30001625 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.1.0 - '@next/swc-darwin-x64': 14.1.0 - '@next/swc-linux-arm64-gnu': 14.1.0 - '@next/swc-linux-arm64-musl': 14.1.0 - '@next/swc-linux-x64-gnu': 14.1.0 - '@next/swc-linux-x64-musl': 14.1.0 - '@next/swc-win32-arm64-msvc': 14.1.0 - '@next/swc-win32-ia32-msvc': 14.1.0 - '@next/swc-win32-x64-msvc': 14.1.0 + '@next/swc-darwin-arm64': 14.1.4 + '@next/swc-darwin-x64': 14.1.4 + '@next/swc-linux-arm64-gnu': 14.1.4 + '@next/swc-linux-arm64-musl': 14.1.4 + '@next/swc-linux-x64-gnu': 14.1.4 + '@next/swc-linux-x64-musl': 14.1.4 + '@next/swc-win32-arm64-msvc': 14.1.4 + '@next/swc-win32-ia32-msvc': 14.1.4 + '@next/swc-win32-x64-msvc': 14.1.4 '@opentelemetry/api': 1.4.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.3(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.3 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001600 + caniuse-lite: 1.0.30001625 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.3 '@next/swc-darwin-x64': 14.2.3 @@ -22633,7 +21231,7 @@ snapshots: nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.1 optional: true nice-try@1.0.5: {} @@ -22647,12 +21245,18 @@ snapshots: lower-case: 2.0.2 tslib: 2.6.2 + node-abi@3.63.0: + dependencies: + semver: 7.6.2 + node-abort-controller@3.1.1: {} node-addon-api@3.2.1: optional: true - node-addon-api@7.1.0: {} + node-addon-api@6.1.0: {} + + node-addon-api@8.0.0: {} node-dir@0.1.17: dependencies: @@ -22664,7 +21268,7 @@ snapshots: dependencies: lodash: 4.17.21 - node-fetch-native@1.6.2: {} + node-fetch-native@1.6.4: {} node-fetch@2.6.11: dependencies: @@ -22678,11 +21282,11 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-gyp-build@4.8.0: {} + node-gyp-build@4.8.1: {} node-int64@0.4.0: {} - node-polyfill-webpack-plugin@2.0.1(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + node-polyfill-webpack-plugin@2.0.1(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -22709,22 +21313,20 @@ snapshots: url: 0.11.3 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) node-releases@2.0.14: {} - nodemailer@6.9.10: {} + nodemailer@6.9.13: {} - nodemailer@6.9.9: {} - - nopt@7.2.0: + nopt@7.2.1: dependencies: abbrev: 2.0.0 normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.2 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -22734,47 +21336,47 @@ snapshots: normalize-url@6.1.0: {} - novel@0.1.22(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21(typescript@5.3.3)): - dependencies: - '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/extension-color': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/extension-text-style@2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))) - '@tiptap/extension-highlight': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-horizontal-rule': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-image': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-link': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-placeholder': 2.0.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-task-item': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) - '@tiptap/extension-task-list': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-text-style': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/extension-underline': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) - '@tiptap/pm': 2.2.3 - '@tiptap/react': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tiptap/starter-kit': 2.2.3(@tiptap/pm@2.2.3) - '@tiptap/suggestion': 2.2.3(@tiptap/core@2.2.3(@tiptap/pm@2.2.3))(@tiptap/pm@2.2.3) + novel@0.1.22(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5)): + dependencies: + '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/extension-color': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/extension-text-style@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))) + '@tiptap/extension-highlight': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-horizontal-rule': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-image': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-link': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-placeholder': 2.0.3(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-task-item': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) + '@tiptap/extension-task-list': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-text-style': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/extension-underline': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) + '@tiptap/pm': 2.4.0 + '@tiptap/react': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@tiptap/starter-kit': 2.4.0(@tiptap/pm@2.4.0) + '@tiptap/suggestion': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) '@types/node': 18.15.3 '@types/react': 18.0.28 '@types/react-dom': 18.0.11 '@upstash/ratelimit': 0.4.4 - '@vercel/analytics': 1.1.2 + '@vercel/analytics': 1.3.1(next@13.4.20-canary.15(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(react@18.3.1) '@vercel/blob': 0.9.3 '@vercel/kv': 0.2.4 - ai: 2.2.37(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21(typescript@5.3.3)) + ai: 2.2.37(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5)) clsx: 1.2.1 eslint: 8.36.0 eslint-config-next: 13.2.4(eslint@8.36.0)(typescript@4.9.5) eventsource-parser: 0.1.0 - lucide-react: 0.244.0(react@18.2.0) - next: 13.4.20-canary.15(@babel/core@7.23.9)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-markdown: 8.0.7(@types/react@18.0.28)(react@18.2.0) - sonner: 0.7.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + lucide-react: 0.244.0(react@18.3.1) + next: 13.4.20-canary.15(@babel/core@7.24.6)(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + react-markdown: 8.0.7(@types/react@18.0.28)(react@18.3.1) + sonner: 0.7.4(react-dom@18.2.0(react@18.3.1))(react@18.3.1) tailwind-merge: 1.14.0 tippy.js: 6.3.7 - tiptap-markdown: 0.8.9(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)) + tiptap-markdown: 0.8.10(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) typescript: 4.9.5 - use-debounce: 9.0.4(react@18.2.0) + use-debounce: 9.0.4(react@18.3.1) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -22810,7 +21412,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.2.0: + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -22820,14 +21422,15 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.7: {} + nwsapi@2.2.10: {} - nypm@0.3.6: + nypm@0.3.8: dependencies: citty: 0.1.6 + consola: 3.2.3 execa: 8.0.1 pathe: 1.1.2 - ufo: 1.4.0 + ufo: 1.5.3 oauth@0.10.0: {} @@ -22837,7 +21440,7 @@ snapshots: object-inspect@1.13.1: {} - object-is@1.1.5: + object-is@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -22851,44 +21454,36 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - object.entries@1.1.7: + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.0.0 - object.fromentries@2.0.7: + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - object.groupby@1.0.2: + object.groupby@1.0.3: dependencies: - array.prototype.filter: 1.0.3 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 - es-errors: 1.3.0 + es-abstract: 1.23.3 - object.hasown@1.1.3: + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 - es-abstract: 1.22.4 - - object.omit@3.0.0: - dependencies: - is-extendable: 1.0.1 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - object.values@1.1.7: + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.0.0 objectorarray@1.0.5: {} @@ -22925,9 +21520,9 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.33.0: + openai@4.47.2: dependencies: - '@types/node': 18.15.3 + '@types/node': 18.19.33 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -22938,14 +21533,14 @@ snapshots: transitivePeerDependencies: - encoding - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@5.4.1: dependencies: @@ -23051,17 +21646,18 @@ snapshots: dependencies: callsites: 3.1.0 - parse-asn1@5.1.6: + parse-asn1@5.1.7: dependencies: - asn1.js: 5.4.1 + asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 + hash-base: 3.0.4 pbkdf2: 3.1.2 safe-buffer: 5.2.1 parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -23139,10 +21735,10 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.2.2 + minipass: 7.1.2 path-to-regexp@0.1.7: {} @@ -23187,7 +21783,44 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.0.0: {} + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.6.2: {} + + pg-connection-string@2.6.4: {} + + pg-int8@1.0.1: {} + + pg-pool@3.6.2(pg@8.11.5): + dependencies: + pg: 8.11.5 + + pg-protocol@1.6.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.11.5: + dependencies: + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.11.5) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -23197,7 +21830,7 @@ snapshots: pify@4.0.1: {} - pino-abstract-transport@1.1.0: + pino-abstract-transport@1.2.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 @@ -23205,7 +21838,7 @@ snapshots: pino-http@9.0.0: dependencies: get-caller-file: 2.0.5 - pino: 8.18.0 + pino: 8.21.0 pino-std-serializers: 6.2.2 process-warning: 3.0.0 @@ -23213,38 +21846,38 @@ snapshots: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.2 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 minimist: 1.2.8 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 + pino-abstract-transport: 1.2.0 pump: 3.0.0 readable-stream: 4.5.2 secure-json-parse: 2.7.0 - sonic-boom: 3.8.0 + sonic-boom: 3.8.1 strip-json-comments: 3.1.1 pino-std-serializers@6.2.2: {} - pino@8.18.0: + pino@8.21.0: dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.3.0 + fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 + pino-abstract-transport: 1.2.0 pino-std-serializers: 6.2.2 process-warning: 3.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.0 - thread-stream: 2.4.1 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 pirates@4.0.6: {} - piscina@4.4.0: + piscina@4.5.1: optionalDependencies: nice-napi: 1.0.2 @@ -23264,32 +21897,27 @@ snapshots: dependencies: find-up: 6.3.0 - pkg-types@1.0.3: + pkg-types@1.1.1: dependencies: - jsonc-parser: 3.2.1 - mlly: 1.5.0 + confbox: 0.1.7 + mlly: 1.7.0 pathe: 1.1.2 pluralize@8.0.0: {} pngjs@5.0.0: {} - pnp-webpack-plugin@1.7.0(typescript@5.3.3): + pnp-webpack-plugin@1.7.0(typescript@5.4.5): dependencies: - ts-pnp: 1.2.0(typescript@5.3.3) + ts-pnp: 1.2.0(typescript@5.4.5) transitivePeerDependencies: - typescript polished@4.3.1: dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.24.6 - postcss-import@15.1.0(postcss@8.4.26): - dependencies: - postcss: 8.4.26 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 + possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.4.38): dependencies: @@ -23298,79 +21926,64 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.26): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.26 - postcss-js@4.0.1(postcss@8.4.38): dependencies: camelcase-css: 2.0.1 postcss: 8.4.38 - postcss-load-config@4.0.2(postcss@8.4.26)(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5)): dependencies: - lilconfig: 3.1.0 - yaml: 2.3.4 + lilconfig: 3.1.1 + yaml: 2.4.2 optionalDependencies: - postcss: 8.4.26 - ts-node: 10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3) + postcss: 8.4.38 + ts-node: 10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)): dependencies: - lilconfig: 3.1.0 - yaml: 2.3.4 + lilconfig: 3.1.1 + yaml: 2.4.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5) - postcss-loader@7.3.4(postcss@8.4.26)(typescript@5.3.3)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + postcss-loader@7.3.4(postcss@8.4.38)(typescript@5.4.5)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.4.5) jiti: 1.21.0 - postcss: 8.4.26 - semver: 7.6.0 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + postcss: 8.4.38 + semver: 7.6.2 + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) transitivePeerDependencies: - typescript - postcss-modules-extract-imports@3.0.0(postcss@8.4.38): + postcss-modules-extract-imports@3.1.0(postcss@8.4.38): dependencies: postcss: 8.4.38 - postcss-modules-local-by-default@4.0.4(postcss@8.4.38): + postcss-modules-local-by-default@4.0.5(postcss@8.4.38): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.1.1(postcss@8.4.38): + postcss-modules-scope@3.2.0(postcss@8.4.38): dependencies: postcss: 8.4.38 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.1.0 postcss-modules-values@4.0.0(postcss@8.4.38): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 - postcss-nested@6.0.1(postcss@8.4.26): - dependencies: - postcss: 8.4.26 - postcss-selector-parser: 6.0.15 - postcss-nested@6.0.1(postcss@8.4.38): dependencies: postcss: 8.4.38 - postcss-selector-parser: 6.0.15 - - postcss-selector-parser@6.0.15: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + postcss-selector-parser: 6.1.0 - postcss-selector-parser@6.0.16: + postcss-selector-parser@6.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -23380,46 +21993,57 @@ snapshots: postcss@8.4.14: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.26: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.35: + postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.38: + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + xtend: 4.0.2 - posthog-js@1.131.4: + posthog-js@1.136.2: dependencies: fflate: 0.4.8 - preact: 10.21.0 + preact: 10.22.0 - preact@10.21.0: {} + preact@10.22.0: {} + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.63.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} prettier@2.8.8: {} - prettier@3.2.5: {} - pretty-error@4.0.0: dependencies: lodash: 4.17.21 @@ -23435,7 +22059,7 @@ snapshots: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 pretty-hrtime@1.0.3: {} @@ -23451,19 +22075,19 @@ snapshots: display-notification: 2.0.0 fixpack: 4.0.0 get-port: 5.1.1 - mailparser: 3.6.7 - nodemailer: 6.9.10 + mailparser: 3.7.1 + nodemailer: 6.9.13 open: 7.4.2 p-event: 4.2.0 p-wait-for: 3.2.0 - pug: 3.0.2 + pug: 3.0.3 uuid: 9.0.1 - prism-react-renderer@2.1.0(react@18.2.0): + prism-react-renderer@2.1.0(react@18.3.1): dependencies: - '@types/prismjs': 1.26.3 + '@types/prismjs': 1.26.4 clsx: 1.2.1 - react: 18.2.0 + react: 18.3.1 prisma-dbml-generator@0.12.0: dependencies: @@ -23473,9 +22097,9 @@ snapshots: - encoding - supports-color - prisma@5.10.2: + prisma@5.14.0: dependencies: - '@prisma/engines': 5.10.2 + '@prisma/engines': 5.14.0 prismjs@1.29.0: {} @@ -23504,11 +22128,11 @@ snapshots: property-expr@2.0.6: {} - property-information@6.4.1: {} + property-information@6.5.0: {} prosemirror-changeset@2.2.1: dependencies: - prosemirror-transform: 1.8.0 + prosemirror-transform: 1.9.0 prosemirror-collab@1.3.1: dependencies: @@ -23516,98 +22140,97 @@ snapshots: prosemirror-commands@1.5.2: dependencies: - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 + prosemirror-transform: 1.9.0 prosemirror-dropcursor@1.8.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 - prosemirror-view: 1.33.1 + prosemirror-transform: 1.9.0 + prosemirror-view: 1.33.7 prosemirror-gapcursor@1.3.2: dependencies: prosemirror-keymap: 1.2.2 - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.1 + prosemirror-view: 1.33.7 - prosemirror-history@1.3.2: + prosemirror-history@1.4.0: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 - prosemirror-view: 1.33.1 + prosemirror-transform: 1.9.0 + prosemirror-view: 1.33.7 rope-sequence: 1.3.4 prosemirror-inputrules@1.4.0: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 + prosemirror-transform: 1.9.0 prosemirror-keymap@1.2.2: dependencies: prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 - prosemirror-markdown@1.12.0: + prosemirror-markdown@1.13.0: dependencies: - markdown-it: 14.0.0 - prosemirror-model: 1.19.4 + markdown-it: 14.1.0 + prosemirror-model: 1.21.0 prosemirror-menu@1.2.4: dependencies: crelt: 1.0.6 prosemirror-commands: 1.5.2 - prosemirror-history: 1.3.2 + prosemirror-history: 1.4.0 prosemirror-state: 1.4.3 - prosemirror-model@1.19.4: + prosemirror-model@1.21.0: dependencies: orderedmap: 2.1.1 prosemirror-schema-basic@1.2.2: dependencies: - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-schema-list@1.3.0: dependencies: - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 + prosemirror-transform: 1.9.0 prosemirror-state@1.4.3: dependencies: - prosemirror-model: 1.19.4 - prosemirror-transform: 1.8.0 - prosemirror-view: 1.33.1 + prosemirror-model: 1.21.0 + prosemirror-transform: 1.9.0 + prosemirror-view: 1.33.7 - prosemirror-tables@1.3.5: + prosemirror-tables@1.3.7: dependencies: prosemirror-keymap: 1.2.2 - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 - prosemirror-view: 1.33.1 + prosemirror-transform: 1.9.0 + prosemirror-view: 1.33.7 - prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.1): + prosemirror-trailing-node@2.0.8(prosemirror-model@1.21.0)(prosemirror-state@1.4.3)(prosemirror-view@1.33.7): dependencies: '@remirror/core-constants': 2.0.2 - '@remirror/core-helpers': 3.0.0 escape-string-regexp: 4.0.0 - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.1 + prosemirror-view: 1.33.7 - prosemirror-transform@1.8.0: + prosemirror-transform@1.9.0: dependencies: - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 - prosemirror-view@1.33.1: + prosemirror-view@1.33.7: dependencies: - prosemirror-model: 1.19.4 + prosemirror-model: 1.21.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.8.0 + prosemirror-transform: 1.9.0 proto-list@1.2.4: {} @@ -23627,7 +22250,7 @@ snapshots: bn.js: 4.12.0 browserify-rsa: 4.1.0 create-hash: 1.2.0 - parse-asn1: 5.1.6 + parse-asn1: 5.1.7 randombytes: 2.1.0 safe-buffer: 5.2.1 @@ -23637,24 +22260,24 @@ snapshots: js-stringify: 1.0.2 pug-runtime: 3.0.1 - pug-code-gen@3.0.2: + pug-code-gen@3.0.3: dependencies: constantinople: 4.0.1 doctypes: 1.1.0 js-stringify: 1.0.2 pug-attrs: 3.0.0 - pug-error: 2.0.0 + pug-error: 2.1.0 pug-runtime: 3.0.1 void-elements: 3.1.0 with: 7.0.2 - pug-error@2.0.0: {} + pug-error@2.1.0: {} pug-filters@4.0.0: dependencies: constantinople: 4.0.1 jstransformer: 1.0.0 - pug-error: 2.0.0 + pug-error: 2.1.0 pug-walk: 2.0.0 resolve: 1.22.8 @@ -23662,11 +22285,11 @@ snapshots: dependencies: character-parser: 2.2.0 is-expression: 4.0.0 - pug-error: 2.0.0 + pug-error: 2.1.0 pug-linker@4.0.0: dependencies: - pug-error: 2.0.0 + pug-error: 2.1.0 pug-walk: 2.0.0 pug-load@3.0.0: @@ -23676,20 +22299,20 @@ snapshots: pug-parser@6.0.0: dependencies: - pug-error: 2.0.0 + pug-error: 2.1.0 token-stream: 1.0.0 pug-runtime@3.0.1: {} pug-strip-comments@2.0.0: dependencies: - pug-error: 2.0.0 + pug-error: 2.1.0 pug-walk@2.0.0: {} - pug@3.0.2: + pug@3.0.3: dependencies: - pug-code-gen: 3.0.2 + pug-code-gen: 3.0.3 pug-filters: 4.0.0 pug-lexer: 5.0.1 pug-linker: 4.0.0 @@ -23723,7 +22346,7 @@ snapshots: puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.4 - debug: 4.3.4 + debug: 4.3.5 extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -23746,11 +22369,11 @@ snapshots: qs@6.11.0: dependencies: - side-channel: 1.0.5 + side-channel: 1.0.6 - qs@6.11.2: + qs@6.12.1: dependencies: - side-channel: 1.0.5 + side-channel: 1.0.6 querystring-es3@0.2.1: {} @@ -23758,14 +22381,14 @@ snapshots: queue-microtask@1.2.3: {} + queue-tick@1.0.1: {} + queue@6.0.2: dependencies: inherits: 2.0.4 quick-format-unescaped@4.0.4: {} - quick-lru@4.0.1: {} - quick-lru@5.1.1: {} raf@3.4.1: @@ -23788,13 +22411,6 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -23809,37 +22425,37 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-colorful@5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - react-confetti@6.1.0(react@18.2.0): + react-confetti@6.1.0(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 tween-functions: 1.2.0 - react-day-picker@8.9.1(date-fns@2.30.0)(react@18.2.0): + react-day-picker@8.10.1(date-fns@2.30.0)(react@18.3.1): dependencies: date-fns: 2.30.0 - react: 18.2.0 + react: 18.3.1 - react-docgen-typescript@2.2.2(typescript@5.3.3): + react-docgen-typescript@2.2.2(typescript@5.4.5): dependencies: - typescript: 5.3.3 + typescript: 5.4.5 - react-docgen@5.4.3: + react-docgen@7.0.3: dependencies: - '@babel/core': 7.23.9 - '@babel/generator': 7.23.6 - '@babel/runtime': 7.24.1 - ast-types: 0.14.2 - commander: 2.20.3 + '@babel/core': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 doctrine: 3.0.0 - estree-to-babel: 3.2.1 - neo-async: 2.6.2 - node-dir: 0.1.17 - strip-indent: 3.0.0 + resolve: 1.22.8 + strip-indent: 4.0.0 transitivePeerDependencies: - supports-color @@ -23847,31 +22463,43 @@ snapshots: dependencies: loose-envify: 1.4.0 react: 18.2.0 - scheduler: 0.23.0 + scheduler: 0.23.2 + + react-dom@18.2.0(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 - react-element-to-jsx-string@15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@base2/pretty-print-object': 1.0.1 is-plain-object: 5.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) react-is: 18.1.0 - react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)): + react-email@2.1.4(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)): dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 '@radix-ui/colors': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-popover': 1.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-email/components': 0.0.15(@types/react@18.2.74)(react-email@2.1.0(@opentelemetry/api@1.4.1)(@swc/helpers@0.5.5)(eslint@8.57.0)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)))(react@18.2.0) - '@react-email/render': 0.0.12 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/core': 1.3.101(@swc/helpers@0.5.5) - '@types/react': 18.2.74 - '@types/react-dom': 18.2.24 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 '@types/webpack': 5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.5))(esbuild@0.19.11) - autoprefixer: 10.4.14(postcss@8.4.35) + autoprefixer: 10.4.14(postcss@8.4.38) chalk: 4.1.2 chokidar: 3.5.3 clsx: 2.1.0 @@ -23880,29 +22508,27 @@ snapshots: esbuild: 0.19.11 eslint-config-prettier: 9.0.0(eslint@8.57.0) eslint-config-turbo: 1.10.12(eslint@8.57.0) - framer-motion: 10.17.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + framer-motion: 10.17.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 mime-types: 2.1.35 - next: 14.1.0(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.1.4(@babel/core@7.24.5)(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) normalize-path: 3.0.0 ora: 5.4.1 - postcss: 8.4.35 - prism-react-renderer: 2.1.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + postcss: 8.4.38 + prism-react-renderer: 2.1.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) shelljs: 0.8.5 socket.io: 4.7.3 socket.io-client: 4.7.3 - sonner: 1.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + sonner: 1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) source-map-js: 1.0.2 stacktrace-parser: 0.1.10 tailwind-merge: 2.2.0 - tailwindcss: 3.4.0(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)) - tree-cli: 0.6.7 + tailwindcss: 3.4.0(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)) typescript: 5.1.6 transitivePeerDependencies: - - '@babel/core' - '@opentelemetry/api' - '@swc/helpers' - babel-plugin-macros @@ -23915,17 +22541,13 @@ snapshots: - utf-8-validate - webpack-cli - react-hook-form@7.43.4(react@18.2.0): + react-hook-form@7.51.5(react@18.3.1): dependencies: - react: 18.2.0 - - react-icons@4.8.0(react@18.2.0): - dependencies: - react: 18.2.0 + react: 18.3.1 - react-inspector@6.0.2(react@18.2.0): + react-icons@4.12.0(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 react-is@16.13.1: {} @@ -23933,9 +22555,9 @@ snapshots: react-is@18.1.0: {} - react-is@18.2.0: {} + react-is@18.3.1: {} - react-markdown@8.0.7(@types/react@18.0.28)(react@18.2.0): + react-markdown@8.0.7(@types/react@18.0.28)(react@18.3.1): dependencies: '@types/hast': 2.3.10 '@types/prop-types': 15.7.12 @@ -23944,9 +22566,9 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 prop-types: 15.8.1 - property-information: 6.4.1 - react: 18.2.0 - react-is: 18.2.0 + property-information: 6.5.0 + react: 18.3.1 + react-is: 18.3.1 remark-parse: 10.0.2 remark-rehype: 10.1.0 space-separated-tokens: 2.0.2 @@ -23957,103 +22579,105 @@ snapshots: transitivePeerDependencies: - supports-color - react-modern-drawer@1.2.2(react@18.2.0): + react-modern-drawer@1.3.1(react@18.3.1): dependencies: - react: 18.2.0 - - react-refresh@0.11.0: {} + react: 18.3.1 - react-refresh@0.14.0: {} + react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.4(@types/react@18.0.28)(react@18.2.0): + react-remove-scroll-bar@2.3.6(@types/react@18.0.28)(react@18.3.1): dependencies: - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.0.28)(react@18.2.0) + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.0.28)(react@18.3.1) tslib: 2.6.2 optionalDependencies: '@types/react': 18.0.28 - react-remove-scroll-bar@2.3.4(@types/react@18.2.74)(react@18.2.0): + react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): dependencies: - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.74)(react@18.2.0) + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - react-remove-scroll@2.5.5(@types/react@18.0.28)(react@18.2.0): + react-remove-scroll@2.5.5(@types/react@18.0.28)(react@18.3.1): dependencies: - react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.0.28)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.0.28)(react@18.2.0) + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.0.28)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.0.28)(react@18.3.1) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.0.28)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.0.28)(react@18.2.0) + use-callback-ref: 1.3.2(@types/react@18.0.28)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.0.28)(react@18.3.1) optionalDependencies: '@types/react': 18.0.28 - react-remove-scroll@2.5.5(@types/react@18.2.74)(react@18.2.0): + react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1): dependencies: - react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.74)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.74)(react@18.2.0) + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.74)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.74)(react@18.2.0) + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - react-smooth@4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-style-singleton@2.2.1(@types/react@18.0.28)(react@18.2.0): + react-style-singleton@2.2.1(@types/react@18.0.28)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: '@types/react': 18.0.28 - react-style-singleton@2.2.1(@types/react@18.2.74)(react@18.2.0): + react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - react-to-pdf@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-to-pdf@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: html2canvas: 1.4.1 jspdf: 2.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - react-to-print@2.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-to-print@2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) react@18.2.0: dependencies: loose-envify: 1.4.0 + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -24109,57 +22733,49 @@ snapshots: real-require@0.2.0: {} - recast@0.21.5: - dependencies: - ast-types: 0.15.2 - esprima: 4.0.1 - source-map: 0.6.1 - tslib: 2.6.2 - - recast@0.23.4: + recast@0.23.8: dependencies: - assert: 2.1.0 ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 + tiny-invariant: 1.3.3 tslib: 2.6.2 recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 - recharts@2.12.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + recharts@2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - clsx: 2.1.0 + clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.17.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 - react-smooth: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-smooth: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts-scale: 0.4.5 - tiny-invariant: 1.3.1 - victory-vendor: 36.9.1 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 rechoir@0.6.2: dependencies: resolve: 1.22.8 - redent@3.0.0: + rechoir@0.8.0: dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 + resolve: 1.22.8 - reflect-metadata@0.2.1: {} + reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.5: + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 which-builtin-type: 1.1.3 regenerate-unicode-properties@10.1.1: @@ -24175,7 +22791,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 regex-parser@2.3.0: {} @@ -24184,7 +22800,7 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.1 + set-function-name: 2.0.2 regexpu-core@5.3.2: dependencies: @@ -24316,51 +22932,35 @@ snapshots: dependencies: glob: 9.3.5 - rimraf@5.0.5: + rimraf@5.0.7: dependencies: - glob: 10.3.10 + glob: 10.4.1 ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 - rollup@4.12.0: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 - fsevents: 2.3.3 - - rollup@4.13.0: + rollup@4.18.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -24387,15 +22987,13 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.0: + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - safe-buffer@5.1.1: {} - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -24410,19 +23008,19 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@12.6.0(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + sass-loader@12.6.0(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) - sax@1.3.0: {} + sax@1.4.1: {} saxes@6.0.0: dependencies: xmlchars: 2.2.0 - scheduler@0.23.0: + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -24435,9 +23033,9 @@ snapshots: schema-utils@4.2.0: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) + ajv: 8.14.0 + ajv-formats: 2.1.1(ajv@8.14.0) + ajv-keywords: 5.1.0(ajv@8.14.0) secure-json-parse@2.7.0: {} @@ -24453,15 +23051,13 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.2 semver@5.7.2: {} semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.2: {} send@0.18.0: dependencies: @@ -24485,19 +23081,11 @@ snapshots: dependencies: randombytes: 2.1.0 - seroval-plugins@1.0.5(seroval@1.0.5): + seroval-plugins@1.0.7(seroval@1.0.7): dependencies: - seroval: 1.0.5 - - seroval@1.0.5: {} + seroval: 1.0.7 - serve-favicon@2.5.0: - dependencies: - etag: 1.8.1 - fresh: 0.5.2 - ms: 2.1.1 - parseurl: 1.3.3 - safe-buffer: 5.1.1 + seroval@1.0.7: {} serve-static@1.15.0: dependencies: @@ -24512,7 +23100,7 @@ snapshots: set-blocking@2.0.0: {} - set-function-length@1.2.1: + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -24521,9 +23109,10 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.1: + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 @@ -24540,6 +23129,17 @@ snapshots: dependencies: kind-of: 6.0.3 + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 6.1.0 + prebuild-install: 7.1.2 + semver: 7.6.2 + simple-get: 4.0.1 + tar-fs: 3.0.6 + tunnel-agent: 0.6.0 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -24552,15 +23152,13 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} - shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - side-channel@1.0.5: + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 @@ -24573,9 +23171,17 @@ snapshots: signal-exit@4.1.0: {} - simple-update-notifier@2.0.0: + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: dependencies: - semver: 7.6.0 + is-arrayish: 0.3.2 sisteransi@1.0.5: {} @@ -24591,7 +23197,7 @@ snapshots: socket.io-adapter@2.5.4: dependencies: - debug: 4.3.4 + debug: 4.3.5 ws: 8.11.0 transitivePeerDependencies: - bufferutil @@ -24600,8 +23206,8 @@ snapshots: socket.io-client@4.7.3: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 engine.io-client: 6.5.3 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -24611,8 +23217,8 @@ snapshots: socket.io-parser@4.2.4: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -24621,7 +23227,7 @@ snapshots: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.5 engine.io: 6.5.4 socket.io-adapter: 2.5.4 socket.io-parser: 4.2.4 @@ -24630,35 +23236,35 @@ snapshots: - supports-color - utf-8-validate - solid-js@1.8.16: + solid-js@1.8.17: dependencies: csstype: 3.1.3 - seroval: 1.0.5 - seroval-plugins: 1.0.5(seroval@1.0.5) + seroval: 1.0.7 + seroval-plugins: 1.0.7(seroval@1.0.7) - solid-swr-store@0.10.7(solid-js@1.8.16)(swr-store@0.10.6): + solid-swr-store@0.10.7(solid-js@1.8.17)(swr-store@0.10.6): dependencies: - solid-js: 1.8.16 + solid-js: 1.8.17 swr-store: 0.10.6 - sonic-boom@3.8.0: + sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 - sonner@0.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + sonner@0.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - sonner@0.7.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + sonner@0.7.4(react-dom@18.2.0(react@18.3.1))(react@18.3.1): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) - sonner@1.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + sonner@1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) sort-keys-length@1.0.1: dependencies: @@ -24685,29 +23291,27 @@ snapshots: space-separated-tokens@2.0.2: {} - spawn-command@0.0.2: {} - spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 - spdx-license-ids@3.0.17: {} + spdx-license-ids@3.0.18: {} split2@4.2.0: {} sprintf-js@1.0.3: {} - sswr@2.0.0(svelte@4.2.12): + sswr@2.0.0(svelte@4.2.17): dependencies: - svelte: 4.2.12 + svelte: 4.2.17 swrev: 4.0.0 stack-utils@2.0.6: @@ -24733,11 +23337,11 @@ snapshots: dependencies: internal-slot: 1.0.7 - store2@2.14.2: {} + store2@2.14.3: {} - storybook@7.4.0: + storybook@7.6.19: dependencies: - '@storybook/cli': 7.4.0 + '@storybook/cli': 7.6.19 transitivePeerDependencies: - bufferutil - encoding @@ -24760,6 +23364,14 @@ snapshots: streamsearch@1.1.0: {} + streamx@2.18.0: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.0 + optionalDependencies: + bare-events: 2.3.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -24772,35 +23384,39 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.10: + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.1 - side-channel: 1.0.5 + set-function-name: 2.0.2 + side-channel: 1.0.6 - string.prototype.trim@1.2.8: + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.7: + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.7: + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.0.0 string_decoder@1.1.1: dependencies: @@ -24810,10 +23426,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -24834,20 +23446,24 @@ snapshots: dependencies: min-indent: 1.0.1 + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strip-literal@1.3.0: + strip-literal@2.1.0: dependencies: - acorn: 8.11.3 + js-tokens: 9.0.0 strip-outer@2.0.0: {} - stripe@14.18.0: + stripe@14.25.0: dependencies: - '@types/node': 20.11.30 - qs: 6.11.2 + '@types/node': 20.12.13 + qs: 6.12.1 strnum@1.0.5: {} @@ -24856,33 +23472,38 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.0.0 - style-loader@3.3.4(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + style-loader@3.3.4(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - styled-jsx@5.1.1(@babel/core@7.23.9)(react@18.2.0): + styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): dependencies: client-only: 0.0.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.24.5 + + styled-jsx@5.1.1(@babel/core@7.24.6)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.6 sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.4.1 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - supports-color@2.0.0: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -24902,11 +23523,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte@4.2.12: + svelte@4.2.17: dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 acorn: 8.11.3 aria-query: 5.3.0 @@ -24916,7 +23537,7 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.7 + magic-string: 0.30.10 periscopic: 3.1.0 svg-pathdata@6.0.3: @@ -24924,26 +23545,26 @@ snapshots: swagger-ui-dist@5.11.2: {} - swc-loader@0.2.6(@swc/core@1.4.8(@swc/helpers@0.5.5))(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + swc-loader@0.2.6(@swc/core@1.5.24(@swc/helpers@0.5.5))(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: - '@swc/core': 1.4.8(@swc/helpers@0.5.5) + '@swc/core': 1.5.24(@swc/helpers@0.5.5) '@swc/counter': 0.1.3 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) swr-store@0.10.6: dependencies: dequal: 2.0.3 - swr@2.2.0(react@18.2.0): + swr@2.2.0(react@18.3.1): dependencies: - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) swrev@4.0.0: {} - swrv@1.0.4(vue@3.4.21(typescript@5.3.3)): + swrv@1.0.4(vue@3.4.27(typescript@5.4.5)): dependencies: - vue: 3.4.21(typescript@5.3.3) + vue: 3.4.27(typescript@5.4.5) symbol-observable@4.0.0: {} @@ -24951,19 +23572,17 @@ snapshots: synchronous-promise@2.0.17: {} - tailwind-merge@1.13.2: {} - tailwind-merge@1.14.0: {} tailwind-merge@2.2.0: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.6 - tailwindcss-animate@1.0.6(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5))): dependencies: - tailwindcss: 3.3.3(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3)) + tailwindcss: 3.4.3(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5)) - tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3)): + tailwindcss@3.4.0(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -24975,22 +23594,22 @@ snapshots: is-glob: 4.0.3 jiti: 1.21.0 lilconfig: 2.1.0 - micromatch: 4.0.5 + micromatch: 4.0.7 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.26 - postcss-import: 15.1.0(postcss@8.4.26) - postcss-js: 4.0.1(postcss@8.4.26) - postcss-load-config: 4.0.2(postcss@8.4.26)(ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3)) - postcss-nested: 6.0.1(postcss@8.4.26) - postcss-selector-parser: 6.0.15 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5)) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - tailwindcss@3.4.0(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)): + tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -25002,16 +23621,16 @@ snapshots: is-glob: 4.0.3 jiti: 1.21.0 lilconfig: 2.1.0 - micromatch: 4.0.5 + micromatch: 4.0.7 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5)) postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -25026,6 +23645,14 @@ snapshots: pump: 3.0.0 tar-stream: 2.2.0 + tar-fs@3.0.6: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.0 + bare-path: 2.1.3 + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -25034,7 +23661,13 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar@6.2.0: + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.18.0 + + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -25043,6 +23676,8 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tarn@3.0.2: {} + telejson@7.2.0: dependencies: memoizerific: 1.11.3 @@ -25078,55 +23713,42 @@ snapshots: terser-webpack-plugin@5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.5))(esbuild@0.19.11)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.5))(esbuild@0.19.11)): dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.27.1 + terser: 5.31.0 webpack: 5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.5))(esbuild@0.19.11) optionalDependencies: '@swc/core': 1.3.101(@swc/helpers@0.5.5) esbuild: 0.19.11 - terser-webpack-plugin@5.3.10(@swc/core@1.4.2(@swc/helpers@0.5.5))(webpack@5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5))): - dependencies: - '@jridgewell/trace-mapping': 0.3.22 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.27.1 - webpack: 5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5)) - optionalDependencies: - '@swc/core': 1.4.2(@swc/helpers@0.5.5) - - terser-webpack-plugin@5.3.10(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + terser-webpack-plugin@5.3.10(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.27.1 - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + terser: 5.31.0 + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) optionalDependencies: - '@swc/core': 1.4.8(@swc/helpers@0.5.5) + '@swc/core': 1.5.24(@swc/helpers@0.5.5) esbuild: 0.18.20 - terser-webpack-plugin@5.3.10(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.91.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + terser-webpack-plugin@5.3.10(@swc/core@1.5.24(@swc/helpers@0.5.5))(webpack@5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5))): dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.27.1 - webpack: 5.91.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + terser: 5.31.0 + webpack: 5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5)) optionalDependencies: - '@swc/core': 1.4.8(@swc/helpers@0.5.5) - esbuild: 0.18.20 - optional: true + '@swc/core': 1.5.24(@swc/helpers@0.5.5) - terser@5.27.1: + terser@5.31.0: dependencies: - '@jridgewell/source-map': 0.3.5 + '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -25137,6 +23759,10 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.1.0: + dependencies: + b4a: 1.6.6 + text-segmentation@1.0.3: dependencies: utrie: 1.0.2 @@ -25151,12 +23777,10 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@2.4.1: + thread-stream@2.7.0: dependencies: real-require: 0.2.0 - throttle-debounce@3.0.1: {} - through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -25164,17 +23788,19 @@ snapshots: through@2.3.8: {} + tildify@2.0.0: {} + timers-browserify@2.0.12: dependencies: setimmediate: 1.0.5 tiny-case@1.0.3: {} - tiny-invariant@1.3.1: {} + tiny-invariant@1.3.3: {} - tinybench@2.6.0: {} + tinybench@2.8.0: {} - tinypool@0.8.2: {} + tinypool@0.8.4: {} tinyspy@2.2.1: {} @@ -25182,15 +23808,15 @@ snapshots: dependencies: '@popperjs/core': 2.11.8 - tiptap-markdown@0.8.9(@tiptap/core@2.2.3(@tiptap/pm@2.2.3)): + tiptap-markdown@0.8.10(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)): dependencies: - '@tiptap/core': 2.2.3(@tiptap/pm@2.2.3) - '@types/markdown-it': 12.2.3 - markdown-it: 13.0.2 + '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) + '@types/markdown-it': 13.0.8 + markdown-it: 14.1.0 markdown-it-task-lists: 2.1.1 - prosemirror-markdown: 1.12.0 + prosemirror-markdown: 1.13.0 - tlds@1.248.0: {} + tlds@1.252.0: {} tmp@0.0.33: dependencies: @@ -25208,7 +23834,7 @@ snapshots: dependencies: is-number: 7.0.0 - tocbot@4.25.0: {} + tocbot@4.28.2: {} toidentifier@1.0.1: {} @@ -25221,7 +23847,7 @@ snapshots: toposort@2.0.2: {} - tough-cookie@4.1.3: + tough-cookie@4.1.4: dependencies: psl: 1.9.0 punycode: 2.3.1 @@ -25238,21 +23864,10 @@ snapshots: dependencies: punycode: 2.3.1 - tree-cli@0.6.7: - dependencies: - bluebird: 3.7.2 - chalk: 1.1.3 - cli-spinner: 0.2.10 - lodash.includes: 4.3.0 - meow: 7.1.1 - object-assign: 4.1.1 - tree-kill@1.2.2: {} trim-lines@3.0.1: {} - trim-newlines@3.0.1: {} - trim-repeated@2.0.0: dependencies: escape-string-regexp: 5.0.0 @@ -25263,57 +23878,57 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.4.2(@swc/helpers@0.5.5))(@types/node@20.11.20)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@18.19.33)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.20 + '@types/node': 18.19.33 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.4.2(@swc/helpers@0.5.5) + '@swc/core': 1.5.24(@swc/helpers@0.5.5) + optional: true - ts-node@10.9.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(@types/node@18.14.6)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.5.24(@swc/helpers@0.5.5))(@types/node@20.12.13)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.14.6 + '@types/node': 20.12.13 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.4.8(@swc/helpers@0.5.5) - optional: true + '@swc/core': 1.5.24(@swc/helpers@0.5.5) ts-pattern@4.3.0: {} - ts-pnp@1.2.0(typescript@5.3.3): + ts-pnp@1.2.0(typescript@5.4.5): optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 tsconfig-paths-webpack-plugin@4.1.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.16.1 tsconfig-paths: 4.2.0 tsconfig-paths@3.15.0: @@ -25338,13 +23953,12 @@ snapshots: tslib: 1.14.1 typescript: 4.9.5 - tsutils@3.21.0(typescript@5.3.3): - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - tty-browserify@0.0.1: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + turbo-darwin-64@1.13.3: optional: true @@ -25380,8 +23994,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.13.1: {} - type-fest@0.16.0: {} type-fest@0.20.2: {} @@ -25401,32 +24013,37 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.1: + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - typed-array-byte-length@1.0.0: + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 + gopd: 1.0.1 + has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.0: + typed-array-byte-offset@1.0.2: dependencies: - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 + gopd: 1.0.1 + has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-length@1.0.4: + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 typedarray@0.0.6: {} @@ -25436,11 +24053,11 @@ snapshots: typescript@5.3.3: {} - uc.micro@1.0.6: {} + typescript@5.4.5: {} - uc.micro@2.0.0: {} + uc.micro@2.1.0: {} - ufo@1.4.0: {} + ufo@1.5.3: {} uglify-js@3.17.4: {} @@ -25536,7 +24153,7 @@ snapshots: unpipe@1.0.0: {} - unplugin@1.7.1: + unplugin@1.10.1: dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -25545,11 +24162,11 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.0.16(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 upper-case@1.1.3: {} @@ -25565,51 +24182,51 @@ snapshots: url@0.11.3: dependencies: punycode: 1.4.1 - qs: 6.11.2 + qs: 6.12.1 - use-callback-ref@1.3.1(@types/react@18.0.28)(react@18.2.0): + use-callback-ref@1.3.2(@types/react@18.0.28)(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: '@types/react': 18.0.28 - use-callback-ref@1.3.1(@types/react@18.2.74)(react@18.2.0): + use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - use-debounce@9.0.4(react@18.2.0): + use-debounce@9.0.4(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 - use-resize-observer@9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + use-resize-observer@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@juggle/resize-observer': 3.4.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - use-sidecar@1.1.2(@types/react@18.0.28)(react@18.2.0): + use-sidecar@1.1.2(@types/react@18.0.28)(react@18.3.1): dependencies: detect-node-es: 1.1.0 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: '@types/react': 18.0.28 - use-sidecar@1.1.2(@types/react@18.2.74)(react@18.2.0): + use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): dependencies: detect-node-es: 1.1.0 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.74 + '@types/react': 18.3.3 - use-sync-external-store@1.2.0(react@18.2.0): + use-sync-external-store@1.2.2(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 util-deprecate@1.0.2: {} @@ -25619,7 +24236,7 @@ snapshots: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 utila@0.4.0: {} @@ -25631,8 +24248,6 @@ snapshots: uuid@3.4.0: {} - uuid@8.3.2: {} - uuid@9.0.0: {} uuid@9.0.1: {} @@ -25646,12 +24261,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.2.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.22 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - valid-data-url@3.0.1: {} validate-npm-package-license@3.0.4: @@ -25659,7 +24268,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validator@13.11.0: {} + validator@13.12.0: {} vary@1.1.2: {} @@ -25675,7 +24284,7 @@ snapshots: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - victory-vendor@36.9.1: + victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -25692,13 +24301,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@1.2.0(@types/node@18.14.6)(terser@5.27.1): + vite-node@1.6.0(@types/node@18.19.33)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.3.5 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.3(@types/node@18.14.6)(terser@5.27.1) + picocolors: 1.0.1 + vite: 5.2.12(@types/node@18.19.33)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - less @@ -25709,51 +24318,40 @@ snapshots: - supports-color - terser - vite@5.1.3(@types/node@18.14.6)(terser@5.27.1): - dependencies: - esbuild: 0.19.12 - postcss: 8.4.38 - rollup: 4.12.0 - optionalDependencies: - '@types/node': 18.14.6 - fsevents: 2.3.3 - terser: 5.27.1 - - vite@5.2.6(@types/node@18.14.6)(terser@5.27.1): + vite@5.2.12(@types/node@18.19.33)(terser@5.31.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.13.0 + rollup: 4.18.0 optionalDependencies: - '@types/node': 18.14.6 + '@types/node': 18.19.33 fsevents: 2.3.3 - terser: 5.27.1 + terser: 5.31.0 - vitest@1.2.0(@types/node@18.14.6)(jsdom@23.2.0)(terser@5.27.1): + vitest@1.6.0(@types/node@18.19.33)(jsdom@23.2.0)(terser@5.31.0): dependencies: - '@vitest/expect': 1.2.0 - '@vitest/runner': 1.2.0 - '@vitest/snapshot': 1.2.0 - '@vitest/spy': 1.2.0 - '@vitest/utils': 1.2.0 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 - cac: 6.7.14 chai: 4.4.1 - debug: 4.3.4 + debug: 4.3.5 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.7 + magic-string: 0.30.10 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 1.3.0 - tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.1.3(@types/node@18.14.6)(terser@5.27.1) - vite-node: 1.2.0(@types/node@18.14.6)(terser@5.27.1) + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.12(@types/node@18.19.33)(terser@5.31.0) + vite-node: 1.6.0(@types/node@18.19.33)(terser@5.31.0) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 18.14.6 + '@types/node': 18.19.33 jsdom: 23.2.0 transitivePeerDependencies: - less @@ -25768,15 +24366,15 @@ snapshots: void-elements@3.1.0: {} - vue@3.4.21(typescript@5.3.3): + vue@3.4.27(typescript@5.4.5): dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-sfc': 3.4.21 - '@vue/runtime-dom': 3.4.21 - '@vue/server-renderer': 3.4.21(vue@3.4.21(typescript@5.3.3)) - '@vue/shared': 3.4.21 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-sfc': 3.4.27 + '@vue/runtime-dom': 3.4.27 + '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.4.5)) + '@vue/shared': 3.4.27 optionalDependencies: - typescript: 5.3.3 + typescript: 5.4.5 w3c-keyname@2.2.8: {} @@ -25825,7 +24423,7 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@6.1.1(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)): + webpack-dev-middleware@6.1.3(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -25833,12 +24431,12 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20) + webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) webpack-hot-middleware@2.26.1: dependencies: ansi-html-community: 0.0.8 - html-entities: 2.4.0 + html-entities: 2.5.2 strip-ansi: 6.0.1 webpack-node-externals@3.0.0: {} @@ -25849,50 +24447,19 @@ snapshots: webpack-virtual-modules@0.6.1: {} - webpack@5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5)): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.2(@swc/helpers@0.5.5))(webpack@5.90.1(@swc/core@1.4.2(@swc/helpers@0.5.5))) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20): + webpack@5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.16.1 + es-module-lexer: 1.5.3 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -25903,8 +24470,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.90.2(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) - watchpack: 2.4.0 + terser-webpack-plugin: 5.3.10(@swc/core@1.5.24(@swc/helpers@0.5.5))(webpack@5.90.1(@swc/core@1.5.24(@swc/helpers@0.5.5))) + watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -25921,9 +24488,9 @@ snapshots: acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.4.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.16.1 + es-module-lexer: 1.5.3 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -25942,7 +24509,7 @@ snapshots: - esbuild - uglify-js - webpack@5.91.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20): + webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -25952,9 +24519,9 @@ snapshots: acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.4.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.16.1 + es-module-lexer: 1.5.3 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -25965,14 +24532,13 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.91.0(@swc/core@1.4.8(@swc/helpers@0.5.5))(esbuild@0.18.20)) + terser-webpack-plugin: 5.3.10(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)(webpack@5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - optional: true whatwg-encoding@2.0.0: dependencies: @@ -26021,21 +24587,21 @@ snapshots: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 - which-collection@1.0.1: + which-collection@1.0.2: dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 which-module@2.0.1: {} - which-typed-array@1.1.14: + which-typed-array@1.1.15: dependencies: - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 @@ -26056,11 +24622,13 @@ snapshots: with@7.0.2: dependencies: - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 + word-wrap@1.2.5: {} + wordwrap@1.0.0: {} wrap-ansi@6.2.0: @@ -26100,7 +24668,7 @@ snapshots: ws@8.11.0: {} - ws@8.16.0: {} + ws@8.17.0: {} xml-crypto@6.0.0: dependencies: @@ -26120,7 +24688,7 @@ snapshots: xml2js@0.6.2: dependencies: - sax: 1.3.0 + sax: 1.4.1 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {} @@ -26151,15 +24719,13 @@ snapshots: yaml@1.10.2: {} - yaml@2.3.4: {} + yaml@2.4.2: {} yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} yargs@15.4.1: @@ -26176,16 +24742,6 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -26207,7 +24763,7 @@ snapshots: yocto-queue@1.0.0: {} - yup@1.0.2: + yup@1.4.0: dependencies: property-expr: 2.0.6 tiny-case: 1.0.3 @@ -26220,10 +24776,10 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-to-json-schema@3.22.5(zod@3.22.4): + zod-to-json-schema@3.23.0(zod@3.23.8): dependencies: - zod: 3.22.4 + zod: 3.23.8 zod@3.21.4: {} - zod@3.22.4: {} + zod@3.23.8: {} From 32950ec3ccc2171dd762915a5d57236d66f56195 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 10:39:48 +0530 Subject: [PATCH 02/61] feat: support orderBy in BaseModel fix: reduce log level fix: add ts check on dev:new (TODO: Need to fix all type errors) feat: added new Error handler --- .gitignore | 1 + apps/api/package.json | 2 + apps/api/src/BaseContext.ts | 8 ++ apps/api/src/main.ts | 4 +- apps/api/src/models/BaseModel.ts | 185 ++++++++++++++++++++-------- apps/api/src/modules/root.module.ts | 2 +- apps/api/src/utils/error.ts | 148 ++++++++++++++++++++++ apps/api/tsconfig.json | 1 - pnpm-lock.yaml | 30 +++++ 9 files changed, 327 insertions(+), 54 deletions(-) create mode 100644 apps/api/src/utils/error.ts diff --git a/.gitignore b/.gitignore index 4acb27a0..8a77cb09 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ tmp /dist apps/api/dist +apps/api/prisma/seed.js # testing /coverage diff --git a/apps/api/package.json b/apps/api/package.json index 67556865..76fcd0ed 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -9,6 +9,7 @@ "build": "npx prisma generate && nest build", "start": "nest start", "dev": "node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty", + "dev-new": "concurrently \"tsc --noEmit --watch\" \"node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty \"", "start:prod": "node dist/main", "db:seed": "ts-node prisma/seed.ts" }, @@ -73,6 +74,7 @@ "@types/passport-google-oauth20": "^2.0.14", "@types/passport-jwt": "^4.0.1", "@types/react": "^18.2.58", + "concurrently": "^8.2.2", "prisma": "^5.10.2", "react": "^18.3.1", "ts-node": "^10.9.2", diff --git a/apps/api/src/BaseContext.ts b/apps/api/src/BaseContext.ts index bb8dc513..592d6f6d 100644 --- a/apps/api/src/BaseContext.ts +++ b/apps/api/src/BaseContext.ts @@ -32,4 +32,12 @@ export default class BaseContext { public async destroy() { await BaseContext.knex.destroy(); } + + public async getTransaction() { + return BaseContext.knex.transaction(); + } + + public async commitTransaction(trx: Knex.Transaction) { + await trx.commit(); + } } diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 45faf24f..fd27bc93 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -10,9 +10,7 @@ import BaseContext from '@api/BaseContext'; import { NestExpressApplication } from '@nestjs/platform-express'; async function bootstrap() { - const app = await NestFactory.create(AppModule, { - bufferLogs: true, - }); + const app = await NestFactory.create(AppModule); await BaseContext.init(); diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index d4b662c4..16e9fcd1 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -1,7 +1,16 @@ import BaseContext from '@api/BaseContext'; -import { Logger } from '@nestjs/common'; -import { generateID, SystemTable } from '@api/utils/db'; import { CreateSchema, UpdateSchema } from '@api/db/schema'; +import { SystemTable, generateID } from '@api/utils/db'; +import { Logger } from '@nestjs/common'; +import { DatabaseError } from '@api/utils/error'; +import { Knex } from 'knex'; + +export type OrderBy = { + [K in keyof M]: { + order: 'asc' | 'desc'; + nulls?: 'first' | 'last'; + }; +}; export default function createBaseModel( tableName: SystemTable, @@ -13,90 +22,168 @@ export default function createBaseModel( this.logger = logger || new Logger(); } - static async findById(id: string): Promise { - const data = await BaseContext.knex(tableName) - .where(id) - .andWhere('is_deleted', false) - .first(); - return (data as M) || null; + static async findById(id: string, trx?: Knex): Promise { + try { + const data = await (trx ?? BaseContext.knex)(tableName) + .where(id) + .andWhere('is_deleted', false) + .first(); + return (data as M) || null; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } - static async find(where: Partial): Promise { - const data = await BaseContext.knex(tableName) - .where(where) - .andWhere('is_deleted', false); - return data as M[]; + static async find( + where: Partial, + orderBy?: OrderBy, + trx?: Knex, + ): Promise { + try { + const qb = (trx ?? BaseContext.knex)(tableName) + .where(where) + .andWhere('is_deleted', false); + if (orderBy) { + for (const [key, value] of Object.entries(orderBy) as [ + keyof M, + { order: 'asc' | 'desc'; nulls?: 'first' | 'last' }, + ][]) { + qb.orderBy(key as string, value?.order, value.nulls ?? 'last'); + } + } + const data = await qb; + return data as M[]; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } - static async create(data: CreateSchema): Promise { - const insertData = { - ...data, - id: generateID(tableName), - }; - const res = await BaseContext.knex(tableName) - .insert(insertData) - .returning('*'); - return res[0] as M; + static async insert(data: CreateSchema, trx?: Knex): Promise { + try { + const insertData = { + ...data, + id: generateID(tableName), + }; + const res = await (trx ?? BaseContext.knex)(tableName) + .insert(insertData) + .returning('*'); + return res[0] as M; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } + } + + static async insertMany(data: CreateSchema[], trx?: Knex): Promise { + try { + const insertData = data.map((d) => ({ + ...d, + id: generateID(tableName), + })); + const res = await (trx ?? BaseContext.knex)(tableName) + .insert(insertData as never) + .returning('*'); + return res as M[]; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } static async update( where: Partial, data: UpdateSchema, + trx?: Knex, ): Promise { - const res = await BaseContext.knex(tableName) - .where(where) - .update(data) - .returning('*'); - return res as M[]; + try { + const res = await (trx ?? BaseContext.knex)(tableName) + .where(where) + .update(data) + .returning('*'); + return res as M[]; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } - static async delete(where: Partial) { + static async delete(where: Partial, trx?: Knex) { if (!where || Object.keys(where).length === 0) { throw new Error('Where clause is required for delete operation'); } - await BaseContext.knex(tableName) - .where(where) - // @ts-ignore - .update({ is_deleted: true }); - return 1; + try { + await (trx ?? BaseContext.knex)(tableName) + .where(where) + // @ts-ignore + .update({ is_deleted: true }); + return 1; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } - static async dangerousHardDelete(where: Partial) { + static async dangerousHardDelete(where: Partial, trx?: Knex) { if (!where || Object.keys(where).length === 0) { throw new Error('Where clause is required for dangerousHardDelete'); } - return BaseContext.knex(tableName).where(where).del(); + try { + return (trx ?? BaseContext.knex)(tableName).where(where).del(); + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } - static async count(where: Partial): Promise { - const data = await BaseContext.knex(tableName) - .where(where) - .andWhere('is_deleted', false) - .count(); - return Number.parseInt(data[0].count as string, 10); + static async count(where: Partial, trx?: Knex): Promise { + try { + const data = await (trx ?? BaseContext.knex)(tableName) + .where(where) + .andWhere('is_deleted', false) + .count(); + return Number.parseInt(data[0].count as string, 10); + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } static async findPaginated( where: Partial, page: number, limit: number, + orderBy?: OrderBy, + trx?: Knex, ): Promise { - const data = await BaseContext.knex(tableName) - .where(where) - .andWhere('is_deleted', false) - .limit(limit) - .offset((page - 1) * limit); - return data as M[]; + try { + const qb = (trx ?? BaseContext.knex)(tableName) + .where(where) + .andWhere('is_deleted', false) + + .limit(limit) + .offset((page - 1) * limit); + + if (orderBy) { + for (const [key, value] of Object.entries(orderBy) as [ + keyof M, + { order: 'asc' | 'desc'; nulls?: 'first' | 'last' }, + ][]) { + qb.orderBy(key as string, value?.order, value.nulls ?? 'last'); + } + } + const data = await qb; + return data as M[]; + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } - static async dangerousRawQuery(query: string) { + static async dangerousRawQuery(query: string, trx?: Knex) { if (!query.toLowerCase().includes(tableName)) { throw new Error('Only raw queries for the current table are allowed'); } if (!query.toLowerCase().includes('where')) { throw new Error('Raw query must contain a where clause'); } - return BaseContext.knex.raw(query); + try { + return (trx ?? BaseContext.knex).raw(query); + } catch (error) { + throw new DatabaseError(`${tableName}: Query Failed : `, error); + } } } diff --git a/apps/api/src/modules/root.module.ts b/apps/api/src/modules/root.module.ts index fdc48d1c..faf11b64 100644 --- a/apps/api/src/modules/root.module.ts +++ b/apps/api/src/modules/root.module.ts @@ -98,7 +98,7 @@ const GlobalModules = [ ]), LoggerModule.forRoot({ pinoHttp: { - level: 'info', + level: 'error', redact: ['req.headers', 'req.remoteAddress', 'res.headers'], }, }), diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts new file mode 100644 index 00000000..95081f6e --- /dev/null +++ b/apps/api/src/utils/error.ts @@ -0,0 +1,148 @@ +class RootError extends Error { + constructor(message: string) { + super(message); + this.name = 'RootError'; + this.message = message; + } +} + +export class DatabaseError extends RootError { + constructor(message: string, error: Error) { + super(message); + this.name = 'DatabaseError'; + this.message = message + extractDBError(error); + } +} + +const extractDBError = (error: any) => { + switch (error.code) { + case '23505': + return 'Unique constraint violation'; + + case '23503': + return 'Foreign key constraint violation'; + + case '42601': + return 'Syntax error'; + + case '23502': + return 'Not null violation'; + + case '23514': + return 'Check constraint violation'; + + case '22001': + return 'String data right truncation'; + + case '22003': + return 'Numeric value out of range'; + + case '22007': + return 'Invalid datetime format'; + + case '22008': + return 'Datetime field overflow'; + + case '22012': + return 'Division by zero'; + + case '22023': + return 'Invalid parameter value'; + + case '40001': + return 'Serialization failure'; + + case '40003': + return 'Statement completion unknown'; + + case '40P01': + return 'Deadlock detected'; + + case '55P03': + return 'Lock not available'; + + case '57014': + return 'Query canceled'; + + case '57P03': + return 'Cannot connect now'; + + case '53300': + return 'Too many connections'; + + case '54000': + return 'Program limit exceeded'; + + case '42703': + return 'Undefined column'; + + case '42P01': + return 'Undefined table'; + + case '42883': + return 'Undefined function'; + + case '42P07': + return 'Duplicate table'; + + case '42701': + return 'Duplicate column'; + + case '42P03': + return 'Duplicate cursor'; + + case '42P04': + return 'Duplicate database'; + + case '42P05': + return 'Duplicate prepared statement'; + + case '42P06': + return 'Duplicate schema'; + + case '42P10': + return 'Invalid column reference'; + + case '42P11': + return 'Invalid cursor definition'; + + case '42P12': + return 'Invalid database definition'; + + case '42P13': + return 'Invalid function definition'; + + case '42P14': + return 'Invalid prepared statement definition'; + + case '42P15': + return 'Invalid schema definition'; + + case '42P16': + return 'Invalid table definition'; + + case '42P17': + return 'Invalid object definition'; + + case '57000': + return 'Operator intervention'; + + case '55006': + return 'Object in use'; + + case '55000': + return 'Object not in prerequisite state'; + + case '57P01': + return 'Admin shutdown'; + + case '57P02': + return 'Crash shutdown'; + + case '57P04': + return 'Database dropped'; + + default: + return 'Unknown database error'; + } +}; diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index ee14610e..d81912aa 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -20,7 +20,6 @@ "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": true, - "types": ["src/types/*.d.ts"], "paths": { "@api/*": ["src/*"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9e7a0f6..e23a0e11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,6 +189,9 @@ importers: '@types/react': specifier: ^18.2.58 version: 18.3.3 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 prisma: specifier: ^5.10.2 version: 5.14.0 @@ -5344,6 +5347,11 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + condense-newlines@0.2.1: resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} engines: {node: '>=0.10.0'} @@ -9728,6 +9736,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -9849,6 +9860,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -17594,6 +17608,18 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + concurrently@8.2.2: + 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 + condense-newlines@0.2.1: dependencies: extend-shallow: 2.0.1 @@ -23152,6 +23178,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.1: {} + shelljs@0.8.5: dependencies: glob: 7.2.3 @@ -23291,6 +23319,8 @@ snapshots: space-separated-tokens@2.0.2: {} + spawn-command@0.0.2: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 From 37fe03ba43eb6b2edea21abfb0ff4ef4bee005b9 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 12:52:31 +0530 Subject: [PATCH 03/61] feat: global error filter --- apps/api/src/filters/global-error.filter.ts | 71 ++++++++++++++++++ apps/api/src/main.ts | 74 ++++++++++--------- apps/api/src/models/BaseModel.ts | 42 +++++------ apps/api/src/utils/error.ts | 62 +++++++++++++++- .../validation/zod.validation.decorator.ts | 26 +++++++ .../api/src/validation/zod.validation.pipe.ts | 26 +++++++ 6 files changed, 237 insertions(+), 64 deletions(-) create mode 100644 apps/api/src/filters/global-error.filter.ts create mode 100644 apps/api/src/validation/zod.validation.decorator.ts create mode 100644 apps/api/src/validation/zod.validation.pipe.ts diff --git a/apps/api/src/filters/global-error.filter.ts b/apps/api/src/filters/global-error.filter.ts new file mode 100644 index 00000000..dd014138 --- /dev/null +++ b/apps/api/src/filters/global-error.filter.ts @@ -0,0 +1,71 @@ +import { + ExceptionFilter, + ArgumentsHost, + NotFoundException, +} from '@nestjs/common'; +import { + BadRequest, + DatabaseError, + ExternalError, + Forbidden, + InternalServerError, + NotFound, + Unauthorized, +} from '@api/utils/error'; + +export class GlobalErrorFilter implements ExceptionFilter { + catch(exception: unknown, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const res = ctx.getResponse(); + + if (exception instanceof DatabaseError) { + res.status(500).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof NotFound) { + res.status(404).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof Forbidden) { + res.status(403).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof Unauthorized) { + res.status(401).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof BadRequest) { + res.status(400).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof ExternalError) { + res.status(500).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof InternalServerError) { + res.status(500).json({ + message: exception.message, + name: exception.name, + }); + } else if (exception instanceof NotFoundException) { + res.status(404).json({ + message: exception.message, + name: exception.name, + }); + } else { + res.status(500).json({ + message: + exception instanceof Error + ? exception.message + : 'Internal Server Error', + name: exception instanceof Error ? exception.name : 'Error', + }); + } + } +} diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index fd27bc93..c9786422 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -8,43 +8,47 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import * as process from 'node:process'; import BaseContext from '@api/BaseContext'; import { NestExpressApplication } from '@nestjs/platform-express'; +import { GlobalErrorFilter } from '@api/filters/global-error.filter'; async function bootstrap() { - const app = await NestFactory.create(AppModule); - - await BaseContext.init(); - - app.use( - session({ - secret: process.env.SESSION_SECRET as string, - resave: false, - saveUninitialized: false, - }), - ); - app.use(cookieParser()); - app.useGlobalPipes(new ValidationPipe()); - // prevent body parsing in stripe webhook route to access the stripe signature as buffer - app.use('/api/payment/webhook', express.raw({ type: '*/*' })); - app.setGlobalPrefix('api'); - app.enableCors({ - origin: process.env.CLIENT_URL || 'http://localhost:3000', - credentials: true, - }); - - const config = new DocumentBuilder() - .setTitle('FossFolio') - .setDescription( - 'An open source web application for people to Find, Host and Manage Events.', - ) - .setVersion('1.0') - .build(); - const document = SwaggerModule.createDocument(app, config); - SwaggerModule.setup('api/docs', app, document); - - await app.listen( - (process.env.PORT as string) || 8080, - (process.env.HOST as string) || '0.0.0.0', - ); + const app = await NestFactory.create(AppModule); + + await BaseContext.init(); + + app.use( + session({ + secret: process.env.SESSION_SECRET as string, + resave: false, + saveUninitialized: false, + }), + ); + app.use(cookieParser()); + app.useGlobalPipes(new ValidationPipe()); + + app.useGlobalFilters(new GlobalErrorFilter()); + + // prevent body parsing in stripe webhook route to access the stripe signature as buffer + app.use('/api/payment/webhook', express.raw({ type: '*/*' })); + app.setGlobalPrefix('api'); + app.enableCors({ + origin: process.env.CLIENT_URL || 'http://localhost:3000', + credentials: true, + }); + + const config = new DocumentBuilder() + .setTitle('FossFolio') + .setDescription( + 'An open source web application for people to Find, Host and Manage Events.', + ) + .setVersion('1.0') + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('api/docs', app, document); + + await app.listen( + (process.env.PORT as string) || 8080, + (process.env.HOST as string) || '0.0.0.0', + ); } bootstrap(); diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index 16e9fcd1..0a8ed02f 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -2,7 +2,7 @@ import BaseContext from '@api/BaseContext'; import { CreateSchema, UpdateSchema } from '@api/db/schema'; import { SystemTable, generateID } from '@api/utils/db'; import { Logger } from '@nestjs/common'; -import { DatabaseError } from '@api/utils/error'; +import { DatabaseError, FFError } from '@api/utils/error'; import { Knex } from 'knex'; export type OrderBy = { @@ -22,7 +22,7 @@ export default function createBaseModel( this.logger = logger || new Logger(); } - static async findById(id: string, trx?: Knex): Promise { + static async findById(id: string, trx?: Knex) { try { const data = await (trx ?? BaseContext.knex)(tableName) .where(id) @@ -30,15 +30,11 @@ export default function createBaseModel( .first(); return (data as M) || null; } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async find( - where: Partial, - orderBy?: OrderBy, - trx?: Knex, - ): Promise { + static async find(where: Partial, orderBy?: OrderBy, trx?: Knex) { try { const qb = (trx ?? BaseContext.knex)(tableName) .where(where) @@ -54,11 +50,11 @@ export default function createBaseModel( const data = await qb; return data as M[]; } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async insert(data: CreateSchema, trx?: Knex): Promise { + static async insert(data: CreateSchema, trx?: Knex) { try { const insertData = { ...data, @@ -69,11 +65,11 @@ export default function createBaseModel( .returning('*'); return res[0] as M; } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async insertMany(data: CreateSchema[], trx?: Knex): Promise { + static async insertMany(data: CreateSchema[], trx?: Knex) { try { const insertData = data.map((d) => ({ ...d, @@ -84,15 +80,11 @@ export default function createBaseModel( .returning('*'); return res as M[]; } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async update( - where: Partial, - data: UpdateSchema, - trx?: Knex, - ): Promise { + static async update(where: Partial, data: UpdateSchema, trx?: Knex) { try { const res = await (trx ?? BaseContext.knex)(tableName) .where(where) @@ -100,7 +92,7 @@ export default function createBaseModel( .returning('*'); return res as M[]; } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -126,11 +118,11 @@ export default function createBaseModel( try { return (trx ?? BaseContext.knex)(tableName).where(where).del(); } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async count(where: Partial, trx?: Knex): Promise { + static async count(where: Partial, trx?: Knex) { try { const data = await (trx ?? BaseContext.knex)(tableName) .where(where) @@ -138,7 +130,7 @@ export default function createBaseModel( .count(); return Number.parseInt(data[0].count as string, 10); } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -148,7 +140,7 @@ export default function createBaseModel( limit: number, orderBy?: OrderBy, trx?: Knex, - ): Promise { + ) { try { const qb = (trx ?? BaseContext.knex)(tableName) .where(where) @@ -168,7 +160,7 @@ export default function createBaseModel( const data = await qb; return data as M[]; } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -182,7 +174,7 @@ export default function createBaseModel( try { return (trx ?? BaseContext.knex).raw(query); } catch (error) { - throw new DatabaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } } diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts index 95081f6e..6afe1470 100644 --- a/apps/api/src/utils/error.ts +++ b/apps/api/src/utils/error.ts @@ -1,20 +1,74 @@ +import { + BadRequestException, + ForbiddenException, + InternalServerErrorException, + NotFoundException, + UnauthorizedException, +} from '@nestjs/common'; + class RootError extends Error { constructor(message: string) { super(message); - this.name = 'RootError'; this.message = message; } } +export class NotFound extends NotFoundException implements RootError {} + +export class Forbidden extends ForbiddenException implements RootError {} + +export class Unauthorized extends UnauthorizedException implements RootError {} + +export class BadRequest extends BadRequestException implements RootError {} + +export class InternalServerError + extends InternalServerErrorException + implements RootError {} + +export class ExternalError extends Error implements RootError {} + export class DatabaseError extends RootError { constructor(message: string, error: Error) { super(message); - this.name = 'DatabaseError'; - this.message = message + extractDBError(error); + this.message = + message + extractDBError(error as unknown as { code: string }); + } +} + +// biome-ignore lint/complexity/noStaticOnlyClass: +export class FFError { + static notFound(message: string) { + throw new NotFound(message); + } + + static forbidden(message: string) { + throw new Forbidden(message); + } + + static unauthorized(message: string) { + throw new Unauthorized(message); + } + + static badRequest(message: string) { + throw new BadRequest(message); + } + + static internalServerError(message: string) { + throw new InternalServerError(message); + } + + static externalError(message: string) { + throw new ExternalError(message); + } + + static databaseError(message: string, error: Error) { + throw new DatabaseError(message, error); } } -const extractDBError = (error: any) => { +const extractDBError = (error: { + code: string; +}) => { switch (error.code) { case '23505': return 'Unique constraint violation'; diff --git a/apps/api/src/validation/zod.validation.decorator.ts b/apps/api/src/validation/zod.validation.decorator.ts new file mode 100644 index 00000000..2dc7d38f --- /dev/null +++ b/apps/api/src/validation/zod.validation.decorator.ts @@ -0,0 +1,26 @@ +import { applyDecorators, UsePipes } from '@nestjs/common'; +import { ZodSchema } from 'zod'; +import { ZodValidationPipe } from './zod.validation.pipe'; + +interface ZodValidationOptions { + bodySchema?: ZodSchema; + querySchema?: ZodSchema; +} + +export function ZodValidator(options: ZodValidationOptions) { + const decorators: ClassDecorator[] = [] as unknown as ClassDecorator[]; + + if (options.bodySchema) { + decorators.push( + UsePipes(new ZodValidationPipe(options.bodySchema, 'body')), + ); + } + + if (options.querySchema) { + decorators.push( + UsePipes(new ZodValidationPipe(options.querySchema, 'query')), + ); + } + + return applyDecorators(...decorators); +} diff --git a/apps/api/src/validation/zod.validation.pipe.ts b/apps/api/src/validation/zod.validation.pipe.ts new file mode 100644 index 00000000..9567c627 --- /dev/null +++ b/apps/api/src/validation/zod.validation.pipe.ts @@ -0,0 +1,26 @@ +import { + PipeTransform, + ArgumentMetadata, + BadRequestException, +} from '@nestjs/common'; +import { ZodSchema } from 'zod'; + +export class ZodValidationPipe implements PipeTransform { + constructor( + private schema: ZodSchema, + private type: 'body' | 'query', + ) {} + + transform(value: unknown, metadata: ArgumentMetadata) { + if (metadata.type !== this.type) { + return value; + } + + try { + const parsedValue = this.schema.parse(value); + return parsedValue; + } catch (error) { + throw new BadRequestException(error.errors); + } + } +} From 9febd4be552c2abb9577c6a95e24275cef2d459b Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 12:53:20 +0530 Subject: [PATCH 04/61] chore: format --- apps/api/src/main.ts | 76 ++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index c9786422..7f75238f 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -11,44 +11,44 @@ import { NestExpressApplication } from '@nestjs/platform-express'; import { GlobalErrorFilter } from '@api/filters/global-error.filter'; async function bootstrap() { - const app = await NestFactory.create(AppModule); - - await BaseContext.init(); - - app.use( - session({ - secret: process.env.SESSION_SECRET as string, - resave: false, - saveUninitialized: false, - }), - ); - app.use(cookieParser()); - app.useGlobalPipes(new ValidationPipe()); - - app.useGlobalFilters(new GlobalErrorFilter()); - - // prevent body parsing in stripe webhook route to access the stripe signature as buffer - app.use('/api/payment/webhook', express.raw({ type: '*/*' })); - app.setGlobalPrefix('api'); - app.enableCors({ - origin: process.env.CLIENT_URL || 'http://localhost:3000', - credentials: true, - }); - - const config = new DocumentBuilder() - .setTitle('FossFolio') - .setDescription( - 'An open source web application for people to Find, Host and Manage Events.', - ) - .setVersion('1.0') - .build(); - const document = SwaggerModule.createDocument(app, config); - SwaggerModule.setup('api/docs', app, document); - - await app.listen( - (process.env.PORT as string) || 8080, - (process.env.HOST as string) || '0.0.0.0', - ); + const app = await NestFactory.create(AppModule); + + await BaseContext.init(); + + app.use( + session({ + secret: process.env.SESSION_SECRET as string, + resave: false, + saveUninitialized: false, + }), + ); + app.use(cookieParser()); + app.useGlobalPipes(new ValidationPipe()); + + app.useGlobalFilters(new GlobalErrorFilter()); + + // prevent body parsing in stripe webhook route to access the stripe signature as buffer + app.use('/api/payment/webhook', express.raw({ type: '*/*' })); + app.setGlobalPrefix('api'); + app.enableCors({ + origin: process.env.CLIENT_URL || 'http://localhost:3000', + credentials: true, + }); + + const config = new DocumentBuilder() + .setTitle('FossFolio') + .setDescription( + 'An open source web application for people to Find, Host and Manage Events.', + ) + .setVersion('1.0') + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('api/docs', app, document); + + await app.listen( + (process.env.PORT as string) || 8080, + (process.env.HOST as string) || '0.0.0.0', + ); } bootstrap(); From d9bde50ebbada8d52169b718d16ea79432f3e877 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 13:02:41 +0530 Subject: [PATCH 05/61] fix: type errors --- apps/api/package.json | 2 +- apps/api/src/models/BaseModel.ts | 20 +- apps/api/src/utils/error.ts | 4 +- .../api/src/validation/zod.validation.pipe.ts | 37 +- pnpm-lock.yaml | 325 +++++++++++++----- 5 files changed, 278 insertions(+), 110 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 76fcd0ed..dd7422de 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.521.0", - "@nestjs-modules/mailer": "^1.11.0", + "@nestjs-modules/mailer": "^2.0.2", "@nestjs/common": "^10.3.3", "@nestjs/config": "^3.2.0", "@nestjs/core": "^10.3.3", diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index 0a8ed02f..9667f186 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -29,7 +29,7 @@ export default function createBaseModel( .andWhere('is_deleted', false) .first(); return (data as M) || null; - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -49,7 +49,7 @@ export default function createBaseModel( } const data = await qb; return data as M[]; - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -64,7 +64,7 @@ export default function createBaseModel( .insert(insertData) .returning('*'); return res[0] as M; - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -79,7 +79,7 @@ export default function createBaseModel( .insert(insertData as never) .returning('*'); return res as M[]; - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -91,7 +91,7 @@ export default function createBaseModel( .update(data) .returning('*'); return res as M[]; - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -106,7 +106,7 @@ export default function createBaseModel( // @ts-ignore .update({ is_deleted: true }); return 1; - } catch (error) { + } catch (error: unknown) { throw new DatabaseError(`${tableName}: Query Failed : `, error); } } @@ -117,7 +117,7 @@ export default function createBaseModel( } try { return (trx ?? BaseContext.knex)(tableName).where(where).del(); - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -129,7 +129,7 @@ export default function createBaseModel( .andWhere('is_deleted', false) .count(); return Number.parseInt(data[0].count as string, 10); - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -159,7 +159,7 @@ export default function createBaseModel( } const data = await qb; return data as M[]; - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -173,7 +173,7 @@ export default function createBaseModel( } try { return (trx ?? BaseContext.knex).raw(query); - } catch (error) { + } catch (error: unknown) { FFError.databaseError(`${tableName}: Query Failed : `, error); } } diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts index 6afe1470..3b4dd150 100644 --- a/apps/api/src/utils/error.ts +++ b/apps/api/src/utils/error.ts @@ -28,7 +28,7 @@ export class InternalServerError export class ExternalError extends Error implements RootError {} export class DatabaseError extends RootError { - constructor(message: string, error: Error) { + constructor(message: string, error: unknown) { super(message); this.message = message + extractDBError(error as unknown as { code: string }); @@ -61,7 +61,7 @@ export class FFError { throw new ExternalError(message); } - static databaseError(message: string, error: Error) { + static databaseError(message: string, error: unknown) { throw new DatabaseError(message, error); } } diff --git a/apps/api/src/validation/zod.validation.pipe.ts b/apps/api/src/validation/zod.validation.pipe.ts index 9567c627..0f9a2064 100644 --- a/apps/api/src/validation/zod.validation.pipe.ts +++ b/apps/api/src/validation/zod.validation.pipe.ts @@ -1,26 +1,27 @@ import { - PipeTransform, - ArgumentMetadata, - BadRequestException, + PipeTransform, + ArgumentMetadata, + BadRequestException, } from '@nestjs/common'; import { ZodSchema } from 'zod'; export class ZodValidationPipe implements PipeTransform { - constructor( - private schema: ZodSchema, - private type: 'body' | 'query', - ) {} + constructor( + private schema: ZodSchema, + private type: 'body' | 'query', + ) { + } - transform(value: unknown, metadata: ArgumentMetadata) { - if (metadata.type !== this.type) { - return value; - } + transform(value: unknown, metadata: ArgumentMetadata) { + if (metadata.type !== this.type) { + return value; + } - try { - const parsedValue = this.schema.parse(value); - return parsedValue; - } catch (error) { - throw new BadRequestException(error.errors); - } - } + try { + const parsedValue = this.schema.parse(value); + return parsedValue; + } catch (error: unknown) { + throw new BadRequestException(error); + } + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e23a0e11..dface00a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^3.521.0 version: 3.587.0 '@nestjs-modules/mailer': - specifier: ^1.11.0 - version: 1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13) + specifier: ^2.0.2 + version: 2.0.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13) '@nestjs/common': specifier: ^10.3.3 version: 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -58,7 +58,7 @@ importers: version: 5.14.0(prisma@5.14.0) '@webtre/nestjs-mailer-react-adapter': specifier: ^0.1.2 - version: 0.1.2(@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13)) + version: 0.1.2(@nestjs-modules/mailer@2.0.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13)) argon2: specifier: ^0.40.1 version: 0.40.3 @@ -1365,56 +1365,68 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@css-inline/css-inline-darwin-arm64@0.13.0': - resolution: {integrity: sha512-A4QvlZdhp8v+3IHKF/UftRf5GrAVUMEHCGRuk2Dx594xn/UR4ieh+B70aMm5rfONh2hv5mlR9UcoYAkVpEQ99g==} + '@css-inline/css-inline-android-arm-eabi@0.14.1': + resolution: {integrity: sha512-LNUR8TY4ldfYi0mi/d4UNuHJ+3o8yLQH9r2Nt6i4qeg1i7xswfL3n/LDLRXvGjBYqeEYNlhlBQzbPwMX1qrU6A==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@css-inline/css-inline-android-arm64@0.14.1': + resolution: {integrity: sha512-tH5us0NYGoTNBHOUHVV7j9KfJ4DtFOeTLA3cM0XNoMtArNu2pmaaBMFJPqECzavfXkLc7x5Z22UPZYjoyHfvCA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@css-inline/css-inline-darwin-arm64@0.14.1': + resolution: {integrity: sha512-QE5W1YRIfRayFrtrcK/wqEaxNaqLULPI0gZB4ArbFRd3d56IycvgBasDTHPre5qL2cXCO3VyPx+80XyHOaVkag==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@css-inline/css-inline-darwin-x64@0.13.0': - resolution: {integrity: sha512-px9z4ypzeECMyBEtlrNzTMpA1tnw5MmMIiMkBRhb8UGRr2pOBZY3yd/eEIxWzVVSPt0aIjVDwUOJ3+d0Z+BskA==} + '@css-inline/css-inline-darwin-x64@0.14.1': + resolution: {integrity: sha512-mAvv2sN8awNFsbvBzlFkZPbCNZ6GCWY5/YcIz7V5dPYw+bHHRbjnlkNTEZq5BsDxErVrMIGvz05PGgzuNvZvdQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@css-inline/css-inline-linux-arm-gnueabihf@0.13.0': - resolution: {integrity: sha512-+uo0coLQNgk/AKeOB8mXSRd8VIlUg38zRSB9B9q0ior9oBCDPtEdn1HuCSvWxHoOSJ8QNNk+uwbz0zW4CETzFw==} + '@css-inline/css-inline-linux-arm-gnueabihf@0.14.1': + resolution: {integrity: sha512-AWC44xL0X7BgKvrWEqfSqkT2tJA5kwSGrAGT+m0gt11wnTYySvQ6YpX0fTY9i3ppYGu4bEdXFjyK2uY1DTQMHA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@css-inline/css-inline-linux-arm64-gnu@0.13.0': - resolution: {integrity: sha512-GVrsFbY5l0Hxyzxsm5S5JPGObvHm/Ybf2wZgnWBsQigxqGtr1FL535HaTwEnq6aHOpH3f08gR5Vx33gB7jG4pw==} + '@css-inline/css-inline-linux-arm64-gnu@0.14.1': + resolution: {integrity: sha512-drj0ciiJgdP3xKXvNAt4W+FH4KKMs8vB5iKLJ3HcH07sNZj58Sx++2GxFRS1el3p+GFp9OoYA6dgouJsGEqt0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@css-inline/css-inline-linux-arm64-musl@0.13.0': - resolution: {integrity: sha512-V5h5+CRnE01EgoafI/kyjEcM8zvN+sKLnp17Aq9LqQfsut7mO3i72d8g/xeVC37DCLoGQFLvDCzbze2NbF2dIQ==} + '@css-inline/css-inline-linux-arm64-musl@0.14.1': + resolution: {integrity: sha512-FzknI+st8eA8YQSdEJU9ykcM0LZjjigBuynVF5/p7hiMm9OMP8aNhWbhZ8LKJpKbZrQsxSGS4g9Vnr6n6FiSdQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@css-inline/css-inline-linux-x64-gnu@0.13.0': - resolution: {integrity: sha512-vbRV++73MW7dvz/AIbozkv4R68/k/sEp57hno/L6lx034VYxpCwdfqtGN4D0W1TOTzdr2b6qBOGNZ1oLKQZOQQ==} + '@css-inline/css-inline-linux-x64-gnu@0.14.1': + resolution: {integrity: sha512-yubbEye+daDY/4vXnyASAxH88s256pPati1DfVoZpU1V0+KP0BZ1dByZOU1ktExurbPH3gZOWisAnBE9xon0Uw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@css-inline/css-inline-linux-x64-musl@0.13.0': - resolution: {integrity: sha512-2tCnwU23W/yMs9cGc2/i2jd9y2pjuntx0a5OytqX7s9fvUtmI3nc0Od6wuf51LnmdU+XAU8HLT9pZppsQiwPfQ==} + '@css-inline/css-inline-linux-x64-musl@0.14.1': + resolution: {integrity: sha512-6CRAZzoy1dMLPC/tns2rTt1ZwPo0nL/jYBEIAsYTCWhfAnNnpoLKVh5Nm+fSU3OOwTTqU87UkGrFJhObD/wobQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@css-inline/css-inline-win32-x64-msvc@0.13.0': - resolution: {integrity: sha512-6VFhFSXp4FH+NzJhLd6fFi7jKCPvIRW+vq0tV+CPuiQ3zPzMfC9nIk8sB/1VJR8EcvBAjMV53YnacuDjRFRT9g==} + '@css-inline/css-inline-win32-x64-msvc@0.14.1': + resolution: {integrity: sha512-nzotGiaiuiQW78EzsiwsHZXbxEt6DiMUFcDJ6dhiliomXxnlaPyBfZb6/FMBgRJOf6sknDt/5695OttNmbMYzg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@css-inline/css-inline@0.13.0': - resolution: {integrity: sha512-ZozAXBiW1I8hf6eW5eTNqhxUdNOBxrNNxxUnQRiKQpWcs5ORuGaiWwV5focMBTJ5WXGN+Z8VLP93BOwWFPzCJw==} + '@css-inline/css-inline@0.14.1': + resolution: {integrity: sha512-u4eku+hnPqqHIGq/ZUQcaP0TrCbYeLIYBaK7qClNRGZbnh8RC4gVxLEIo8Pceo1nOK9E5G4Lxzlw5KnXcvflfA==} engines: {node: '>= 10'} '@discoveryjs/json-ext@0.5.7': @@ -1995,8 +2007,8 @@ packages: '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} - '@nestjs-modules/mailer@1.11.2': - resolution: {integrity: sha512-k07wyKbtCzxWMm6IqGwcGIisnXD/6sneGvUR8rBBZbxtLn1HE1FLGyiaXBrPui/0K7W41aS9x9jAIhfTawtlUg==} + '@nestjs-modules/mailer@2.0.2': + resolution: {integrity: sha512-+z4mADQasg0H1ZaGu4zZTuKv2pu+XdErqx99PLFPzCDNTN/q9U59WPgkxVaHnsvKHNopLj5Xap7G4ZpptduoYw==} peerDependencies: '@nestjs/common': '>=7.0.9' '@nestjs/core': '>=7.0.9' @@ -4170,6 +4182,12 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/mjml-core@4.7.4': + resolution: {integrity: sha512-hajbYITLm/wJU99Of50Dmn/k4ok+mrhJs4qDdnveJsINdiNJhQd+03C6Kt09vF9biB23cEI4pPeLrJNYfIZf7g==} + + '@types/mjml@4.7.4': + resolution: {integrity: sha512-vyi1vzWgMzFMwZY7GSZYX0GU0dmtC8vLHwpgk+NWmwbwRSrlieVyJ9sn5elodwUfklJM7yGl0zQeet1brKTWaQ==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -6662,6 +6680,11 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + glob@10.3.4: resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -7554,6 +7577,11 @@ packages: linkifyjs@4.1.3: resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + liquidjs@10.13.1: + resolution: {integrity: sha512-QCQ69sbyMdA1970NEsG7KdQoKi6N+lGg55izisvKvrrRO1nrpS/YBAnzDndR13exYB4xE9A87qdOMuaXPn9v9A==} + engines: {node: '>=14'} + hasBin: true + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -12610,40 +12638,48 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@css-inline/css-inline-darwin-arm64@0.13.0': + '@css-inline/css-inline-android-arm-eabi@0.14.1': optional: true - '@css-inline/css-inline-darwin-x64@0.13.0': + '@css-inline/css-inline-android-arm64@0.14.1': optional: true - '@css-inline/css-inline-linux-arm-gnueabihf@0.13.0': + '@css-inline/css-inline-darwin-arm64@0.14.1': optional: true - '@css-inline/css-inline-linux-arm64-gnu@0.13.0': + '@css-inline/css-inline-darwin-x64@0.14.1': optional: true - '@css-inline/css-inline-linux-arm64-musl@0.13.0': + '@css-inline/css-inline-linux-arm-gnueabihf@0.14.1': optional: true - '@css-inline/css-inline-linux-x64-gnu@0.13.0': + '@css-inline/css-inline-linux-arm64-gnu@0.14.1': optional: true - '@css-inline/css-inline-linux-x64-musl@0.13.0': + '@css-inline/css-inline-linux-arm64-musl@0.14.1': optional: true - '@css-inline/css-inline-win32-x64-msvc@0.13.0': + '@css-inline/css-inline-linux-x64-gnu@0.14.1': optional: true - '@css-inline/css-inline@0.13.0': + '@css-inline/css-inline-linux-x64-musl@0.14.1': + optional: true + + '@css-inline/css-inline-win32-x64-msvc@0.14.1': + optional: true + + '@css-inline/css-inline@0.14.1': optionalDependencies: - '@css-inline/css-inline-darwin-arm64': 0.13.0 - '@css-inline/css-inline-darwin-x64': 0.13.0 - '@css-inline/css-inline-linux-arm-gnueabihf': 0.13.0 - '@css-inline/css-inline-linux-arm64-gnu': 0.13.0 - '@css-inline/css-inline-linux-arm64-musl': 0.13.0 - '@css-inline/css-inline-linux-x64-gnu': 0.13.0 - '@css-inline/css-inline-linux-x64-musl': 0.13.0 - '@css-inline/css-inline-win32-x64-msvc': 0.13.0 + '@css-inline/css-inline-android-arm-eabi': 0.14.1 + '@css-inline/css-inline-android-arm64': 0.14.1 + '@css-inline/css-inline-darwin-arm64': 0.14.1 + '@css-inline/css-inline-darwin-x64': 0.14.1 + '@css-inline/css-inline-linux-arm-gnueabihf': 0.14.1 + '@css-inline/css-inline-linux-arm64-gnu': 0.14.1 + '@css-inline/css-inline-linux-arm64-musl': 0.14.1 + '@css-inline/css-inline-linux-x64-gnu': 0.14.1 + '@css-inline/css-inline-linux-x64-musl': 0.14.1 + '@css-inline/css-inline-win32-x64-msvc': 0.14.1 '@discoveryjs/json-ext@0.5.7': {} @@ -13084,20 +13120,22 @@ snapshots: pump: 3.0.0 tar-fs: 2.1.1 - '@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13)': + '@nestjs-modules/mailer@2.0.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13)': dependencies: - '@css-inline/css-inline': 0.13.0 + '@css-inline/css-inline': 0.14.1 '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1) - glob: 10.3.10 - mjml: 4.15.3 + glob: 10.3.12 nodemailer: 6.9.13 - preview-email: 3.0.19 optionalDependencies: '@types/ejs': 3.1.5 + '@types/mjml': 4.7.4 '@types/pug': 2.0.10 ejs: 3.1.10 handlebars: 4.7.8 + liquidjs: 10.13.1 + mjml: 4.15.3 + preview-email: 3.0.19 pug: 3.0.3 transitivePeerDependencies: - encoding @@ -16155,6 +16193,14 @@ snapshots: '@types/mime@1.3.5': {} + '@types/mjml-core@4.7.4': + optional: true + + '@types/mjml@4.7.4': + dependencies: + '@types/mjml-core': 4.7.4 + optional: true + '@types/ms@0.7.34': {} '@types/multer@1.4.11': @@ -16588,9 +16634,9 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webtre/nestjs-mailer-react-adapter@0.1.2(@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13))': + '@webtre/nestjs-mailer-react-adapter@0.1.2(@nestjs-modules/mailer@2.0.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13))': dependencies: - '@nestjs-modules/mailer': 1.11.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13) + '@nestjs-modules/mailer': 2.0.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(nodemailer@6.9.13) '@react-email/render': 0.0.7 locter: 1.3.0 @@ -16742,6 +16788,7 @@ snapshots: dependencies: esprima: 1.2.5 estraverse: 1.9.3 + optional: true ansi-colors@4.1.3: {} @@ -16922,7 +16969,8 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - asap@2.0.6: {} + asap@2.0.6: + optional: true asn1.js@4.10.1: dependencies: @@ -16930,7 +16978,8 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - assert-never@1.2.1: {} + assert-never@1.2.1: + optional: true assert@2.1.0: dependencies: @@ -17054,6 +17103,7 @@ snapshots: babel-walk@3.0.0-canary-5: dependencies: '@babel/types': 7.24.6 + optional: true bail@2.0.2: {} @@ -17289,6 +17339,7 @@ snapshots: dependencies: no-case: 2.3.2 upper-case: 1.1.3 + optional: true camel-case@4.1.2: dependencies: @@ -17335,6 +17386,7 @@ snapshots: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + optional: true chalk@4.1.2: dependencies: @@ -17348,6 +17400,7 @@ snapshots: character-parser@2.2.0: dependencies: is-regex: 1.1.4 + optional: true chardet@0.7.0: {} @@ -17375,6 +17428,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 + optional: true cheerio@1.0.0-rc.12: dependencies: @@ -17385,6 +17439,7 @@ snapshots: htmlparser2: 8.0.2 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 + optional: true chokidar@3.5.3: dependencies: @@ -17446,6 +17501,7 @@ snapshots: clean-css@4.2.4: dependencies: source-map: 0.6.1 + optional: true clean-css@5.3.3: dependencies: @@ -17643,6 +17699,7 @@ snapshots: dependencies: '@babel/parser': 7.24.6 '@babel/types': 7.24.6 + optional: true constants-browserify@1.0.0: {} @@ -17759,6 +17816,7 @@ snapshots: semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 + optional: true cross-spawn@7.0.3: dependencies: @@ -17816,6 +17874,7 @@ snapshots: domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 + optional: true css-tree@2.3.1: dependencies: @@ -18037,11 +18096,13 @@ snapshots: detect-libc@2.0.3: {} - detect-newline@3.1.0: {} + detect-newline@3.1.0: + optional: true detect-node-es@1.1.0: {} - detect-node@2.1.0: {} + detect-node@2.1.0: + optional: true detect-package-manager@2.0.1: dependencies: @@ -18078,6 +18139,7 @@ snapshots: dependencies: escape-string-applescript: 1.0.0 run-applescript: 3.2.0 + optional: true dlv@1.1.3: {} @@ -18089,7 +18151,8 @@ snapshots: dependencies: esutils: 2.0.3 - doctypes@1.1.0: {} + doctypes@1.1.0: + optional: true dom-accessibility-api@0.5.16: {} @@ -18125,6 +18188,7 @@ snapshots: domhandler@3.3.0: dependencies: domelementtype: 2.3.0 + optional: true domhandler@4.3.1: dependencies: @@ -18210,9 +18274,11 @@ snapshots: encodeurl@1.0.2: {} - encoding-japanese@2.0.0: {} + encoding-japanese@2.0.0: + optional: true - encoding-japanese@2.1.0: {} + encoding-japanese@2.1.0: + optional: true end-of-stream@1.4.4: dependencies: @@ -18470,11 +18536,13 @@ snapshots: escalade@3.1.2: {} - escape-goat@3.0.0: {} + escape-goat@3.0.0: + optional: true escape-html@1.0.3: {} - escape-string-applescript@1.0.0: {} + escape-string-applescript@1.0.0: + optional: true escape-string-regexp@1.0.5: {} @@ -18741,7 +18809,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - esprima@1.2.5: {} + esprima@1.2.5: + optional: true esprima@4.0.1: {} @@ -18753,7 +18822,8 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@1.9.3: {} + estraverse@1.9.3: + optional: true estraverse@4.3.0: {} @@ -18795,6 +18865,7 @@ snapshots: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 + optional: true execa@0.7.0: dependencies: @@ -18894,7 +18965,8 @@ snapshots: ext-list: 2.2.2 sort-keys-length: 1.0.1 - extend-object@1.0.0: {} + extend-object@1.0.0: + optional: true extend-shallow@2.0.1: dependencies: @@ -19067,6 +19139,7 @@ snapshots: detect-newline: 3.1.0 extend-object: 1.0.0 rc: 1.2.8 + optional: true flat-cache@3.2.0: dependencies: @@ -19285,6 +19358,14 @@ snapshots: minipass: 7.1.2 path-scurry: 1.11.1 + glob@10.3.12: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 + glob@10.3.4: dependencies: foreground-child: 3.1.1 @@ -19488,6 +19569,7 @@ snapshots: param-case: 2.1.1 relateurl: 0.2.7 uglify-js: 3.17.4 + optional: true html-tags@3.3.1: {} @@ -19528,6 +19610,7 @@ snapshots: domhandler: 3.3.0 domutils: 2.8.0 entities: 2.2.0 + optional: true htmlparser2@6.1.0: dependencies: @@ -19549,6 +19632,7 @@ snapshots: domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 + optional: true http-cache-semantics@4.1.1: {} @@ -19786,6 +19870,7 @@ snapshots: dependencies: acorn: 7.4.1 object-assign: 4.1.1 + optional: true is-extendable@0.1.1: {} @@ -19840,7 +19925,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} - is-promise@2.2.2: {} + is-promise@2.2.2: + optional: true is-reference@3.0.2: dependencies: @@ -20049,7 +20135,8 @@ snapshots: js-sdsl@4.4.2: {} - js-stringify@1.0.2: {} + js-stringify@1.0.2: + optional: true js-tokens@4.0.0: {} @@ -20211,6 +20298,7 @@ snapshots: dependencies: is-promise: 2.2.2 promise: 7.3.1 + optional: true jsx-ast-utils@3.3.5: dependencies: @@ -20228,6 +20316,7 @@ snapshots: web-resource-inliner: 6.0.1 transitivePeerDependencies: - encoding + optional: true jwa@1.4.1: dependencies: @@ -20302,9 +20391,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libbase64@1.2.1: {} + libbase64@1.2.1: + optional: true - libbase64@1.3.0: {} + libbase64@1.3.0: + optional: true libmime@5.2.0: dependencies: @@ -20312,6 +20403,7 @@ snapshots: iconv-lite: 0.6.3 libbase64: 1.2.1 libqp: 2.0.1 + optional: true libmime@5.3.5: dependencies: @@ -20319,12 +20411,15 @@ snapshots: iconv-lite: 0.6.3 libbase64: 1.3.0 libqp: 2.1.0 + optional: true libphonenumber-js@1.11.2: {} - libqp@2.0.1: {} + libqp@2.0.1: + optional: true - libqp@2.1.0: {} + libqp@2.1.0: + optional: true lilconfig@2.1.0: {} @@ -20338,6 +20433,11 @@ snapshots: linkifyjs@4.1.3: {} + liquidjs@10.13.1: + dependencies: + commander: 10.0.1 + optional: true + loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -20430,7 +20530,8 @@ snapshots: dependencies: get-func-name: 2.0.2 - lower-case@1.1.4: {} + lower-case@1.1.4: + optional: true lower-case@2.0.2: dependencies: @@ -20475,12 +20576,14 @@ snapshots: nodemailer: 6.9.13 punycode.js: 2.3.1 tlds: 1.252.0 + optional: true mailsplit@5.4.0: dependencies: libbase64: 1.2.1 libmime: 5.2.0 libqp: 2.0.1 + optional: true make-dir@2.1.0: dependencies: @@ -20586,7 +20689,8 @@ snapshots: dependencies: map-or-similar: 1.5.0 - mensch@0.3.4: {} + mensch@0.3.4: + optional: true merge-descriptors@1.0.1: {} @@ -20807,6 +20911,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-body@4.15.3: dependencies: @@ -20815,6 +20920,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-button@4.15.3: dependencies: @@ -20823,6 +20929,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-carousel@4.15.3: dependencies: @@ -20831,12 +20938,13 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-cli@4.15.3: dependencies: '@babel/runtime': 7.24.6 chokidar: 3.6.0 - glob: 10.3.10 + glob: 10.4.1 html-minifier: 4.0.0 js-beautify: 1.15.1 lodash: 4.17.21 @@ -20848,6 +20956,7 @@ snapshots: yargs: 17.7.2 transitivePeerDependencies: - encoding + optional: true mjml-column@4.15.3: dependencies: @@ -20856,6 +20965,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-core@4.15.3: dependencies: @@ -20871,6 +20981,7 @@ snapshots: mjml-validator: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-divider@4.15.3: dependencies: @@ -20879,6 +20990,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-group@4.15.3: dependencies: @@ -20887,6 +20999,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-attributes@4.15.3: dependencies: @@ -20895,6 +21008,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-breakpoint@4.15.3: dependencies: @@ -20903,6 +21017,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-font@4.15.3: dependencies: @@ -20911,6 +21026,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-html-attributes@4.15.3: dependencies: @@ -20919,6 +21035,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-preview@4.15.3: dependencies: @@ -20927,6 +21044,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-style@4.15.3: dependencies: @@ -20935,6 +21053,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head-title@4.15.3: dependencies: @@ -20943,6 +21062,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-head@4.15.3: dependencies: @@ -20951,6 +21071,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-hero@4.15.3: dependencies: @@ -20959,6 +21080,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-image@4.15.3: dependencies: @@ -20967,6 +21089,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-migrate@4.15.3: dependencies: @@ -20978,6 +21101,7 @@ snapshots: yargs: 17.7.2 transitivePeerDependencies: - encoding + optional: true mjml-navbar@4.15.3: dependencies: @@ -20986,6 +21110,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-parser-xml@4.15.3: dependencies: @@ -20993,6 +21118,7 @@ snapshots: detect-node: 2.1.0 htmlparser2: 9.1.0 lodash: 4.17.21 + optional: true mjml-preset-core@4.15.3: dependencies: @@ -21024,6 +21150,7 @@ snapshots: mjml-wrapper: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-raw@4.15.3: dependencies: @@ -21032,6 +21159,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-section@4.15.3: dependencies: @@ -21040,6 +21168,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-social@4.15.3: dependencies: @@ -21048,6 +21177,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-spacer@4.15.3: dependencies: @@ -21056,6 +21186,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-table@4.15.3: dependencies: @@ -21064,6 +21195,7 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-text@4.15.3: dependencies: @@ -21072,10 +21204,12 @@ snapshots: mjml-core: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml-validator@4.15.3: dependencies: '@babel/runtime': 7.24.6 + optional: true mjml-wrapper@4.15.3: dependencies: @@ -21085,6 +21219,7 @@ snapshots: mjml-section: 4.15.3 transitivePeerDependencies: - encoding + optional: true mjml@4.15.3: dependencies: @@ -21096,6 +21231,7 @@ snapshots: mjml-validator: 4.15.3 transitivePeerDependencies: - encoding + optional: true mkdirp-classic@0.5.3: {} @@ -21260,11 +21396,13 @@ snapshots: node-gyp-build: 4.8.1 optional: true - nice-try@1.0.5: {} + nice-try@1.0.5: + optional: true no-case@2.3.2: dependencies: lower-case: 1.1.4 + optional: true no-case@3.0.4: dependencies: @@ -21595,6 +21733,7 @@ snapshots: p-event@4.2.0: dependencies: p-timeout: 3.2.0 + optional: true p-filter@2.1.0: dependencies: @@ -21648,12 +21787,14 @@ snapshots: p-timeout@3.2.0: dependencies: p-finally: 1.0.0 + optional: true p-try@2.2.0: {} p-wait-for@3.2.0: dependencies: p-timeout: 3.2.0 + optional: true pako@0.2.9: {} @@ -21662,6 +21803,7 @@ snapshots: param-case@2.1.1: dependencies: no-case: 2.3.2 + optional: true param-case@3.0.4: dependencies: @@ -21692,6 +21834,7 @@ snapshots: dependencies: domhandler: 5.0.3 parse5: 7.1.2 + optional: true parse5@7.1.2: dependencies: @@ -22108,6 +22251,7 @@ snapshots: p-wait-for: 3.2.0 pug: 3.0.3 uuid: 9.0.1 + optional: true prism-react-renderer@2.1.0(react@18.3.1): dependencies: @@ -22140,6 +22284,7 @@ snapshots: promise@7.3.1: dependencies: asap: 2.0.6 + optional: true prompts@2.4.2: dependencies: @@ -22285,6 +22430,7 @@ snapshots: constantinople: 4.0.1 js-stringify: 1.0.2 pug-runtime: 3.0.1 + optional: true pug-code-gen@3.0.3: dependencies: @@ -22296,8 +22442,10 @@ snapshots: pug-runtime: 3.0.1 void-elements: 3.1.0 with: 7.0.2 + optional: true - pug-error@2.1.0: {} + pug-error@2.1.0: + optional: true pug-filters@4.0.0: dependencies: @@ -22306,35 +22454,43 @@ snapshots: pug-error: 2.1.0 pug-walk: 2.0.0 resolve: 1.22.8 + optional: true pug-lexer@5.0.1: dependencies: character-parser: 2.2.0 is-expression: 4.0.0 pug-error: 2.1.0 + optional: true pug-linker@4.0.0: dependencies: pug-error: 2.1.0 pug-walk: 2.0.0 + optional: true pug-load@3.0.0: dependencies: object-assign: 4.1.1 pug-walk: 2.0.0 + optional: true pug-parser@6.0.0: dependencies: pug-error: 2.1.0 token-stream: 1.0.0 + optional: true - pug-runtime@3.0.1: {} + pug-runtime@3.0.1: + optional: true pug-strip-comments@2.0.0: dependencies: pug-error: 2.1.0 + optional: true - pug-walk@2.0.0: {} + pug-walk@2.0.0: + optional: true pug@3.0.3: dependencies: @@ -22346,6 +22502,7 @@ snapshots: pug-parser: 6.0.0 pug-runtime: 3.0.1 pug-strip-comments: 2.0.0 + optional: true pump@2.0.1: dependencies: @@ -22996,6 +23153,7 @@ snapshots: run-applescript@3.2.0: dependencies: execa: 0.10.0 + optional: true run-async@2.4.1: {} @@ -23221,7 +23379,8 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - slick@1.12.2: {} + slick@1.12.2: + optional: true socket.io-adapter@2.5.4: dependencies: @@ -23846,7 +24005,8 @@ snapshots: markdown-it-task-lists: 2.1.1 prosemirror-markdown: 1.13.0 - tlds@1.252.0: {} + tlds@1.252.0: + optional: true tmp@0.0.33: dependencies: @@ -23868,7 +24028,8 @@ snapshots: toidentifier@1.0.1: {} - token-stream@1.0.0: {} + token-stream@1.0.0: + optional: true token-types@5.0.1: dependencies: @@ -24089,7 +24250,8 @@ snapshots: ufo@1.5.3: {} - uglify-js@3.17.4: {} + uglify-js@3.17.4: + optional: true uid-safe@2.1.5: dependencies: @@ -24198,7 +24360,8 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 - upper-case@1.1.3: {} + upper-case@1.1.3: + optional: true uri-js@4.4.1: dependencies: @@ -24291,7 +24454,8 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - valid-data-url@3.0.1: {} + valid-data-url@3.0.1: + optional: true validate-npm-package-license@3.0.4: dependencies: @@ -24394,7 +24558,8 @@ snapshots: vm-browserify@1.1.2: {} - void-elements@3.1.0: {} + void-elements@3.1.0: + optional: true vue@3.4.27(typescript@5.4.5): dependencies: @@ -24444,6 +24609,7 @@ snapshots: valid-data-url: 3.0.1 transitivePeerDependencies: - encoding + optional: true web-streams-polyfill@3.3.3: {} @@ -24656,6 +24822,7 @@ snapshots: '@babel/types': 7.24.6 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 + optional: true word-wrap@1.2.5: {} From cd307dc787f68660ad6bf66f57daad4b34ee386e Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 13:29:18 +0530 Subject: [PATCH 06/61] fix: move to zod and new types --- apps/api/src/controllers/ai.controller.ts | 8 +-- apps/api/src/controllers/auth.controller.ts | 53 +++++++++++++------ apps/api/src/dto/ai.dto.ts | 12 +++++ apps/api/src/services/dto/ai.dto.ts | 12 ----- apps/api/src/types/express.ts | 7 +++ apps/api/src/utils/error.ts | 2 +- .../api/src/validation/zod.validation.pipe.ts | 38 ++++++------- 7 files changed, 80 insertions(+), 52 deletions(-) create mode 100644 apps/api/src/dto/ai.dto.ts delete mode 100644 apps/api/src/services/dto/ai.dto.ts create mode 100644 apps/api/src/types/express.ts diff --git a/apps/api/src/controllers/ai.controller.ts b/apps/api/src/controllers/ai.controller.ts index 104d6b66..ea8e59c2 100644 --- a/apps/api/src/controllers/ai.controller.ts +++ b/apps/api/src/controllers/ai.controller.ts @@ -1,14 +1,16 @@ import { Controller, Post, Body } from '@nestjs/common'; import { AiService } from '../services/ai.service'; -import { AIFormDto } from '../services/dto/ai.dto'; -import { ApiTags } from '@nestjs/swagger'; +import { ZodValidator } from '@api/validation/zod.validation.decorator'; +import { AIFormSchema, AIFormDto } from '@api/dto/ai.dto'; @Controller('ai') export class AiController { constructor(private readonly aiService: AiService) {} @Post('form') - @ApiTags('ai') + @ZodValidator({ + bodySchema: AIFormSchema, + }) async generateForm(@Body() aiFormDto: AIFormDto) { return this.aiService.gptComplete(aiFormDto.prompt, aiFormDto.messages); } diff --git a/apps/api/src/controllers/auth.controller.ts b/apps/api/src/controllers/auth.controller.ts index fa374ab6..fac55d0e 100644 --- a/apps/api/src/controllers/auth.controller.ts +++ b/apps/api/src/controllers/auth.controller.ts @@ -1,10 +1,13 @@ -import { Controller, Get, Request, Response, UseGuards } from '@nestjs/common'; -import { GithubAuthGuard } from '../services/auth/guards/github-oauth.guard'; -import { AuthService } from '../services/auth/auth.service'; -import { cookieHandler } from '../services/auth/cookieHandler'; -import { RefreshGuard } from '../services/auth/guards/refresh.guard'; -import { GoogleAuthGuard } from '../services/auth/guards/google-oauth.guard'; -import { SamlAuthGuard } from '../services/auth/guards/saml-oauth.guard'; +import { Controller, Get, Response, UseGuards, Request } from '@nestjs/common'; +import { GithubAuthGuard } from '@api/services/auth/guards/github-oauth.guard'; +import { AuthService } from '@api/services/auth/auth.service'; +import { cookieHandler } from '@api/services/auth/cookieHandler'; +import { RefreshGuard } from '@api/services/auth/guards/refresh.guard'; +import { GoogleAuthGuard } from '@api/services/auth/guards/google-oauth.guard'; +import { SamlAuthGuard } from '@api/services/auth/guards/saml-oauth.guard'; +import { Response as EResponse, Request as ERequest } from 'express'; +import { AuthUser } from '@api/services/auth/decorators/user.decorator'; +import { User } from '@api/db/schema'; @Controller('auth') export class AuthController { @@ -18,8 +21,11 @@ export class AuthController { // Route to Handle GitHub OAuth Callback @Get('/github/callback') @UseGuards(GithubAuthGuard) - async githubOAuthCallback(@Request() req, @Response() res) { - const authToken = await this.authService.generateAuthToken(req.user.uid); + async githubOAuthCallback( + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const authToken = await this.authService.generateAuthToken(user.id); cookieHandler(res, authToken, true); } @@ -29,8 +35,11 @@ export class AuthController { @Get('/google/callback') @UseGuards(GoogleAuthGuard) - async googleOAuthCallback(@Request() req, @Response() res) { - const authToken = await this.authService.generateAuthToken(req.user.uid); + async googleOAuthCallback( + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const authToken = await this.authService.generateAuthToken(user.id); cookieHandler(res, authToken, true); } @@ -40,9 +49,13 @@ export class AuthController { @Get('/saml//callback') @UseGuards(SamlAuthGuard) - async samlOAuthCallback(@Request() req, @Response() res) { + async samlOAuthCallback( + @Request() req: ERequest, + @AuthUser() user: User, + @Response() res: EResponse, + ) { const genToken = await this.authService.refreshAuthToken( - req.user, + user, req.cookies.refresh_token, ); cookieHandler(res, genToken, false); @@ -50,9 +63,13 @@ export class AuthController { @Get('/refresh') @UseGuards(RefreshGuard) - async refresh(@Request() req, @Response() res) { + async refresh( + @Request() req: ERequest, + @AuthUser() user: User, + @Response() res: EResponse, + ) { const genToken = await this.authService.refreshAuthToken( - req.user, + user, req.cookies.refresh_token, ); @@ -60,10 +77,12 @@ export class AuthController { } @Get('/logout') - async logout(@Response() res) { + async logout(@Response() res: EResponse) { res.clearCookie('access_token'); res.clearCookie('refresh_token'); - res.redirect(process.env.CLIENT_REDIRECT_URI); + // TODO: @DarkPhoenix2704 - Redirect to the client's home page + // Make a Typesafe way to fetch environment variables + // res.redirect(process.env.CLIENT_REDIRECT_URI); } } diff --git a/apps/api/src/dto/ai.dto.ts b/apps/api/src/dto/ai.dto.ts new file mode 100644 index 00000000..d23b8687 --- /dev/null +++ b/apps/api/src/dto/ai.dto.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +export const AIFormSchema = z.object({ + prompt: z.string(), + messages: z.array( + z.object({ + text: z.string(), + ai: z.boolean(), + }), + ), +}); + +export type AIFormDto = z.infer; diff --git a/apps/api/src/services/dto/ai.dto.ts b/apps/api/src/services/dto/ai.dto.ts deleted file mode 100644 index faedfa68..00000000 --- a/apps/api/src/services/dto/ai.dto.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class AIFormDto { - @ApiProperty() - prompt: string; - - @ApiProperty() - messages: Array<{ - text: string; - ai: boolean; - }>; -} diff --git a/apps/api/src/types/express.ts b/apps/api/src/types/express.ts new file mode 100644 index 00000000..db96ee89 --- /dev/null +++ b/apps/api/src/types/express.ts @@ -0,0 +1,7 @@ +import type { User } from '@api/db/schema'; + +declare namespace Express { + export interface Request { + user: User; + } +} diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts index 3b4dd150..afa4a7ad 100644 --- a/apps/api/src/utils/error.ts +++ b/apps/api/src/utils/error.ts @@ -49,7 +49,7 @@ export class FFError { throw new Unauthorized(message); } - static badRequest(message: string) { + static badRequest(message: string | unknown) { throw new BadRequest(message); } diff --git a/apps/api/src/validation/zod.validation.pipe.ts b/apps/api/src/validation/zod.validation.pipe.ts index 0f9a2064..daf78f73 100644 --- a/apps/api/src/validation/zod.validation.pipe.ts +++ b/apps/api/src/validation/zod.validation.pipe.ts @@ -1,27 +1,27 @@ import { - PipeTransform, - ArgumentMetadata, - BadRequestException, + PipeTransform, + ArgumentMetadata, + BadRequestException, } from '@nestjs/common'; import { ZodSchema } from 'zod'; +import { FFError } from '@api/utils/error'; export class ZodValidationPipe implements PipeTransform { - constructor( - private schema: ZodSchema, - private type: 'body' | 'query', - ) { - } + constructor( + private schema: ZodSchema, + private type: 'body' | 'query', + ) {} - transform(value: unknown, metadata: ArgumentMetadata) { - if (metadata.type !== this.type) { - return value; - } + transform(value: unknown, metadata: ArgumentMetadata) { + if (metadata.type !== this.type) { + return value; + } - try { - const parsedValue = this.schema.parse(value); - return parsedValue; - } catch (error: unknown) { - throw new BadRequestException(error); - } - } + try { + const parsedValue = this.schema.parse(value); + return parsedValue; + } catch (error: unknown) { + FFError.badRequest('Invalid request body'); + } + } } From 0a1c577fb3ddb62ac300f38235cea71ccc2b9dce Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 14:34:59 +0530 Subject: [PATCH 07/61] fix: some migration to new models --- apps/api/src/db/schema/user.ts | 2 +- apps/api/src/models/Account.ts | 13 +++ apps/api/src/models/BaseModel.ts | 20 ++--- apps/api/src/models/User.ts | 19 ++++ apps/api/src/models/index.ts | 4 + apps/api/src/services/ai.service.ts | 4 +- apps/api/src/services/auth/auth.service.ts | 75 ++++++---------- .../services/auth/strategy/github.strategy.ts | 13 ++- .../services/auth/strategy/google.strategy.ts | 16 ++-- .../services/auth/strategy/jwt.strategy.ts | 21 +++-- .../auth/strategy/refresh.strategy.ts | 8 +- apps/api/src/services/cloud.service.ts | 8 +- apps/api/src/services/user.service.ts | 87 ++++++------------- apps/api/src/utils/error.ts | 6 ++ 14 files changed, 146 insertions(+), 150 deletions(-) create mode 100644 apps/api/src/models/Account.ts create mode 100644 apps/api/src/models/index.ts diff --git a/apps/api/src/db/schema/user.ts b/apps/api/src/db/schema/user.ts index c29ee31f..3ef42c6e 100644 --- a/apps/api/src/db/schema/user.ts +++ b/apps/api/src/db/schema/user.ts @@ -10,7 +10,7 @@ export const UserSchema = z.object({ college_name: z.string().optional(), is_student: z.boolean().optional(), - refresh_token: z.string().optional(), + refresh_token: z.string(), created_at: z.date(), updated_at: z.date(), diff --git a/apps/api/src/models/Account.ts b/apps/api/src/models/Account.ts new file mode 100644 index 00000000..fb3766cf --- /dev/null +++ b/apps/api/src/models/Account.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Account } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class AccountModel extends BaseModel( + SystemTable.Account, +) { + constructor() { + const logger = new Logger('Account Model'); + super(logger); + } +} diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index 9667f186..0ad20c31 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -30,7 +30,7 @@ export default function createBaseModel( .first(); return (data as M) || null; } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -50,11 +50,11 @@ export default function createBaseModel( const data = await qb; return data as M[]; } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async insert(data: CreateSchema, trx?: Knex) { + static async insert(data: CreateSchema, trx?: Knex): Promise { try { const insertData = { ...data, @@ -65,7 +65,7 @@ export default function createBaseModel( .returning('*'); return res[0] as M; } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -80,7 +80,7 @@ export default function createBaseModel( .returning('*'); return res as M[]; } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -92,7 +92,7 @@ export default function createBaseModel( .returning('*'); return res as M[]; } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -118,7 +118,7 @@ export default function createBaseModel( try { return (trx ?? BaseContext.knex)(tableName).where(where).del(); } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -130,7 +130,7 @@ export default function createBaseModel( .count(); return Number.parseInt(data[0].count as string, 10); } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -160,7 +160,7 @@ export default function createBaseModel( const data = await qb; return data as M[]; } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -174,7 +174,7 @@ export default function createBaseModel( try { return (trx ?? BaseContext.knex).raw(query); } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + throw FFError.databaseError(`${tableName}: Query Failed : `, error); } } } diff --git a/apps/api/src/models/User.ts b/apps/api/src/models/User.ts index cfd0e0ee..1a00b725 100644 --- a/apps/api/src/models/User.ts +++ b/apps/api/src/models/User.ts @@ -2,6 +2,9 @@ import BaseModel from '@api/models/BaseModel'; import { User } from '@api/db/schema'; import { Logger } from '@nestjs/common'; import { SystemTable } from '@api/utils/db'; +import { Knex } from 'knex'; +import BaseContext from '@api/BaseContext'; +import { FFError } from '@api/utils/error'; export class UserModel extends BaseModel( SystemTable.User, @@ -10,4 +13,20 @@ export class UserModel extends BaseModel( const logger = new Logger('UserModel'); super(logger); } + + static async findUserByEmail(email: string, trx?: Knex) { + try { + const user = await (trx ?? BaseContext.knex)( + SystemTable.User, + ) + .where({ email }) + .first(); + return user; + } catch (error) { + throw FFError.databaseError( + `${SystemTable.User}: Query Failed : `, + error, + ); + } + } } diff --git a/apps/api/src/models/index.ts b/apps/api/src/models/index.ts new file mode 100644 index 00000000..2bd60ee3 --- /dev/null +++ b/apps/api/src/models/index.ts @@ -0,0 +1,4 @@ +import { AccountModel } from './Account'; +import { UserModel } from './User'; + +export { AccountModel, UserModel }; diff --git a/apps/api/src/services/ai.service.ts b/apps/api/src/services/ai.service.ts index 62fca3d6..452377d3 100644 --- a/apps/api/src/services/ai.service.ts +++ b/apps/api/src/services/ai.service.ts @@ -83,8 +83,8 @@ export class AiService { response_format: { type: 'json_object', schema: jsonSchema }, }); - const jsonExtract = chat.choices[0].message.content.match( - /[{\[]{1}([,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis, + const jsonExtract = chat.choices[0].message.content?.match( + /[{\[]([,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]/gis, ); if (!jsonExtract) { diff --git a/apps/api/src/services/auth/auth.service.ts b/apps/api/src/services/auth/auth.service.ts index 6486a8e6..919e7581 100644 --- a/apps/api/src/services/auth/auth.service.ts +++ b/apps/api/src/services/auth/auth.service.ts @@ -1,34 +1,27 @@ import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { JwtService } from '@nestjs/jwt'; -import type { User } from '@prisma/client'; import { hash, verify } from 'argon2'; import type { Profile } from 'passport'; -import { PrismaService } from '../prisma.service'; -import { UserService } from '../user.service'; +import { User } from '@api/db/schema'; +import { AccountModel, UserModel } from '@api/models'; +import { FFError } from '@api/utils/error'; @Injectable() export class AuthService { constructor( - private readonly prismaService: PrismaService, private readonly jwtService: JwtService, - private readonly userService: UserService, private readonly configService: ConfigService, ) {} async checkIfProviderAccountExists(OAuthUserData: Profile) { - const provider = await this.prismaService.account.findUnique({ - where: { - verify_provider_account: { - provider: OAuthUserData.provider, - providerAccountId: OAuthUserData.id, - }, - }, + const provider = await AccountModel.find({ + provider: OAuthUserData.provider, + provider_account_id: OAuthUserData.id, }); - if (!provider) return null; - - return provider; + if (!provider || !provider.length) return null; + return provider[0]; } async createProviderAccount( @@ -37,36 +30,26 @@ export class AuthService { accessToken: string, refreshToken: string, ) { - try { - const createdProviderAccount = await this.prismaService.account.create({ - data: { - provider: profile.provider, - providerAccountId: profile.id, - providerAccessToken: accessToken, - providerRefreshToken: refreshToken, - user: { - connect: { - uid: user.uid, - }, - }, - }, - }); - - return createdProviderAccount; - } catch (error) { - return null; - } + const account = await AccountModel.insert({ + provider: profile.provider, + provider_account_id: profile.id, + provider_access_token: accessToken, + provider_refresh_token: refreshToken, + fk_user_id: user.id, + }); + + return account; } - async generateAuthToken(uid: string) { + async generateAuthToken(id: string) { const payload = { iss: this.configService.get('API_BASE_URL'), - sub: uid, + sub: id, iat: new Date().getTime(), }; const accessToken = await this.jwtService.signAsync(payload); - const refreshToken = await this.generateRefreshToken(uid); + const refreshToken = await this.generateRefreshToken(id); return { accessToken, @@ -74,9 +57,9 @@ export class AuthService { }; } - async generateRefreshToken(uid: string) { + async generateRefreshToken(id: string) { const payload = { - sub: uid, + sub: id, iss: this.configService.get('API_BASE_URL'), iat: new Date().getTime(), }; @@ -84,12 +67,7 @@ export class AuthService { const hashedRefreshToken = await hash(refreshToken); - const updatedUser = await this.userService.updateRefreshToken( - uid, - hashedRefreshToken, - ); - - if (!updatedUser) throw new Error('REFRESH_TOKEN_NOT_UPDATED'); + await UserModel.update({ id: id }, { refresh_token: hashedRefreshToken }); return refreshToken; } @@ -97,11 +75,10 @@ export class AuthService { async refreshAuthToken(user: User, hashedToken: string) { if (!user) throw new Error('USER_NOT_FOUND'); - const isRefreshTokenValid = await verify(user.refreshToken, hashedToken); + const isRefreshTokenValid = await verify(user.refresh_token, hashedToken); - if (!isRefreshTokenValid) - throw new Error('AFTER_GENERATION_INVALID_REFRESH_TOKEN'); + if (!isRefreshTokenValid) FFError.unauthorized('Invalid refresh token'); - return await this.generateAuthToken(user.uid); + return await this.generateAuthToken(user.id); } } diff --git a/apps/api/src/services/auth/strategy/github.strategy.ts b/apps/api/src/services/auth/strategy/github.strategy.ts index b52dd513..7c1ac162 100644 --- a/apps/api/src/services/auth/strategy/github.strategy.ts +++ b/apps/api/src/services/auth/strategy/github.strategy.ts @@ -4,6 +4,7 @@ import { Injectable } from '@nestjs/common'; import { AuthService } from '../auth.service'; import { UserService } from '../../user.service'; import { ConfigService } from '@nestjs/config'; +import { UserModel } from '@api/models/User'; @Injectable() export class GithubStrategy extends PassportStrategy(Strategy) { @@ -27,10 +28,15 @@ export class GithubStrategy extends PassportStrategy(Strategy) { profile: Profile, done, ) { + const email = profile.emails?.[0].value; + + if (!email) { + // If the user doesn't have an email, return an error + return done(null, false); + } + // Check whether this user exist in the database or not - const user = await this.usersService.findUserByEmail( - profile.emails[0].value, - ); + const user = await UserModel.findUserByEmail(email); // If the user doesn't exist in the database, create a new user if (!user) { @@ -38,6 +44,7 @@ export class GithubStrategy extends PassportStrategy(Strategy) { accessToken, refreshToken, profile, + email, ); return createdUser; } diff --git a/apps/api/src/services/auth/strategy/google.strategy.ts b/apps/api/src/services/auth/strategy/google.strategy.ts index 5dc0d030..05c2a499 100644 --- a/apps/api/src/services/auth/strategy/google.strategy.ts +++ b/apps/api/src/services/auth/strategy/google.strategy.ts @@ -4,6 +4,7 @@ import { Injectable } from '@nestjs/common'; import { AuthService } from '../auth.service'; import { UserService } from '../../user.service'; import { ConfigService } from '@nestjs/config'; +import { UserModel } from '@api/models'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy) { @@ -27,19 +28,24 @@ export class GoogleStrategy extends PassportStrategy(Strategy) { profile: Profile, done, ) { + const email = profile.emails?.[0].value; + + if (!email) { + // If the user doesn't have an email, return an error + return done(null, false); + } + // Check whether this user exist in the database or not - const user = await this.usersService.findUserByEmail( - profile.emails[0].value, - ); + const user = await UserModel.findUserByEmail(email); // If the user doesn't exist in the database, create a new user if (!user) { - const createdUser = await this.usersService.createOAuthUser( + return await this.usersService.createOAuthUser( accessToken, refreshToken, profile, + email, ); - return createdUser; } // If the user already exists, check if the user has a provider account diff --git a/apps/api/src/services/auth/strategy/jwt.strategy.ts b/apps/api/src/services/auth/strategy/jwt.strategy.ts index c3d6e913..35695103 100644 --- a/apps/api/src/services/auth/strategy/jwt.strategy.ts +++ b/apps/api/src/services/auth/strategy/jwt.strategy.ts @@ -1,9 +1,11 @@ -import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { PassportStrategy } from '@nestjs/passport'; import type { Request } from 'express'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { UserService } from '../../user.service'; +import { UserService } from '@api/services/user.service'; +import { FFError } from '@api/utils/error'; +import { UserModel } from '@api/models'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { @@ -18,7 +20,7 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { (request: Request) => { const data = request?.cookies.access_token; if (!data) { - throw new UnauthorizedException('ACCESS_TOKEN_NOT_FOUND'); + FFError.unauthorized('Access Token not found'); } return data; }, @@ -26,14 +28,15 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { }); } - async validate(payload: any) { - if (payload === null) { - throw new UnauthorizedException(); - } - const user = await this.userService.findUserById(payload.sub); + async validate(payload: { + iss: string; + sub: string; + iat: number; + }) { + const user = await UserModel.findById(payload.sub); if (!user) { - throw new UnauthorizedException('INVALID_USER'); + FFError.unauthorized('Invalid user'); } return user; } diff --git a/apps/api/src/services/auth/strategy/refresh.strategy.ts b/apps/api/src/services/auth/strategy/refresh.strategy.ts index efff372a..8de93f7b 100644 --- a/apps/api/src/services/auth/strategy/refresh.strategy.ts +++ b/apps/api/src/services/auth/strategy/refresh.strategy.ts @@ -8,6 +8,7 @@ import { PassportStrategy } from '@nestjs/passport'; import type { Request } from 'express'; import { ExtractJwt, Strategy } from 'passport-jwt'; import { UserService } from '../../user.service'; +import { FFError } from '@api/utils/error'; @Injectable() export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { @@ -21,9 +22,9 @@ export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { secretOrKey: configService.get('JWT_SECRET'), jwtFromRequest: ExtractJwt.fromExtractors([ (request: Request) => { - const data = request?.cookies['refresh_token']; + const data = request?.cookies.refresh_token; if (!data) { - throw new UnauthorizedException('REFRESH_TOKEN_NOT_FOUND'); + FFError.unauthorized('Invalid refresh token'); } return data; }, @@ -32,9 +33,6 @@ export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { } async validate(req: Request, payload: any) { - if (!payload) { - throw new BadRequestException('PAYLOAD_NOT_FOUND'); - } const user = await this.userService.findUserById(payload.sub); if (!user) { diff --git a/apps/api/src/services/cloud.service.ts b/apps/api/src/services/cloud.service.ts index 46e9087e..79bbfe28 100644 --- a/apps/api/src/services/cloud.service.ts +++ b/apps/api/src/services/cloud.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; +import { FFError } from '@api/utils/error'; @Injectable() export class S3Service { @@ -15,10 +16,11 @@ export class S3Service { }); } - async uploadFile(file: Express.Multer.File): Promise { + async uploadFile(file: Express.Multer.File) { try { const { mimetype, originalname } = file; const command = new PutObjectCommand({ + // TODO: @DarkPhoenix2704 - Make the Bucket name Configurable Bucket: 'fossfolio', Key: originalname.split(' ').join('-'), Body: file.buffer, @@ -28,9 +30,7 @@ export class S3Service { return `https://${command.input.Bucket}.s3.amazonaws.com/${command.input.Key}`; } catch (error) { - // Handle error gracefully - console.error(error); - return; + FFError.uploadAttachmentError('Error uploading attachment'); } } } diff --git a/apps/api/src/services/user.service.ts b/apps/api/src/services/user.service.ts index d3a48e6a..6a9a0095 100644 --- a/apps/api/src/services/user.service.ts +++ b/apps/api/src/services/user.service.ts @@ -6,6 +6,8 @@ import type { UpdateUserDto } from './dto/update-user.dto'; import type { User } from '@prisma/client'; import { fakerEN } from '@faker-js/faker'; import { EventEmitter2 } from '@nestjs/event-emitter'; +import { UserModel } from '@api/models/User'; +import { AccountModel } from '@api/models'; @Injectable() export class UserService { @@ -14,19 +16,6 @@ export class UserService { private readonly eventEmitter: EventEmitter2, ) {} - async findUserByEmail(email: string) { - try { - const user = await this.prismaService.user.findUnique({ - where: { - email: email, - }, - }); - return user; - } catch (error) { - return null; - } - } - async findUserBySlug(slug: string) { try { const user = await this.prismaService.user.findUnique({ @@ -44,9 +33,10 @@ export class UserService { accessToken: string, refreshToken: string, profile: Profile, + email: string, ) { - const userDisplayName = profile.displayName ? profile.displayName : null; - const userPhotoURL = profile.photos ? profile.photos[0].value : null; + const userDisplayName = profile.displayName ? profile.displayName : ''; + const userPhotoURL = profile.photos ? profile.photos[0].value : ''; let slug: string; while (true) { @@ -56,60 +46,33 @@ export class UserService { break; } - const createdUser = await this.prismaService.user.create({ - data: { - displayName: userDisplayName, - email: profile.emails[0].value, - photoURL: userPhotoURL, - slug, - providerAccounts: { - create: { - provider: profile.provider, - providerAccountId: profile.id, - providerRefreshToken: refreshToken, - providerAccessToken: accessToken, - }, - }, - }, + const user = await UserModel.insert({ + display_name: userDisplayName, + email, + photo_url: userPhotoURL, + slug, + refresh_token: '', + }); + + await AccountModel.insert({ + provider: profile.provider, + provider_account_id: profile.id, + provider_access_token: accessToken, + provider_refresh_token: refreshToken, + fk_user_id: user.id, }); this.eventEmitter.emit('user.registered', { - email: createdUser.email, - name: createdUser.displayName, - avatarUrl: createdUser.photoURL, + email: user.email, + name: user.display_name, + avatarUrl: user.photo_url, }); - return createdUser; + return user; } - async updateRefreshToken(uid: string, refreshToken: string | null) { - try { - const updatedUser = await this.prismaService.user.update({ - where: { - uid: uid, - }, - data: { - refreshToken: refreshToken, - }, - }); - return updatedUser; - } catch (error) { - throw error; - } - } - - async findUserById(uid: string) { - try { - const user = await this.prismaService.user.findUnique({ - where: { - uid: uid, - }, - }); - - return user; - } catch (error) { - return null; - } + async findUserById(id: string) { + return await UserModel.findById(id); } async updateUser(authUser: User, updateUserDto: UpdateUserDto) { diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts index afa4a7ad..4d9f77a2 100644 --- a/apps/api/src/utils/error.ts +++ b/apps/api/src/utils/error.ts @@ -27,6 +27,8 @@ export class InternalServerError export class ExternalError extends Error implements RootError {} +export class UploadAttachmentError extends RootError {} + export class DatabaseError extends RootError { constructor(message: string, error: unknown) { super(message); @@ -64,6 +66,10 @@ export class FFError { static databaseError(message: string, error: unknown) { throw new DatabaseError(message, error); } + + static uploadAttachmentError(message: string) { + throw new UploadAttachmentError(message); + } } const extractDBError = (error: { From cf7a81b28f3e5864d6a5c8aca2f0ef769345e411 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 18:23:08 +0530 Subject: [PATCH 08/61] fix: remove direct usage of process.env --- apps/api/.env.example | 1 - apps/api/src/BaseContext.ts | 76 ++++--- apps/api/src/controllers/auth.controller.ts | 134 +++++------ apps/api/src/main.ts | 28 +-- apps/api/src/middleware/upload.middleware.ts | 7 +- apps/api/src/models/BaseModel.ts | 24 +- apps/api/src/models/User.ts | 5 +- apps/api/src/modules/root.module.ts | 220 +++++++++---------- apps/api/src/services/auth/cookieHandler.ts | 10 +- apps/api/src/services/cloud.service.ts | 9 +- apps/api/src/services/org-invite.service.ts | 11 +- apps/api/src/services/stripe.service.ts | 37 ++-- apps/api/src/utils/envSchema.ts | 48 ++++ apps/api/src/utils/error.ts | 18 +- 14 files changed, 340 insertions(+), 288 deletions(-) create mode 100644 apps/api/src/utils/envSchema.ts diff --git a/apps/api/.env.example b/apps/api/.env.example index af144008..0066339c 100644 --- a/apps/api/.env.example +++ b/apps/api/.env.example @@ -2,7 +2,6 @@ GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= GITHUB_SCOPE=user:email -RESEND_KEY = "" SESSION_SECRET=secret JWT_SECRET=secret DATABASE_URL=postgres://fossfolio:fossfolio@localhost:5432/fossfolio diff --git a/apps/api/src/BaseContext.ts b/apps/api/src/BaseContext.ts index 592d6f6d..ba8f288a 100644 --- a/apps/api/src/BaseContext.ts +++ b/apps/api/src/BaseContext.ts @@ -2,42 +2,46 @@ import type { Knex } from 'knex'; import knex from 'knex'; import { Logger } from '@nestjs/common'; import { SystemTable } from '@api/utils/db'; +import { ConfigService } from '@nestjs/config'; export default class BaseContext { - public static knex: Knex; - private static readonly logger = new Logger(BaseContext.name); - - public static async init() { - BaseContext.knex = knex({ - client: 'pg', - connection: { - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - }, - migrations: { - tableName: SystemTable.FF_Migrations, - directory: 'src/db/migrations', - }, - }); - - BaseContext.logger.log('Starting Migration process...'); - - await BaseContext.knex.migrate.latest(); - - BaseContext.logger.log('Migration process completed.'); - } - - public async destroy() { - await BaseContext.knex.destroy(); - } - - public async getTransaction() { - return BaseContext.knex.transaction(); - } - - public async commitTransaction(trx: Knex.Transaction) { - await trx.commit(); - } + public static knex: Knex; + public static config: ConfigService; + private static readonly logger = new Logger(BaseContext.name); + + public static async init(_config: ConfigService) { + this.config = _config; + + BaseContext.knex = knex({ + client: 'pg', + connection: { + host: this.config.get('DB_HOST'), + user: this.config.get('DB_USER'), + password: this.config.get('DB_PASSWORD'), + database: this.config.get('DB_NAME'), + }, + migrations: { + tableName: SystemTable.FF_Migrations, + directory: 'src/db/migrations', + }, + }); + + BaseContext.logger.log('Starting Migration process...'); + + await BaseContext.knex.migrate.latest(); + + BaseContext.logger.log('Migration process completed.'); + } + + public async destroy() { + await BaseContext.knex.destroy(); + } + + public async getTransaction() { + return BaseContext.knex.transaction(); + } + + public async commitTransaction(trx: Knex.Transaction) { + await trx.commit(); + } } diff --git a/apps/api/src/controllers/auth.controller.ts b/apps/api/src/controllers/auth.controller.ts index fac55d0e..db46b26e 100644 --- a/apps/api/src/controllers/auth.controller.ts +++ b/apps/api/src/controllers/auth.controller.ts @@ -8,81 +8,87 @@ import { SamlAuthGuard } from '@api/services/auth/guards/saml-oauth.guard'; import { Response as EResponse, Request as ERequest } from 'express'; import { AuthUser } from '@api/services/auth/decorators/user.decorator'; import { User } from '@api/db/schema'; +import { ConfigService } from '@nestjs/config'; @Controller('auth') export class AuthController { - constructor(private readonly authService: AuthService) {} + constructor( + private readonly authService: AuthService, + private readonly configService: ConfigService, + ) { + } - // Route to Initiate GitHub OAuth - @Get('/github') - @UseGuards(GithubAuthGuard) - async githubOAuth() {} + // Route to Initiate GitHub OAuth + @Get('/github') + @UseGuards(GithubAuthGuard) + async githubOAuth() { + } - // Route to Handle GitHub OAuth Callback - @Get('/github/callback') - @UseGuards(GithubAuthGuard) - async githubOAuthCallback( - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const authToken = await this.authService.generateAuthToken(user.id); - cookieHandler(res, authToken, true); - } + // Route to Handle GitHub OAuth Callback + @Get('/github/callback') + @UseGuards(GithubAuthGuard) + async githubOAuthCallback( + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const authToken = await this.authService.generateAuthToken(user.id); + cookieHandler(res, authToken, true); + } - @Get('/google') - @UseGuards(GoogleAuthGuard) - async googleOAuth() {} + @Get('/google') + @UseGuards(GoogleAuthGuard) + async googleOAuth() { + } - @Get('/google/callback') - @UseGuards(GoogleAuthGuard) - async googleOAuthCallback( - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const authToken = await this.authService.generateAuthToken(user.id); - cookieHandler(res, authToken, true); - } + @Get('/google/callback') + @UseGuards(GoogleAuthGuard) + async googleOAuthCallback( + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const authToken = await this.authService.generateAuthToken(user.id); + cookieHandler(res, authToken, true); + } - @Get('/saml') - @UseGuards(SamlAuthGuard) - async samlOAuth() {} + @Get('/saml') + @UseGuards(SamlAuthGuard) + async samlOAuth() { + } - @Get('/saml//callback') - @UseGuards(SamlAuthGuard) - async samlOAuthCallback( - @Request() req: ERequest, - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const genToken = await this.authService.refreshAuthToken( - user, - req.cookies.refresh_token, - ); - cookieHandler(res, genToken, false); - } + @Get('/saml//callback') + @UseGuards(SamlAuthGuard) + async samlOAuthCallback( + @Request() req: ERequest, + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const genToken = await this.authService.refreshAuthToken( + user, + req.cookies.refresh_token, + ); + cookieHandler(res, genToken, false); + } - @Get('/refresh') - @UseGuards(RefreshGuard) - async refresh( - @Request() req: ERequest, - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const genToken = await this.authService.refreshAuthToken( - user, - req.cookies.refresh_token, - ); + @Get('/refresh') + @UseGuards(RefreshGuard) + async refresh( + @Request() req: ERequest, + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const genToken = await this.authService.refreshAuthToken( + user, + req.cookies.refresh_token, + ); - cookieHandler(res, genToken, false); - } + cookieHandler(res, genToken, false); + } - @Get('/logout') - async logout(@Response() res: EResponse) { - res.clearCookie('access_token'); - res.clearCookie('refresh_token'); + @Get('/logout') + async logout(@Response() res: EResponse) { + res.clearCookie('access_token'); + res.clearCookie('refresh_token'); - // TODO: @DarkPhoenix2704 - Redirect to the client's home page - // Make a Typesafe way to fetch environment variables - // res.redirect(process.env.CLIENT_REDIRECT_URI); - } + res.redirect(this.configService.get('CLIENT_URL') as string); + } } diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 7f75238f..3b28162a 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -4,50 +4,44 @@ import { AppModule } from './app.module'; import * as cookieParser from 'cookie-parser'; import * as express from 'express'; import { ValidationPipe } from '@nestjs/common'; -import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import * as process from 'node:process'; import BaseContext from '@api/BaseContext'; import { NestExpressApplication } from '@nestjs/platform-express'; import { GlobalErrorFilter } from '@api/filters/global-error.filter'; +import { ConfigService } from '@nestjs/config'; async function bootstrap() { const app = await NestFactory.create(AppModule); - await BaseContext.init(); + const configService = app.get(ConfigService); + + await BaseContext.init(configService); app.use( session({ - secret: process.env.SESSION_SECRET as string, + secret: configService.get('SESSION_SECRET'), resave: false, saveUninitialized: false, }), ); app.use(cookieParser()); + app.useGlobalPipes(new ValidationPipe()); app.useGlobalFilters(new GlobalErrorFilter()); // prevent body parsing in stripe webhook route to access the stripe signature as buffer app.use('/api/payment/webhook', express.raw({ type: '*/*' })); + app.setGlobalPrefix('api'); + app.enableCors({ - origin: process.env.CLIENT_URL || 'http://localhost:3000', + origin: configService.get('CLIENT_URL'), credentials: true, }); - const config = new DocumentBuilder() - .setTitle('FossFolio') - .setDescription( - 'An open source web application for people to Find, Host and Manage Events.', - ) - .setVersion('1.0') - .build(); - const document = SwaggerModule.createDocument(app, config); - SwaggerModule.setup('api/docs', app, document); - await app.listen( - (process.env.PORT as string) || 8080, - (process.env.HOST as string) || '0.0.0.0', + configService.get('PORT') as number, + configService.get('HOST'), ); } diff --git a/apps/api/src/middleware/upload.middleware.ts b/apps/api/src/middleware/upload.middleware.ts index f2fc5187..43043742 100644 --- a/apps/api/src/middleware/upload.middleware.ts +++ b/apps/api/src/middleware/upload.middleware.ts @@ -1,10 +1,15 @@ import { Injectable, type NestMiddleware } from '@nestjs/common'; import type { Request, Response, NextFunction } from 'express'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class UploadMiddleWare implements NestMiddleware { + constructor(private readonly configService: ConfigService) {} + use(req: Request, _: Response, next: NextFunction) { - const url = new URL(process.env.API_BASE_URL + req.originalUrl); + const url = new URL( + this.configService.get('API_BASE_URL') + req.originalUrl, + ); // // Access the extracted parameters this is done to upload files to events if (!req.body.organizationId) { req.body = { diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index 0ad20c31..cebd8b16 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -30,11 +30,15 @@ export default function createBaseModel( .first(); return (data as M) || null; } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } - static async find(where: Partial, orderBy?: OrderBy, trx?: Knex) { + static async find( + where: Partial, + orderBy?: OrderBy, + trx?: Knex, + ): Promise { try { const qb = (trx ?? BaseContext.knex)(tableName) .where(where) @@ -50,7 +54,7 @@ export default function createBaseModel( const data = await qb; return data as M[]; } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -65,7 +69,7 @@ export default function createBaseModel( .returning('*'); return res[0] as M; } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -80,7 +84,7 @@ export default function createBaseModel( .returning('*'); return res as M[]; } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -92,7 +96,7 @@ export default function createBaseModel( .returning('*'); return res as M[]; } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -118,7 +122,7 @@ export default function createBaseModel( try { return (trx ?? BaseContext.knex)(tableName).where(where).del(); } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -130,7 +134,7 @@ export default function createBaseModel( .count(); return Number.parseInt(data[0].count as string, 10); } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -160,7 +164,7 @@ export default function createBaseModel( const data = await qb; return data as M[]; } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } @@ -174,7 +178,7 @@ export default function createBaseModel( try { return (trx ?? BaseContext.knex).raw(query); } catch (error: unknown) { - throw FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError(`${tableName}: Query Failed : `, error); } } } diff --git a/apps/api/src/models/User.ts b/apps/api/src/models/User.ts index 1a00b725..5aa7c150 100644 --- a/apps/api/src/models/User.ts +++ b/apps/api/src/models/User.ts @@ -23,10 +23,7 @@ export class UserModel extends BaseModel( .first(); return user; } catch (error) { - throw FFError.databaseError( - `${SystemTable.User}: Query Failed : `, - error, - ); + FFError.databaseError(`${SystemTable.User}: Query Failed : `, error); } } } diff --git a/apps/api/src/modules/root.module.ts b/apps/api/src/modules/root.module.ts index faf11b64..d60f3981 100644 --- a/apps/api/src/modules/root.module.ts +++ b/apps/api/src/modules/root.module.ts @@ -37,135 +37,115 @@ import { OrganizationController } from '../controllers/organization.controller'; import { PrismaService } from '../services/prisma.service'; import { StripeController } from '../controllers/stripe.controller'; import { UserController } from '../controllers/user.controller'; -import * as Joi from 'joi'; +import { envSchema, parsedEnv } from '@api/utils/envSchema'; const AuthProviders = [ - AuthService, - GithubStrategy, - GoogleStrategy, - SamlStrategy, - UserService, - JwtStrategy, - RefreshStrategy, + AuthService, + GithubStrategy, + GoogleStrategy, + SamlStrategy, + UserService, + JwtStrategy, + RefreshStrategy, ]; const AuthModules = [ - PassportModule, - JwtModule.register({ - secret: process.env.JWT_SECRET, - signOptions: { expiresIn: process.env.ACCESS_TOKEN_VALIDITY }, - }), + PassportModule, + JwtModule.registerAsync({ + useFactory: async (configService: ConfigService) => ({ + secret: configService.get('JWT_SECRET'), + signOptions: { expiresIn: configService.get('ACCESS_TOKEN_VALIDITY') }, + }), + inject: [ConfigService], + }), ]; const GlobalModules = [ - ConfigModule.forRoot({ - isGlobal: true, - validationSchema: Joi.object({ - DATABASE_URL: Joi.string(), - GITHUB_CLIENT_ID: Joi.string(), - GITHUB_CLIENT_SECRET: Joi.string(), - GITHUB_CALLBACK_URL: Joi.string(), - GITHUB_SCOPE: Joi.string(), - ACCESS_TOKEN_VALIDITY: Joi.string(), - API_BASE_URL: Joi.string(), - GOOGLE_CLIENT_ID: Joi.string(), - GOOGLE_CLIENT_SECRET: Joi.string(), - GOOGLE_CALLBACK_URL: Joi.string(), - GOOGLE_SCOPE: Joi.string(), - WEB_URL: Joi.string(), - MAIL_HOST: Joi.string(), - MAIL_PORT: Joi.number(), - MAIL_USER: Joi.string(), - MAIL_PASSWORD: Joi.string(), - AWS_ACCESS_KEY: Joi.string(), - AWS_SECRET_KEY: Joi.string(), - AWS_REGION: Joi.string(), - STRIPE_SECRET_KEY: Joi.string(), - STRIPE_WEBHOOK_SECRET: Joi.string(), - AI_KEY: Joi.string(), - }), - validationOptions: { - allowUnknown: true, - abortEarly: true, - }, - }), - EventEmitterModule.forRoot(), - ThrottlerModule.forRoot([ - { - ttl: 60000, - limit: 50, - }, - ]), - LoggerModule.forRoot({ - pinoHttp: { - level: 'error', - redact: ['req.headers', 'req.remoteAddress', 'res.headers'], - }, - }), - MailerModule.forRootAsync({ - useFactory: async (configService: ConfigService) => ({ - transport: { - host: configService.get('MAIL_HOST'), - port: configService.get('MAIL_PORT'), - secure: false, - auth: { - user: configService.get('MAIL_USER'), - pass: configService.get('MAIL_PASSWORD'), - }, - tls: { - rejectUnauthorized: false, - }, - }, - defaults: { - from: configService.get('MAIL_FROM'), - }, - template: { - dir: join(__dirname, 'templates'), - adapter: new ReactAdapter({ - pretty: false, - plainText: false, - }), - options: { - strict: true, - }, - }, - }), - inject: [ConfigService], - }), + ConfigModule.forRoot({ + isGlobal: true, + validate: envSchema.parse, + validationOptions: { + abortEarly: true, + }, + }), + EventEmitterModule.forRoot(), + ThrottlerModule.forRoot([ + { + ttl: 60000, + limit: 50, + }, + ]), + LoggerModule.forRoot({ + pinoHttp: { + level: 'error', + redact: ['req.headers', 'req.remoteAddress', 'res.headers'], + }, + }), + MailerModule.forRootAsync({ + useFactory: async (configService: ConfigService) => ({ + transport: { + host: configService.get('MAIL_HOST'), + port: configService.get('MAIL_PORT'), + secure: false, + auth: { + user: configService.get('MAIL_USER'), + pass: configService.get('MAIL_PASSWORD'), + }, + tls: { + rejectUnauthorized: false, + }, + }, + defaults: { + from: configService.get('MAIL_FROM'), + }, + template: { + dir: join(__dirname, 'templates'), + adapter: new ReactAdapter({ + pretty: false, + plainText: false, + }), + options: { + strict: true, + }, + }, + }), + inject: [ConfigService], + }), ]; @Module({ - imports: [...GlobalModules, ...AuthModules], - controllers: [ - AuthController, - AiController, - EventsController, - FormController, - KanbanController, - OrgInviteController, - OrgMemberController, - OrganizationController, - StripeController, - UserController, - ], - providers: [ - { - provide: APP_GUARD, - useClass: ThrottlerGuard, - }, - ...AuthProviders, - AiService, - S3Service, - StripeService, - EventsService, - FormService, - KanbanService, - MailService, - OrganizationInviteService, - OrganizationMemberService, - OrganizationService, - PrismaService, - UserService, - ], + imports: [...GlobalModules, ...AuthModules], + controllers: [ + AuthController, + AiController, + EventsController, + FormController, + KanbanController, + OrgInviteController, + OrgMemberController, + OrganizationController, + StripeController, + UserController, + ], + providers: [ + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, + ...AuthProviders, + AiService, + S3Service, + StripeService, + EventsService, + FormService, + KanbanService, + MailService, + OrganizationInviteService, + OrganizationMemberService, + OrganizationService, + PrismaService, + UserService, + ], }) -export class RootModule {} +export class RootModule { +} diff --git a/apps/api/src/services/auth/cookieHandler.ts b/apps/api/src/services/auth/cookieHandler.ts index 4d57c2c8..7d373164 100644 --- a/apps/api/src/services/auth/cookieHandler.ts +++ b/apps/api/src/services/auth/cookieHandler.ts @@ -1,5 +1,7 @@ import type { Response } from 'express'; +import BaseContext from '@api/BaseContext'; + export const cookieHandler = ( res: Response, authToken: { @@ -10,12 +12,12 @@ export const cookieHandler = ( ) => { res.cookie('access_token', authToken.accessToken, { httpOnly: true, - secure: process.env.NODE_ENV === 'production', + secure: BaseContext.config.get('NODE_ENV') === 'production', maxAge: 1000 * 60 * 60 * 24, // 1 day }); res.cookie('refresh_token', authToken.refreshToken, { httpOnly: true, - secure: process.env.NODE_ENV === 'production', + secure: BaseContext.config.get('NODE_ENV') === 'production', maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week }); @@ -25,5 +27,7 @@ export const cookieHandler = ( }); } - return res.status(200).redirect(process.env.CLIENT_REDIRECT_URI); + return res + .status(200) + .redirect(BaseContext.config.get('CLIENT_REDIRECT_URI')); }; diff --git a/apps/api/src/services/cloud.service.ts b/apps/api/src/services/cloud.service.ts index 79bbfe28..aca06287 100644 --- a/apps/api/src/services/cloud.service.ts +++ b/apps/api/src/services/cloud.service.ts @@ -1,17 +1,18 @@ import { Injectable } from '@nestjs/common'; import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; import { FFError } from '@api/utils/error'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class S3Service { private readonly s3Client: S3Client; - constructor() { + constructor(private readonly configService: ConfigService) { this.s3Client = new S3Client({ - region: process.env.AWS_REGION, + region: this.configService.get('AWS_REGION') as string, credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY, - secretAccessKey: process.env.AWS_SECRET_KEY, + accessKeyId: this.configService.get('AWS_ACCESS_KEY') as string, + secretAccessKey: this.configService.get('AWS_SECRET_KEY') as string, }, }); } diff --git a/apps/api/src/services/org-invite.service.ts b/apps/api/src/services/org-invite.service.ts index 999a843f..c01840f9 100644 --- a/apps/api/src/services/org-invite.service.ts +++ b/apps/api/src/services/org-invite.service.ts @@ -2,12 +2,15 @@ import { PrismaService } from './prisma.service'; import { Injectable, ServiceUnavailableException } from '@nestjs/common'; import type { Role } from '@prisma/client'; import { EventEmitter2 } from '@nestjs/event-emitter'; +import { ConfigService } from '@nestjs/config'; +import BaseContext from '@api/BaseContext'; @Injectable() export class OrganizationInviteService { constructor( private readonly prismaService: PrismaService, private readonly eventEmitter: EventEmitter2, + private readonly configService: ConfigService, ) {} async inviteToOrg( @@ -72,7 +75,8 @@ export class OrganizationInviteService { (el) => el.inviteeEmail === email, ).id; // finding the id of new invite - const localPort = process.env.CLIENT_URL || 'http://localhost:3000'; + const localPort = + this.configService.get('CLIENT_URL') || 'http://localhost:3000'; const inviteURL = `${localPort}/verify?id=${inviteId}`; // we dont want to send invite on local @@ -92,7 +96,10 @@ export class OrganizationInviteService { return { ok: true, - data: process.env.NODE_ENV !== 'production' ? inviteUrl : null, + data: + this.configService.get('NODE_ENV') !== 'production' + ? inviteUrl + : null, message: 'email sent successfully , please check your mailbox', }; } catch { diff --git a/apps/api/src/services/stripe.service.ts b/apps/api/src/services/stripe.service.ts index 5780db03..e802ff7b 100644 --- a/apps/api/src/services/stripe.service.ts +++ b/apps/api/src/services/stripe.service.ts @@ -7,21 +7,23 @@ import { EventEmitter2 } from '@nestjs/event-emitter'; @Injectable() export class StripeService { - private readonly stripe: Stripe; - private readonly prisma: PrismaService; - private readonly configService: ConfigService; + private stripe: Stripe; constructor( - prisma: PrismaService, - config: ConfigService, + private readonly configService: ConfigService, private readonly eventEmitter: EventEmitter2, + private readonly prismaService: PrismaService, ) { - this.stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { - apiVersion: '2023-10-16', - }); + this.initStripe(); + } - this.prisma = prisma; - this.configService = config; + initStripe() { + this.stripe = new Stripe( + this.configService.get('STRIPE_SECRET_KEY') as string, + { + apiVersion: '2023-10-16', + }, + ); } async handleWebHookEvent(body, signature) { @@ -29,7 +31,7 @@ export class StripeService { const event = this.stripe.webhooks.constructEvent( body, signature, - process.env.STRIPE_WEBHOOK_SECRET, + this.configService.get('STRIPE_WEBHOOK_SECRET') as string, ); if (event.type === 'payment_intent.created') { const eventInfo = event.data.object.metadata; @@ -37,13 +39,13 @@ export class StripeService { if (!event_id || !user_id) { throw new Error('Invalid metadata'); } else { - const event = await this.prisma.events.findUnique({ + const event = await this.prismaService.events.findUnique({ where: { id: event_id, }, }); - await this.prisma.events.update({ + await this.prismaService.events.update({ where: { id: event_id, }, @@ -57,7 +59,7 @@ export class StripeService { }, }); - const user = await this.prisma.user.findUnique({ + const user = await this.prismaService.user.findUnique({ where: { uid: user_id, }, @@ -88,7 +90,7 @@ export class StripeService { }, }); - await this.prisma.events.update({ + await this.prismaService.events.update({ where: { id: event.id, }, @@ -118,7 +120,7 @@ export class StripeService { currency: 'inr', }); - await this.prisma.events.update({ + await this.prismaService.events.update({ where: { id: event.id, }, @@ -165,9 +167,10 @@ export class StripeService { ], mode: 'payment', // might need to create a success page then redirect to tickets page + // biome-ignore lint/style/useTemplate: success_url: webUrl + '/tickets', // can show a toast in frontend - cancel_url: webUrl + '/events?payment_error=true', + cancel_url: `${webUrl}/events?payment_error=true`, }); return { sessionId: session.id, url: session.url }; diff --git a/apps/api/src/utils/envSchema.ts b/apps/api/src/utils/envSchema.ts new file mode 100644 index 00000000..b8d9acb9 --- /dev/null +++ b/apps/api/src/utils/envSchema.ts @@ -0,0 +1,48 @@ +import { z } from 'zod'; + +export const envSchema = z.object({ + DATABASE_URL: z + .string({ + required_error: 'DATABASE_URL is required in the environment variables', + }) + .default('postgres://fossfolio:fossfolio@localhost:5432/fossfolio'), + GITHUB_CLIENT_ID: z.string(), + GITHUB_CLIENT_SECRET: z.string(), + GITHUB_CALLBACK_URL: z.string().url(), + GITHUB_SCOPE: z.string().default('user:email'), + ACCESS_TOKEN_VALIDITY: z.string().default('10h'), + API_BASE_URL: z.string().default('http://localhost:8000'), + GOOGLE_CLIENT_ID: z.string(), + GOOGLE_CLIENT_SECRET: z.string(), + GOOGLE_CALLBACK_URL: z.string().url(), + GOOGLE_SCOPE: z.string().default('profile,email'), + + WEB_URL: z.string().default('http://localhost:3000'), + + MAIL_HOST: z.string(), + MAIL_PORT: z.string().default('587'), + MAIL_USER: z.string(), + MAIL_PASSWORD: z.string(), + + AWS_ACCESS_KEY: z.string(), + AWS_SECRET_KEY: z.string(), + AWS_REGION: z.string(), + + STRIPE_SECRET_KEY: z.string(), + STRIPE_WEBHOOK_SECRET: z.string(), + + JWT_SECRET: z.string(), + + AI_KEY: z.string(), + + NODE_ENV: z.string().default('development'), + + HOST: z.string().default('0.0.0.0'), + PORT: z.number().default(8080), + + DB_HOST: z.string().default('localhost'), + DB_USER: z.string().default('fossfolio'), + DB_PASSWORD: z.string().default('fossfolio'), + DB_NAME: z.string().default('fossfolio'), + DB_PORT: z.string().default('5432'), +}); diff --git a/apps/api/src/utils/error.ts b/apps/api/src/utils/error.ts index 4d9f77a2..5b3671be 100644 --- a/apps/api/src/utils/error.ts +++ b/apps/api/src/utils/error.ts @@ -37,37 +37,37 @@ export class DatabaseError extends RootError { } } -// biome-ignore lint/complexity/noStaticOnlyClass: +// biome-ignore lint/complexity/noStaticOnlyClass: Incorrectly flagged here. This class is used to create instances of the error classes. export class FFError { - static notFound(message: string) { + static notFound(message: string): never { throw new NotFound(message); } - static forbidden(message: string) { + static forbidden(message: string): never { throw new Forbidden(message); } - static unauthorized(message: string) { + static unauthorized(message: string): never { throw new Unauthorized(message); } - static badRequest(message: string | unknown) { + static badRequest(message: string | unknown): never { throw new BadRequest(message); } - static internalServerError(message: string) { + static internalServerError(message: string): never { throw new InternalServerError(message); } - static externalError(message: string) { + static externalError(message: string): never { throw new ExternalError(message); } - static databaseError(message: string, error: unknown) { + static databaseError(message: string, error: unknown): never { throw new DatabaseError(message, error); } - static uploadAttachmentError(message: string) { + static uploadAttachmentError(message: string): never { throw new UploadAttachmentError(message); } } From 2df5583a0725cbd9bdc9c8f6f38b1242c4ab8a84 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Sun, 2 Jun 2024 18:36:58 +0530 Subject: [PATCH 09/61] feat: support rawQuery and dangerous Raw Query in BaseContext and BaseModel context --- apps/api/src/BaseContext.ts | 115 ++++++++++++++++++++----------- apps/api/src/models/BaseModel.ts | 32 +++++++-- 2 files changed, 104 insertions(+), 43 deletions(-) diff --git a/apps/api/src/BaseContext.ts b/apps/api/src/BaseContext.ts index ba8f288a..fc85183a 100644 --- a/apps/api/src/BaseContext.ts +++ b/apps/api/src/BaseContext.ts @@ -3,45 +3,82 @@ import knex from 'knex'; import { Logger } from '@nestjs/common'; import { SystemTable } from '@api/utils/db'; import { ConfigService } from '@nestjs/config'; +import { FFError } from '@api/utils/error'; export default class BaseContext { - public static knex: Knex; - public static config: ConfigService; - private static readonly logger = new Logger(BaseContext.name); - - public static async init(_config: ConfigService) { - this.config = _config; - - BaseContext.knex = knex({ - client: 'pg', - connection: { - host: this.config.get('DB_HOST'), - user: this.config.get('DB_USER'), - password: this.config.get('DB_PASSWORD'), - database: this.config.get('DB_NAME'), - }, - migrations: { - tableName: SystemTable.FF_Migrations, - directory: 'src/db/migrations', - }, - }); - - BaseContext.logger.log('Starting Migration process...'); - - await BaseContext.knex.migrate.latest(); - - BaseContext.logger.log('Migration process completed.'); - } - - public async destroy() { - await BaseContext.knex.destroy(); - } - - public async getTransaction() { - return BaseContext.knex.transaction(); - } - - public async commitTransaction(trx: Knex.Transaction) { - await trx.commit(); - } + public static knex: Knex; + public static config: ConfigService; + private static readonly logger = new Logger(BaseContext.name); + + public static async init(_config: ConfigService) { + this.config = _config; + + BaseContext.knex = knex({ + client: 'pg', + connection: { + host: this.config.get('DB_HOST'), + user: this.config.get('DB_USER'), + password: this.config.get('DB_PASSWORD'), + database: this.config.get('DB_NAME'), + }, + migrations: { + tableName: SystemTable.FF_Migrations, + directory: 'src/db/migrations', + }, + }); + + BaseContext.logger.log('Starting Migration process...'); + + await BaseContext.knex.migrate.latest(); + + BaseContext.logger.log('Migration process completed.'); + } + + public async destroy() { + await BaseContext.knex.destroy(); + } + + public async getTransaction() { + return BaseContext.knex.transaction(); + } + + public async commitTransaction(trx: Knex.Transaction) { + await trx.commit(); + } + + public async rollbackTransaction(trx: Knex.Transaction) { + await trx.rollback(); + } + + public async execRawQuery(query: string, trx?: Knex.Transaction) { + if (!query.toLowerCase().includes('where')) { + throw new Error( + 'Raw query must contain a where clause. For unrestricted usage, use BaseContext.knex.raw()', + ); + } + try { + return await (trx ?? BaseContext.knex).raw(query); + } catch (error: unknown) { + BaseContext.logger.error( + `BaseContext: RawQuery Failed : ${query} `, + error, + ); + FFError.databaseError(`BaseContext: RawQuery Failed : ${query} `, error); + } + } + + public async dangerousExecRawQuery(query: string, trx?: Knex.Transaction) { + try { + return await (trx ?? BaseContext.knex).raw(query); + } catch (error: unknown) { + BaseContext.logger.error( + `BaseContext: DangerousExecRawQuery Failed : ${query} `, + error, + ); + FFError.databaseError( + 'BaseContext: DangerousExecRawQuery Failed : ', + error, + ); + } + } } diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index cebd8b16..0e4ed836 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -168,17 +168,41 @@ export default function createBaseModel( } } - static async dangerousRawQuery(query: string, trx?: Knex) { + static async rawQuery(query: string, trx?: Knex) { if (!query.toLowerCase().includes(tableName)) { - throw new Error('Only raw queries for the current table are allowed'); + throw new Error( + 'Only raw queries for the scoped table are allowed here. For executing in global scope, use BaseContext.execRawQuery()', + ); } + if (!query.toLowerCase().includes('where')) { - throw new Error('Raw query must contain a where clause'); + throw new Error( + 'Raw query must contain a where clause. For unrestricted usage, use dangerousExecRawQuery()', + ); } try { return (trx ?? BaseContext.knex).raw(query); } catch (error: unknown) { - FFError.databaseError(`${tableName}: Query Failed : `, error); + FFError.databaseError( + `${tableName}: Raw Query Failed ${query} : `, + error, + ); + } + } + + static async dangerousRawQuery(query: string, trx?: Knex) { + if (!query.toLowerCase().includes(tableName)) { + throw new Error( + 'Only raw queries for the scoped table are allowed here. For executing in global scope, use BaseContext.execRawQuery()', + ); + } + try { + return (trx ?? BaseContext.knex).raw(query); + } catch (error: unknown) { + FFError.databaseError( + `${tableName}: DangerousRawQuery Failed ${query} : `, + error, + ); } } } From 706707161a70659a3ce19e651962ecb45ae399e3 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Tue, 4 Jun 2024 09:16:41 +0530 Subject: [PATCH 10/61] feat(wip): migrating to new controllers --- apps/api/package.json | 1 - apps/api/src/controllers/auth.controller.ts | 121 ++- apps/api/src/controllers/events.controller.ts | 185 ++-- .../src/controllers/org-events.controller.ts | 62 ++ .../controllers/public-events.controller.ts | 28 + apps/api/src/db/schema/events.ts | 2 +- apps/api/src/dto/events.dto.ts | 44 + apps/api/src/models/BaseModel.ts | 12 + apps/api/src/models/Comment.ts | 13 + apps/api/src/models/EventTicket.ts | 14 + apps/api/src/models/Events.ts | 13 + apps/api/src/models/Form.ts | 13 + apps/api/src/models/FormFieldOptions.ts | 14 + apps/api/src/models/FormFields.ts | 14 + apps/api/src/models/FormResponse.ts | 14 + apps/api/src/models/Kanban.ts | 13 + apps/api/src/models/KanbanCard.ts | 14 + apps/api/src/models/Org.ts | 13 + apps/api/src/models/OrgInvite.ts | 14 + apps/api/src/models/OrgMember.ts | 14 + apps/api/src/models/Ticket.ts | 13 + apps/api/src/models/index.ts | 31 +- apps/api/src/modules/root.module.ts | 197 +++-- .../services/auth/guards/saml-oauth.guard.ts | 14 - .../services/auth/strategy/github.strategy.ts | 2 +- .../auth/strategy/refresh.strategy.ts | 27 +- .../services/auth/strategy/saml.strategy.ts | 74 -- .../src/services/decorator/roles.decorator.ts | 3 +- .../api/src/services/dto/create-events.dto.ts | 9 - apps/api/src/services/events.service.ts | 800 +++--------------- .../src/services/guards/rbac-member.guard.ts | 36 +- apps/api/src/services/org-events.service.ts | 364 ++++++++ apps/api/src/types/express.ts | 6 +- apps/api/src/utils/index.ts | 5 + apps/api/src/utils/stripUndefined.ts | 29 + .../validation/zod.validation.decorator.ts | 20 +- .../api/src/validation/zod.validation.pipe.ts | 2 +- pnpm-lock.yaml | 129 --- 38 files changed, 1114 insertions(+), 1265 deletions(-) create mode 100644 apps/api/src/controllers/org-events.controller.ts create mode 100644 apps/api/src/controllers/public-events.controller.ts create mode 100644 apps/api/src/dto/events.dto.ts create mode 100644 apps/api/src/models/Comment.ts create mode 100644 apps/api/src/models/EventTicket.ts create mode 100644 apps/api/src/models/Events.ts create mode 100644 apps/api/src/models/Form.ts create mode 100644 apps/api/src/models/FormFieldOptions.ts create mode 100644 apps/api/src/models/FormFields.ts create mode 100644 apps/api/src/models/FormResponse.ts create mode 100644 apps/api/src/models/Kanban.ts create mode 100644 apps/api/src/models/KanbanCard.ts create mode 100644 apps/api/src/models/Org.ts create mode 100644 apps/api/src/models/OrgInvite.ts create mode 100644 apps/api/src/models/OrgMember.ts create mode 100644 apps/api/src/models/Ticket.ts delete mode 100644 apps/api/src/services/auth/guards/saml-oauth.guard.ts delete mode 100644 apps/api/src/services/auth/strategy/saml.strategy.ts create mode 100644 apps/api/src/services/org-events.service.ts create mode 100644 apps/api/src/utils/index.ts create mode 100644 apps/api/src/utils/stripUndefined.ts diff --git a/apps/api/package.json b/apps/api/package.json index dd7422de..d6b10ee1 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -26,7 +26,6 @@ "@nestjs/schematics": "^10.1.1", "@nestjs/swagger": "^7.3.0", "@nestjs/throttler": "^5.1.2", - "@node-saml/passport-saml": "^5.0.0", "@prisma/client": "^5.10.2", "@webtre/nestjs-mailer-react-adapter": "^0.1.2", "argon2": "^0.40.1", diff --git a/apps/api/src/controllers/auth.controller.ts b/apps/api/src/controllers/auth.controller.ts index db46b26e..b03cf776 100644 --- a/apps/api/src/controllers/auth.controller.ts +++ b/apps/api/src/controllers/auth.controller.ts @@ -4,7 +4,6 @@ import { AuthService } from '@api/services/auth/auth.service'; import { cookieHandler } from '@api/services/auth/cookieHandler'; import { RefreshGuard } from '@api/services/auth/guards/refresh.guard'; import { GoogleAuthGuard } from '@api/services/auth/guards/google-oauth.guard'; -import { SamlAuthGuard } from '@api/services/auth/guards/saml-oauth.guard'; import { Response as EResponse, Request as ERequest } from 'express'; import { AuthUser } from '@api/services/auth/decorators/user.decorator'; import { User } from '@api/db/schema'; @@ -12,83 +11,61 @@ import { ConfigService } from '@nestjs/config'; @Controller('auth') export class AuthController { - constructor( - private readonly authService: AuthService, - private readonly configService: ConfigService, - ) { - } + constructor( + private readonly authService: AuthService, + private readonly configService: ConfigService, + ) {} - // Route to Initiate GitHub OAuth - @Get('/github') - @UseGuards(GithubAuthGuard) - async githubOAuth() { - } + // Route to Initiate GitHub OAuth + @Get('/github') + @UseGuards(GithubAuthGuard) + async githubOAuth() {} - // Route to Handle GitHub OAuth Callback - @Get('/github/callback') - @UseGuards(GithubAuthGuard) - async githubOAuthCallback( - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const authToken = await this.authService.generateAuthToken(user.id); - cookieHandler(res, authToken, true); - } + // Route to Handle GitHub OAuth Callback + @Get('/github/callback') + @UseGuards(GithubAuthGuard) + async githubOAuthCallback( + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const authToken = await this.authService.generateAuthToken(user.id); + cookieHandler(res, authToken, true); + } - @Get('/google') - @UseGuards(GoogleAuthGuard) - async googleOAuth() { - } + @Get('/google') + @UseGuards(GoogleAuthGuard) + async googleOAuth() {} - @Get('/google/callback') - @UseGuards(GoogleAuthGuard) - async googleOAuthCallback( - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const authToken = await this.authService.generateAuthToken(user.id); - cookieHandler(res, authToken, true); - } + @Get('/google/callback') + @UseGuards(GoogleAuthGuard) + async googleOAuthCallback( + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const authToken = await this.authService.generateAuthToken(user.id); + cookieHandler(res, authToken, true); + } - @Get('/saml') - @UseGuards(SamlAuthGuard) - async samlOAuth() { - } + @Get('/refresh') + @UseGuards(RefreshGuard) + async refresh( + @Request() req: ERequest, + @AuthUser() user: User, + @Response() res: EResponse, + ) { + const genToken = await this.authService.refreshAuthToken( + user, + req.cookies.refresh_token, + ); - @Get('/saml//callback') - @UseGuards(SamlAuthGuard) - async samlOAuthCallback( - @Request() req: ERequest, - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const genToken = await this.authService.refreshAuthToken( - user, - req.cookies.refresh_token, - ); - cookieHandler(res, genToken, false); - } + cookieHandler(res, genToken, false); + } - @Get('/refresh') - @UseGuards(RefreshGuard) - async refresh( - @Request() req: ERequest, - @AuthUser() user: User, - @Response() res: EResponse, - ) { - const genToken = await this.authService.refreshAuthToken( - user, - req.cookies.refresh_token, - ); + @Get('/logout') + async logout(@Response() res: EResponse) { + res.clearCookie('access_token'); + res.clearCookie('refresh_token'); - cookieHandler(res, genToken, false); - } - - @Get('/logout') - async logout(@Response() res: EResponse) { - res.clearCookie('access_token'); - res.clearCookie('refresh_token'); - - res.redirect(this.configService.get('CLIENT_URL') as string); - } + res.redirect(this.configService.get('CLIENT_URL') as string); + } } diff --git a/apps/api/src/controllers/events.controller.ts b/apps/api/src/controllers/events.controller.ts index 0cb268b2..abe29024 100644 --- a/apps/api/src/controllers/events.controller.ts +++ b/apps/api/src/controllers/events.controller.ts @@ -2,161 +2,100 @@ import { Body, Controller, Delete, - FileTypeValidator, Get, - MaxFileSizeValidator, Param, - ParseFilePipe, Patch, Post, Query, - UploadedFile, UseGuards, - UseInterceptors, } from '@nestjs/common'; -import { FileInterceptor } from '@nestjs/platform-express'; import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiTags } from '@nestjs/swagger'; -import type { User } from '@prisma/client'; import { EventsService } from '../services/events.service'; import { AuthUser } from '../services/auth/decorators/user.decorator'; import { RbacGuard } from '../services/guards/rbac-member.guard'; -import type { CreateEventDto } from '../services/dto/create-events.dto'; +import { + CreateEventDto, + CreateEventParamsSchema, + EventParamsSchema, + UpdateEventSchema, + UpdateEventDto, +} from '../dto/events.dto'; import { Roles } from '../services/decorator/roles.decorator'; -import type { UpdateEventDto } from '../services/dto/update-event.dto'; -import type { RegisterEventDto } from '../services/dto/register-event.dto'; -import type { DeleteEventDto } from '../services/dto/delete-event.dto'; -import type { RemoveUserDto } from '../services/dto/remove-user.dto'; +import { ZodValidator } from '@api/validation/zod.validation.decorator'; +import { CreateEventSchema } from '@api/dto/events.dto'; +import { Role } from '@api/utils/db'; +import { User } from '@api/db/schema'; -@Controller('events') +@Controller() export class EventsController { constructor(private readonly events: EventsService) {} - @Get('/') - @ApiTags('events') - @ApiOperation({ summary: 'returns all upcoming events' }) - async getAllEvents(@Query('search') query) { + @Get('/events') + async getAllEvents(@Query('search') query: string) { return await this.events.getAllEvents(query); } - @Get('/:eventId') - @ApiTags('events') - @ApiOperation({ summary: 'returns the specific event with slug' }) - async getEventByID(@Param('eventId') id: string) { - return await this.events.getEventBySlugId(id); - } - - @Post('/create') - @ApiOperation({ summary: 'create new events' }) - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') + @Post('/:orgId/events') + @Roles(Role.ADMIN, Role.EDITOR) @UseGuards(AuthGuard('jwt'), RbacGuard) - async createNewEvent(@Body() data: CreateEventDto, @AuthUser() user: User) { - return await this.events.createEvent(data, user.uid); - } - - @Get('/publish/:orgID/:id') - @ApiTags('events') - @ApiOperation({ - summary: - 'publish event , by doing this we lets public to register for event', + @ZodValidator({ + body: CreateEventSchema, + params: CreateEventParamsSchema, }) - @Roles('ADMIN', 'EDITOR') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async publishNewEvent(@Param('id') data: string) { - return await this.events.publishEvent(data); - } - - @Patch('/edit') - @ApiOperation({ summary: 'update info of event' }) - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @UseInterceptors(FileInterceptor('file')) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async updateNewEvent(@Body() data: UpdateEventDto) { - return await this.events.updateEvent(data); - } - - @Post('/register') - @ApiTags('events') - @ApiOperation({ summary: 'Register for specific event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async registerEvent(@Body() data: RegisterEventDto, @AuthUser() user: User) { - return await this.events.registerEvent(data.eventId, user.uid); - } - - @Get('/participants/:orgID/:id') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiOperation({ summary: 'Get all participants of events' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getregisterDParticipants(@Param('id') id: string) { - return await this.events.getEventParticipants(id); - } - - @Delete('/participants/delete') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @ApiOperation({ summary: 'Remove participant from a event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async removePartcipent(@Body() data: RemoveUserDto) { - return await this.events.removeParticipant(data.eventId, data.userId); - } - - @Get('/status/:id') - @ApiTags('events') - @ApiOperation({ summary: 'Get if participant is registerd for event or not' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getUserEventStatus( - @Param('id') slugId: string, + async createEvent( + @Body() createEventData: CreateEventDto, @AuthUser() user: User, + @Param('orgId') orgId: string, ) { - return await this.events.getEventRegistartionStatus(slugId, user.uid); + return await this.events.createEvent({ + newEvent: createEventData, + user, + orgId, + }); } - @Get('/stats/:id') - @ApiTags('events') - @ApiOperation({ summary: 'Get event stats' }) + @Get('/:orgId/events/:eventId') + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) @UseGuards(AuthGuard('jwt'), RbacGuard) - async getEventStats(@Param('id') id: string) { - return await this.events.getEventStats(id); + @ZodValidator({ params: EventParamsSchema }) + async getEventByID(@Param('eventId') id: string) { + return await this.events.getEventById(id); } - @Patch('/edit/cover') - @Roles('ADMIN', 'EDITOR') - @ApiTags('events') + @Patch('/:orgId/events/:eventId') + @Roles(Role.ADMIN, Role.EDITOR) @UseGuards(AuthGuard('jwt'), RbacGuard) - @UseInterceptors(FileInterceptor('file')) - @ApiOperation({ summary: 'Upload image for event cover page' }) - async uploadFile( - @UploadedFile( - new ParseFilePipe({ - // file size validators - validators: [ - new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' }), // support png,jpg,peg - new MaxFileSizeValidator({ maxSize: 1024 * 1024 * 4 }), // File size 4 megabytes - ], - }), - ) - file: Express.Multer.File, - @Query('event') event: string, + @ZodValidator({ + body: UpdateEventSchema, + params: EventParamsSchema, + }) + async updateEvent( + @Body() updateData: UpdateEventDto, + @AuthUser() user: User, + @Param('orgId') orgId: string, + @Param('eventId') eventId: string, ) { - return await this.events.uploadEventCover(file, event); + return await this.events.updateEvent({ + updateData, + user, + orgId, + eventId, + }); } - @Get('/ticket/:eventId') - @ApiTags('events') - @ApiOperation({ summary: 'return ticket info' }) - async getTicketInfo(@Param('eventId') eventId: string) { - return await this.events.getTicketInfo(eventId); - } - - @Delete('/delete/:id') - @Roles('ADMIN') - @ApiTags('events') + @Delete('/:orgId/events/:eventId') + @Roles(Role.ADMIN) @UseGuards(AuthGuard('jwt'), RbacGuard) - @ApiOperation({ summary: 'Delete a event using event id' }) - async deleteEvent(@Param('id') eventId: string, @Body() _: DeleteEventDto) { - return await this.events.deleteEvent(eventId); + @ZodValidator({ + params: EventParamsSchema, + }) + async deleteEvent( + @Param('orgId') orgId: string, + @Param('eventId') eventId: string, + ) { + return await this.events.deleteEvent({ + eventId, + orgId, + }); } } diff --git a/apps/api/src/controllers/org-events.controller.ts b/apps/api/src/controllers/org-events.controller.ts new file mode 100644 index 00000000..435d113b --- /dev/null +++ b/apps/api/src/controllers/org-events.controller.ts @@ -0,0 +1,62 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import type { User } from '@prisma/client'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import { Roles } from '../services/decorator/roles.decorator'; +import type { RemoveUserDto } from '../services/dto/remove-user.dto'; +import { Role } from '@api/utils/db'; +import { ZodValidator } from '@api/validation/zod.validation.decorator'; +import { EventParamsSchema } from '@api/dto/events.dto'; +import { OrgEventsService } from '@api/services/org-events.service'; + +@Controller() +export class OrgEventsController { + constructor(private readonly orgEventsService: OrgEventsService) {} + + @Get('/:orgId/events/:eventId/participants') + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) + @UseGuards(AuthGuard('jwt'), RbacGuard) + @ZodValidator({ + params: EventParamsSchema, + }) + async getRegisterdParticipants( + @Param('orgId') orgId: string, + @Param('id') eventId: string, + ) { + return await this.orgEventsService.getEventParticipants({ + orgId, + eventId, + }); + } + + @Delete('/participants/delete') + @Roles('ADMIN', 'EDITOR') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async removePartcipent(@Body() data: RemoveUserDto) { + return await this.events.removeParticipant(data.eventId, data.userId); + } + + @Get('/status/:id') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getUserEventStatus( + @Param('id') slugId: string, + @AuthUser() user: User, + ) { + return await this.events.getEventRegistartionStatus(slugId, user.uid); + } + + @Get('/stats/:id') + @UseGuards(AuthGuard('jwt'), RbacGuard) + async getEventStats(@Param('id') id: string) { + return await this.events.getEventStats(id); + } +} diff --git a/apps/api/src/controllers/public-events.controller.ts b/apps/api/src/controllers/public-events.controller.ts new file mode 100644 index 00000000..e3a23063 --- /dev/null +++ b/apps/api/src/controllers/public-events.controller.ts @@ -0,0 +1,28 @@ +import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import type { User } from '@prisma/client'; +import { EventsService } from '../services/events.service'; +import { AuthUser } from '../services/auth/decorators/user.decorator'; +import { RbacGuard } from '../services/guards/rbac-member.guard'; +import type { RegisterEventDto } from '../services/dto/register-event.dto'; + +@Controller() +export class PublicEventsController { + constructor(private readonly events: EventsService) {} + + @Post('/register') + @ApiTags('events') + @ApiOperation({ summary: 'Register for specific event' }) + @UseGuards(AuthGuard('jwt'), RbacGuard) + async registerEvent(@Body() data: RegisterEventDto, @AuthUser() user: User) { + return await this.events.registerEvent(data.eventId, user.uid); + } + + @Get('/ticket/:eventId') + @ApiTags('events') + @ApiOperation({ summary: 'return ticket info' }) + async getTicketInfo(@Param('eventId') eventId: string) { + return await this.events.getTicketInfo(eventId); + } +} diff --git a/apps/api/src/db/schema/events.ts b/apps/api/src/db/schema/events.ts index b596ed8a..8770daf5 100644 --- a/apps/api/src/db/schema/events.ts +++ b/apps/api/src/db/schema/events.ts @@ -10,7 +10,7 @@ export const EventSchema = z.object({ fk_organization_id: z.string().length(25), - description: z.string(), + description: z.string().optional(), website: z.string().url().optional(), diff --git a/apps/api/src/dto/events.dto.ts b/apps/api/src/dto/events.dto.ts new file mode 100644 index 00000000..aceb44a5 --- /dev/null +++ b/apps/api/src/dto/events.dto.ts @@ -0,0 +1,44 @@ +import { z } from 'zod'; + +export const CreateEventSchema = z.object({ + name: z.string(), + + description: z.string().optional(), + + website: z.string(), + + location: z.string(), + + cover_image: z.string(), + + event_date: z.date(), +}); + +export const CreateEventParamsSchema = z.object({ + orgId: z.string(), +}); + +export const EventParamsSchema = z.object({ + orgId: z.string(), + eventId: z.string(), +}); + +export const UpdateEventSchema = z.object({ + name: z.string().optional(), + + description: z.string().optional(), + + website: z.string().url().optional(), + + location: z.string().optional(), + + cover_image: z.string().url().optional(), + + is_published: z.boolean().optional(), +}); + +export type UpdateEventDto = z.infer; + +export type CreateEventDto = z.infer; + +export type EventParams = z.infer; diff --git a/apps/api/src/models/BaseModel.ts b/apps/api/src/models/BaseModel.ts index 0e4ed836..29825e80 100644 --- a/apps/api/src/models/BaseModel.ts +++ b/apps/api/src/models/BaseModel.ts @@ -34,6 +34,18 @@ export default function createBaseModel( } } + static async findOne(where: Partial, trx?: Knex): Promise { + try { + const data = await (trx ?? BaseContext.knex)(tableName) + .where(where) + .andWhere('is_deleted', false) + .first(); + return (data as M) || null; + } catch (error: unknown) { + FFError.databaseError(`${tableName}: Query Failed : `, error); + } + } + static async find( where: Partial, orderBy?: OrderBy, diff --git a/apps/api/src/models/Comment.ts b/apps/api/src/models/Comment.ts new file mode 100644 index 00000000..eb984329 --- /dev/null +++ b/apps/api/src/models/Comment.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Comment } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class CommentModel extends BaseModel( + SystemTable.Comment, +) { + constructor() { + const logger = new Logger('Comment Model'); + super(logger); + } +} diff --git a/apps/api/src/models/EventTicket.ts b/apps/api/src/models/EventTicket.ts new file mode 100644 index 00000000..62f11037 --- /dev/null +++ b/apps/api/src/models/EventTicket.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { EventTicket } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class EventTicketModel extends BaseModel< + SystemTable.EventTicket, + EventTicket +>(SystemTable.EventTicket) { + constructor() { + const logger = new Logger('EventTicket Model'); + super(logger); + } +} diff --git a/apps/api/src/models/Events.ts b/apps/api/src/models/Events.ts new file mode 100644 index 00000000..7f701cd2 --- /dev/null +++ b/apps/api/src/models/Events.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Event } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class EventModel extends BaseModel( + SystemTable.Events, +) { + constructor() { + const logger = new Logger('Event Model'); + super(logger); + } +} diff --git a/apps/api/src/models/Form.ts b/apps/api/src/models/Form.ts new file mode 100644 index 00000000..47b5a09c --- /dev/null +++ b/apps/api/src/models/Form.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Form } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class FormModel extends BaseModel( + SystemTable.Form, +) { + constructor() { + const logger = new Logger('Form Model'); + super(logger); + } +} diff --git a/apps/api/src/models/FormFieldOptions.ts b/apps/api/src/models/FormFieldOptions.ts new file mode 100644 index 00000000..54a6220e --- /dev/null +++ b/apps/api/src/models/FormFieldOptions.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { FormFieldOptions } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class FormFieldOptionsModel extends BaseModel< + SystemTable.FormFieldOptions, + FormFieldOptions +>(SystemTable.FormFieldOptions) { + constructor() { + const logger = new Logger('FormFieldOptions Model'); + super(logger); + } +} diff --git a/apps/api/src/models/FormFields.ts b/apps/api/src/models/FormFields.ts new file mode 100644 index 00000000..93da7385 --- /dev/null +++ b/apps/api/src/models/FormFields.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { FormField } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class FormFieldsModel extends BaseModel< + SystemTable.FormFields, + FormField +>(SystemTable.FormFields) { + constructor() { + const logger = new Logger('FormFields Model'); + super(logger); + } +} diff --git a/apps/api/src/models/FormResponse.ts b/apps/api/src/models/FormResponse.ts new file mode 100644 index 00000000..5ddb18cd --- /dev/null +++ b/apps/api/src/models/FormResponse.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { FormResponse } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class FormResponseModel extends BaseModel< + SystemTable.FormResponse, + FormResponse +>(SystemTable.FormResponse) { + constructor() { + const logger = new Logger('FormResponse Model'); + super(logger); + } +} diff --git a/apps/api/src/models/Kanban.ts b/apps/api/src/models/Kanban.ts new file mode 100644 index 00000000..a531b7e9 --- /dev/null +++ b/apps/api/src/models/Kanban.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Kanban } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class KanbanModal extends BaseModel( + SystemTable.Kanban, +) { + constructor() { + const logger = new Logger('Kanban Model'); + super(logger); + } +} diff --git a/apps/api/src/models/KanbanCard.ts b/apps/api/src/models/KanbanCard.ts new file mode 100644 index 00000000..cc301c7e --- /dev/null +++ b/apps/api/src/models/KanbanCard.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { KanbanCard } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class KanbanCardModal extends BaseModel< + SystemTable.KanbanCard, + KanbanCard +>(SystemTable.KanbanCard) { + constructor() { + const logger = new Logger('KanbanCard Model'); + super(logger); + } +} diff --git a/apps/api/src/models/Org.ts b/apps/api/src/models/Org.ts new file mode 100644 index 00000000..8ed9ee94 --- /dev/null +++ b/apps/api/src/models/Org.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Organization } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class OrgModel extends BaseModel( + SystemTable.Org, +) { + constructor() { + const logger = new Logger('Org Model'); + super(logger); + } +} diff --git a/apps/api/src/models/OrgInvite.ts b/apps/api/src/models/OrgInvite.ts new file mode 100644 index 00000000..7d31856f --- /dev/null +++ b/apps/api/src/models/OrgInvite.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { OrganizationInvite } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class OrgInviteModel extends BaseModel< + SystemTable.OrgInvite, + OrganizationInvite +>(SystemTable.OrgInvite) { + constructor() { + const logger = new Logger('OrgInvite Model'); + super(logger); + } +} diff --git a/apps/api/src/models/OrgMember.ts b/apps/api/src/models/OrgMember.ts new file mode 100644 index 00000000..22d0fa0c --- /dev/null +++ b/apps/api/src/models/OrgMember.ts @@ -0,0 +1,14 @@ +import BaseModel from '@api/models/BaseModel'; +import { OrganizationMember } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class OrgMemberModel extends BaseModel< + SystemTable.OrgMember, + OrganizationMember +>(SystemTable.OrgMember) { + constructor() { + const logger = new Logger('OrgMember Model'); + super(logger); + } +} diff --git a/apps/api/src/models/Ticket.ts b/apps/api/src/models/Ticket.ts new file mode 100644 index 00000000..d2cc14ca --- /dev/null +++ b/apps/api/src/models/Ticket.ts @@ -0,0 +1,13 @@ +import BaseModel from '@api/models/BaseModel'; +import { Ticket } from '@api/db/schema'; +import { Logger } from '@nestjs/common'; +import { SystemTable } from '@api/utils/db'; + +export class TicketModel extends BaseModel( + SystemTable.Ticket, +) { + constructor() { + const logger = new Logger('Ticket Model'); + super(logger); + } +} diff --git a/apps/api/src/models/index.ts b/apps/api/src/models/index.ts index 2bd60ee3..7bb11fab 100644 --- a/apps/api/src/models/index.ts +++ b/apps/api/src/models/index.ts @@ -1,4 +1,33 @@ import { AccountModel } from './Account'; +import { CommentModel } from './Comment'; import { UserModel } from './User'; +import { EventModel } from './Events'; +import { EventTicketModel } from './EventTicket'; +import { FormModel } from './Form'; +import { FormFieldOptionsModel } from './FormFieldOptions'; +import { FormFieldsModel } from './FormFields'; +import { FormResponseModel } from './FormResponse'; +import { KanbanModal } from './Kanban'; +import { KanbanCardModal } from './KanbanCard'; +import { OrgModel } from './Org'; +import { OrgInviteModel } from './OrgInvite'; +import { TicketModel } from './Ticket'; +import { OrgMemberModel } from './OrgMember'; -export { AccountModel, UserModel }; +export { + AccountModel, + UserModel, + EventModel, + OrgMemberModel, + CommentModel, + EventTicketModel, + FormModel, + FormFieldOptionsModel, + FormFieldsModel, + FormResponseModel, + KanbanModal, + KanbanCardModal, + OrgModel, + OrgInviteModel, + TicketModel, +}; diff --git a/apps/api/src/modules/root.module.ts b/apps/api/src/modules/root.module.ts index d60f3981..0fa067ba 100644 --- a/apps/api/src/modules/root.module.ts +++ b/apps/api/src/modules/root.module.ts @@ -8,7 +8,6 @@ import { AuthController } from '../controllers/auth.controller'; import { AuthService } from '../services/auth/auth.service'; import { GithubStrategy } from '../services/auth/strategy/github.strategy'; import { GoogleStrategy } from '../services/auth/strategy/google.strategy'; -import { SamlStrategy } from '../services/auth/strategy/saml.strategy'; import { UserService } from '../services/user.service'; import { JwtStrategy } from '../services/auth/strategy/jwt.strategy'; import { RefreshStrategy } from '../services/auth/strategy/refresh.strategy'; @@ -40,112 +39,110 @@ import { UserController } from '../controllers/user.controller'; import { envSchema, parsedEnv } from '@api/utils/envSchema'; const AuthProviders = [ - AuthService, - GithubStrategy, - GoogleStrategy, - SamlStrategy, - UserService, - JwtStrategy, - RefreshStrategy, + AuthService, + GithubStrategy, + GoogleStrategy, + UserService, + JwtStrategy, + RefreshStrategy, ]; const AuthModules = [ - PassportModule, - JwtModule.registerAsync({ - useFactory: async (configService: ConfigService) => ({ - secret: configService.get('JWT_SECRET'), - signOptions: { expiresIn: configService.get('ACCESS_TOKEN_VALIDITY') }, - }), - inject: [ConfigService], - }), + PassportModule, + JwtModule.registerAsync({ + useFactory: async (configService: ConfigService) => ({ + secret: configService.get('JWT_SECRET'), + signOptions: { expiresIn: configService.get('ACCESS_TOKEN_VALIDITY') }, + }), + inject: [ConfigService], + }), ]; const GlobalModules = [ - ConfigModule.forRoot({ - isGlobal: true, - validate: envSchema.parse, - validationOptions: { - abortEarly: true, - }, - }), - EventEmitterModule.forRoot(), - ThrottlerModule.forRoot([ - { - ttl: 60000, - limit: 50, - }, - ]), - LoggerModule.forRoot({ - pinoHttp: { - level: 'error', - redact: ['req.headers', 'req.remoteAddress', 'res.headers'], - }, - }), - MailerModule.forRootAsync({ - useFactory: async (configService: ConfigService) => ({ - transport: { - host: configService.get('MAIL_HOST'), - port: configService.get('MAIL_PORT'), - secure: false, - auth: { - user: configService.get('MAIL_USER'), - pass: configService.get('MAIL_PASSWORD'), - }, - tls: { - rejectUnauthorized: false, - }, - }, - defaults: { - from: configService.get('MAIL_FROM'), - }, - template: { - dir: join(__dirname, 'templates'), - adapter: new ReactAdapter({ - pretty: false, - plainText: false, - }), - options: { - strict: true, - }, - }, - }), - inject: [ConfigService], - }), + ConfigModule.forRoot({ + isGlobal: true, + validate: envSchema.parse, + validationOptions: { + abortEarly: true, + }, + }), + EventEmitterModule.forRoot(), + ThrottlerModule.forRoot([ + { + ttl: 60000, + limit: 50, + }, + ]), + LoggerModule.forRoot({ + pinoHttp: { + level: 'error', + redact: ['req.headers', 'req.remoteAddress', 'res.headers'], + }, + }), + MailerModule.forRootAsync({ + useFactory: async (configService: ConfigService) => ({ + transport: { + host: configService.get('MAIL_HOST'), + port: configService.get('MAIL_PORT'), + secure: false, + auth: { + user: configService.get('MAIL_USER'), + pass: configService.get('MAIL_PASSWORD'), + }, + tls: { + rejectUnauthorized: false, + }, + }, + defaults: { + from: configService.get('MAIL_FROM'), + }, + template: { + dir: join(__dirname, 'templates'), + adapter: new ReactAdapter({ + pretty: false, + plainText: false, + }), + options: { + strict: true, + }, + }, + }), + inject: [ConfigService], + }), ]; @Module({ - imports: [...GlobalModules, ...AuthModules], - controllers: [ - AuthController, - AiController, - EventsController, - FormController, - KanbanController, - OrgInviteController, - OrgMemberController, - OrganizationController, - StripeController, - UserController, - ], - providers: [ - { - provide: APP_GUARD, - useClass: ThrottlerGuard, - }, - ...AuthProviders, - AiService, - S3Service, - StripeService, - EventsService, - FormService, - KanbanService, - MailService, - OrganizationInviteService, - OrganizationMemberService, - OrganizationService, - PrismaService, - UserService, - ], + imports: [...GlobalModules, ...AuthModules], + controllers: [ + AuthController, + AiController, + EventsController, + FormController, + KanbanController, + OrgInviteController, + OrgMemberController, + OrganizationController, + StripeController, + UserController, + ], + providers: [ + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, + ...AuthProviders, + AiService, + S3Service, + StripeService, + EventsService, + FormService, + KanbanService, + MailService, + OrganizationInviteService, + OrganizationMemberService, + OrganizationService, + PrismaService, + UserService, + ], }) -export class RootModule { -} +export class RootModule {} diff --git a/apps/api/src/services/auth/guards/saml-oauth.guard.ts b/apps/api/src/services/auth/guards/saml-oauth.guard.ts deleted file mode 100644 index cf5d92ec..00000000 --- a/apps/api/src/services/auth/guards/saml-oauth.guard.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type ExecutionContext, Injectable } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; - -@Injectable() -export class SamlAuthGuard extends AuthGuard('saml') { - getAuthenticateOptions(context: ExecutionContext) { - const req = context.switchToHttp().getRequest(); - return { - state: { - redirect_uri: req.query.redirect_uri, - }, - }; - } -} diff --git a/apps/api/src/services/auth/strategy/github.strategy.ts b/apps/api/src/services/auth/strategy/github.strategy.ts index 7c1ac162..1337bc11 100644 --- a/apps/api/src/services/auth/strategy/github.strategy.ts +++ b/apps/api/src/services/auth/strategy/github.strategy.ts @@ -11,7 +11,7 @@ export class GithubStrategy extends PassportStrategy(Strategy) { constructor( private readonly authService: AuthService, private readonly usersService: UserService, - private readonly configService: ConfigService, + configService: ConfigService, ) { super({ clientID: configService.get('GITHUB_CLIENT_ID'), diff --git a/apps/api/src/services/auth/strategy/refresh.strategy.ts b/apps/api/src/services/auth/strategy/refresh.strategy.ts index 8de93f7b..c4360177 100644 --- a/apps/api/src/services/auth/strategy/refresh.strategy.ts +++ b/apps/api/src/services/auth/strategy/refresh.strategy.ts @@ -1,21 +1,14 @@ -import { - BadRequestException, - Injectable, - UnauthorizedException, -} from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { PassportStrategy } from '@nestjs/passport'; import type { Request } from 'express'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { UserService } from '../../user.service'; import { FFError } from '@api/utils/error'; +import { UserModel } from '@api/models'; @Injectable() export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { - constructor( - private userService: UserService, - private readonly configService: ConfigService, - ) { + constructor(configService: ConfigService) { super({ ignoreExpiration: true, passReqToCallback: true, @@ -32,11 +25,17 @@ export class RefreshStrategy extends PassportStrategy(Strategy, 'refresh') { }); } - async validate(req: Request, payload: any) { - const user = await this.userService.findUserById(payload.sub); - + async validate( + _req: Request, + payload: { + sub: string; + iat: number; + exp: number; + }, + ) { + const user = await UserModel.findById(payload.sub); if (!user) { - throw new BadRequestException('INVALID_USER'); + FFError.unauthorized('Invalid refresh token'); } return user; diff --git a/apps/api/src/services/auth/strategy/saml.strategy.ts b/apps/api/src/services/auth/strategy/saml.strategy.ts deleted file mode 100644 index 8f1463c5..00000000 --- a/apps/api/src/services/auth/strategy/saml.strategy.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { MultiSamlStrategy } from '@node-saml/passport-saml'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable } from '@nestjs/common'; -import { AuthService } from '../auth.service'; -import { UserService } from '../../user.service'; -import { PrismaService } from '../../prisma.service'; -import type { StrategyOptionsCallback } from '@node-saml/passport-saml/lib/types'; -import type e from 'express'; - -@Injectable() -export class SamlStrategy extends PassportStrategy(MultiSamlStrategy, 'saml') { - constructor( - private readonly authService: AuthService, - private readonly prismaService: PrismaService, - private readonly usersService: UserService, - ) { - super({ - passReqToCallback: true, - getSamlOptions: async ( - req: e.Request, - callback: StrategyOptionsCallback, - ) => { - const issuer = req.query.issuer; - if (!issuer || typeof issuer !== 'string') { - return callback(new Error('Issuer not found')); - } - const config = await this.prismaService.samlConfig.findUnique({ - where: { issuer: issuer }, - }); - if (!config) { - return callback(new Error('SAML config not found')); - } - return callback(null, config); - }, - }); - } - - async validate(profile, done) { - // Check whether this user exist in the database or not - console.log(profile); - const user = await this.prismaService.user.findUnique({ - where: { - email: - typeof profile.email === 'string' ? profile.email : profile.email[0], - }, - }); - - // If the user doesn't exist in the database, create a new user - if (!user) { - const createdUser = await this.usersService.createOAuthUser( - profile.nameID, - profile.nameID, - profile, - ); - return createdUser; - } - - // If the user already exists, check if the user has a provider account - const providerAccount = - await this.authService.checkIfProviderAccountExists(profile); - - // If the user doesn't have a provider account, create a new provider account - if (!providerAccount) { - await this.authService.createProviderAccount( - user, - profile, - profile.email, - profile.email, - ); - } - - return user; - } -} diff --git a/apps/api/src/services/decorator/roles.decorator.ts b/apps/api/src/services/decorator/roles.decorator.ts index b0376727..d672d1d9 100644 --- a/apps/api/src/services/decorator/roles.decorator.ts +++ b/apps/api/src/services/decorator/roles.decorator.ts @@ -1,3 +1,4 @@ import { SetMetadata } from '@nestjs/common'; +import { Role } from '@api/utils/db'; -export const Roles = (...roles: string[]) => SetMetadata('roles', roles); +export const Roles = (...roles: Role[]) => SetMetadata('roles', roles); diff --git a/apps/api/src/services/dto/create-events.dto.ts b/apps/api/src/services/dto/create-events.dto.ts index ad0e6dc4..07e21087 100644 --- a/apps/api/src/services/dto/create-events.dto.ts +++ b/apps/api/src/services/dto/create-events.dto.ts @@ -6,15 +6,6 @@ export class CreateEventDto { @IsString() @IsNotEmpty() organizationId: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - name: string; - - @ApiProperty() - description: JSON; - @ApiProperty() @IsString() website: string; diff --git a/apps/api/src/services/events.service.ts b/apps/api/src/services/events.service.ts index 9747d6ff..c3a6045a 100644 --- a/apps/api/src/services/events.service.ts +++ b/apps/api/src/services/events.service.ts @@ -1,723 +1,147 @@ +import { Injectable } from '@nestjs/common'; import { - ConflictException, - Injectable, - InternalServerErrorException, - NotFoundException, - ServiceUnavailableException, - UnprocessableEntityException, -} from '@nestjs/common'; -import { PrismaService } from './prisma.service'; -import { StripeService } from './stripe.service'; -import { S3Service } from './cloud.service'; -import type { CreateEventDto } from './dto/create-events.dto'; -import type { UpdateEventDto } from './dto/update-event.dto'; -import type { - GetEventByOrgDto, - GetEventByOrgIdDto, -} from './dto/get-events.dto'; -import excludeKey from '../utils/exclude'; -import type { Events, User } from '@prisma/client'; -import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; -import { AiService } from './ai.service'; + CreateEventDto, + EventParams, + UpdateEventDto, +} from '@api/dto/events.dto'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { CommentModel, EventModel, FormModel, KanbanModal } from '@api/models'; +import { User } from '@api/db/schema'; +import { stripUndefinedOrNull, exclude } from '@api/utils'; +import { FFError } from '@api/utils/error'; @Injectable() export class EventsService { - constructor( - private readonly prismaService: PrismaService, - private readonly cloudService: S3Service, - private readonly stripeService: StripeService, - private readonly eventEmitter: EventEmitter2, - private readonly AiService: AiService, - ) {} + constructor(private readonly eventEmitter: EventEmitter2) {} public async getEventById(id: string) { - return this.prismaService.events.findUnique({ - where: { - id, - }, + return await EventModel.findById(id); + } + + async createEvent({ + newEvent, + user, + orgId, + }: { + newEvent: CreateEventDto; + user: User; + orgId: string; + }) { + const isEventWithSlugExist = await EventModel.find({ + slug: newEvent.name, }); - } - - async createEvent(d: CreateEventDto, userId: string) { - try { - const isEventWithSlugExist = await this.getEventBySlug(d.name); - - const totalCount = await this.prismaService.events.aggregate({ - _count: true, - }); - - let slug: string; - if (isEventWithSlugExist) { - slug = `${d.name}-${totalCount._count}`; - } else { - slug = d.name; - } + let slug: string; - await this.prismaService.organization.update({ - where: { - id: d.organizationId, - }, - data: { - events: { - create: { - name: d.name, - website: d.website, - location: d.location, - ticketPrice: d.ticketPrice, - slug, - eventDate: new Date(d.eventDate), - lastDate: new Date(d.lastDate), - maxTicketCount: d.maxTicketCount, - }, - }, - }, + if (isEventWithSlugExist) { + const totalEventCount = await EventModel.count({ + slug: newEvent.name, }); - - const newEvent = await this.getEventBySlug(slug); - - this.eventEmitter.emit('event.created', newEvent, userId); - - return { - ok: true, - message: 'event created successfully', - data: newEvent, - }; - } catch (e) { - return { - ok: false, - message: 'could not create event', - ERROR: e, - }; + slug = `${newEvent.name}-${totalEventCount}`; + } else { + slug = newEvent.name; } - } - - async updateEvent(payload: UpdateEventDto) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - organizationId: payload.organizationId, - slug: payload.eventSlug, - }, - }); - if (!event) { - throw new NotFoundException("Event doesn't exist"); - } + const event = await EventModel.insert({ + fk_organization_id: orgId, + name: newEvent.name, + website: newEvent.website, + location: newEvent.location, + slug, + event_date: newEvent.event_date, + description: newEvent.description ?? '', + }); - const data = await this.prismaService.events.update({ - where: { - organizationId: payload.organizationId, - slug: payload.eventSlug, - }, - data: { - name: payload.name || event.name, - website: payload.website || event.website, - location: payload.location || event.location, - description: payload.description || event.description, - lastDate: payload.lastDate || event.lastDate, - isPublished: payload.hasOwnProperty('isPublished') - ? payload.isPublished - : event.isPublished, - maxTeamSize: payload.maxTeamSize || event.maxTeamSize, - minTeamSize: payload.minTeamSize || event.minTeamSize, - isCollegeEvent: payload.hasOwnProperty('isCollegeEvent') - ? payload.isCollegeEvent - : event.isCollegeEvent, - maxTicketCount: payload.maxTicketCount || event.maxTicketCount, - eventDate: payload.eventDate || event.eventDate, - }, - }); + // Creating an Event will create a default Form + await FormModel.insert({ + fk_event_id: event.id, + title: 'Default Form', + description: 'Default Form Description', + confirmation_message: 'This message is shown after form submission', + misc: {}, + is_default_form: true, + }); - if (!data) { - throw new UnprocessableEntityException("Event couldn't be updated"); - } + // Creating an Event will create a Kanban board + await KanbanModal.insertMany([ + { + fk_event_id: event.id, + title: 'ToDo', + }, + { + fk_event_id: event.id, + title: 'In Progress', + }, + { + fk_event_id: event.id, + title: 'Done', + }, + ]); + + this.eventEmitter.emit('event.created', event, user.id); + } + + async updateEvent({ + updateData, + user: _user, + orgId, + eventId, + }: { + updateData: UpdateEventDto; + user: User; + orgId: string; + eventId: string; + }) { + const updateObj = stripUndefinedOrNull(updateData); + + const updateEvent = EventModel.update( + { + id: eventId, + fk_organization_id: orgId, + }, + updateObj, + ); - this.eventEmitter.emit('event.updated', data); + this.eventEmitter.emit('event.updated', updateEvent); - return { - ok: true, - message: 'Event was updated successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message, - }); - } else if (e instanceof UnprocessableEntityException) { - throw new UnprocessableEntityException({ - ok: false, - message: e.message, - }); - } else { - throw new InternalServerErrorException({ - error: e, - }); - } - } + return updateEvent; } async getAllEvents(query = '') { - try { - return await this.prismaService.events.findMany({ - where: { - name: { - contains: query, - mode: 'insensitive', - }, - lastDate: { - gte: new Date(), - }, - isPublished: true, - maxTicketCount: { - gt: 0, - }, - }, - orderBy: { - createdAt: 'asc', - }, - }); - } catch { - throw { - ok: false, - message: 'could not get events', - }; - } - } - - async getEventByOrgSlug(payload: GetEventByOrgDto) { - try { - return await this.prismaService.organization.findMany({ - where: { - slug: payload.slug, - }, - select: { - events: true, - }, - }); - } catch { - return null; - } - } - - async getEventByOrgsId(payload: GetEventByOrgIdDto) { - try { - return await this.prismaService.organization.findMany({ - where: { - id: payload.id, - }, - select: { - events: true, - members: true, - }, - }); - } catch { - return null; - } - } - - async publishEvent(eventSlug: string) { - try { - const data = await this.getEventBySlug(eventSlug); - - if (!data) { - throw new NotFoundException(); - } - - const { maxTicketCount, eventDate, lastDate } = data; - if (!maxTicketCount || !eventDate || !lastDate) { - throw new UnprocessableEntityException({ - message: 'please provide all required information for event', - }); - } - await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - isPublished: true, - }, - }); - - return { - ok: true, - message: 'event was published successfully', - }; - } catch (e) { - // Use exception filters to handle exceptions and return appropriate responses - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message, - }); - } else if (e instanceof UnprocessableEntityException) { - throw new UnprocessableEntityException({ - ok: false, - message: e.message, - }); - } else { - throw e; // Rethrow other exceptions - } - } - } - - async getEventBySlugId(slug: string) { - try { - const data = await this.prismaService.events.findUnique({ - where: { - slug, - }, - include: { - form: true, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - return { - ok: true, - message: 'event found successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message, - }); - } else if (e instanceof UnprocessableEntityException) { - throw new UnprocessableEntityException({ - ok: false, - message: e.message, - }); - } else { - throw e; // Rethrow other exceptions - } - } - } - - async registerEvent(eventSlug: string, userId: string) { - try { - const eventInfo = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - include: { - Ticket: { - where: { - userUid: userId, - }, - }, - }, - }); - - if (eventInfo.Ticket.length) { - throw new ConflictException(); - } - - if (eventInfo.maxTicketCount <= 0) { - throw new ServiceUnavailableException(); - } - - // when the event requires a form input we should check if the use has completed the form or not - // can only be done after creating the response schema - - // After this if the event has a ticket price we will redirect to stripe checkout - - if (eventInfo.ticketPrice > 0) { - // this will trigger another service layer from the stripeService Event emitter - return await this.stripeService.createCheckoutSession( - eventInfo, - userId, - ); - } else { - const data = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - Ticket: { - create: { - userUid: userId, - }, - }, - maxTicketCount: eventInfo.maxTicketCount - 1, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event register successfully', - }; - } - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else if (e instanceof ServiceUnavailableException) { - throw new ServiceUnavailableException(); - } else if (e instanceof ConflictException) { - throw new ConflictException('user already registered'); - } else { - throw e; - } - } - } - - async getEventParticipants(slugId: string) { - try { - const userInfo = await this.prismaService.events.findUnique({ - where: { - slug: slugId, - }, - select: { - Ticket: { - select: { - user: true, - }, - }, - }, - }); - - if (!userInfo) { - throw new NotFoundException('Events not found'); - } - - const data = userInfo.Ticket.map((info) => - excludeKey(info.user, [ - 'refreshToken', - 'createdAt', - ]), - ); - - return { - ok: true, - message: 'members found successfully', - data: data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException('Event not found'); - } else { - throw e; - } - } - } - - async getEventRegistartionStatus(slugId: string, userId: string) { - try { - const data = await this.prismaService.events.findUnique({ - where: { - slug: slugId, - }, - select: { - Ticket: { - where: { - userUid: userId, - }, - }, - }, - }); - - if (!data || !data.Ticket.length) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'User found successfully', - isRegistred: true, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw new InternalServerErrorException({ - error: e, - }); - } - } - } - - async uploadEventCover(file: Express.Multer.File, eventSlug: string) { - try { - const publicUrl = await this.cloudService.uploadFile(file); - if (!publicUrl) { - return new InternalServerErrorException(); - } - - const updatedEventCover = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - coverImage: publicUrl, - }, - }); - - if (!updatedEventCover) { - throw new InternalServerErrorException(); - } - return { - ok: true, - data: updatedEventCover, - message: 'image uploaded successfully', - }; - } catch (e) { - if (e instanceof InternalServerErrorException) { - throw new InternalServerErrorException(); - } - } - } - - async getTicketInfo(id: string) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - id, - }, - select: { - eventDate: true, - description: true, - isCollegeEvent: true, - coverImage: true, - location: true, - name: true, - }, - }); - if (!event) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event schema found', - data: event, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - async deleteEvent(eventId: string) { - try { - const event = await this.getEventById(eventId); - // cant delete paid event till we figure out a way to process refund - // #TODO: @sreehari2003 add refund logic here - if (event.ticketPrice > 0) { - return new ServiceUnavailableException(); - } - - await this.prismaService.ticket.deleteMany({ - where: { - eventsId: eventId, - }, - }); - - await this.prismaService.events.delete({ - where: { - id: eventId, - }, - }); + const events = await EventModel.find({ + name: query, + }); - return { - ok: true, - message: 'event was deleted successfully', - }; - } catch (e) { - if (e instanceof ServiceUnavailableException) { - throw new ServiceUnavailableException({ - message: 'We dont support to delete a paid event', - }); - } - throw new InternalServerErrorException({ - error: e, - }); - } + return events; } - async removeParticipant(eventId: string, userId: string) { - try { - const isUserExist = await this.prismaService.ticket.findFirst({ - where: { - eventsId: eventId, - userUid: userId, - }, - }); - - if (!isUserExist) { - throw new NotFoundException(); - } - - await this.prismaService.ticket.delete({ - where: { - id: isUserExist.id, - }, - }); + async deleteEvent({ eventId, orgId }: EventParams) { + const event = await EventModel.findOne({ + id: eventId, + fk_organization_id: orgId, + }); - return { - ok: true, - message: 'user was removed successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw new ServiceUnavailableException(); - } + if (!event) { + FFError.badRequest('There is no event with this id'); } - } - - async getEventStats(id: string) { - try { - const eventInfo = await this.prismaService.events.findUnique({ - where: { - slug: id, - }, - }); - - if (!eventInfo) throw new NotFoundException(); - - const insights = await this.prismaService.ticket.groupBy({ - by: ['createdAt'], - where: { - eventsId: eventInfo.id, - }, - _count: true, - }); - const stats = await this.prismaService.user.aggregate({ - where: { - Ticket: { - some: { - eventsId: eventInfo.id, - }, - }, - }, - _count: true, - }); - - const totalRevenue = stats._count * eventInfo.ticketPrice; - - const data = { - totalRevenue: totalRevenue || 0, - totalTickets: stats._count || 0, - insights: this.aggregateCountsByDay(insights), - }; - - return { - data, - message: 'Data Found successfully', - }; - } catch { - throw new NotFoundException(); + if (event?.is_published) { + FFError.badRequest('Cannot delete published event'); } - } - - @OnEvent('event.updated') - async handleEventUpdated(event: Events) { - const embedDescription = await this.AiService.generateEmbedding( - JSON.stringify(event.description), - ); - const embedName = await this.AiService.generateEmbedding( - JSON.stringify(event.name), - ); - await this.prismaService - .$queryRaw`UPDATE public."Events" SET embedding_description = ${embedDescription} WHERE id = ${event.id}`; - await this.prismaService - .$queryRaw`UPDATE public."Events" SET embedding_title = ${embedName} WHERE id = ${event.id}`; - } - @OnEvent('event.created') - async addSeedKanbanBoards(newEvent: Events, userId: string) { - // By default these kanban boards are created for each event - await this.prismaService.events.update({ - where: { - id: newEvent.id, - }, - data: { - kanban: { - createMany: { - data: [ - { - userUid: userId, - title: 'Todo', - }, - { - userUid: userId, - title: 'In process', - }, - { - userUid: userId, - title: 'completed', - }, - ], - }, - }, - }, + await KanbanModal.delete({ + fk_event_id: eventId, }); - } - async deleteForm(slug: string) { - try { - await this.prismaService.events.update({ - where: { - slug, - }, - data: { - form: { - deleteMany: {}, - }, - }, - }); - return { - ok: true, - message: 'form deleted successfully', - }; - } catch { - throw new InternalServerErrorException(); - } - } - - private async getEventBySlug(id: string) { - return this.prismaService.events.findUnique({ - where: { - slug: id, - }, + await CommentModel.delete({ + fk_event_id: eventId, }); - } - - private aggregateCountsByDay(responses: Insights[]) { - const aggregatedCounts = {}; - responses.forEach((response) => { - // Extract the date part from createdAt - const date = new Date(response.createdAt).toISOString().split('T')[0]; + // TODO: @DarkPhoenix2704 Delete all associated data also - // Initialize count for the day if not exists - if (!aggregatedCounts[date]) { - aggregatedCounts[date] = 0; - } - - // Add count to the existing count for the day - aggregatedCounts[date] += response._count; + return await EventModel.delete({ + id: eventId, + fk_organization_id: orgId, }); - - return aggregatedCounts; } } - -type Insights = { - _count: number; - createdAt: Date; -}; diff --git a/apps/api/src/services/guards/rbac-member.guard.ts b/apps/api/src/services/guards/rbac-member.guard.ts index 744e9090..71166d4e 100644 --- a/apps/api/src/services/guards/rbac-member.guard.ts +++ b/apps/api/src/services/guards/rbac-member.guard.ts @@ -3,18 +3,16 @@ import { type ExecutionContext, Injectable, ForbiddenException, - NotFoundException, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import { ORG_ID_NOT_FOUND, NO_ROLE_ACCESS } from '../../error'; -import { PrismaService } from '../prisma.service'; +import { NO_ROLE_ACCESS } from '../../error'; +import { FFError } from '@api/utils/error'; +import { OrgMemberModel } from '@api/models'; +import { User } from '@api/db/schema'; @Injectable() export class RbacGuard implements CanActivate { - constructor( - private reflector: Reflector, - private prisma: PrismaService, - ) {} + constructor(private reflector: Reflector) {} async canActivate(context: ExecutionContext): Promise { const roles = this.reflector.get('roles', context.getHandler()); @@ -23,31 +21,21 @@ export class RbacGuard implements CanActivate { } const request = context.switchToHttp().getRequest(); - const user = request.user; + const user = request.user as User | undefined; + const organizationId = request.params.orgId; - const organizationId = - request.method === 'GET' - ? request.params.orgID - : request.body.organizationId; - - if (!organizationId) { - throw new NotFoundException(ORG_ID_NOT_FOUND); + if (!organizationId || !user) { + FFError.forbidden(''); } - const organizationMember = await this.prisma.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid: user.uid, - organizationId, - }, - }, + const organizationMember = await OrgMemberModel.findOne({ + fk_organization_id: organizationId, + fk_user_id: user.id, }); if (!organizationMember) { throw new ForbiddenException(NO_ROLE_ACCESS); } - - // setting role in request so that we can access the role via decorator request.role = organizationMember.role; return roles.includes(organizationMember.role); diff --git a/apps/api/src/services/org-events.service.ts b/apps/api/src/services/org-events.service.ts new file mode 100644 index 00000000..c91da76c --- /dev/null +++ b/apps/api/src/services/org-events.service.ts @@ -0,0 +1,364 @@ +import { + ConflictException, + Injectable, + InternalServerErrorException, + NotFoundException, + ServiceUnavailableException, +} from '@nestjs/common'; +import { PrismaService } from './prisma.service'; +import { StripeService } from './stripe.service'; +import { S3Service } from './cloud.service'; +import { EventParams } from '@api/dto/events.dto'; +import { User } from '@api/db/schema'; +import { exclude } from '@api/utils'; +import BaseContext from '@api/BaseContext'; +import { SystemTable } from '@api/utils/db'; + +@Injectable() +export class OrgEventsService { + constructor( + private readonly prismaService: PrismaService, + private readonly cloudService: S3Service, + private readonly stripeService: StripeService, + ) {} + + async registerEvent(eventSlug: string, userId: string) { + try { + const eventInfo = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + include: { + Ticket: { + where: { + userUid: userId, + }, + }, + }, + }); + + if (eventInfo.Ticket.length) { + throw new ConflictException(); + } + + if (eventInfo.maxTicketCount <= 0) { + throw new ServiceUnavailableException(); + } + + // when the event requires a form input we should check if the use has completed the form or not + // can only be done after creating the response schema + + // After this if the event has a ticket price we will redirect to stripe checkout + + if (eventInfo.ticketPrice > 0) { + // this will trigger another service layer from the stripeService Event emitter + return await this.stripeService.createCheckoutSession( + eventInfo, + userId, + ); + } else { + const data = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + Ticket: { + create: { + userUid: userId, + }, + }, + maxTicketCount: eventInfo.maxTicketCount - 1, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'Event register successfully', + }; + } + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else if (e instanceof ServiceUnavailableException) { + throw new ServiceUnavailableException(); + } else if (e instanceof ConflictException) { + throw new ConflictException('user already registered'); + } else { + throw e; + } + } + } + + async getEventParticipants2({ orgId, eventId }: EventParams) { + const participants = await BaseContext.knex(SystemTable.Ticket) + .where({ id: eventId }) + .select('tickets.user') + .join('tickets', 'events.id', 'tickets.event_id'); + } + + async getEventParticipants(slugId: string) { + try { + const userInfo = await this.prismaService.events.findUnique({ + where: { + slug: slugId, + }, + select: { + Ticket: { + select: { + user: true, + }, + }, + }, + }); + + if (!userInfo) { + throw new NotFoundException('Events not found'); + } + + const data = userInfo.Ticket.map((info) => + exclude(info.user, [ + 'refreshToken', + 'createdAt', + ]), + ); + + return { + ok: true, + message: 'members found successfully', + data: data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException('Event not found'); + } else { + throw e; + } + } + } + + async getEventRegistartionStatus(slugId: string, userId: string) { + try { + const data = await this.prismaService.events.findUnique({ + where: { + slug: slugId, + }, + select: { + Ticket: { + where: { + userUid: userId, + }, + }, + }, + }); + + if (!data || !data.Ticket.length) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'User found successfully', + isRegistred: true, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw new InternalServerErrorException({ + error: e, + }); + } + } + } + + async uploadEventCover(file: Express.Multer.File, eventSlug: string) { + try { + const publicUrl = await this.cloudService.uploadFile(file); + if (!publicUrl) { + return new InternalServerErrorException(); + } + + const updatedEventCover = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + coverImage: publicUrl, + }, + }); + + if (!updatedEventCover) { + throw new InternalServerErrorException(); + } + return { + ok: true, + data: updatedEventCover, + message: 'image uploaded successfully', + }; + } catch (e) { + if (e instanceof InternalServerErrorException) { + throw new InternalServerErrorException(); + } + } + } + + async getTicketInfo(id: string) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + id, + }, + select: { + eventDate: true, + description: true, + isCollegeEvent: true, + coverImage: true, + location: true, + name: true, + }, + }); + if (!event) { + throw new NotFoundException(); + } + + return { + ok: true, + message: 'Event schema found', + data: event, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } + + async removeParticipant(eventId: string, userId: string) { + try { + const isUserExist = await this.prismaService.ticket.findFirst({ + where: { + eventsId: eventId, + userUid: userId, + }, + }); + + if (!isUserExist) { + throw new NotFoundException(); + } + + await this.prismaService.ticket.delete({ + where: { + id: isUserExist.id, + }, + }); + + return { + ok: true, + message: 'user was removed successfully', + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw new ServiceUnavailableException(); + } + } + } + + async getEventStats(id: string) { + try { + const eventInfo = await this.prismaService.events.findUnique({ + where: { + slug: id, + }, + }); + + if (!eventInfo) throw new NotFoundException(); + + const insights = await this.prismaService.ticket.groupBy({ + by: ['createdAt'], + where: { + eventsId: eventInfo.id, + }, + _count: true, + }); + + const stats = await this.prismaService.user.aggregate({ + where: { + Ticket: { + some: { + eventsId: eventInfo.id, + }, + }, + }, + _count: true, + }); + + const totalRevenue = stats._count * eventInfo.ticketPrice; + + const data = { + totalRevenue: totalRevenue || 0, + totalTickets: stats._count || 0, + insights: this.aggregateCountsByDay(insights), + }; + + return { + data, + message: 'Data Found successfully', + }; + } catch { + throw new NotFoundException(); + } + } + + async deleteForm(slug: string) { + try { + await this.prismaService.events.update({ + where: { + slug, + }, + data: { + form: { + deleteMany: {}, + }, + }, + }); + return { + ok: true, + message: 'form deleted successfully', + }; + } catch { + throw new InternalServerErrorException(); + } + } + + private aggregateCountsByDay(responses: Insights[]) { + const aggregatedCounts = {}; + + responses.forEach((response) => { + // Extract the date part from createdAt + const date = new Date(response.createdAt).toISOString().split('T')[0]; + + // Initialize count for the day if not exists + if (!aggregatedCounts[date]) { + aggregatedCounts[date] = 0; + } + + // Add count to the existing count for the day + aggregatedCounts[date] += response._count; + }); + + return aggregatedCounts; + } +} + +type Insights = { + _count: number; + createdAt: Date; +}; diff --git a/apps/api/src/types/express.ts b/apps/api/src/types/express.ts index db96ee89..6231dcd3 100644 --- a/apps/api/src/types/express.ts +++ b/apps/api/src/types/express.ts @@ -1,7 +1,9 @@ -import type { User } from '@api/db/schema'; +import { User as FFUser } from '@api/db/schema'; +import { Role } from '@api/utils/db'; declare namespace Express { export interface Request { - user: User; + user?: FFUser; + role?: Role; } } diff --git a/apps/api/src/utils/index.ts b/apps/api/src/utils/index.ts new file mode 100644 index 00000000..f99e60d1 --- /dev/null +++ b/apps/api/src/utils/index.ts @@ -0,0 +1,5 @@ +import { stripUndefinedOrNull } from '@api/utils/stripUndefined'; +import { hyphenete } from './hyphenate'; +import exclude from './exclude'; + +export { stripUndefinedOrNull, hyphenete, exclude }; diff --git a/apps/api/src/utils/stripUndefined.ts b/apps/api/src/utils/stripUndefined.ts new file mode 100644 index 00000000..0e95c30d --- /dev/null +++ b/apps/api/src/utils/stripUndefined.ts @@ -0,0 +1,29 @@ +type NonUndefined = T extends undefined ? never : T; +type NonNull = T extends null ? never : T; +type NonNullableObject = { + [K in keyof T]: NonUndefined>; +}; + +type Prettify = { + [K in keyof T]: T[K]; +} & {}; + +export const stripUndefinedOrNull = ( + obj: T, +): Prettify> => { + const strip = (input: unknown): unknown => { + return Array.isArray(input) + ? input.map(strip) + : input !== null && typeof input === 'object' + ? Object.entries(input) + .filter(([, value]) => value !== undefined && value !== null) + .reduce((acc, [key, value]) => { + acc[key as keyof typeof acc] = strip(value); + return acc; + // biome-ignore lint/suspicious/noExplicitAny: + }, {} as any) + : input; + }; + + return strip(obj) as Prettify>; +}; diff --git a/apps/api/src/validation/zod.validation.decorator.ts b/apps/api/src/validation/zod.validation.decorator.ts index 2dc7d38f..3451a113 100644 --- a/apps/api/src/validation/zod.validation.decorator.ts +++ b/apps/api/src/validation/zod.validation.decorator.ts @@ -3,23 +3,23 @@ import { ZodSchema } from 'zod'; import { ZodValidationPipe } from './zod.validation.pipe'; interface ZodValidationOptions { - bodySchema?: ZodSchema; - querySchema?: ZodSchema; + body?: ZodSchema; + query?: ZodSchema; + params?: ZodSchema; } export function ZodValidator(options: ZodValidationOptions) { const decorators: ClassDecorator[] = [] as unknown as ClassDecorator[]; - if (options.bodySchema) { - decorators.push( - UsePipes(new ZodValidationPipe(options.bodySchema, 'body')), - ); + if (options.body) { + decorators.push(UsePipes(new ZodValidationPipe(options.body, 'body'))); } - if (options.querySchema) { - decorators.push( - UsePipes(new ZodValidationPipe(options.querySchema, 'query')), - ); + if (options.query) { + decorators.push(UsePipes(new ZodValidationPipe(options.query, 'query'))); + } + if (options.params) { + decorators.push(UsePipes(new ZodValidationPipe(options.params, 'param'))); } return applyDecorators(...decorators); diff --git a/apps/api/src/validation/zod.validation.pipe.ts b/apps/api/src/validation/zod.validation.pipe.ts index daf78f73..d482e34c 100644 --- a/apps/api/src/validation/zod.validation.pipe.ts +++ b/apps/api/src/validation/zod.validation.pipe.ts @@ -9,7 +9,7 @@ import { FFError } from '@api/utils/error'; export class ZodValidationPipe implements PipeTransform { constructor( private schema: ZodSchema, - private type: 'body' | 'query', + private type: 'body' | 'query' | 'param', ) {} transform(value: unknown, metadata: ArgumentMetadata) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dface00a..43e12072 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,9 +50,6 @@ importers: '@nestjs/throttler': specifier: ^5.1.2 version: 5.1.2(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2) - '@node-saml/passport-saml': - specifier: ^5.0.0 - version: 5.0.0 '@prisma/client': specifier: ^5.10.2 version: 5.14.0(prisma@5.14.0) @@ -2302,14 +2299,6 @@ packages: cpu: [x64] os: [win32] - '@node-saml/node-saml@5.0.0': - resolution: {integrity: sha512-4JGubfHgL5egpXiuo9bupSGn6mgpfOQ/brZZvv2Qiho5aJmW7O1khbjdB7tsTsCvNFtLLjQqm3BmvcRicJyA2g==} - engines: {node: '>= 18'} - - '@node-saml/passport-saml@5.0.0': - resolution: {integrity: sha512-7miY7Id6UkP39+6HO68e3/V6eJwszytEQl+oCh0R/gbzp5nHA/WI1mvrI6NNUVq5gC5GEnDS8GTw7oj+Kx499w==} - engines: {node: '>= 18'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4314,12 +4303,6 @@ packages: '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - '@types/xml-encryption@1.2.4': - resolution: {integrity: sha512-I69K/WW1Dv7j6O3jh13z0X8sLWJRXbu5xnHDl9yHzUNDUBtUoBY058eb5s+x/WG6yZC1h8aKdI2EoyEPjyEh+Q==} - - '@types/xml2js@0.4.14': - resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -4496,14 +4479,6 @@ packages: peerDependencies: '@nestjs-modules/mailer': ^1.8.1 - '@xmldom/is-dom-node@1.0.1': - resolution: {integrity: sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q==} - engines: {node: '>= 16'} - - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -9647,9 +9622,6 @@ packages: sass-embedded: optional: true - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -11056,14 +11028,6 @@ packages: utf-8-validate: optional: true - xml-crypto@6.0.0: - resolution: {integrity: sha512-L3RgnkaDrHaYcCnoENv4Idzt1ZRj5U1z1BDH98QdDTQfssScx8adgxhd9qwyYo+E3fXbQZjEQH7aiXHLVgxGvw==} - engines: {node: '>=16'} - - xml-encryption@3.0.2: - resolution: {integrity: sha512-VxYXPvsWB01/aqVLd6ZMPWZ+qaj0aIdF+cStrVJMcFj3iymwZeI0ABzB3VqMYv48DkSpRhnrXqTUkR34j+UDyg==} - engines: {node: '>=12'} - xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -11072,18 +11036,6 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml2js@0.6.2: - resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -11091,18 +11043,6 @@ packages: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} - xpath@0.0.32: - resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} - engines: {node: '>=0.6.0'} - - xpath@0.0.33: - resolution: {integrity: sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA==} - engines: {node: '>=0.6.0'} - - xpath@0.0.34: - resolution: {integrity: sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==} - engines: {node: '>=0.6.0'} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -13379,34 +13319,6 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.3': optional: true - '@node-saml/node-saml@5.0.0': - dependencies: - '@types/debug': 4.1.12 - '@types/qs': 6.9.15 - '@types/xml-encryption': 1.2.4 - '@types/xml2js': 0.4.14 - '@xmldom/is-dom-node': 1.0.1 - '@xmldom/xmldom': 0.8.10 - debug: 4.3.5 - xml-crypto: 6.0.0 - xml-encryption: 3.0.2 - xml2js: 0.6.2 - xmlbuilder: 15.1.1 - xpath: 0.0.34 - transitivePeerDependencies: - - supports-color - - '@node-saml/passport-saml@5.0.0': - dependencies: - '@node-saml/node-saml': 5.0.0 - '@types/express': 4.17.21 - '@types/passport': 1.0.16 - '@types/passport-strategy': 0.2.38 - passport: 0.7.0 - passport-strategy: 1.0.0 - transitivePeerDependencies: - - supports-color - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -16363,14 +16275,6 @@ snapshots: - webpack-cli optional: true - '@types/xml-encryption@1.2.4': - dependencies: - '@types/node': 20.12.13 - - '@types/xml2js@0.4.14': - dependencies: - '@types/node': 20.12.13 - '@types/yargs-parser@21.0.3': {} '@types/yargs@16.0.9': @@ -16640,10 +16544,6 @@ snapshots: '@react-email/render': 0.0.7 locter: 1.3.0 - '@xmldom/is-dom-node@1.0.1': {} - - '@xmldom/xmldom@0.8.10': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -23198,8 +23098,6 @@ snapshots: neo-async: 2.6.2 webpack: 5.91.0(@swc/core@1.5.24(@swc/helpers@0.5.5))(esbuild@0.18.20) - sax@1.4.1: {} - saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -24867,41 +24765,14 @@ snapshots: ws@8.17.0: {} - xml-crypto@6.0.0: - dependencies: - '@xmldom/is-dom-node': 1.0.1 - '@xmldom/xmldom': 0.8.10 - xpath: 0.0.33 - - xml-encryption@3.0.2: - dependencies: - '@xmldom/xmldom': 0.8.10 - escape-html: 1.0.3 - xpath: 0.0.32 - xml-name-validator@4.0.0: {} xml-name-validator@5.0.0: {} - xml2js@0.6.2: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - xmlbuilder@15.1.1: {} - xmlchars@2.2.0: {} xmlhttprequest-ssl@2.0.0: {} - xpath@0.0.32: {} - - xpath@0.0.33: {} - - xpath@0.0.34: {} - xtend@4.0.2: {} y18n@4.0.3: {} From 5d216b9324072f297bcc0544912fa8756511b3ba Mon Sep 17 00:00:00 2001 From: sreehari jayaraj Date: Wed, 5 Jun 2024 19:47:27 +0530 Subject: [PATCH 11/61] fix: ts error and few knex orm --- apps/api/src/controllers/ai.controller.ts | 26 +- apps/api/src/controllers/form.controller.ts | 204 ++++---- apps/api/src/controllers/kanban.controller.ts | 104 ++-- .../src/controllers/org-events.controller.ts | 105 ++--- .../src/controllers/org-invite.controller.ts | 53 ++- .../src/controllers/org-member.controller.ts | 93 ++-- .../controllers/organization.controller.ts | 145 +++--- apps/api/src/db/schema/event-ticket.ts | 32 +- apps/api/src/db/schema/form-fields.ts | 30 +- apps/api/src/dto/form-field.dto.ts | 11 + apps/api/src/dto/update-task.dto.ts | 7 + apps/api/src/services/dto/create-form.dto.ts | 25 - apps/api/src/services/dto/update-role.dto.ts | 28 +- apps/api/src/services/events.service.ts | 284 +++++------ apps/api/src/services/form.service.ts | 415 ++++++++-------- apps/api/src/services/inti.service.ts | 0 apps/api/src/services/kanban.service.ts | 368 +++++++++------ apps/api/src/services/org-member.service.ts | 190 ++++---- apps/api/src/services/organization.service.ts | 444 +++++++++--------- apps/api/src/utils/db.ts | 106 ++--- apps/web/hooks/api/kanban/useKanban.ts | 48 +- apps/web/hooks/api/kanban/useUpdateTask.ts | 73 +++ 22 files changed, 1494 insertions(+), 1297 deletions(-) create mode 100644 apps/api/src/dto/form-field.dto.ts create mode 100644 apps/api/src/dto/update-task.dto.ts delete mode 100644 apps/api/src/services/dto/create-form.dto.ts delete mode 100644 apps/api/src/services/inti.service.ts create mode 100644 apps/web/hooks/api/kanban/useUpdateTask.ts diff --git a/apps/api/src/controllers/ai.controller.ts b/apps/api/src/controllers/ai.controller.ts index ea8e59c2..67a897f2 100644 --- a/apps/api/src/controllers/ai.controller.ts +++ b/apps/api/src/controllers/ai.controller.ts @@ -1,17 +1,17 @@ -import { Controller, Post, Body } from '@nestjs/common'; -import { AiService } from '../services/ai.service'; -import { ZodValidator } from '@api/validation/zod.validation.decorator'; -import { AIFormSchema, AIFormDto } from '@api/dto/ai.dto'; +import { Controller, Post, Body } from "@nestjs/common"; +import { AiService } from "../services/ai.service"; +import { ZodValidator } from "@api/validation/zod.validation.decorator"; +import { AIFormSchema, AIFormDto } from "@api/dto/ai.dto"; -@Controller('ai') +@Controller("ai") export class AiController { - constructor(private readonly aiService: AiService) {} + constructor(private readonly aiService: AiService) {} - @Post('form') - @ZodValidator({ - bodySchema: AIFormSchema, - }) - async generateForm(@Body() aiFormDto: AIFormDto) { - return this.aiService.gptComplete(aiFormDto.prompt, aiFormDto.messages); - } + @Post("form") + @ZodValidator({ + body: AIFormSchema, + }) + async generateForm(@Body() aiFormDto: AIFormDto) { + return this.aiService.gptComplete(aiFormDto.prompt, aiFormDto.messages); + } } diff --git a/apps/api/src/controllers/form.controller.ts b/apps/api/src/controllers/form.controller.ts index e7585fa2..deda13d5 100644 --- a/apps/api/src/controllers/form.controller.ts +++ b/apps/api/src/controllers/form.controller.ts @@ -1,109 +1,117 @@ import { - Body, - Controller, - Delete, - Get, - InternalServerErrorException, - NotFoundException, - Param, - Post, - UseGuards, -} from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiTags } from '@nestjs/swagger'; -import { Roles } from '../services/decorator/roles.decorator'; -import { RbacGuard } from '../services/guards/rbac-member.guard'; -import { FormService } from '../services/form.service'; -import { EventsService } from '../services/events.service'; -import type { FormPayLoad } from '../services/dto/create-form.dto'; -import type { User } from '@prisma/client'; -import { AuthUser } from '../services/auth/decorators/user.decorator'; -import type { ToggleFormPublishStatus } from '../services/dto/publish-form.dto'; + Body, + Controller, + Delete, + Get, + InternalServerErrorException, + NotFoundException, + Param, + Post, + UseGuards, +} from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; +import { ApiOperation, ApiTags } from "@nestjs/swagger"; +import { Roles } from "../services/decorator/roles.decorator"; +import { RbacGuard } from "../services/guards/rbac-member.guard"; +import { FormService } from "../services/form.service"; +import { EventsService } from "../services/events.service"; +import { + CreateFormFieldDto, + CreateFormFieldSchema, +} from "@api/dto/form-field.dto"; +import type { User } from "@prisma/client"; +import { AuthUser } from "../services/auth/decorators/user.decorator"; +import type { ToggleFormPublishStatus } from "../services/dto/publish-form.dto"; +import { ZodValidator } from "@api/validation/zod.validation.decorator"; +import { Role } from "@api/utils/db"; -@Controller('/events') +@Controller("/events") export class FormController { - constructor( - private form: FormService, - private events: EventsService, - ) {} + constructor(private form: FormService, private events: EventsService) {} - @Get('/form/:orgID/:eventId') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiOperation({ summary: 'get form schema of a specific event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getFormSchema(@Param('eventId') slugId: string) { - return await this.form.getEventFormScheme(slugId); - } + @Get("/form/:orgID/:eventId") + @ApiTags("events") + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) + @ApiOperation({ summary: "get form schema of a specific event" }) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getFormSchema(@Param("eventId") slugId: string) { + return await this.form.getEventFormScheme(slugId); + } - @Post('/form/:eventId') - @ApiTags('events') - @ApiOperation({ summary: 'users register form via this route' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async postFormResponse( - @Param('eventId') eventId: string, - @Body() data: Record>, - @AuthUser() user: User, - ) { - try { - const event = await this.events.getEventById(eventId); - if (event.maxTicketCount < 1) { - throw new NotFoundException(); - } - await this.form.addUserFormSubmission(data, eventId, user.uid); - return await this.events.registerEvent(event.slug, user.uid); - } catch (e) { - if (e instanceof NotFoundException) throw new NotFoundException(); + @Post("/form/:eventId") + @ApiTags("events") + @ApiOperation({ summary: "users register form via this route" }) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async postFormResponse( + @Param("eventId") eventId: string, + @Body() data: Record>, + @AuthUser() user: User + ) { + try { + const event = await this.events.getEventById(eventId); + if (!event || event?.maxTicketCount < 1) { + throw new NotFoundException(); + } + await this.form.addUserFormSubmission(data, eventId, user.uid); + return await this.events.registerEvent(event.slug, user.uid); + } catch (e) { + if (e instanceof NotFoundException) throw new NotFoundException(); - throw new InternalServerErrorException(); - } - } + throw new InternalServerErrorException(); + } + } - @Post('/publish/form/:id') - @ApiTags('events') - @ApiOperation({ - summary: - 'publish event , by doing this we lets public to register for event', - }) - @Roles('ADMIN', 'EDITOR') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async publishForm( - @Param('id') data: string, - @Body() payload: ToggleFormPublishStatus, - ) { - return await this.form.toggleFormPublishStatus( - data, - payload.shouldFormPublish, - ); - } + @Post("/publish/form/:id") + @ApiTags("events") + @ApiOperation({ + summary: + "publish event , by doing this we lets public to register for event", + }) + @Roles(Role.ADMIN, Role.EDITOR) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async publishForm( + @Param("id") data: string, + @Body() payload: ToggleFormPublishStatus + ) { + return await this.form.toggleFormPublishStatus( + data, + payload.shouldFormPublish + ); + } - @Post('/form') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @ApiOperation({ summary: 'Create form for each event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async createForm(@Body() payload: FormPayLoad) { - return await this.form.createForm(payload); - } + @Post("/form/:formId") + @ApiTags("events") + @Roles(Role.ADMIN, Role.EDITOR) + @ApiOperation({ summary: "Create form for each event" }) + @ZodValidator({ + body: CreateFormFieldSchema, + }) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async createForm( + @Body() payload: CreateFormFieldDto, + @Param("id") formId: string + ) { + return await this.form.createForm(payload, formId); + } - @Get('/participants/:orgID/:id/:userId/form') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiOperation({ summary: 'Get all the form submission from participant' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getRegisteredParticipantsFormSubmissions( - @Param('id') id: string, - @Param('userId') uid: string, - ) { - return await this.form.getRegisteredParticipantsFormSubmissions(id, uid); - } + @Get("/participants/:orgID/:id/:userId/form") + @ApiTags("events") + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) + @ApiOperation({ summary: "Get all the form submission from participant" }) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getRegisteredParticipantsFormSubmissions( + @Param("id") id: string, + @Param("userId") uid: string + ) { + return await this.form.getRegisteredParticipantsFormSubmissions(id, uid); + } - @Delete('/form/bulk-delete/:slug') - @ApiTags('events') - @Roles('ADMIN', 'EDITOR') - @ApiOperation({ summary: 'Bulk delete form for each event' }) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async bulkDeleteForm(@Param('slug') eventName: string) { - return await this.events.deleteForm(eventName); - } + @Delete("/form/bulk-delete/:slug") + @ApiTags("events") + @Roles(Role.ADMIN, Role.EDITOR) + @ApiOperation({ summary: "Bulk delete form for each event" }) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async bulkDeleteForm(@Param("slug") eventName: string) { + return await this.events.deleteForm(eventName); + } } diff --git a/apps/api/src/controllers/kanban.controller.ts b/apps/api/src/controllers/kanban.controller.ts index bc6a511a..8aa2c184 100644 --- a/apps/api/src/controllers/kanban.controller.ts +++ b/apps/api/src/controllers/kanban.controller.ts @@ -1,39 +1,75 @@ -import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; -import { KanbanService } from '../services/kanban.service'; -import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiTags } from '@nestjs/swagger'; -import { RbacGuard } from '../services/guards/rbac-member.guard'; -import type { CreateTask } from '../services/dto/create-task.dto'; -import { AuthUser } from '../services/auth/decorators/user.decorator'; -import type { User } from '@prisma/client'; +import { + Body, + Controller, + Delete, + Get, + Param, + Patch, + Post, + UseGuards, +} from "@nestjs/common"; +import { KanbanService } from "../services/kanban.service"; +import { AuthGuard } from "@nestjs/passport"; +import { ApiOperation, ApiTags } from "@nestjs/swagger"; +import { RbacGuard } from "../services/guards/rbac-member.guard"; +import { AuthUser } from "../services/auth/decorators/user.decorator"; +import { UpdateTaskBoard, IUpdateTaskBoard } from "@api/dto/update-task.dto"; +import { ZodValidator } from "@api/validation/zod.validation.decorator"; +import type { User } from "@prisma/client"; +import type { CreateTask } from "../services/dto/create-task.dto"; -@Controller('/events/kanban') +@Controller("/events/kanban") export class KanbanController { - constructor(private kanbanService: KanbanService) {} + constructor(private kanbanService: KanbanService) {} - @ApiOperation({ summary: 'get all kanban boards associated with a event' }) - @ApiTags('kanban') - @UseGuards(AuthGuard('jwt'), RbacGuard) - @Get('/:slug') - async getAllBoards(@Param('slug') slug: string) { - return await this.kanbanService.getAllBoards(slug); - } + @ApiOperation({ summary: "get all kanban boards associated with a event" }) + @ApiTags("kanban") + @UseGuards(AuthGuard("jwt"), RbacGuard) + @Get("/:slug") + async getAllBoards(@Param("slug") slug: string) { + return await this.kanbanService.getAllBoards(slug); + } - @ApiOperation({ summary: 'create a new task in kanban board' }) - @ApiTags('kanban') - @UseGuards(AuthGuard('jwt'), RbacGuard) - @Post('/:slug/:boardId') - async createTask( - @Param('slug') slug: string, - @Param('boardId') boardId: string, - @Body() payload: CreateTask, - @AuthUser() user: User, - ) { - return await this.kanbanService.createTask( - payload, - slug, - boardId, - user.uid, - ); - } + @ApiOperation({ summary: "create a new task in kanban board" }) + @ApiTags("kanban") + @UseGuards(AuthGuard("jwt"), RbacGuard) + @Post("/:slug/:boardId") + async createTask( + @Param("slug") slug: string, + @Param("boardId") boardId: string, + @Body() payload: CreateTask, + @AuthUser() user: User + ) { + return await this.kanbanService.createTask( + payload, + slug, + boardId, + user.uid + ); + } + + @ApiOperation({ summary: "delete a board" }) + @ApiTags("kanban") + @UseGuards(AuthGuard("jwt"), RbacGuard) + @Delete("/:slug/:boardId") + async deleteBoard( + @Param("slug") slug: string, + @Param("boardId") boardId: string + ) { + return await this.kanbanService.deleteBoard(boardId, slug); + } + + @ApiOperation({ summary: "update task board" }) + @ApiTags("kanban") + @UseGuards(AuthGuard("jwt"), RbacGuard) + @Patch("/tasks/:taskId") + @ZodValidator({ + body: UpdateTaskBoard, + }) + async updateTaskBoard( + @Param("taskId") boardId: string, + @Body() data: IUpdateTaskBoard + ) { + return await this.kanbanService.updateTaskBoard(boardId, data.kanbanId); + } } diff --git a/apps/api/src/controllers/org-events.controller.ts b/apps/api/src/controllers/org-events.controller.ts index 435d113b..cd9199ed 100644 --- a/apps/api/src/controllers/org-events.controller.ts +++ b/apps/api/src/controllers/org-events.controller.ts @@ -1,62 +1,61 @@ import { - Body, - Controller, - Delete, - Get, - Param, - Post, - UseGuards, -} from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import type { User } from '@prisma/client'; -import { AuthUser } from '../services/auth/decorators/user.decorator'; -import { RbacGuard } from '../services/guards/rbac-member.guard'; -import { Roles } from '../services/decorator/roles.decorator'; -import type { RemoveUserDto } from '../services/dto/remove-user.dto'; -import { Role } from '@api/utils/db'; -import { ZodValidator } from '@api/validation/zod.validation.decorator'; -import { EventParamsSchema } from '@api/dto/events.dto'; -import { OrgEventsService } from '@api/services/org-events.service'; + Body, + Controller, + Delete, + Get, + Param, + UseGuards, +} from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; +import { AuthUser } from "../services/auth/decorators/user.decorator"; +import { RbacGuard } from "../services/guards/rbac-member.guard"; +import { Roles } from "../services/decorator/roles.decorator"; +import { Role } from "@api/utils/db"; +import { ZodValidator } from "@api/validation/zod.validation.decorator"; +import { EventParamsSchema } from "@api/dto/events.dto"; +import { OrgEventsService } from "@api/services/org-events.service"; +import { User } from "@api/db/schema"; +import type { RemoveUserDto } from "../services/dto/remove-user.dto"; @Controller() export class OrgEventsController { - constructor(private readonly orgEventsService: OrgEventsService) {} + constructor(private readonly orgEventsService: OrgEventsService) {} - @Get('/:orgId/events/:eventId/participants') - @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) - @UseGuards(AuthGuard('jwt'), RbacGuard) - @ZodValidator({ - params: EventParamsSchema, - }) - async getRegisterdParticipants( - @Param('orgId') orgId: string, - @Param('id') eventId: string, - ) { - return await this.orgEventsService.getEventParticipants({ - orgId, - eventId, - }); - } + @Get("/:orgId/events/:eventId/participants") + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) + @UseGuards(AuthGuard("jwt"), RbacGuard) + @ZodValidator({ + params: EventParamsSchema, + }) + async getRegisterdParticipants( + @Param("orgId") orgId: string, + @Param("id") eventId: string + ) { + return await this.orgEventsService.getEventParticipants({ + orgId, + eventId, + }); + } - @Delete('/participants/delete') - @Roles('ADMIN', 'EDITOR') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async removePartcipent(@Body() data: RemoveUserDto) { - return await this.events.removeParticipant(data.eventId, data.userId); - } + @Delete("/participants/delete") + @Roles(Role.ADMIN, Role.EDITOR) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async removePartcipent(@Body() data: RemoveUserDto) { + return await this.events.removeParticipant(data.eventId, data.userId); + } - @Get('/status/:id') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getUserEventStatus( - @Param('id') slugId: string, - @AuthUser() user: User, - ) { - return await this.events.getEventRegistartionStatus(slugId, user.uid); - } + @Get("/status/:id") + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getUserEventStatus( + @Param("id") slugId: string, + @AuthUser() user: User + ) { + return await this.events.getEventRegistartionStatus(slugId, user.id); + } - @Get('/stats/:id') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getEventStats(@Param('id') id: string) { - return await this.events.getEventStats(id); - } + @Get("/stats/:id") + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getEventStats(@Param("id") id: string) { + return await this.events.getEventStats(id); + } } diff --git a/apps/api/src/controllers/org-invite.controller.ts b/apps/api/src/controllers/org-invite.controller.ts index d53ddcb5..924fcb3b 100644 --- a/apps/api/src/controllers/org-invite.controller.ts +++ b/apps/api/src/controllers/org-invite.controller.ts @@ -1,31 +1,32 @@ -import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common'; -import { RbacGuard } from '../services/guards/rbac-member.guard'; -import { Roles } from '../services/decorator/roles.decorator'; -import { OrganizationInviteService } from '../services/org-invite.service'; -import { AuthUser } from '../services/auth/decorators/user.decorator'; -import type { OrgInvie } from '../services/dto/user-invite.dto'; -import { AuthGuard } from '@nestjs/passport'; -import type { User } from '@prisma/client'; +import { Body, Controller, Get, Post, Query, UseGuards } from "@nestjs/common"; +import { RbacGuard } from "../services/guards/rbac-member.guard"; +import { Roles } from "../services/decorator/roles.decorator"; +import { OrganizationInviteService } from "../services/org-invite.service"; +import { AuthUser } from "../services/auth/decorators/user.decorator"; +import { AuthGuard } from "@nestjs/passport"; +import { Role } from "@api/utils/db"; +import type { User } from "@prisma/client"; +import type { OrgInvie } from "../services/dto/user-invite.dto"; -@Controller('org/invite') +@Controller("org/invite") export class OrgInviteController { - constructor(private readonly service: OrganizationInviteService) {} + constructor(private readonly service: OrganizationInviteService) {} - @Post('/') - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async sendInvite(@AuthUser() user: User, @Body() data: OrgInvie) { - return this.service.inviteToOrg( - data.email, - user.uid, - data.organizationId, - data.role, - ); - } + @Post("/") + @Roles(Role.ADMIN) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async sendInvite(@AuthUser() user: User, @Body() data: OrgInvie) { + return this.service.inviteToOrg( + data.email, + user.uid, + data.organizationId, + data.role + ); + } - @Get('/verify') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async verfyEmail(@AuthUser() user: User, @Query() { id }) { - return this.service.verifyEmailInvite(id, user.uid, user.email); - } + @Get("/verify") + @UseGuards(AuthGuard("jwt"), RbacGuard) + async verfyEmail(@AuthUser() user: User, @Query() { id }) { + return this.service.verifyEmailInvite(id, user.uid, user.email); + } } diff --git a/apps/api/src/controllers/org-member.controller.ts b/apps/api/src/controllers/org-member.controller.ts index 305afc2a..948e075d 100644 --- a/apps/api/src/controllers/org-member.controller.ts +++ b/apps/api/src/controllers/org-member.controller.ts @@ -1,53 +1,52 @@ -import { Body, Controller, Get, Param, Patch, UseGuards } from '@nestjs/common'; -import { OrganizationMemberService } from '../services/org-member.service'; -import { AuthGuard } from '@nestjs/passport'; -import { RbacGuard } from '../services/guards/rbac-member.guard'; -import { Roles } from '../services/decorator/roles.decorator'; -import type { RemoveMember } from '../services/dto/member-remove.dto'; -import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; -import type { UpdateMemberRole } from '../services/dto/update-role.dto'; -import type { Role } from '@prisma/client'; +import { Body, Controller, Get, Param, Patch, UseGuards } from "@nestjs/common"; +import { OrganizationMemberService } from "../services/org-member.service"; +import { AuthGuard } from "@nestjs/passport"; +import { RbacGuard } from "../services/guards/rbac-member.guard"; +import { Roles } from "../services/decorator/roles.decorator"; +import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; +import { Role } from "@api/utils/db"; +import type { UpdateMemberRole } from "../services/dto/update-role.dto"; +import type { RemoveMember } from "../services/dto/member-remove.dto"; -@Controller('org/member') +@Controller("org/member") export class OrgMemberController { - constructor(private readonly orgMemberService: OrganizationMemberService) {} + constructor(private readonly orgMemberService: OrganizationMemberService) {} - @Get('/:orgID') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @ApiTags('org-members') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getMembers(@Param('orgID') orgID: string) { - return await this.orgMemberService.getMembers(orgID); - } + @Get("/:orgID") + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) + @ApiTags("org-members") + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getMembers(@Param("orgID") orgID: string) { + return await this.orgMemberService.getMembers(orgID); + } - @Patch('/remove') - @ApiTags('org-members') - @ApiOperation({ summary: 'Remove members from organization' }) - @ApiResponse({ - status: 200, - description: 'User will be removed successfully', - }) - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async removeUser(@Body() data: RemoveMember) { - return await this.orgMemberService.removeMember( - data.organizationId, - data.memberId, - ); - } + @Patch("/remove") + @ApiTags("org-members") + @ApiOperation({ summary: "Remove members from organization" }) + @ApiResponse({ + status: 200, + description: "User will be removed successfully", + }) + @Roles(Role.ADMIN) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async removeUser(@Body() data: RemoveMember) { + return await this.orgMemberService.removeMember( + data.organizationId, + data.memberId + ); + } - @Patch('/role') - @ApiTags('org-members') - @ApiOperation({ summary: 'Update member role in org' }) - @ApiResponse({ status: 200, description: 'User role will be updated' }) - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async updateUserRole(@Body() data: UpdateMemberRole) { - return await this.orgMemberService.updateRole( - data.organizationId, - data.memberId, - data.role as Role, - ); - // swagger was throwing circular error so i had to define type as this way - } + @Patch("/role") + @ApiTags("org-members") + @ApiOperation({ summary: "Update member role in org" }) + @ApiResponse({ status: 200, description: "User role will be updated" }) + @Roles(Role.ADMIN) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async updateUserRole(@Body() data: UpdateMemberRole) { + return await this.orgMemberService.updateRole( + data.organizationId, + data.memberId, + data.role as Role + ); + } } diff --git a/apps/api/src/controllers/organization.controller.ts b/apps/api/src/controllers/organization.controller.ts index 5eaf5e1e..eb512122 100644 --- a/apps/api/src/controllers/organization.controller.ts +++ b/apps/api/src/controllers/organization.controller.ts @@ -1,85 +1,86 @@ import { - Body, - Controller, - Get, - Param, - Patch, - Post, - UseGuards, - Delete, -} from '@nestjs/common'; -import { OrganizationService } from '../services/organization.service'; -import { AuthGuard } from '@nestjs/passport'; -import type { CreateOrgDto } from '../services/dto/create-org.dto'; -import type { DeleteOrgDto } from '../services/dto/delete-org.dto'; -import { Roles } from '../services/decorator/roles.decorator'; -import { RbacGuard } from '../services/guards/rbac-member.guard'; -import type { UpdateOrgDto } from '../services/dto/update-org.dto'; -import { AuthUser } from '../services/auth/decorators/user.decorator'; -import type { User, Role } from '@prisma/client'; -import type { LeaveOrg } from '../services/dto/leave-org.dto'; -import { UserRole } from '../services/auth/decorators/role.decorator'; + Body, + Controller, + Get, + Param, + Patch, + Post, + UseGuards, + Delete, +} from "@nestjs/common"; +import { OrganizationService } from "../services/organization.service"; +import { AuthGuard } from "@nestjs/passport"; +import { Roles } from "../services/decorator/roles.decorator"; +import { RbacGuard } from "../services/guards/rbac-member.guard"; +import { AuthUser } from "../services/auth/decorators/user.decorator"; +import { UserRole } from "../services/auth/decorators/role.decorator"; +import { Role } from "@api/utils/db"; +import type { LeaveOrg } from "../services/dto/leave-org.dto"; +import type { CreateOrgDto } from "../services/dto/create-org.dto"; +import type { DeleteOrgDto } from "../services/dto/delete-org.dto"; +import type { UpdateOrgDto } from "../services/dto/update-org.dto"; +import type { User } from "@api/db/schema"; -@Controller('org') +@Controller("org") export class OrganizationController { - constructor(private readonly organizationService: OrganizationService) {} + constructor(private readonly organizationService: OrganizationService) {} - @Post('/') - @UseGuards(AuthGuard('jwt')) - async createOrganization( - @Body() createOrgDto: CreateOrgDto, - @AuthUser() user: User, - ) { - return this.organizationService.create(createOrgDto, user.uid); - } + @Post("/") + @UseGuards(AuthGuard("jwt")) + async createOrganization( + @Body() createOrgDto: CreateOrgDto, + @AuthUser() user: User + ) { + return this.organizationService.create(createOrgDto, user.id); + } - @Get('/find/:slug') - async findOrgBySlug(@Param('slug') slug: string) { - return this.organizationService.findOrgBySlug(slug); - } + @Get("/find/:slug") + async findOrgBySlug(@Param("slug") slug: string) { + return this.organizationService.findOrgBySlug(slug); + } - @Get('/:orgID') - @UseGuards(AuthGuard('jwt')) - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getOrgInfo(@Param('orgID') info) { - return await this.organizationService.getOrgById(info); - } + @Get("/:orgID") + @UseGuards(AuthGuard("jwt")) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getOrgInfo(@Param("orgID") info) { + return await this.organizationService.getOrgById(info); + } - @Get('/events/public/:slug') - async getOrgEvents(@Param('slug') slug) { - return await this.organizationService.getEventsByorg(slug); - } + @Get("/events/public/:slug") + async getOrgEvents(@Param("slug") slug) { + return await this.organizationService.getEventsByorg(slug); + } - @Get('/events/:orgID') - @Roles('ADMIN', 'EDITOR', 'VIEWER') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async getAllEvents(@Param('orgID') orgID: string, @UserRole() role: Role) { - return this.organizationService.getAllEvents(orgID, role); - } + @Get("/events/:orgID") + @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async getAllEvents(@Param("orgID") orgID: string, @UserRole() role: Role) { + return this.organizationService.getAllEvents(orgID, role); + } - @Patch('/') - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async updateOrganization(@Body() updateOrgDto: UpdateOrgDto) { - return this.organizationService.update(updateOrgDto); - } + @Patch("/") + @Roles(Role.ADMIN) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async updateOrganization(@Body() updateOrgDto: UpdateOrgDto) { + return this.organizationService.update(updateOrgDto); + } - @Delete('/delete') - @Roles('ADMIN') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async deleteOrganization(@Body() data: DeleteOrgDto) { - return this.organizationService.deleteOrg(data.organizationId); - } + @Delete("/delete") + @Roles(Role.ADMIN) + @UseGuards(AuthGuard("jwt"), RbacGuard) + async deleteOrganization(@Body() data: DeleteOrgDto) { + return this.organizationService.deleteOrg(data.organizationId); + } - @Delete('/leave') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async leaveOrg(@AuthUser() user: User, @Body() body: LeaveOrg) { - return this.organizationService.leaveOrg(body.organizationId, user.uid); - } + @Delete("/leave") + @UseGuards(AuthGuard("jwt"), RbacGuard) + async leaveOrg(@AuthUser() user: User, @Body() body: LeaveOrg) { + return this.organizationService.leaveOrg(body.organizationId, user.id); + } - @Patch('/update') - @UseGuards(AuthGuard('jwt'), RbacGuard) - async UpdateOrg(@Body() data: UpdateOrgDto) { - return await this.organizationService.UpdateOrg(data.organizationId, data); - } + @Patch("/update") + @UseGuards(AuthGuard("jwt"), RbacGuard) + async UpdateOrg(@Body() data: UpdateOrgDto) { + return await this.organizationService.UpdateOrg(data.organizationId, data); + } } diff --git a/apps/api/src/db/schema/event-ticket.ts b/apps/api/src/db/schema/event-ticket.ts index 3b3d0dd3..afde4ff8 100644 --- a/apps/api/src/db/schema/event-ticket.ts +++ b/apps/api/src/db/schema/event-ticket.ts @@ -1,37 +1,37 @@ -import type { SystemFields } from '../../utils/db'; -import { z } from 'zod'; +import type { SystemFields } from "../../utils/db"; +import { z } from "zod"; export const EventTicketSchema = z.object({ - id: z.string().length(25), + id: z.string().length(25), - fk_event_id: z.string().length(25), + fk_event_id: z.string().length(25), - name: z.string().min(3).max(255), + name: z.string().min(3).max(255), - description: z.string(), + description: z.string(), - price: z.number().min(0), + price: z.number().min(0), - quantity: z.number().min(0), + quantity: z.number().min(0), - stripe_price_object: z.record(z.unknown()).optional(), + stripe_price_object: z.record(z.unknown()).optional(), - stripe_product_object: z.record(z.unknown()).optional(), + stripe_product_object: z.record(z.unknown()).optional(), - is_active: z.boolean().default(false), + is_active: z.boolean().default(false), - is_deleted: z.boolean().default(false), + is_deleted: z.boolean().default(false), - created_at: z.date(), + created_at: z.date(), - updated_at: z.date(), + updated_at: z.date(), }); export type EventTicket = z.infer; export type EventTicketCreateSchema = Omit< - z.input, - SystemFields + z.input, + SystemFields >; export type EventTicketUpdateSchema = Partial; diff --git a/apps/api/src/db/schema/form-fields.ts b/apps/api/src/db/schema/form-fields.ts index ddcd0128..c4216d30 100644 --- a/apps/api/src/db/schema/form-fields.ts +++ b/apps/api/src/db/schema/form-fields.ts @@ -1,35 +1,33 @@ -import type { SystemFields, FormInput } from '../../utils/db'; -import { z } from 'zod'; +import { SystemFields, FormInput } from "../../utils/db"; +import { z } from "zod"; export const FormFieldSchema = z.object({ - id: z.string().length(25), + id: z.string().length(25), - fk_form_id: z.string().length(25), + fk_form_id: z.string().length(25), - name: z.string().min(3).max(255), + name: z.string().min(3).max(255), - placeholder: z.string().optional(), + placeholder: z.string().optional(), - description: z.string().optional(), + description: z.string().optional(), - required: z.boolean().default(false), + required: z.boolean().default(false), - type: z.custom((val) => { - return val; - }), + type: z.enum(FormInput), - is_deleted: z.boolean().default(false), + is_deleted: z.boolean().default(false), - created_at: z.date(), + created_at: z.date(), - updated_at: z.date(), + updated_at: z.date(), }); export type FormField = z.infer; export type FormFieldCreateSchema = Omit< - z.input, - SystemFields + z.input, + SystemFields >; export type FormFieldUpdateSchema = Partial; diff --git a/apps/api/src/dto/form-field.dto.ts b/apps/api/src/dto/form-field.dto.ts new file mode 100644 index 00000000..48a7dfec --- /dev/null +++ b/apps/api/src/dto/form-field.dto.ts @@ -0,0 +1,11 @@ +import { FormInput } from "@api/utils/db"; +import { z } from "zod"; + +export const CreateFormFieldSchema = z.object({ + label: z.string(), + placeholder: z.string().optional(), + require: z.boolean(), + type: z.enum(FormInput), +}); + +export type CreateFormFieldDto = z.infer; diff --git a/apps/api/src/dto/update-task.dto.ts b/apps/api/src/dto/update-task.dto.ts new file mode 100644 index 00000000..fb356bfa --- /dev/null +++ b/apps/api/src/dto/update-task.dto.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +export const UpdateTaskBoard = z.object({ + kanbanId: z.string(), +}); + +export type IUpdateTaskBoard = z.infer; diff --git a/apps/api/src/services/dto/create-form.dto.ts b/apps/api/src/services/dto/create-form.dto.ts deleted file mode 100644 index 250e93e5..00000000 --- a/apps/api/src/services/dto/create-form.dto.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import type { FieldType } from '@prisma/client'; -import { IsNotEmpty, IsString } from 'class-validator'; - -export class FormPayLoad { - @ApiProperty() - @IsString() - @IsNotEmpty() - organizationId: string; - - @ApiProperty() - @IsString() - @IsNotEmpty() - eventId: string; - - data: Payload; -} - -class Payload { - label: string; - placeholder?: string; - options?: Array; - required: boolean; - type: FieldType; -} diff --git a/apps/api/src/services/dto/update-role.dto.ts b/apps/api/src/services/dto/update-role.dto.ts index 2e9a84ed..a20232ef 100644 --- a/apps/api/src/services/dto/update-role.dto.ts +++ b/apps/api/src/services/dto/update-role.dto.ts @@ -1,19 +1,19 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; +import { ApiProperty } from "@nestjs/swagger"; +import { IsNotEmpty, IsString } from "class-validator"; export class UpdateMemberRole { - @ApiProperty() - @IsNotEmpty() - @IsString() - organizationId: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + organizationId: string; - @ApiProperty() - @IsNotEmpty() - @IsString() - memberId: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + memberId: string; - @ApiProperty() - @IsNotEmpty() - @IsString() - role: string; + @ApiProperty() + @IsNotEmpty() + @IsString() + role: string; } diff --git a/apps/api/src/services/events.service.ts b/apps/api/src/services/events.service.ts index c3a6045a..bb0c6463 100644 --- a/apps/api/src/services/events.service.ts +++ b/apps/api/src/services/events.service.ts @@ -1,147 +1,147 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable } from "@nestjs/common"; import { - CreateEventDto, - EventParams, - UpdateEventDto, -} from '@api/dto/events.dto'; -import { EventEmitter2 } from '@nestjs/event-emitter'; -import { CommentModel, EventModel, FormModel, KanbanModal } from '@api/models'; -import { User } from '@api/db/schema'; -import { stripUndefinedOrNull, exclude } from '@api/utils'; -import { FFError } from '@api/utils/error'; + CreateEventDto, + EventParams, + UpdateEventDto, +} from "@api/dto/events.dto"; +import { EventEmitter2 } from "@nestjs/event-emitter"; +import { CommentModel, EventModel, FormModel, KanbanModal } from "@api/models"; +import { User } from "@api/db/schema"; +import { stripUndefinedOrNull, exclude } from "@api/utils"; +import { FFError } from "@api/utils/error"; @Injectable() export class EventsService { - constructor(private readonly eventEmitter: EventEmitter2) {} - - public async getEventById(id: string) { - return await EventModel.findById(id); - } - - async createEvent({ - newEvent, - user, - orgId, - }: { - newEvent: CreateEventDto; - user: User; - orgId: string; - }) { - const isEventWithSlugExist = await EventModel.find({ - slug: newEvent.name, - }); - - let slug: string; - - if (isEventWithSlugExist) { - const totalEventCount = await EventModel.count({ - slug: newEvent.name, - }); - slug = `${newEvent.name}-${totalEventCount}`; - } else { - slug = newEvent.name; - } - - const event = await EventModel.insert({ - fk_organization_id: orgId, - name: newEvent.name, - website: newEvent.website, - location: newEvent.location, - slug, - event_date: newEvent.event_date, - description: newEvent.description ?? '', - }); - - // Creating an Event will create a default Form - await FormModel.insert({ - fk_event_id: event.id, - title: 'Default Form', - description: 'Default Form Description', - confirmation_message: 'This message is shown after form submission', - misc: {}, - is_default_form: true, - }); - - // Creating an Event will create a Kanban board - await KanbanModal.insertMany([ - { - fk_event_id: event.id, - title: 'ToDo', - }, - { - fk_event_id: event.id, - title: 'In Progress', - }, - { - fk_event_id: event.id, - title: 'Done', - }, - ]); - - this.eventEmitter.emit('event.created', event, user.id); - } - - async updateEvent({ - updateData, - user: _user, - orgId, - eventId, - }: { - updateData: UpdateEventDto; - user: User; - orgId: string; - eventId: string; - }) { - const updateObj = stripUndefinedOrNull(updateData); - - const updateEvent = EventModel.update( - { - id: eventId, - fk_organization_id: orgId, - }, - updateObj, - ); - - this.eventEmitter.emit('event.updated', updateEvent); - - return updateEvent; - } - - async getAllEvents(query = '') { - const events = await EventModel.find({ - name: query, - }); - - return events; - } - - async deleteEvent({ eventId, orgId }: EventParams) { - const event = await EventModel.findOne({ - id: eventId, - fk_organization_id: orgId, - }); - - if (!event) { - FFError.badRequest('There is no event with this id'); - } - - if (event?.is_published) { - FFError.badRequest('Cannot delete published event'); - } - - await KanbanModal.delete({ - fk_event_id: eventId, - }); - - await CommentModel.delete({ - fk_event_id: eventId, - }); - - // TODO: @DarkPhoenix2704 Delete all associated data also - - return await EventModel.delete({ - id: eventId, - fk_organization_id: orgId, - }); - } + constructor(private readonly eventEmitter: EventEmitter2) {} + + public async getEventById(id: string) { + return await EventModel.findById(id); + } + + async createEvent({ + newEvent, + user, + orgId, + }: { + newEvent: CreateEventDto; + user: User; + orgId: string; + }) { + const isEventWithSlugExist = await EventModel.find({ + slug: newEvent.name, + }); + + let slug: string; + + if (isEventWithSlugExist) { + const totalEventCount = await EventModel.count({ + slug: newEvent.name, + }); + slug = `${newEvent.name}-${totalEventCount}`; + } else { + slug = newEvent.name; + } + + const event = await EventModel.insert({ + fk_organization_id: orgId, + name: newEvent.name, + website: newEvent.website, + location: newEvent.location, + slug, + event_date: newEvent.event_date, + description: newEvent.description ?? "", + }); + + // Creating an Event will create a default Form + await FormModel.insert({ + fk_event_id: event.id, + title: "Default Form", + description: "Default Form Description", + confirmation_message: "This message is shown after form submission", + misc: {}, + is_default_form: true, + }); + + // Creating an Event will create a Kanban board + await KanbanModal.insertMany([ + { + fk_event_id: event.id, + title: "ToDo", + }, + { + fk_event_id: event.id, + title: "In Progress", + }, + { + fk_event_id: event.id, + title: "Done", + }, + ]); + + this.eventEmitter.emit("event.created", event, user.id); + } + + async updateEvent({ + updateData, + user: _user, + orgId, + eventId, + }: { + updateData: UpdateEventDto; + user: User; + orgId: string; + eventId: string; + }) { + const updateObj = stripUndefinedOrNull(updateData); + + const updateEvent = EventModel.update( + { + id: eventId, + fk_organization_id: orgId, + }, + updateObj + ); + + this.eventEmitter.emit("event.updated", updateEvent); + + return updateEvent; + } + + async getAllEvents(query = "") { + const events = await EventModel.find({ + name: query, + }); + + return events; + } + + async deleteEvent({ eventId, orgId }: EventParams) { + const event = await EventModel.findOne({ + id: eventId, + fk_organization_id: orgId, + }); + + if (!event) { + FFError.badRequest("There is no event with this id"); + } + + if (event?.is_published) { + FFError.badRequest("Cannot delete published event"); + } + + await KanbanModal.delete({ + fk_event_id: eventId, + }); + + await CommentModel.delete({ + fk_event_id: eventId, + }); + + // TODO: @DarkPhoenix2704 Delete all associated data also + + return await EventModel.delete({ + id: eventId, + fk_organization_id: orgId, + }); + } } diff --git a/apps/api/src/services/form.service.ts b/apps/api/src/services/form.service.ts index 51bfe494..b07c308d 100644 --- a/apps/api/src/services/form.service.ts +++ b/apps/api/src/services/form.service.ts @@ -1,208 +1,217 @@ import { - Injectable, - InternalServerErrorException, - NotFoundException, -} from '@nestjs/common'; -import { PrismaService } from './prisma.service'; -import { AiService } from './ai.service'; -import { EventsService } from './events.service'; -import type { FormPayLoad } from './dto/create-form.dto'; + Injectable, + InternalServerErrorException, + NotFoundException, +} from "@nestjs/common"; +import { PrismaService } from "./prisma.service"; +import { AiService } from "./ai.service"; +import { EventsService } from "./events.service"; +import { EventModel, FormFieldsModel, FormModel } from "@api/models"; +import { CreateFormFieldDto } from "@api/dto/form-field.dto"; @Injectable() export class FormService { - constructor( - private readonly prismaService: PrismaService, - private readonly AiService: AiService, - private readonly EventService: EventsService, - ) {} - - async createForm(data: FormPayLoad) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - organizationId: data.organizationId, - id: data.eventId, - }, - }); - - if (!event) { - throw new NotFoundException(); - } - - const formSchema = await this.prismaService.field.create({ - data: { - label: data.data.label, - placeholder: data.data.placeholder, - required: data.data.required, - type: data.data.type, - options: data.data.options, - Events: { - connect: { - id: data.eventId, - }, - }, - }, - }); - - return { - ok: true, - message: 'schema updated successfully', - data: formSchema, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - async toggleFormPublishStatus(eventSlug: string, shouldPublish: boolean) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - select: { - form: true, - }, - }); - if (!event) { - throw new NotFoundException(); - } - - if (!event.form.length) { - throw new InternalServerErrorException(); - } - - const newEventStatus = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - isFormPublished: shouldPublish, - }, - }); - - return { - ok: 'true', - message: 'form status was changed', - data: newEventStatus, - }; - } catch (e) { - if (e instanceof InternalServerErrorException) { - throw new InternalServerErrorException({ - message: 'Please create a form schema to publish the form', - }); - } - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } - - return e; - } - } - - async getEventFormScheme(eventSlug: string) { - try { - const eventSchema = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - select: { - form: true, - }, - }); - - if (!eventSchema) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event schema found', - data: eventSchema.form, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - public async addUserFormSubmission( - info: Record>, - eventId: string, - userId: string, - ) { - const event = await this.EventService.getEventById(eventId); - if (!event) return new NotFoundException(); - - await this.prismaService.response.create({ - data: { - data: info, - user: { - connect: { - uid: userId, - }, - }, - Events: { - connect: { - id: event.id, - }, - }, - }, - }); - } - - async getRegisteredParticipantsFormSubmissions(id: string, userId: string) { - try { - const schema = await this.prismaService.events.findUnique({ - where: { - slug: id, - }, - select: { - form: true, - id: true, - }, - }); - - const label = {}; - schema.form.forEach((el) => { - label[el.id] = el.label; - }); - - const data = await this.prismaService.response.findMany({ - where: { - userUid: userId, - eventsId: schema.id, - }, - }); - if (!data) return new NotFoundException(); - - const result = {}; - - schema.form.forEach((el) => { - // @ts-ignore - if (data[0] && el.id in data[0].data) { - result[el.label] = data[0].data[el.id]; - } - }); - - return { - ok: true, - data: result, - message: 'received form successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } + constructor( + private readonly prismaService: PrismaService, + private readonly AiService: AiService, + private readonly EventService: EventsService + ) {} + + async createForm(data: CreateFormFieldDto, formId: string) { + try { + const event = await EventModel.findOne({ + fk_organization_id: data.organizationId, + id: data.eventId, + }); + + if (!event) { + throw new NotFoundException(); + } + + const formInfo = await FormModel.findOne({ + fk_event_id: event.id, + id: formId, + }); + + await FormFieldsModel.insert({ + name: data.data.label, + placeholder: data.data.placeholder, + }); + + const formSchema = await this.prismaService.field.create({ + data: { + label: data.data.label, + placeholder: data.data.placeholder, + required: data.data.required, + type: data.data.type, + options: data.data.options, + Events: { + connect: { + id: data.eventId, + }, + }, + }, + }); + + return { + ok: true, + message: "schema updated successfully", + data: formSchema, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } + + async toggleFormPublishStatus(eventSlug: string, shouldPublish: boolean) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + select: { + form: true, + }, + }); + if (!event) { + throw new NotFoundException(); + } + + if (!event.form.length) { + throw new InternalServerErrorException(); + } + + const newEventStatus = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + isFormPublished: shouldPublish, + }, + }); + + return { + ok: "true", + message: "form status was changed", + data: newEventStatus, + }; + } catch (e) { + if (e instanceof InternalServerErrorException) { + throw new InternalServerErrorException({ + message: "Please create a form schema to publish the form", + }); + } + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + + return e; + } + } + + async getEventFormScheme(eventSlug: string) { + try { + const eventSchema = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + select: { + form: true, + }, + }); + + if (!eventSchema) { + throw new NotFoundException(); + } + + return { + ok: true, + message: "Event schema found", + data: eventSchema.form, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } + + public async addUserFormSubmission( + info: Record>, + eventId: string, + userId: string + ) { + const event = await this.EventService.getEventById(eventId); + if (!event) return new NotFoundException(); + + await this.prismaService.response.create({ + data: { + data: info, + user: { + connect: { + uid: userId, + }, + }, + Events: { + connect: { + id: event.id, + }, + }, + }, + }); + } + + async getRegisteredParticipantsFormSubmissions(id: string, userId: string) { + try { + const schema = await this.prismaService.events.findUnique({ + where: { + slug: id, + }, + select: { + form: true, + id: true, + }, + }); + + const label = {}; + schema.form.forEach((el) => { + label[el.id] = el.label; + }); + + const data = await this.prismaService.response.findMany({ + where: { + userUid: userId, + eventsId: schema.id, + }, + }); + if (!data) return new NotFoundException(); + + const result = {}; + + schema.form.forEach((el) => { + // @ts-ignore + if (data[0] && el.id in data[0].data) { + result[el.label] = data[0].data[el.id]; + } + }); + + return { + ok: true, + data: result, + message: "received form successfully", + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } else { + throw e; + } + } + } } diff --git a/apps/api/src/services/inti.service.ts b/apps/api/src/services/inti.service.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/api/src/services/kanban.service.ts b/apps/api/src/services/kanban.service.ts index 7646a769..b8c8876c 100644 --- a/apps/api/src/services/kanban.service.ts +++ b/apps/api/src/services/kanban.service.ts @@ -1,149 +1,229 @@ import { - Injectable, - InternalServerErrorException, - NotFoundException, -} from '@nestjs/common'; -import { type Prisma } from '@prisma/client'; -import { PrismaService } from './prisma.service'; -import type { CreateTask } from './dto/create-task.dto'; + Injectable, + InternalServerErrorException, + NotFoundException, +} from "@nestjs/common"; +import { type Prisma } from "@prisma/client"; +import { PrismaService } from "./prisma.service"; +import type { CreateTask } from "./dto/create-task.dto"; +import { KanbanCardModal, KanbanModal } from "@api/models"; +import BaseContext from "@api/BaseContext"; +import { SystemTable } from "@api/utils/db"; +import type { Event } from "@api/db/schema"; @Injectable() export class KanbanService { - constructor(private prismaService: PrismaService) {} - - async getAllBoards(slug: string) { - try { - const allBoards = await this.prismaService.events.findUnique({ - where: { - slug, - }, - select: { - kanban: { - include: { - tasks: { - include: { - createdBy: { - select: { - email: true, - displayName: true, - photoURL: true, - }, - }, - Comment: true, - }, - }, - createdBy: { - select: { - email: true, - displayName: true, - photoURL: true, - }, - }, - _count: true, - }, - orderBy: { - createdAt: 'asc', - }, - }, - }, - }); - - if (!allBoards) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Boards found', - data: allBoards.kanban, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } - - throw new InternalServerErrorException({ - error: e, - }); - } - } - - async createTask( - payload: CreateTask, - slug: string, - kanbanId: string, - user: string, - ) { - try { - const newKanban = await this.prismaService.events.update({ - where: { - slug, - }, - data: { - kanban: { - update: { - where: { - id: kanbanId, - }, - data: { - tasks: { - create: { - title: payload.title, - userUid: user, - }, - }, - }, - }, - }, - }, - }); - if (!newKanban) throw new InternalServerErrorException(); - - const newTask = await this.prismaService.task.findFirst({ - where: { - userUid: user, - kanbanId: kanbanId, - title: payload.title, - }, - }); - - await this.addComment(newTask.id, payload.data, user); - - return { - ok: true, - message: 'task was added successfully', - }; - } catch { - throw new InternalServerErrorException(); - } - } - - async addComment(taskId: string, comment: Prisma.JsonValue, userId: string) { - try { - const newComment = await this.prismaService.task.update({ - where: { - id: taskId, - }, - data: { - Comment: { - create: { - data: comment, - userUid: userId, - }, - }, - }, - }); - - if (!newComment) throw new InternalServerErrorException(); - - return { - ok: true, - message: 'comment was added', - }; - } catch (e) { - throw new InternalServerErrorException({ - error: e, - }); - } - } + constructor(private prismaService: PrismaService) {} + + async getAllBoards(slug: string) { + try { + const allBoards = await BaseContext.knex(SystemTable.Events) + .select( + "kanban.id as id", + "kanban.created_at as created_at", + BaseContext.knex.raw("COUNT(tasks.id) as _count"), + BaseContext.knex.raw(` + json_agg(json_build_object( + 'id', tasks.id, + 'title', tasks.title, + 'createdBy', json_build_object( + 'id', task_creator.id, + 'displayName', task_creator.display_name, + 'photoURL', task_creator.photo_url + ), + 'Comment', ( + SELECT json_agg(json_build_object( + 'id', comments.id, + 'fk_user_id', comments.fk_user_id, + 'fk_event_id', comments.fk_event_id, + 'fk_kanban_card_id', comments.fk_kanban_card_id, + 'fk_kanban_id', comments.fk_kanban_id, + 'comment', comments.comment, + 'is_deleted', comments.is_deleted, + 'created_at', comments.created_at, + 'updated_at', comments.updated_at, + 'owner', json_build_object( + 'id', comment_owner.uid, + 'displayName', comment_owner.display_name, + 'email', comment_owner.email, + 'slug', comment_owner.slug, + 'photoURL', comment_owner.photo_url + ) + )) + FROM comments + JOIN users as comment_owner ON comment_owner.id = comments.fk_user_id + WHERE comments.fk_kanban_card_id = tasks.id + ) + )) AS tasks + `) + ) + .join("kanban", "kanban.fk_event_id", "events.id") + .leftJoin( + "users as kanban_creator", + "kanban_creator.id", + "kanban.fk_user_id" + ) + .leftJoin("kanban_card as tasks", "tasks.fk_kanban_id", "kanban.id") + .leftJoin( + "users as task_creator", + "task_creator.id", + "tasks.fk_user_id" + ) + .where("events.slug", slug) + .groupBy( + "kanban.id", + "kanban.created_at", + "kanban_creator.uid", + "kanban_creator.display_name", + "kanban_creator.email", + "kanban_creator.slug", + "kanban_creator.photo_url" + ) + .orderBy("kanban.created_at", "asc"); + + if (!allBoards) { + throw new NotFoundException(); + } + + return { + ok: true, + message: "Boards found", + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + + throw new InternalServerErrorException({ + error: e, + }); + } + } + + async createTask( + payload: CreateTask, + slug: string, + kanbanId: string, + user: string + ) { + try { + const newKanban = await this.prismaService.events.update({ + where: { + slug, + }, + data: { + kanban: { + update: { + where: { + id: kanbanId, + }, + data: { + tasks: { + create: { + title: payload.title, + userUid: user, + }, + }, + }, + }, + }, + }, + }); + if (!newKanban) throw new InternalServerErrorException(); + + const newTask = await this.prismaService.task.findFirst({ + where: { + userUid: user, + kanbanId: kanbanId, + title: payload.title, + }, + }); + + await this.addComment(newTask.id, payload.data, user); + + return { + ok: true, + message: "task was added successfully", + }; + } catch { + throw new InternalServerErrorException(); + } + } + + async addComment(taskId: string, comment: Prisma.JsonValue, userId: string) { + try { + const newComment = await this.prismaService.task.update({ + where: { + id: taskId, + }, + data: { + Comment: { + create: { + data: comment, + userUid: userId, + }, + }, + }, + }); + + if (!newComment) throw new InternalServerErrorException(); + + return { + ok: true, + message: "comment was added", + }; + } catch (e) { + throw new InternalServerErrorException({ + error: e, + }); + } + } + + async deleteBoard(boardId: string, slug: string) { + try { + await this.prismaService.events.update({ + where: { + slug, + }, + data: { + kanban: { + delete: { + id: boardId, + }, + }, + }, + }); + + return { + ok: true, + message: "kanban deleted successfully", + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + + throw new InternalServerErrorException(); + } + } + + async updateTaskBoard(taskId: string, boardId: string) { + try { + await KanbanCardModal.update( + { + id: taskId, + }, + { + fk_kanban_id: boardId, + } + ); + + return { + ok: true, + message: "Task moved successfully", + }; + } catch { + throw new InternalServerErrorException(); + } + } } diff --git a/apps/api/src/services/org-member.service.ts b/apps/api/src/services/org-member.service.ts index 44d7dd47..58f765ed 100644 --- a/apps/api/src/services/org-member.service.ts +++ b/apps/api/src/services/org-member.service.ts @@ -1,110 +1,110 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import type { Role } from '@prisma/client'; -import { ORG_MEMBER_NOT_FOUND, ROLE_UPDATE_FAILED } from '../error'; -import { PrismaService } from './prisma.service'; +import { Injectable, NotFoundException } from "@nestjs/common"; +import { ORG_MEMBER_NOT_FOUND, ROLE_UPDATE_FAILED } from "../error"; +import { PrismaService } from "./prisma.service"; +import { Role } from "@api/utils/db"; @Injectable() export class OrganizationMemberService { - constructor(private readonly prismaService: PrismaService) {} + constructor(private readonly prismaService: PrismaService) {} - async getMembers(organizationId: string) { - const members = await this.prismaService.organizationMember.findMany({ - where: { - organizationId, - }, - select: { - user: { - select: { - uid: true, - email: true, - displayName: true, - slug: true, - }, - }, - role: true, - }, - }); + async getMembers(organizationId: string) { + const members = await this.prismaService.organizationMember.findMany({ + where: { + organizationId, + }, + select: { + user: { + select: { + uid: true, + email: true, + displayName: true, + slug: true, + }, + }, + role: true, + }, + }); - return members; - } + return members; + } - async findMember(organizationId: string, userUid: string) { - const member = await this.prismaService.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid, - organizationId, - }, - }, - }); + async findMember(organizationId: string, userUid: string) { + const member = await this.prismaService.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid, + organizationId, + }, + }, + }); - if (member) return member; - return ORG_MEMBER_NOT_FOUND; - } + if (member) return member; + return ORG_MEMBER_NOT_FOUND; + } - async removeMember(organizationId: string, userUid: string) { - try { - const member = await this.prismaService.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid, - organizationId, - }, - }, - }); + async removeMember(organizationId: string, userUid: string) { + try { + const member = await this.prismaService.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid, + organizationId, + }, + }, + }); - if (!member) throw new NotFoundException(); + if (!member) throw new NotFoundException(); - await this.prismaService.organizationMember.delete({ - where: { - id: member.id, - }, - }); + await this.prismaService.organizationMember.delete({ + where: { + id: member.id, + }, + }); - return { - ok: true, - message: 'User removed successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ORG_MEMBER_NOT_FOUND, - }); - } else { - return e; - } - } - } + return { + ok: true, + message: "User removed successfully", + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ORG_MEMBER_NOT_FOUND, + }); + } else { + return e; + } + } + } - async updateRole(organizationId: string, userUid: string, role: Role) { - try { - const newRole = await this.prismaService.organizationMember.update({ - where: { - userUid_organizationId: { - userUid, - organizationId, - }, - }, - data: { - role, - }, - }); + async updateRole(organizationId: string, userUid: string, role: Role) { + try { + const newRole = await this.prismaService.organizationMember.update({ + where: { + userUid_organizationId: { + userUid, + organizationId, + }, + }, + data: { + role, + }, + }); - if (!newRole) throw new NotFoundException(); + if (!newRole) throw new NotFoundException(); - return { - ok: true, - message: 'role updated successfully', - data: newRole, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ROLE_UPDATE_FAILED, - }); - } else { - return e; - } - } - } + return { + ok: true, + message: "role updated successfully", + data: newRole, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ROLE_UPDATE_FAILED, + }); + } else { + return e; + } + } + } } diff --git a/apps/api/src/services/organization.service.ts b/apps/api/src/services/organization.service.ts index 839ea801..8c664291 100644 --- a/apps/api/src/services/organization.service.ts +++ b/apps/api/src/services/organization.service.ts @@ -1,111 +1,111 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from './prisma.service'; -import type { CreateOrgDto } from './dto/create-org.dto'; -import { ORG_EXISTS, ORG_NOT_FOUND } from '../error'; -import type { UpdateOrgDto } from './dto/update-org.dto'; -import type { Role } from '@prisma/client'; +import { Role } from "@api/utils/db"; +import { Injectable, NotFoundException } from "@nestjs/common"; +import { PrismaService } from "./prisma.service"; +import { ORG_EXISTS, ORG_NOT_FOUND } from "../error"; +import type { CreateOrgDto } from "./dto/create-org.dto"; +import type { UpdateOrgDto } from "./dto/update-org.dto"; @Injectable() export class OrganizationService { - constructor(private readonly prismaService: PrismaService) {} + constructor(private readonly prismaService: PrismaService) {} - async create(createOrgDto: CreateOrgDto, uid: string) { - try { - const { name, slug } = createOrgDto; + async create(createOrgDto: CreateOrgDto, uid: string) { + try { + const { name, slug } = createOrgDto; - const org = await this.prismaService.organization.create({ - data: { - name, - slug, - members: { - create: { - role: 'ADMIN', - userUid: uid, - }, - }, - }, - }); + const org = await this.prismaService.organization.create({ + data: { + name, + slug, + members: { + create: { + role: "ADMIN", + userUid: uid, + }, + }, + }, + }); - return org; - } catch (error) { - return ORG_EXISTS; - } - } + return org; + } catch (error) { + return ORG_EXISTS; + } + } - async findOrgBySlug(slug: string) { - const org = await this.prismaService.organization.findUnique({ - where: { - slug, - }, - }); + async findOrgBySlug(slug: string) { + const org = await this.prismaService.organization.findUnique({ + where: { + slug, + }, + }); - if (org) return org; - return ORG_NOT_FOUND; - } + if (org) return org; + return ORG_NOT_FOUND; + } - async update(updateOrgDto: UpdateOrgDto) { - const { organizationId, name } = updateOrgDto; + async update(updateOrgDto: UpdateOrgDto) { + const { organizationId, name } = updateOrgDto; - const org = await this.prismaService.organization.findUnique({ - where: { - id: organizationId, - }, - }); + const org = await this.prismaService.organization.findUnique({ + where: { + id: organizationId, + }, + }); - if (!org) return ORG_NOT_FOUND; + if (!org) return ORG_NOT_FOUND; - const updatedOrg = await this.prismaService.organization.update({ - where: { - id: organizationId, - }, - data: { - name, - }, - }); + const updatedOrg = await this.prismaService.organization.update({ + where: { + id: organizationId, + }, + data: { + name, + }, + }); - return updatedOrg; - } + return updatedOrg; + } - async findOrgsByUser(uid: string) { - const data = await this.prismaService.organizationMember.findMany({ - where: { - userUid: uid, - }, - select: { - organization: { - include: { - _count: { - select: { - members: true, - events: true, - }, - }, - }, - }, - role: true, - }, - }); + async findOrgsByUser(uid: string) { + const data = await this.prismaService.organizationMember.findMany({ + where: { + userUid: uid, + }, + select: { + organization: { + include: { + _count: { + select: { + members: true, + events: true, + }, + }, + }, + }, + role: true, + }, + }); - return { - ok: true, - message: 'orgs found successfully', - data, - }; - } + return { + ok: true, + message: "orgs found successfully", + data, + }; + } - async deleteOrg(id: string) { - await this.prismaService.organization.delete({ - where: { - id, - }, - }); - return { - ok: true, - message: 'org was deleted successfully', - }; - } + async deleteOrg(id: string) { + await this.prismaService.organization.delete({ + where: { + id, + }, + }); + return { + ok: true, + message: "org was deleted successfully", + }; + } - /* + /* * if there is only one admin and he is the one leaving the org we should tranfer the org to the first person who joined the org @@ -116,147 +116,147 @@ export class OrganizationService { */ - async leaveOrg(orgId: string, userId: string) { - try { - await this.prismaService.organizationMember.delete({ - where: { - userUid_organizationId: { - userUid: userId, - organizationId: orgId, - }, - }, - }); - return { - ok: true, - message: 'successfully left the organization', - }; - } catch { - return { - ok: false, - message: 'Unable to leave the org please try again later', - }; - } - } + async leaveOrg(orgId: string, userId: string) { + try { + await this.prismaService.organizationMember.delete({ + where: { + userUid_organizationId: { + userUid: userId, + organizationId: orgId, + }, + }, + }); + return { + ok: true, + message: "successfully left the organization", + }; + } catch { + return { + ok: false, + message: "Unable to leave the org please try again later", + }; + } + } - async getAllEvents(id: string, role: Role) { - try { - const event = await this.prismaService.events.findMany({ - where: { - organizationId: id, - }, - }); + async getAllEvents(id: string, role: Role) { + try { + const event = await this.prismaService.events.findMany({ + where: { + organizationId: id, + }, + }); - return { - event, - role, - }; - } catch (e) { - return { - ok: false, - message: 'could not find the events', - ERROR: e, - }; - } - } + return { + event, + role, + }; + } catch (e) { + return { + ok: false, + message: "could not find the events", + ERROR: e, + }; + } + } - async getOrgRole(orgId: string, user: string) { - try { - return await this.prismaService.organizationMember.findUnique({ - where: { - userUid_organizationId: { - userUid: user, - organizationId: orgId, - }, - }, - select: { - role: true, - }, - }); - } catch {} - } + async getOrgRole(orgId: string, user: string) { + try { + return await this.prismaService.organizationMember.findUnique({ + where: { + userUid_organizationId: { + userUid: user, + organizationId: orgId, + }, + }, + select: { + role: true, + }, + }); + } catch {} + } - async getOrgById(orgId: string) { - try { - const data = await this.prismaService.organization.findUnique({ - where: { - id: orgId, - }, - }); + async getOrgById(orgId: string) { + try { + const data = await this.prismaService.organization.findUnique({ + where: { + id: orgId, + }, + }); - if (!data) { - throw new NotFoundException(); - } + if (!data) { + throw new NotFoundException(); + } - return { - ok: true, - message: 'org found successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException({ - ok: false, - message: e.message || 'error loading organization', - }); - } - } - } + return { + ok: true, + message: "org found successfully", + data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException({ + ok: false, + message: e.message || "error loading organization", + }); + } + } + } - async UpdateOrg(id: string, payload: Data) { - try { - const data = await this.prismaService.organization.update({ - where: { - id, - }, - data: { - name: payload.name, - slug: payload.slug, - }, - }); + async UpdateOrg(id: string, payload: Data) { + try { + const data = await this.prismaService.organization.update({ + where: { + id, + }, + data: { + name: payload.name, + slug: payload.slug, + }, + }); - if (!data) { - throw new NotFoundException(); - } - return { - ok: true, - message: 'Org was updated successfully', - data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } - } - } + if (!data) { + throw new NotFoundException(); + } + return { + ok: true, + message: "Org was updated successfully", + data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + } + } - async getEventsByorg(key: string) { - try { - const data = await this.prismaService.organization.findUnique({ - where: { - slug: key, - }, - select: { - events: { - where: { - isPublished: true, - }, - }, - name: true, - }, - }); - if (!data) throw new NotFoundException(); - return { - ok: true, - message: 'Events found successfully', - data, - }; - } catch { - throw new NotFoundException(); - } - } + async getEventsByorg(key: string) { + try { + const data = await this.prismaService.organization.findUnique({ + where: { + slug: key, + }, + select: { + events: { + where: { + isPublished: true, + }, + }, + name: true, + }, + }); + if (!data) throw new NotFoundException(); + return { + ok: true, + message: "Events found successfully", + data, + }; + } catch { + throw new NotFoundException(); + } + } } type Data = { - slug: string; - name: string; + slug: string; + name: string; }; diff --git a/apps/api/src/utils/db.ts b/apps/api/src/utils/db.ts index 7c33cdfa..27e2cc2a 100644 --- a/apps/api/src/utils/db.ts +++ b/apps/api/src/utils/db.ts @@ -1,71 +1,71 @@ -import { customAlphabet } from 'nanoid'; +import { customAlphabet } from "nanoid"; -export type SystemFields = 'id' | 'created_at' | 'updated_at' | 'is_deleted'; +export type SystemFields = "id" | "created_at" | "updated_at" | "is_deleted"; export enum SystemTable { - User = 'ff_user', - Account = 'ff_account', - Org = 'ff_organization', - OrgMember = 'ff_organization_member', - OrgInvite = 'ff_organization_invite', - Events = 'ff_events', - EventTicket = 'ff_event_ticket', - Form = 'ff_form', - FormFields = 'ff_form_fields', - FormFieldOptions = 'ff_form_field_options', - FormResponse = 'ff_form_response', - Ticket = 'ff_ticket', - Kanban = 'ff_kanban', - KanbanCard = 'ff_kanban_card', - Comment = 'ff_comment', - FF_Migrations = 'ff_migrations', + User = "ff_user", + Account = "ff_account", + Org = "ff_organization", + OrgMember = "ff_organization_member", + OrgInvite = "ff_organization_invite", + Events = "ff_events", + EventTicket = "ff_event_ticket", + Form = "ff_form", + FormFields = "ff_form_fields", + FormFieldOptions = "ff_form_field_options", + FormResponse = "ff_form_response", + Ticket = "ff_ticket", + Kanban = "ff_kanban", + KanbanCard = "ff_kanban_card", + Comment = "ff_comment", + FF_Migrations = "ff_migrations", } export const IDPrefix = { - [SystemTable.User]: 'usr', - [SystemTable.Account]: 'acc', - [SystemTable.Org]: 'org', - [SystemTable.OrgMember]: 'orm', - [SystemTable.OrgInvite]: 'oin', - [SystemTable.Events]: 'evt', - [SystemTable.EventTicket]: 'evt', - [SystemTable.Form]: 'frm', - [SystemTable.FormFields]: 'fld', - [SystemTable.FormFieldOptions]: 'ffo', - [SystemTable.FormResponse]: 'frs', - [SystemTable.Ticket]: 'tkt', - [SystemTable.Kanban]: 'kan', - [SystemTable.KanbanCard]: 'kcd', - [SystemTable.Comment]: 'cmt', - [SystemTable.FF_Migrations]: 'mig', + [SystemTable.User]: "usr", + [SystemTable.Account]: "acc", + [SystemTable.Org]: "org", + [SystemTable.OrgMember]: "orm", + [SystemTable.OrgInvite]: "oin", + [SystemTable.Events]: "evt", + [SystemTable.EventTicket]: "evt", + [SystemTable.Form]: "frm", + [SystemTable.FormFields]: "fld", + [SystemTable.FormFieldOptions]: "ffo", + [SystemTable.FormResponse]: "frs", + [SystemTable.Ticket]: "tkt", + [SystemTable.Kanban]: "kan", + [SystemTable.KanbanCard]: "kcd", + [SystemTable.Comment]: "cmt", + [SystemTable.FF_Migrations]: "mig", }; export enum Role { - ADMIN = 'admin', - EDITOR = 'editor', - VIEWER = 'viewer', + ADMIN = "admin", + EDITOR = "editor", + VIEWER = "viewer", } const nanoid = customAlphabet( - '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', - 15, + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + 15 ); export const FormInput = [ - 'SingleLineText', - 'LongText', - 'SingleSelect', - 'MultiSelect', - 'Checkbox', - 'Number', - 'Email', - 'Url', - 'PhoneNumber', - 'Attachment', -]; + "SingleLineText", + "LongText", + "SingleSelect", + "MultiSelect", + "Checkbox", + "Number", + "Email", + "Url", + "PhoneNumber", + "Attachment", +] as const; export const generateID = (table: SystemTable) => { - const prefix = IDPrefix[table]; - const id = `${prefix}${nanoid()}`; - return id; + const prefix = IDPrefix[table]; + const id = `${prefix}${nanoid()}`; + return id; }; diff --git a/apps/web/hooks/api/kanban/useKanban.ts b/apps/web/hooks/api/kanban/useKanban.ts index 25a40d9d..3fee4c09 100644 --- a/apps/web/hooks/api/kanban/useKanban.ts +++ b/apps/web/hooks/api/kanban/useKanban.ts @@ -1,35 +1,35 @@ -import { apiHandler } from '@app/config'; -import { useQuery } from '@tanstack/react-query'; -import { useRouter } from 'next/router'; -import { useEffect, useState } from 'react'; -import { Kanban, ServerResponse } from '@app/types'; +import { apiHandler } from "@app/config"; +import { useQuery } from "@tanstack/react-query"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Kanban, ServerResponse } from "@app/types"; -type KanbanResponse = ServerResponse; +export type KanbanResponse = ServerResponse; const getKanban = async (slug: string): Promise => { - const { data } = await apiHandler.get(`/events/kanban/${slug}`); - return data; + const { data } = await apiHandler.get(`/events/kanban/${slug}`); + return data; }; export const useKanban = () => { - const [slug, setSlug] = useState(''); - const router = useRouter(); + const [slug, setSlug] = useState(""); + const router = useRouter(); - useEffect(() => { - if (router.isReady) { - const { pk } = router.query; - setSlug(pk as string); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [router.isReady]); + useEffect(() => { + if (router.isReady) { + const { pk } = router.query; + setSlug(pk as string); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [router.isReady]); - const key = ['event', 'kanaban', slug]; + const key = ["event", "kanaban", slug]; - const apiData = useQuery({ - queryFn: () => getKanban(slug), - queryKey: key, - enabled: !!slug, - }); + const apiData = useQuery({ + queryFn: () => getKanban(slug), + queryKey: key, + enabled: !!slug, + }); - return apiData; + return apiData; }; diff --git a/apps/web/hooks/api/kanban/useUpdateTask.ts b/apps/web/hooks/api/kanban/useUpdateTask.ts new file mode 100644 index 00000000..81b09060 --- /dev/null +++ b/apps/web/hooks/api/kanban/useUpdateTask.ts @@ -0,0 +1,73 @@ +import { useQueryClient, useMutation } from "@tanstack/react-query"; +import { apiHandler } from "@app/config"; +import { KanbanResponse } from "@app/hooks/api/kanban/useKanban"; +import { useRouter } from "next/router"; + +const updateTaskKanbanId = async ({ + taskId, + newKanbanId, +}: { + taskId: string; + newKanbanId: string; +}) => { + await apiHandler.patch(`/events/kanban/tasks/${taskId}`, { + kanbanId: newKanbanId, + }); +}; + +export const useUpdateTask = () => { + const queryClient = useQueryClient(); + const router = useRouter(); + const { pk } = router.query; + + return useMutation(updateTaskKanbanId, { + onMutate: async ({ taskId, newKanbanId }) => { + const previousKanban = queryClient.getQueryData([ + "event", + "kanban", + pk, + ]); + + queryClient.setQueryData( + ["event", "kanban", pk], + // @ts-ignore + (old: KanbanResponse) => { + if (!old) return old; + + return { + ...old, + data: old.data.map((board) => { + if (board.id === newKanbanId) { + return { + ...board, + tasks: [ + ...board.tasks, + { + ...board.tasks.find((task) => task.id === taskId), + kanbanId: newKanbanId, + }, + ], + }; + } + if (board.tasks.find((task) => task.id === taskId)) { + return { + ...board, + tasks: board.tasks.filter((task) => task.id !== taskId), + }; + } + return board; + }), + }; + } + ); + + return { previousKanban }; + }, + onError: (_, __, context: any) => { + queryClient.setQueryData(["event", "kanban", pk], context.previousKanban); + }, + onSettled: () => { + queryClient.invalidateQueries(["event", "kanban", pk]); + }, + }); +}; From 76faa0777ba3f7fb321fac24fcd4aeb149087994 Mon Sep 17 00:00:00 2001 From: sreehari jayaraj Date: Wed, 5 Jun 2024 21:02:25 +0530 Subject: [PATCH 12/61] fix: format and lint --- apps/api/package.json | 162 ++-- apps/api/src/controllers/form.controller.ts | 20 +- apps/api/src/controllers/kanban.controller.ts | 12 +- apps/api/src/db/migrations/06.events.ts | 40 +- apps/api/src/services/events.service.ts | 8 +- apps/api/src/services/form.service.ts | 22 +- apps/api/src/services/kanban.service.ts | 122 +-- .../mail/templates/payment-succesfull.tsx | 118 +-- .../src/services/mail/templates/welcome.tsx | 118 +-- apps/api/src/services/org-events.service.ts | 708 +++++++++--------- apps/api/src/services/org-member.service.ts | 6 +- apps/api/src/services/stripe.service.ts | 359 +++++---- apps/api/src/services/user.service.ts | 252 +++---- apps/api/src/utils/hyphenate.ts | 4 +- 14 files changed, 931 insertions(+), 1020 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index d6b10ee1..f3e5d917 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,82 +1,84 @@ { - "name": "api", - "version": "1.0.0", - "license": "UNLICENSED", - "private": true, - "type": "commonjs", - "scripts": { - "prebuild": "rimraf dist", - "build": "npx prisma generate && nest build", - "start": "nest start", - "dev": "node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty", - "dev-new": "concurrently \"tsc --noEmit --watch\" \"node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty \"", - "start:prod": "node dist/main", - "db:seed": "ts-node prisma/seed.ts" - }, - "dependencies": { - "@aws-sdk/client-s3": "^3.521.0", - "@nestjs-modules/mailer": "^2.0.2", - "@nestjs/common": "^10.3.3", - "@nestjs/config": "^3.2.0", - "@nestjs/core": "^10.3.3", - "@nestjs/event-emitter": "^2.0.4", - "@nestjs/jwt": "^10.2.0", - "@nestjs/passport": "^10.0.3", - "@nestjs/platform-express": "^10.3.3", - "@nestjs/schematics": "^10.1.1", - "@nestjs/swagger": "^7.3.0", - "@nestjs/throttler": "^5.1.2", - "@prisma/client": "^5.10.2", - "@webtre/nestjs-mailer-react-adapter": "^0.1.2", - "argon2": "^0.40.1", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.1", - "cookie-parser": "^1.4.6", - "express": "^4.19.2", - "express-session": "^1.18.0", - "joi": "^17.12.2", - "knex": "^3.1.0", - "nanoid": "^3.3.4", - "nestjs-pino": "^4.0.0", - "nodemailer": "^6.9.10", - "openai": "^4.33.0", - "passport": "^0.7.0", - "passport-github2": "^0.1.12", - "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.1", - "pg": "^8.11.5", - "pino-http": "^9.0.0", - "pino-pretty": "^10.3.1", - "prisma-dbml-generator": "^0.12.0", - "reflect-metadata": "^0.2.1", - "rimraf": "^5.0.5", - "rxjs": "^7.8.1", - "stripe": "^14.18.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.5" - }, - "devDependencies": { - "@biomejs/biome": "^1.7.3", - "@faker-js/faker": "^8.4.1", - "@nestjs/cli": "^10.3.2", - "@react-email/components": "^0.0.15", - "@swc-node/register": "^1.9.1", - "@swc/cli": "^0.3.9", - "@swc/core": "^1.4.2", - "@types/cookie-parser": "^1.4.6", - "@types/express": "^4.17.21", - "@types/multer": "^1.4.11", - "@types/node": "^20.11.20", - "@types/nodemailer": "^6.4.14", - "@types/passport": "^1.0.16", - "@types/passport-github2": "^1.2.9", - "@types/passport-google-oauth20": "^2.0.14", - "@types/passport-jwt": "^4.0.1", - "@types/react": "^18.2.58", - "concurrently": "^8.2.2", - "prisma": "^5.10.2", - "react": "^18.3.1", - "ts-node": "^10.9.2", - "typescript": "^5.4.5" - } + "name": "api", + "version": "1.0.0", + "license": "UNLICENSED", + "private": true, + "type": "commonjs", + "scripts": { + "prebuild": "rimraf dist", + "build": "npx prisma generate && nest build", + "start": "nest start", + "dev": "node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty", + "dev-new": "concurrently \"tsc --noEmit --watch\" \"node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty \"", + "start:prod": "node dist/main", + "db:seed": "ts-node prisma/seed.ts", + "lint": "biome lint --error-on-warnings ./src", + "format": "npx @biomejs/biome format ./src" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.521.0", + "@nestjs-modules/mailer": "^2.0.2", + "@nestjs/common": "^10.3.3", + "@nestjs/config": "^3.2.0", + "@nestjs/core": "^10.3.3", + "@nestjs/event-emitter": "^2.0.4", + "@nestjs/jwt": "^10.2.0", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-express": "^10.3.3", + "@nestjs/schematics": "^10.1.1", + "@nestjs/swagger": "^7.3.0", + "@nestjs/throttler": "^5.1.2", + "@prisma/client": "^5.10.2", + "@webtre/nestjs-mailer-react-adapter": "^0.1.2", + "argon2": "^0.40.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "cookie-parser": "^1.4.6", + "express": "^4.19.2", + "express-session": "^1.18.0", + "joi": "^17.12.2", + "knex": "^3.1.0", + "nanoid": "^3.3.4", + "nestjs-pino": "^4.0.0", + "nodemailer": "^6.9.10", + "openai": "^4.33.0", + "passport": "^0.7.0", + "passport-github2": "^0.1.12", + "passport-google-oauth20": "^2.0.0", + "passport-jwt": "^4.0.1", + "pg": "^8.11.5", + "pino-http": "^9.0.0", + "pino-pretty": "^10.3.1", + "prisma-dbml-generator": "^0.12.0", + "reflect-metadata": "^0.2.1", + "rimraf": "^5.0.5", + "rxjs": "^7.8.1", + "stripe": "^14.18.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.5" + }, + "devDependencies": { + "@biomejs/biome": "^1.7.3", + "@faker-js/faker": "^8.4.1", + "@nestjs/cli": "^10.3.2", + "@react-email/components": "^0.0.15", + "@swc-node/register": "^1.9.1", + "@swc/cli": "^0.3.9", + "@swc/core": "^1.4.2", + "@types/cookie-parser": "^1.4.6", + "@types/express": "^4.17.21", + "@types/multer": "^1.4.11", + "@types/node": "^20.11.20", + "@types/nodemailer": "^6.4.14", + "@types/passport": "^1.0.16", + "@types/passport-github2": "^1.2.9", + "@types/passport-google-oauth20": "^2.0.14", + "@types/passport-jwt": "^4.0.1", + "@types/react": "^18.2.58", + "concurrently": "^8.2.2", + "prisma": "^5.10.2", + "react": "^18.3.1", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" + } } diff --git a/apps/api/src/controllers/form.controller.ts b/apps/api/src/controllers/form.controller.ts index deda13d5..b7061a2c 100644 --- a/apps/api/src/controllers/form.controller.ts +++ b/apps/api/src/controllers/form.controller.ts @@ -19,23 +19,27 @@ import { CreateFormFieldDto, CreateFormFieldSchema, } from "@api/dto/form-field.dto"; -import type { User } from "@prisma/client"; import { AuthUser } from "../services/auth/decorators/user.decorator"; -import type { ToggleFormPublishStatus } from "../services/dto/publish-form.dto"; import { ZodValidator } from "@api/validation/zod.validation.decorator"; import { Role } from "@api/utils/db"; +import { EventTicketModel } from "@api/models"; +import type { User } from "@prisma/client"; +import type { ToggleFormPublishStatus } from "../services/dto/publish-form.dto"; @Controller("/events") export class FormController { constructor(private form: FormService, private events: EventsService) {} - @Get("/form/:orgID/:eventId") + @Get("/form/:orgID/:eventId/:formId") @ApiTags("events") @Roles(Role.ADMIN, Role.EDITOR, Role.VIEWER) @ApiOperation({ summary: "get form schema of a specific event" }) @UseGuards(AuthGuard("jwt"), RbacGuard) - async getFormSchema(@Param("eventId") slugId: string) { - return await this.form.getEventFormScheme(slugId); + async getFormSchema( + @Param("eventId") eventId: string, + @Param("formId") formId: string + ) { + return await this.form.getEventFormScheme(eventId, formId); } @Post("/form/:eventId") @@ -48,8 +52,10 @@ export class FormController { @AuthUser() user: User ) { try { - const event = await this.events.getEventById(eventId); - if (!event || event?.maxTicketCount < 1) { + const event = await EventTicketModel.findOne({ + fk_event_id: eventId, + }); + if (!event || event?.price > 0) { throw new NotFoundException(); } await this.form.addUserFormSubmission(data, eventId, user.uid); diff --git a/apps/api/src/controllers/kanban.controller.ts b/apps/api/src/controllers/kanban.controller.ts index 8aa2c184..29c8658b 100644 --- a/apps/api/src/controllers/kanban.controller.ts +++ b/apps/api/src/controllers/kanban.controller.ts @@ -15,7 +15,7 @@ import { RbacGuard } from "../services/guards/rbac-member.guard"; import { AuthUser } from "../services/auth/decorators/user.decorator"; import { UpdateTaskBoard, IUpdateTaskBoard } from "@api/dto/update-task.dto"; import { ZodValidator } from "@api/validation/zod.validation.decorator"; -import type { User } from "@prisma/client"; +import { User } from "@api/db/schema"; import type { CreateTask } from "../services/dto/create-task.dto"; @Controller("/events/kanban") @@ -33,19 +33,13 @@ export class KanbanController { @ApiOperation({ summary: "create a new task in kanban board" }) @ApiTags("kanban") @UseGuards(AuthGuard("jwt"), RbacGuard) - @Post("/:slug/:boardId") + @Post("/:boardId") async createTask( - @Param("slug") slug: string, @Param("boardId") boardId: string, @Body() payload: CreateTask, @AuthUser() user: User ) { - return await this.kanbanService.createTask( - payload, - slug, - boardId, - user.uid - ); + return await this.kanbanService.createTask(payload, boardId, user.id); } @ApiOperation({ summary: "delete a board" }) diff --git a/apps/api/src/db/migrations/06.events.ts b/apps/api/src/db/migrations/06.events.ts index 3268514d..bac34bb2 100644 --- a/apps/api/src/db/migrations/06.events.ts +++ b/apps/api/src/db/migrations/06.events.ts @@ -1,38 +1,38 @@ -import { Role, SystemTable } from '../../utils/db'; -import type { Knex } from 'knex'; +import { SystemTable } from "../../utils/db"; +import type { Knex } from "knex"; export async function up(knex: Knex): Promise { - const isTableExists = await knex.schema.hasTable(SystemTable.Events); + const isTableExists = await knex.schema.hasTable(SystemTable.Events); - if (!isTableExists) { - await knex.schema.createTable(SystemTable.Events, (table) => { - table.string('id', 25).primary(); + if (!isTableExists) { + await knex.schema.createTable(SystemTable.Events, (table) => { + table.string("id", 25).primary(); - table.string('name', 255); + table.string("name", 255); - table.string('slug', 255); + table.string("slug", 255); - table.string('fk_organization_id', 25); + table.string("fk_organization_id", 25); - table.string('description'); + table.string("description"); - table.string('website').nullable(); + table.string("website").nullable(); - table.string('cover_image').nullable(); + table.string("cover_image").nullable(); - table.string('location', 255); + table.string("location", 255); - table.timestamp('event_date'); + table.timestamp("event_date"); - table.boolean('is_published').defaultTo(false); + table.boolean("is_published").defaultTo(false); - table.boolean('is_deleted').defaultTo(false); + table.boolean("is_deleted").defaultTo(false); - table.timestamps(true, true); - }); - } + table.timestamps(true, true); + }); + } } export async function down(knex: Knex): Promise { - await knex.schema.dropTableIfExists(SystemTable.Events); + await knex.schema.dropTableIfExists(SystemTable.Events); } diff --git a/apps/api/src/services/events.service.ts b/apps/api/src/services/events.service.ts index bb0c6463..be18c5e9 100644 --- a/apps/api/src/services/events.service.ts +++ b/apps/api/src/services/events.service.ts @@ -7,8 +7,9 @@ import { import { EventEmitter2 } from "@nestjs/event-emitter"; import { CommentModel, EventModel, FormModel, KanbanModal } from "@api/models"; import { User } from "@api/db/schema"; -import { stripUndefinedOrNull, exclude } from "@api/utils"; +import { stripUndefinedOrNull } from "@api/utils"; import { FFError } from "@api/utils/error"; +import { hyphenate } from "@api/utils/hyphenate"; @Injectable() export class EventsService { @@ -28,7 +29,7 @@ export class EventsService { orgId: string; }) { const isEventWithSlugExist = await EventModel.find({ - slug: newEvent.name, + slug: hyphenate(newEvent.name), }); let slug: string; @@ -38,8 +39,9 @@ export class EventsService { slug: newEvent.name, }); slug = `${newEvent.name}-${totalEventCount}`; + slug = hyphenate(slug); } else { - slug = newEvent.name; + slug = hyphenate(newEvent.name); } const event = await EventModel.insert({ diff --git a/apps/api/src/services/form.service.ts b/apps/api/src/services/form.service.ts index b07c308d..5d415da4 100644 --- a/apps/api/src/services/form.service.ts +++ b/apps/api/src/services/form.service.ts @@ -8,6 +8,8 @@ import { AiService } from "./ai.service"; import { EventsService } from "./events.service"; import { EventModel, FormFieldsModel, FormModel } from "@api/models"; import { CreateFormFieldDto } from "@api/dto/form-field.dto"; +import BaseContext from "@api/BaseContext"; +import { SystemTable } from "@api/utils/db"; @Injectable() export class FormService { @@ -61,9 +63,8 @@ export class FormService { } catch (e) { if (e instanceof NotFoundException) { throw new NotFoundException(); - } else { - throw e; } + throw e; } } @@ -113,16 +114,9 @@ export class FormService { } } - async getEventFormScheme(eventSlug: string) { + async getEventFormScheme(eventId: string, formId: string) { try { - const eventSchema = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - select: { - form: true, - }, - }); + const eventSchema = await BaseContext.knex(SystemTable.Form).select(); if (!eventSchema) { throw new NotFoundException(); @@ -136,9 +130,8 @@ export class FormService { } catch (e) { if (e instanceof NotFoundException) { throw new NotFoundException(); - } else { - throw e; } + throw e; } } @@ -209,9 +202,8 @@ export class FormService { } catch (e) { if (e instanceof NotFoundException) { throw new NotFoundException(); - } else { - throw e; } + throw e; } } } diff --git a/apps/api/src/services/kanban.service.ts b/apps/api/src/services/kanban.service.ts index b8c8876c..b82ead7f 100644 --- a/apps/api/src/services/kanban.service.ts +++ b/apps/api/src/services/kanban.service.ts @@ -3,13 +3,11 @@ import { InternalServerErrorException, NotFoundException, } from "@nestjs/common"; -import { type Prisma } from "@prisma/client"; import { PrismaService } from "./prisma.service"; -import type { CreateTask } from "./dto/create-task.dto"; -import { KanbanCardModal, KanbanModal } from "@api/models"; +import { KanbanCardModal } from "@api/models"; import BaseContext from "@api/BaseContext"; import { SystemTable } from "@api/utils/db"; -import type { Event } from "@api/db/schema"; +import type { CreateTask } from "./dto/create-task.dto"; @Injectable() export class KanbanService { @@ -17,69 +15,7 @@ export class KanbanService { async getAllBoards(slug: string) { try { - const allBoards = await BaseContext.knex(SystemTable.Events) - .select( - "kanban.id as id", - "kanban.created_at as created_at", - BaseContext.knex.raw("COUNT(tasks.id) as _count"), - BaseContext.knex.raw(` - json_agg(json_build_object( - 'id', tasks.id, - 'title', tasks.title, - 'createdBy', json_build_object( - 'id', task_creator.id, - 'displayName', task_creator.display_name, - 'photoURL', task_creator.photo_url - ), - 'Comment', ( - SELECT json_agg(json_build_object( - 'id', comments.id, - 'fk_user_id', comments.fk_user_id, - 'fk_event_id', comments.fk_event_id, - 'fk_kanban_card_id', comments.fk_kanban_card_id, - 'fk_kanban_id', comments.fk_kanban_id, - 'comment', comments.comment, - 'is_deleted', comments.is_deleted, - 'created_at', comments.created_at, - 'updated_at', comments.updated_at, - 'owner', json_build_object( - 'id', comment_owner.uid, - 'displayName', comment_owner.display_name, - 'email', comment_owner.email, - 'slug', comment_owner.slug, - 'photoURL', comment_owner.photo_url - ) - )) - FROM comments - JOIN users as comment_owner ON comment_owner.id = comments.fk_user_id - WHERE comments.fk_kanban_card_id = tasks.id - ) - )) AS tasks - `) - ) - .join("kanban", "kanban.fk_event_id", "events.id") - .leftJoin( - "users as kanban_creator", - "kanban_creator.id", - "kanban.fk_user_id" - ) - .leftJoin("kanban_card as tasks", "tasks.fk_kanban_id", "kanban.id") - .leftJoin( - "users as task_creator", - "task_creator.id", - "tasks.fk_user_id" - ) - .where("events.slug", slug) - .groupBy( - "kanban.id", - "kanban.created_at", - "kanban_creator.uid", - "kanban_creator.display_name", - "kanban_creator.email", - "kanban_creator.slug", - "kanban_creator.photo_url" - ) - .orderBy("kanban.created_at", "asc"); + const allBoards = {}; if (!allBoards) { throw new NotFoundException(); @@ -102,44 +38,28 @@ export class KanbanService { async createTask( payload: CreateTask, - slug: string, kanbanId: string, - user: string + user: string, + eventId: string ) { try { - const newKanban = await this.prismaService.events.update({ - where: { - slug, - }, - data: { - kanban: { - update: { - where: { - id: kanbanId, - }, - data: { - tasks: { - create: { - title: payload.title, - userUid: user, - }, - }, - }, - }, - }, - }, + const existingKanban = await BaseContext.knex( + SystemTable.Kanban + ) + .select("*") + .where({ + fk_event_id: eventId, + id: kanbanId, + }); + + if (!existingKanban) throw new NotFoundException(); + + await KanbanCardModal.insert({ + fk_kanban_id: kanbanId, + fk_user_id: user, + title: payload.title, + description: payload.data?.toLocaleString(), }); - if (!newKanban) throw new InternalServerErrorException(); - - const newTask = await this.prismaService.task.findFirst({ - where: { - userUid: user, - kanbanId: kanbanId, - title: payload.title, - }, - }); - - await this.addComment(newTask.id, payload.data, user); return { ok: true, diff --git a/apps/api/src/services/mail/templates/payment-succesfull.tsx b/apps/api/src/services/mail/templates/payment-succesfull.tsx index a6049073..9b8c02a4 100644 --- a/apps/api/src/services/mail/templates/payment-succesfull.tsx +++ b/apps/api/src/services/mail/templates/payment-succesfull.tsx @@ -1,68 +1,68 @@ import { - Body, - Button, - Container, - Head, - Heading, - Hr, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import type { PaymentSuccessEvent } from '../mail.service'; -import React from 'react'; + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import type { PaymentSuccessEvent } from "../mail.service"; +import React from "react"; const baseUrl = process.env.CLIENT_URL - ? `${process.env.CLIENT_URL}` - : 'fossfolio.com'; + ? `${process.env.CLIENT_URL}` + : "fossfolio.com"; const InviteUserEmail = ({ from, amount }: PaymentSuccessEvent) => { - return ( - - - Payment Successsfull - - - -
- Fossfolio -
- - Payment Successsfull - - - Hello, - - - Congratulations {from}! -
- Your payment of ₹ {amount} was successfull. You can find your - tickets in the website below -
-
- -
+ return ( + + + Payment Successful + + + +
+ Fossfolio +
+ + Payment Successful + + + Hello, + + + Congratulations {from}! +
+ Your payment of ₹ {amount} was successful. You can find your + tickets in the website below +
+
+ +
-
-
- -
- - ); +
+
+ +
+ + ); }; export default InviteUserEmail; diff --git a/apps/api/src/services/mail/templates/welcome.tsx b/apps/api/src/services/mail/templates/welcome.tsx index 0df91581..39b9fb7e 100644 --- a/apps/api/src/services/mail/templates/welcome.tsx +++ b/apps/api/src/services/mail/templates/welcome.tsx @@ -1,68 +1,68 @@ import { - Body, - Button, - Container, - Head, - Heading, - Hr, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import type { UserRegisteredEvent } from '../mail.service'; -import React from 'react'; + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import type { UserRegisteredEvent } from "../mail.service"; +import React from "react"; const baseUrl = process.env.CLIENT_URL - ? `${process.env.CLIENT_URL}` - : 'fossfolio.com'; + ? `${process.env.CLIENT_URL}` + : "fossfolio.com"; const UserWelcome = ({ name, email, avatarUrl }: UserRegisteredEvent) => { - const previewText = `Welcome to Fossfolio`; + const previewText = "Welcome to Fossfolio"; - return ( - - - {previewText} - - - -
- Fossfolio -
- - Welcome to Fossfolio - - - Hello, {name} - - - You have successfully registered for Fossfolio. We are glad to - have you on board. You can now explore the events and start - exploring the community. - -
- -
-
-
- -
- - ); + return ( + + + {previewText} + + + +
+ Fossfolio +
+ + Welcome to Fossfolio + + + Hello, {name} + + + You have successfully registered for Fossfolio. We are glad to + have you on board. You can now explore the events and start + exploring the community. + +
+ +
+
+
+ +
+ + ); }; export default UserWelcome; diff --git a/apps/api/src/services/org-events.service.ts b/apps/api/src/services/org-events.service.ts index c91da76c..108e31e3 100644 --- a/apps/api/src/services/org-events.service.ts +++ b/apps/api/src/services/org-events.service.ts @@ -1,364 +1,360 @@ import { - ConflictException, - Injectable, - InternalServerErrorException, - NotFoundException, - ServiceUnavailableException, -} from '@nestjs/common'; -import { PrismaService } from './prisma.service'; -import { StripeService } from './stripe.service'; -import { S3Service } from './cloud.service'; -import { EventParams } from '@api/dto/events.dto'; -import { User } from '@api/db/schema'; -import { exclude } from '@api/utils'; -import BaseContext from '@api/BaseContext'; -import { SystemTable } from '@api/utils/db'; + ConflictException, + Injectable, + InternalServerErrorException, + NotFoundException, + ServiceUnavailableException, +} from "@nestjs/common"; +import { PrismaService } from "./prisma.service"; +import { StripeService } from "./stripe.service"; +import { S3Service } from "./cloud.service"; +import { EventParams } from "@api/dto/events.dto"; +import { User } from "@api/db/schema"; +import { exclude } from "@api/utils"; +import BaseContext from "@api/BaseContext"; +import { SystemTable } from "@api/utils/db"; @Injectable() export class OrgEventsService { - constructor( - private readonly prismaService: PrismaService, - private readonly cloudService: S3Service, - private readonly stripeService: StripeService, - ) {} - - async registerEvent(eventSlug: string, userId: string) { - try { - const eventInfo = await this.prismaService.events.findUnique({ - where: { - slug: eventSlug, - }, - include: { - Ticket: { - where: { - userUid: userId, - }, - }, - }, - }); - - if (eventInfo.Ticket.length) { - throw new ConflictException(); - } - - if (eventInfo.maxTicketCount <= 0) { - throw new ServiceUnavailableException(); - } - - // when the event requires a form input we should check if the use has completed the form or not - // can only be done after creating the response schema - - // After this if the event has a ticket price we will redirect to stripe checkout - - if (eventInfo.ticketPrice > 0) { - // this will trigger another service layer from the stripeService Event emitter - return await this.stripeService.createCheckoutSession( - eventInfo, - userId, - ); - } else { - const data = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - Ticket: { - create: { - userUid: userId, - }, - }, - maxTicketCount: eventInfo.maxTicketCount - 1, - }, - }); - - if (!data) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event register successfully', - }; - } - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else if (e instanceof ServiceUnavailableException) { - throw new ServiceUnavailableException(); - } else if (e instanceof ConflictException) { - throw new ConflictException('user already registered'); - } else { - throw e; - } - } - } - - async getEventParticipants2({ orgId, eventId }: EventParams) { - const participants = await BaseContext.knex(SystemTable.Ticket) - .where({ id: eventId }) - .select('tickets.user') - .join('tickets', 'events.id', 'tickets.event_id'); - } - - async getEventParticipants(slugId: string) { - try { - const userInfo = await this.prismaService.events.findUnique({ - where: { - slug: slugId, - }, - select: { - Ticket: { - select: { - user: true, - }, - }, - }, - }); - - if (!userInfo) { - throw new NotFoundException('Events not found'); - } - - const data = userInfo.Ticket.map((info) => - exclude(info.user, [ - 'refreshToken', - 'createdAt', - ]), - ); - - return { - ok: true, - message: 'members found successfully', - data: data, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException('Event not found'); - } else { - throw e; - } - } - } - - async getEventRegistartionStatus(slugId: string, userId: string) { - try { - const data = await this.prismaService.events.findUnique({ - where: { - slug: slugId, - }, - select: { - Ticket: { - where: { - userUid: userId, - }, - }, - }, - }); - - if (!data || !data.Ticket.length) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'User found successfully', - isRegistred: true, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw new InternalServerErrorException({ - error: e, - }); - } - } - } - - async uploadEventCover(file: Express.Multer.File, eventSlug: string) { - try { - const publicUrl = await this.cloudService.uploadFile(file); - if (!publicUrl) { - return new InternalServerErrorException(); - } - - const updatedEventCover = await this.prismaService.events.update({ - where: { - slug: eventSlug, - }, - data: { - coverImage: publicUrl, - }, - }); - - if (!updatedEventCover) { - throw new InternalServerErrorException(); - } - return { - ok: true, - data: updatedEventCover, - message: 'image uploaded successfully', - }; - } catch (e) { - if (e instanceof InternalServerErrorException) { - throw new InternalServerErrorException(); - } - } - } - - async getTicketInfo(id: string) { - try { - const event = await this.prismaService.events.findUnique({ - where: { - id, - }, - select: { - eventDate: true, - description: true, - isCollegeEvent: true, - coverImage: true, - location: true, - name: true, - }, - }); - if (!event) { - throw new NotFoundException(); - } - - return { - ok: true, - message: 'Event schema found', - data: event, - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw e; - } - } - } - - async removeParticipant(eventId: string, userId: string) { - try { - const isUserExist = await this.prismaService.ticket.findFirst({ - where: { - eventsId: eventId, - userUid: userId, - }, - }); - - if (!isUserExist) { - throw new NotFoundException(); - } - - await this.prismaService.ticket.delete({ - where: { - id: isUserExist.id, - }, - }); - - return { - ok: true, - message: 'user was removed successfully', - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - throw new ServiceUnavailableException(); - } - } - } - - async getEventStats(id: string) { - try { - const eventInfo = await this.prismaService.events.findUnique({ - where: { - slug: id, - }, - }); - - if (!eventInfo) throw new NotFoundException(); - - const insights = await this.prismaService.ticket.groupBy({ - by: ['createdAt'], - where: { - eventsId: eventInfo.id, - }, - _count: true, - }); - - const stats = await this.prismaService.user.aggregate({ - where: { - Ticket: { - some: { - eventsId: eventInfo.id, - }, - }, - }, - _count: true, - }); - - const totalRevenue = stats._count * eventInfo.ticketPrice; - - const data = { - totalRevenue: totalRevenue || 0, - totalTickets: stats._count || 0, - insights: this.aggregateCountsByDay(insights), - }; - - return { - data, - message: 'Data Found successfully', - }; - } catch { - throw new NotFoundException(); - } - } - - async deleteForm(slug: string) { - try { - await this.prismaService.events.update({ - where: { - slug, - }, - data: { - form: { - deleteMany: {}, - }, - }, - }); - return { - ok: true, - message: 'form deleted successfully', - }; - } catch { - throw new InternalServerErrorException(); - } - } - - private aggregateCountsByDay(responses: Insights[]) { - const aggregatedCounts = {}; - - responses.forEach((response) => { - // Extract the date part from createdAt - const date = new Date(response.createdAt).toISOString().split('T')[0]; - - // Initialize count for the day if not exists - if (!aggregatedCounts[date]) { - aggregatedCounts[date] = 0; - } - - // Add count to the existing count for the day - aggregatedCounts[date] += response._count; - }); - - return aggregatedCounts; - } + constructor( + private readonly prismaService: PrismaService, + private readonly cloudService: S3Service, + private readonly stripeService: StripeService + ) {} + + async registerEvent(eventSlug: string, userId: string) { + try { + const eventInfo = await this.prismaService.events.findUnique({ + where: { + slug: eventSlug, + }, + include: { + Ticket: { + where: { + userUid: userId, + }, + }, + }, + }); + + if (eventInfo.Ticket.length) { + throw new ConflictException(); + } + + if (eventInfo.maxTicketCount <= 0) { + throw new ServiceUnavailableException(); + } + + // when the event requires a form input we should check if the use has completed the form or not + // can only be done after creating the response schema + + // After this if the event has a ticket price we will redirect to stripe checkout + + if (eventInfo.ticketPrice > 0) { + // this will trigger another service layer from the stripeService Event emitter + return await this.stripeService.createCheckoutSession( + eventInfo, + userId + ); + } + const data = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + Ticket: { + create: { + userUid: userId, + }, + }, + maxTicketCount: eventInfo.maxTicketCount - 1, + }, + }); + + if (!data) { + throw new NotFoundException(); + } + + return { + ok: true, + message: "Event register successfully", + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + if (e instanceof ServiceUnavailableException) { + throw new ServiceUnavailableException(); + } + if (e instanceof ConflictException) { + throw new ConflictException("user already registered"); + } + throw e; + } + } + + async getEventParticipants2({ orgId, eventId }: EventParams) { + const participants = await BaseContext.knex(SystemTable.Ticket) + .where({ id: eventId }) + .select("tickets.user") + .join("tickets", "events.id", "tickets.event_id"); + } + + async getEventParticipants(slugId: string) { + try { + const userInfo = await this.prismaService.events.findUnique({ + where: { + slug: slugId, + }, + select: { + Ticket: { + select: { + user: true, + }, + }, + }, + }); + + if (!userInfo) { + throw new NotFoundException("Events not found"); + } + + const data = userInfo.Ticket.map((info) => + exclude(info.user, [ + "refreshToken", + "createdAt", + ]) + ); + + return { + ok: true, + message: "members found successfully", + data: data, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException("Event not found"); + } + throw e; + } + } + + async getEventRegistartionStatus(slugId: string, userId: string) { + try { + const data = await this.prismaService.events.findUnique({ + where: { + slug: slugId, + }, + select: { + Ticket: { + where: { + userUid: userId, + }, + }, + }, + }); + + if (!data || !data.Ticket.length) { + throw new NotFoundException(); + } + + return { + ok: true, + message: "User found successfully", + isRegistred: true, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + throw new InternalServerErrorException({ + error: e, + }); + } + } + + async uploadEventCover(file: Express.Multer.File, eventSlug: string) { + try { + const publicUrl = await this.cloudService.uploadFile(file); + if (!publicUrl) { + return new InternalServerErrorException(); + } + + const updatedEventCover = await this.prismaService.events.update({ + where: { + slug: eventSlug, + }, + data: { + coverImage: publicUrl, + }, + }); + + if (!updatedEventCover) { + throw new InternalServerErrorException(); + } + return { + ok: true, + data: updatedEventCover, + message: "image uploaded successfully", + }; + } catch (e) { + if (e instanceof InternalServerErrorException) { + throw new InternalServerErrorException(); + } + } + } + + async getTicketInfo(id: string) { + try { + const event = await this.prismaService.events.findUnique({ + where: { + id, + }, + select: { + eventDate: true, + description: true, + isCollegeEvent: true, + coverImage: true, + location: true, + name: true, + }, + }); + if (!event) { + throw new NotFoundException(); + } + + return { + ok: true, + message: "Event schema found", + data: event, + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + throw e; + } + } + + async removeParticipant(eventId: string, userId: string) { + try { + const isUserExist = await this.prismaService.ticket.findFirst({ + where: { + eventsId: eventId, + userUid: userId, + }, + }); + + if (!isUserExist) { + throw new NotFoundException(); + } + + await this.prismaService.ticket.delete({ + where: { + id: isUserExist.id, + }, + }); + + return { + ok: true, + message: "user was removed successfully", + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + throw new ServiceUnavailableException(); + } + } + + async getEventStats(id: string) { + try { + const eventInfo = await this.prismaService.events.findUnique({ + where: { + slug: id, + }, + }); + + if (!eventInfo) throw new NotFoundException(); + + const insights = await this.prismaService.ticket.groupBy({ + by: ["createdAt"], + where: { + eventsId: eventInfo.id, + }, + _count: true, + }); + + const stats = await this.prismaService.user.aggregate({ + where: { + Ticket: { + some: { + eventsId: eventInfo.id, + }, + }, + }, + _count: true, + }); + + const totalRevenue = stats._count * eventInfo.ticketPrice; + + const data = { + totalRevenue: totalRevenue || 0, + totalTickets: stats._count || 0, + insights: this.aggregateCountsByDay(insights), + }; + + return { + data, + message: "Data Found successfully", + }; + } catch { + throw new NotFoundException(); + } + } + + async deleteForm(slug: string) { + try { + await this.prismaService.events.update({ + where: { + slug, + }, + data: { + form: { + deleteMany: {}, + }, + }, + }); + return { + ok: true, + message: "form deleted successfully", + }; + } catch { + throw new InternalServerErrorException(); + } + } + + private aggregateCountsByDay(responses: Insights[]) { + const aggregatedCounts = {}; + + responses.forEach((response) => { + // Extract the date part from createdAt + const date = new Date(response.createdAt).toISOString().split("T")[0]; + + // Initialize count for the day if not exists + if (!aggregatedCounts[date]) { + aggregatedCounts[date] = 0; + } + + // Add count to the existing count for the day + aggregatedCounts[date] += response._count; + }); + + return aggregatedCounts; + } } type Insights = { - _count: number; - createdAt: Date; + _count: number; + createdAt: Date; }; diff --git a/apps/api/src/services/org-member.service.ts b/apps/api/src/services/org-member.service.ts index 58f765ed..e1b43199 100644 --- a/apps/api/src/services/org-member.service.ts +++ b/apps/api/src/services/org-member.service.ts @@ -70,9 +70,8 @@ export class OrganizationMemberService { throw new NotFoundException({ ORG_MEMBER_NOT_FOUND, }); - } else { - return e; } + return e; } } @@ -102,9 +101,8 @@ export class OrganizationMemberService { throw new NotFoundException({ ROLE_UPDATE_FAILED, }); - } else { - return e; } + return e; } } } diff --git a/apps/api/src/services/stripe.service.ts b/apps/api/src/services/stripe.service.ts index e802ff7b..f88f8366 100644 --- a/apps/api/src/services/stripe.service.ts +++ b/apps/api/src/services/stripe.service.ts @@ -1,187 +1,186 @@ -import { Injectable } from '@nestjs/common'; -import type { Events } from '@prisma/client'; -import { ConfigService } from '@nestjs/config'; -import { PrismaService } from './prisma.service'; -import Stripe from 'stripe'; -import { EventEmitter2 } from '@nestjs/event-emitter'; +import { Injectable } from "@nestjs/common"; +import type { Events } from "@prisma/client"; +import { ConfigService } from "@nestjs/config"; +import { PrismaService } from "./prisma.service"; +import Stripe from "stripe"; +import { EventEmitter2 } from "@nestjs/event-emitter"; @Injectable() export class StripeService { - private stripe: Stripe; - - constructor( - private readonly configService: ConfigService, - private readonly eventEmitter: EventEmitter2, - private readonly prismaService: PrismaService, - ) { - this.initStripe(); - } - - initStripe() { - this.stripe = new Stripe( - this.configService.get('STRIPE_SECRET_KEY') as string, - { - apiVersion: '2023-10-16', - }, - ); - } - - async handleWebHookEvent(body, signature) { - try { - const event = this.stripe.webhooks.constructEvent( - body, - signature, - this.configService.get('STRIPE_WEBHOOK_SECRET') as string, - ); - if (event.type === 'payment_intent.created') { - const eventInfo = event.data.object.metadata; - const { event_id, user_id } = eventInfo; - if (!event_id || !user_id) { - throw new Error('Invalid metadata'); - } else { - const event = await this.prismaService.events.findUnique({ - where: { - id: event_id, - }, - }); - - await this.prismaService.events.update({ - where: { - id: event_id, - }, - data: { - Ticket: { - create: { - userUid: user_id, - }, - }, - maxTicketCount: event.maxTicketCount - 1, - }, - }); - - const user = await this.prismaService.user.findUnique({ - where: { - uid: user_id, - }, - }); - - this.eventEmitter.emit('payment.success', { - from: user.displayName ?? user.email.split('@')[0], - email: user.email, - amount: event.ticketPrice, - }); - } - } - } catch (e) { - console.log(e); - throw new Error('Failed to handle payments'); - } - } - - async createProductObject(event: Events): Promise { - try { - const product = await this.stripe.products.create({ - name: event.name, - description: event.name, - images: [event.coverImage], - shippable: false, - metadata: { - event_id: event.id, - }, - }); - - await this.prismaService.events.update({ - where: { - id: event.id, - }, - data: { - stripe_product_object: product.id, - }, - }); - - return product.id; - } catch (error) { - console.error('Stripe API Error:', error); - throw new Error('Failed to create product object'); - } - } - - async createProductPricingObject(event: Events): Promise { - try { - let stripe_product_object = ''; - if (!event.stripe_product_object) { - stripe_product_object = await this.createProductObject(event); - } else { - stripe_product_object = event.stripe_product_object; - } - const price = await this.stripe.prices.create({ - product: stripe_product_object, - unit_amount: event.ticketPrice * 100, // amount in inr , stripe default takes paisa in inr so we conver that to rupee - currency: 'inr', - }); - - await this.prismaService.events.update({ - where: { - id: event.id, - }, - data: { - stripe_price_object: price.id, - }, - }); - - return price.id; - } catch (error) { - console.error('Stripe API Error:', error); - throw new Error('Failed to create product pricing object'); - } - } - - async createCheckoutSession( - items: Events, - user: string, - ): Promise { - try { - const webUrl = this.configService.get('WEB_URL'); - // if there is already stripe_payment_object we will use it else we will create another one - let price_object = ''; - if (!items.stripe_price_object) { - price_object = await this.createProductPricingObject(items); - } else { - price_object = items.stripe_price_object; - } - - const session = await this.stripe.checkout.sessions.create({ - metadata: { - user_id: user, - event_id: items.id, - event_image: items.coverImage, - event_name: items.name, - }, - payment_method_types: ['card'], - line_items: [ - { - price: price_object, - quantity: 1, - // one user can only buy one ticket for now - }, - ], - mode: 'payment', - // might need to create a success page then redirect to tickets page - // biome-ignore lint/style/useTemplate: - success_url: webUrl + '/tickets', - // can show a toast in frontend - cancel_url: `${webUrl}/events?payment_error=true`, - }); - - return { sessionId: session.id, url: session.url }; - } catch (error) { - console.log('Stripe API Error:', error); - throw new Error('Failed to create checkout'); - } - } + private stripe: Stripe; + + constructor( + private readonly configService: ConfigService, + private readonly eventEmitter: EventEmitter2, + private readonly prismaService: PrismaService + ) { + this.initStripe(); + } + + initStripe() { + this.stripe = new Stripe( + this.configService.get("STRIPE_SECRET_KEY") as string, + { + apiVersion: "2023-10-16", + } + ); + } + + async handleWebHookEvent(body, signature) { + try { + const event = this.stripe.webhooks.constructEvent( + body, + signature, + this.configService.get("STRIPE_WEBHOOK_SECRET") as string + ); + if (event.type === "payment_intent.created") { + const eventInfo = event.data.object.metadata; + const { event_id, user_id } = eventInfo; + if (!event_id || !user_id) { + throw new Error("Invalid metadata"); + } + const event = await this.prismaService.events.findUnique({ + where: { + id: event_id, + }, + }); + + await this.prismaService.events.update({ + where: { + id: event_id, + }, + data: { + Ticket: { + create: { + userUid: user_id, + }, + }, + maxTicketCount: event.maxTicketCount - 1, + }, + }); + + const user = await this.prismaService.user.findUnique({ + where: { + uid: user_id, + }, + }); + + this.eventEmitter.emit("payment.success", { + from: user.displayName ?? user.email.split("@")[0], + email: user.email, + amount: event.ticketPrice, + }); + } + } catch (e) { + console.log(e); + throw new Error("Failed to handle payments"); + } + } + + async createProductObject(event: Events): Promise { + try { + const product = await this.stripe.products.create({ + name: event.name, + description: event.name, + images: [event.coverImage], + shippable: false, + metadata: { + event_id: event.id, + }, + }); + + await this.prismaService.events.update({ + where: { + id: event.id, + }, + data: { + stripe_product_object: product.id, + }, + }); + + return product.id; + } catch (error) { + console.error("Stripe API Error:", error); + throw new Error("Failed to create product object"); + } + } + + async createProductPricingObject(event: Events): Promise { + try { + let stripe_product_object = ""; + if (!event.stripe_product_object) { + stripe_product_object = await this.createProductObject(event); + } else { + stripe_product_object = event.stripe_product_object; + } + const price = await this.stripe.prices.create({ + product: stripe_product_object, + unit_amount: event.ticketPrice * 100, // amount in inr , stripe default takes paisa in inr so we conver that to rupee + currency: "inr", + }); + + await this.prismaService.events.update({ + where: { + id: event.id, + }, + data: { + stripe_price_object: price.id, + }, + }); + + return price.id; + } catch (error) { + console.error("Stripe API Error:", error); + throw new Error("Failed to create product pricing object"); + } + } + + async createCheckoutSession( + items: Events, + user: string + ): Promise { + try { + const webUrl = this.configService.get("WEB_URL"); + // if there is already stripe_payment_object we will use it else we will create another one + let price_object = ""; + if (!items.stripe_price_object) { + price_object = await this.createProductPricingObject(items); + } else { + price_object = items.stripe_price_object; + } + + const session = await this.stripe.checkout.sessions.create({ + metadata: { + user_id: user, + event_id: items.id, + event_image: items.coverImage, + event_name: items.name, + }, + payment_method_types: ["card"], + line_items: [ + { + price: price_object, + quantity: 1, + // one user can only buy one ticket for now + }, + ], + mode: "payment", + // might need to create a success page then redirect to tickets page + // biome-ignore lint/style/useTemplate: + success_url: webUrl + "/tickets", + // can show a toast in frontend + cancel_url: `${webUrl}/events?payment_error=true`, + }); + + return { sessionId: session.id, url: session.url }; + } catch (error) { + console.log("Stripe API Error:", error); + throw new Error("Failed to create checkout"); + } + } } type CheckOutReturnProp = { - sessionId: string; - url: string; + sessionId: string; + url: string; }; diff --git a/apps/api/src/services/user.service.ts b/apps/api/src/services/user.service.ts index 6a9a0095..b6ec4275 100644 --- a/apps/api/src/services/user.service.ts +++ b/apps/api/src/services/user.service.ts @@ -1,143 +1,143 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import type { Profile } from 'passport'; -import { USER_UPDATE_ERROR } from '../error'; -import { PrismaService } from './prisma.service'; -import type { UpdateUserDto } from './dto/update-user.dto'; -import type { User } from '@prisma/client'; -import { fakerEN } from '@faker-js/faker'; -import { EventEmitter2 } from '@nestjs/event-emitter'; -import { UserModel } from '@api/models/User'; -import { AccountModel } from '@api/models'; +import { Injectable, NotFoundException } from "@nestjs/common"; +import type { Profile } from "passport"; +import { USER_UPDATE_ERROR } from "../error"; +import { PrismaService } from "./prisma.service"; +import type { UpdateUserDto } from "./dto/update-user.dto"; +import type { User } from "@prisma/client"; +import { fakerEN } from "@faker-js/faker"; +import { EventEmitter2 } from "@nestjs/event-emitter"; +import { UserModel } from "@api/models/User"; +import { AccountModel } from "@api/models"; @Injectable() export class UserService { - constructor( - private readonly prismaService: PrismaService, - private readonly eventEmitter: EventEmitter2, - ) {} + constructor( + private readonly prismaService: PrismaService, + private readonly eventEmitter: EventEmitter2 + ) {} - async findUserBySlug(slug: string) { - try { - const user = await this.prismaService.user.findUnique({ - where: { - slug, - }, - }); - return user; - } catch (e) { - return null; - } - } + async findUserBySlug(slug: string) { + try { + const user = await this.prismaService.user.findUnique({ + where: { + slug, + }, + }); + return user; + } catch (e) { + return null; + } + } - async createOAuthUser( - accessToken: string, - refreshToken: string, - profile: Profile, - email: string, - ) { - const userDisplayName = profile.displayName ? profile.displayName : ''; - const userPhotoURL = profile.photos ? profile.photos[0].value : ''; + async createOAuthUser( + accessToken: string, + refreshToken: string, + profile: Profile, + email: string + ) { + const userDisplayName = profile.displayName ? profile.displayName : ""; + const userPhotoURL = profile.photos ? profile.photos[0].value : ""; - let slug: string; - while (true) { - slug = this.generateSlug(); - const user = await this.findUserBySlug(slug); - if (user) continue; - break; - } + let slug: string; + while (true) { + slug = this.generateSlug(); + const user = await this.findUserBySlug(slug); + if (user) continue; + break; + } - const user = await UserModel.insert({ - display_name: userDisplayName, - email, - photo_url: userPhotoURL, - slug, - refresh_token: '', - }); + const user = await UserModel.insert({ + display_name: userDisplayName, + email, + photo_url: userPhotoURL, + slug, + refresh_token: "", + }); - await AccountModel.insert({ - provider: profile.provider, - provider_account_id: profile.id, - provider_access_token: accessToken, - provider_refresh_token: refreshToken, - fk_user_id: user.id, - }); + await AccountModel.insert({ + provider: profile.provider, + provider_account_id: profile.id, + provider_access_token: accessToken, + provider_refresh_token: refreshToken, + fk_user_id: user.id, + }); - this.eventEmitter.emit('user.registered', { - email: user.email, - name: user.display_name, - avatarUrl: user.photo_url, - }); + this.eventEmitter.emit("user.registered", { + email: user.email, + name: user.display_name, + avatarUrl: user.photo_url, + }); - return user; - } + return user; + } - async findUserById(id: string) { - return await UserModel.findById(id); - } + async findUserById(id: string) { + return await UserModel.findById(id); + } - async updateUser(authUser: User, updateUserDto: UpdateUserDto) { - try { - const user = await this.prismaService.user.update({ - where: { - uid: authUser.uid, - }, - data: { - slug: updateUserDto.slug ? updateUserDto.slug : authUser.slug, - photoURL: updateUserDto.photoUrl - ? updateUserDto.photoUrl - : authUser.photoURL, - displayName: updateUserDto.displayName - ? updateUserDto.displayName - : authUser.displayName, - isStudent: updateUserDto.hasOwnProperty('isCollegeStudent') - ? updateUserDto.isCollegeStudent - : authUser.isStudent, - collegeName: updateUserDto.collegeName || authUser.collegeName, - }, - }); - return user; - } catch (error) { - return USER_UPDATE_ERROR; - } - } + async updateUser(authUser: User, updateUserDto: UpdateUserDto) { + try { + const user = await this.prismaService.user.update({ + where: { + uid: authUser.uid, + }, + data: { + slug: updateUserDto.slug ? updateUserDto.slug : authUser.slug, + photoURL: updateUserDto.photoUrl + ? updateUserDto.photoUrl + : authUser.photoURL, + displayName: updateUserDto.displayName + ? updateUserDto.displayName + : authUser.displayName, + isStudent: Object.hasOwn(updateUserDto, "isCollegeStudent") + ? updateUserDto.isCollegeStudent + : authUser.isStudent, + collegeName: updateUserDto.collegeName || authUser.collegeName, + }, + }); - async getReservedTickets(id: string) { - try { - const data = await this.prismaService.user.findUnique({ - where: { - uid: id, - }, + return user; + } catch (error) { + return USER_UPDATE_ERROR; + } + } - select: { - Ticket: { - select: { - event: true, - }, - }, - }, - }); + async getReservedTickets(id: string) { + try { + const data = await this.prismaService.user.findUnique({ + where: { + uid: id, + }, - if (!data) { - throw new NotFoundException(); - } - return { - ok: true, - message: 'Ticket found successfully', - data: data.Ticket.map((el) => el.event), - }; - } catch (e) { - if (e instanceof NotFoundException) { - throw new NotFoundException(); - } else { - return e; - } - } - } + select: { + Ticket: { + select: { + event: true, + }, + }, + }, + }); - private generateSlug() { - return fakerEN.lorem.slug({ - min: 1, - max: 2, - }); - } + if (!data) { + throw new NotFoundException(); + } + return { + ok: true, + message: "Ticket found successfully", + data: data.Ticket.map((el) => el.event), + }; + } catch (e) { + if (e instanceof NotFoundException) { + throw new NotFoundException(); + } + return e; + } + } + + private generateSlug() { + return fakerEN.lorem.slug({ + min: 1, + max: 2, + }); + } } diff --git a/apps/api/src/utils/hyphenate.ts b/apps/api/src/utils/hyphenate.ts index 74279f7c..4ffb0781 100644 --- a/apps/api/src/utils/hyphenate.ts +++ b/apps/api/src/utils/hyphenate.ts @@ -1 +1,3 @@ -export const hyphenete = (text: string) => text.trim().replace(/ /g, '-'); +export const hyphenate = (text: string): string => { + return text.trim().replace(/ /g, "-"); +}; From dbae8456476749a71260414ab4b7f58db732d2ba Mon Sep 17 00:00:00 2001 From: sreehari jayaraj Date: Fri, 7 Jun 2024 15:48:11 +0530 Subject: [PATCH 13/61] fix: removed stripe services --- apps/api/package.json | 2 - apps/api/src/controllers/form.controller.ts | 8 +- apps/api/src/controllers/stripe.controller.ts | 14 - apps/api/src/db/migrations/16.event-ticket.ts | 24 + apps/api/src/db/schema/event-ticket.ts | 3 + apps/api/src/db/schema/events.ts | 30 +- apps/api/src/main.ts | 66 +- apps/api/src/modules/root.module.ts | 266 +- apps/api/src/services/organization.service.ts | 51 +- apps/api/src/services/stripe.service.ts | 186 - apps/api/src/utils/envSchema.ts | 99 +- .../preloaders/components/OrgLoader.tsx | 19 +- apps/web/config/ENV.ts | 12 +- apps/web/next-env.d.ts | 5 + apps/web/next.config.js | 28 +- apps/web/pages/[org].tsx | 71 +- apps/web/pages/_app.tsx | 188 +- apps/web/pages/org/[id]/[pk]/form.tsx | 944 +- apps/web/pages/org/[id]/[pk]/tasks.tsx | 46 +- pnpm-lock.yaml | 30692 ++++++++-------- 20 files changed, 15926 insertions(+), 16828 deletions(-) delete mode 100644 apps/api/src/controllers/stripe.controller.ts create mode 100644 apps/api/src/db/migrations/16.event-ticket.ts delete mode 100644 apps/api/src/services/stripe.service.ts create mode 100644 apps/web/next-env.d.ts diff --git a/apps/api/package.json b/apps/api/package.json index f3e5d917..16bcfa76 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -6,12 +6,10 @@ "type": "commonjs", "scripts": { "prebuild": "rimraf dist", - "build": "npx prisma generate && nest build", "start": "nest start", "dev": "node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty", "dev-new": "concurrently \"tsc --noEmit --watch\" \"node -r '@swc-node/register' --watch --enable-source-maps src/main.ts | pino-pretty \"", "start:prod": "node dist/main", - "db:seed": "ts-node prisma/seed.ts", "lint": "biome lint --error-on-warnings ./src", "format": "npx @biomejs/biome format ./src" }, diff --git a/apps/api/src/controllers/form.controller.ts b/apps/api/src/controllers/form.controller.ts index b7061a2c..50f45f00 100644 --- a/apps/api/src/controllers/form.controller.ts +++ b/apps/api/src/controllers/form.controller.ts @@ -23,7 +23,7 @@ import { AuthUser } from "../services/auth/decorators/user.decorator"; import { ZodValidator } from "@api/validation/zod.validation.decorator"; import { Role } from "@api/utils/db"; import { EventTicketModel } from "@api/models"; -import type { User } from "@prisma/client"; +import { User } from "@api/db/schema"; import type { ToggleFormPublishStatus } from "../services/dto/publish-form.dto"; @Controller("/events") @@ -56,10 +56,12 @@ export class FormController { fk_event_id: eventId, }); if (!event || event?.price > 0) { + // temporary we dont support paid event + // @reenphygeorge throw new NotFoundException(); } - await this.form.addUserFormSubmission(data, eventId, user.uid); - return await this.events.registerEvent(event.slug, user.uid); + await this.form.addUserFormSubmission(data, eventId, user.id); + return await this.events.registerEvent(event.slug, user.id); } catch (e) { if (e instanceof NotFoundException) throw new NotFoundException(); diff --git a/apps/api/src/controllers/stripe.controller.ts b/apps/api/src/controllers/stripe.controller.ts deleted file mode 100644 index 85e1a9af..00000000 --- a/apps/api/src/controllers/stripe.controller.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Body, Controller, Post, Headers } from '@nestjs/common'; -import { StripeService } from '../services/stripe.service'; - -@Controller('payment/webhook') -export class StripeController { - constructor(private readonly stripeService: StripeService) {} - - @Post('/') - async handleWebHook(@Body() data, @Headers() head) { - const signature = head['stripe-signature'] as string; - - return await this.stripeService.handleWebHookEvent(data, signature); - } -} diff --git a/apps/api/src/db/migrations/16.event-ticket.ts b/apps/api/src/db/migrations/16.event-ticket.ts new file mode 100644 index 00000000..8142f8cf --- /dev/null +++ b/apps/api/src/db/migrations/16.event-ticket.ts @@ -0,0 +1,24 @@ +import type { Knex } from "knex"; +import { SystemTable } from "../../utils/db"; + +export async function up(knex: Knex): Promise { + const isTableExists = await knex.schema.hasTable(SystemTable.EventTicket); + + if (isTableExists) { + await knex.schema.alterTable(SystemTable.EventTicket, (table) => { + table.string("fk_user_id"); + }); + } +} + +export async function down(knex: Knex): Promise { + return knex.schema.table(SystemTable.EventTicket, () => { + knex.schema + .hasColumn(SystemTable.EventTicket, "fk_user_id") + .then((exist) => { + knex.schema.table(SystemTable.EventTicket, (t) => + t.dropColumn("fk_user_id") + ); + }); + }); +} diff --git a/apps/api/src/db/schema/event-ticket.ts b/apps/api/src/db/schema/event-ticket.ts index afde4ff8..4677b23a 100644 --- a/apps/api/src/db/schema/event-ticket.ts +++ b/apps/api/src/db/schema/event-ticket.ts @@ -6,6 +6,9 @@ export const EventTicketSchema = z.object({ fk_event_id: z.string().length(25), + // id of the user who is registering + fk_user_id: z.string(), + name: z.string().min(3).max(255), description: z.string(), diff --git a/apps/api/src/db/schema/events.ts b/apps/api/src/db/schema/events.ts index 8770daf5..3157249e 100644 --- a/apps/api/src/db/schema/events.ts +++ b/apps/api/src/db/schema/events.ts @@ -1,32 +1,32 @@ -import type { SystemFields } from '../../utils/db'; -import { z } from 'zod'; +import type { SystemFields } from "../../utils/db"; +import { z } from "zod"; export const EventSchema = z.object({ - id: z.string().length(25), + id: z.string().length(25), - name: z.string().min(3).max(255), + name: z.string().min(3).max(255), - slug: z.string().min(3).max(255), + slug: z.string().min(3).max(255), - fk_organization_id: z.string().length(25), + fk_organization_id: z.string().length(25), - description: z.string().optional(), + description: z.string().optional(), - website: z.string().url().optional(), + website: z.string().url().optional(), - cover_image: z.string().url().optional(), + cover_image: z.string().url().optional(), - location: z.string().min(3).max(255), + location: z.string().min(3).max(255), - event_date: z.date(), + event_date: z.date(), - is_published: z.boolean().default(false), + is_published: z.boolean().default(false), - is_deleted: z.boolean().default(false), + is_deleted: z.boolean().default(false), - created_at: z.date(), + created_at: z.date(), - updated_at: z.date(), + updated_at: z.date(), }); export type Event = z.infer; diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 3b28162a..abb4c2ac 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -1,48 +1,44 @@ -import * as session from 'express-session'; -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; -import * as cookieParser from 'cookie-parser'; -import * as express from 'express'; -import { ValidationPipe } from '@nestjs/common'; -import BaseContext from '@api/BaseContext'; -import { NestExpressApplication } from '@nestjs/platform-express'; -import { GlobalErrorFilter } from '@api/filters/global-error.filter'; -import { ConfigService } from '@nestjs/config'; +import * as session from "express-session"; +import { NestFactory } from "@nestjs/core"; +import { AppModule } from "./app.module"; +import * as cookieParser from "cookie-parser"; +import { ValidationPipe } from "@nestjs/common"; +import BaseContext from "@api/BaseContext"; +import { NestExpressApplication } from "@nestjs/platform-express"; +import { GlobalErrorFilter } from "@api/filters/global-error.filter"; +import { ConfigService } from "@nestjs/config"; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule); - const configService = app.get(ConfigService); + const configService = app.get(ConfigService); - await BaseContext.init(configService); + await BaseContext.init(configService); - app.use( - session({ - secret: configService.get('SESSION_SECRET'), - resave: false, - saveUninitialized: false, - }), - ); - app.use(cookieParser()); + app.use( + session({ + secret: configService.get("SESSION_SECRET"), + resave: false, + saveUninitialized: false, + }) + ); + app.use(cookieParser()); - app.useGlobalPipes(new ValidationPipe()); + app.useGlobalPipes(new ValidationPipe()); - app.useGlobalFilters(new GlobalErrorFilter()); + app.useGlobalFilters(new GlobalErrorFilter()); - // prevent body parsing in stripe webhook route to access the stripe signature as buffer - app.use('/api/payment/webhook', express.raw({ type: '*/*' })); + app.setGlobalPrefix("api"); - app.setGlobalPrefix('api'); + app.enableCors({ + origin: configService.get("CLIENT_URL"), + credentials: true, + }); - app.enableCors({ - origin: configService.get('CLIENT_URL'), - credentials: true, - }); - - await app.listen( - configService.get('PORT') as number, - configService.get('HOST'), - ); + await app.listen( + configService.get("PORT") as number, + configService.get("HOST") + ); } bootstrap(); diff --git a/apps/api/src/modules/root.module.ts b/apps/api/src/modules/root.module.ts index 0fa067ba..a9bab7be 100644 --- a/apps/api/src/modules/root.module.ts +++ b/apps/api/src/modules/root.module.ts @@ -1,148 +1,144 @@ -import { Module } from '@nestjs/common'; -import { EventEmitterModule } from '@nestjs/event-emitter'; -import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; -import { ConfigModule, ConfigService } from '@nestjs/config'; -import { LoggerModule } from 'nestjs-pino'; -import { APP_GUARD } from '@nestjs/core'; -import { AuthController } from '../controllers/auth.controller'; -import { AuthService } from '../services/auth/auth.service'; -import { GithubStrategy } from '../services/auth/strategy/github.strategy'; -import { GoogleStrategy } from '../services/auth/strategy/google.strategy'; -import { UserService } from '../services/user.service'; -import { JwtStrategy } from '../services/auth/strategy/jwt.strategy'; -import { RefreshStrategy } from '../services/auth/strategy/refresh.strategy'; -import { PassportModule } from '@nestjs/passport'; -import { JwtModule } from '@nestjs/jwt'; -import { AiController } from '../controllers/ai.controller'; -import { AiService } from '../services/ai.service'; -import { S3Service } from '../services/cloud.service'; -import { EventsController } from '../controllers/events.controller'; -import { StripeService } from '../services/stripe.service'; -import { EventsService } from '../services/events.service'; -import { FormService } from '../services/form.service'; -import { FormController } from '../controllers/form.controller'; -import { KanbanService } from '../services/kanban.service'; -import { KanbanController } from '../controllers/kanban.controller'; -import { MailService } from '../services/mail/mail.service'; -import { MailerModule } from '@nestjs-modules/mailer'; -import { join } from 'node:path'; -import { ReactAdapter } from '@webtre/nestjs-mailer-react-adapter'; -import { OrganizationInviteService } from '../services/org-invite.service'; -import { OrgInviteController } from '../controllers/org-invite.controller'; -import { OrgMemberController } from '../controllers/org-member.controller'; -import { OrganizationMemberService } from '../services/org-member.service'; -import { OrganizationService } from '../services/organization.service'; -import { OrganizationController } from '../controllers/organization.controller'; -import { PrismaService } from '../services/prisma.service'; -import { StripeController } from '../controllers/stripe.controller'; -import { UserController } from '../controllers/user.controller'; -import { envSchema, parsedEnv } from '@api/utils/envSchema'; +import { Module } from "@nestjs/common"; +import { EventEmitterModule } from "@nestjs/event-emitter"; +import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler"; +import { ConfigModule, ConfigService } from "@nestjs/config"; +import { LoggerModule } from "nestjs-pino"; +import { APP_GUARD } from "@nestjs/core"; +import { AuthController } from "../controllers/auth.controller"; +import { AuthService } from "../services/auth/auth.service"; +import { GithubStrategy } from "../services/auth/strategy/github.strategy"; +import { GoogleStrategy } from "../services/auth/strategy/google.strategy"; +import { UserService } from "../services/user.service"; +import { JwtStrategy } from "../services/auth/strategy/jwt.strategy"; +import { RefreshStrategy } from "../services/auth/strategy/refresh.strategy"; +import { PassportModule } from "@nestjs/passport"; +import { JwtModule } from "@nestjs/jwt"; +import { AiController } from "../controllers/ai.controller"; +import { AiService } from "../services/ai.service"; +import { S3Service } from "../services/cloud.service"; +import { EventsController } from "../controllers/events.controller"; +import { EventsService } from "../services/events.service"; +import { FormService } from "../services/form.service"; +import { FormController } from "../controllers/form.controller"; +import { KanbanService } from "../services/kanban.service"; +import { KanbanController } from "../controllers/kanban.controller"; +import { MailService } from "../services/mail/mail.service"; +import { MailerModule } from "@nestjs-modules/mailer"; +import { join } from "node:path"; +import { ReactAdapter } from "@webtre/nestjs-mailer-react-adapter"; +import { OrganizationInviteService } from "../services/org-invite.service"; +import { OrgInviteController } from "../controllers/org-invite.controller"; +import { OrgMemberController } from "../controllers/org-member.controller"; +import { OrganizationMemberService } from "../services/org-member.service"; +import { OrganizationService } from "../services/organization.service"; +import { OrganizationController } from "../controllers/organization.controller"; +import { PrismaService } from "../services/prisma.service"; +import { UserController } from "../controllers/user.controller"; +import { envSchema } from "@api/utils/envSchema"; const AuthProviders = [ - AuthService, - GithubStrategy, - GoogleStrategy, - UserService, - JwtStrategy, - RefreshStrategy, + AuthService, + GithubStrategy, + GoogleStrategy, + UserService, + JwtStrategy, + RefreshStrategy, ]; const AuthModules = [ - PassportModule, - JwtModule.registerAsync({ - useFactory: async (configService: ConfigService) => ({ - secret: configService.get('JWT_SECRET'), - signOptions: { expiresIn: configService.get('ACCESS_TOKEN_VALIDITY') }, - }), - inject: [ConfigService], - }), + PassportModule, + JwtModule.registerAsync({ + useFactory: async (configService: ConfigService) => ({ + secret: configService.get("JWT_SECRET"), + signOptions: { expiresIn: configService.get("ACCESS_TOKEN_VALIDITY") }, + }), + inject: [ConfigService], + }), ]; const GlobalModules = [ - ConfigModule.forRoot({ - isGlobal: true, - validate: envSchema.parse, - validationOptions: { - abortEarly: true, - }, - }), - EventEmitterModule.forRoot(), - ThrottlerModule.forRoot([ - { - ttl: 60000, - limit: 50, - }, - ]), - LoggerModule.forRoot({ - pinoHttp: { - level: 'error', - redact: ['req.headers', 'req.remoteAddress', 'res.headers'], - }, - }), - MailerModule.forRootAsync({ - useFactory: async (configService: ConfigService) => ({ - transport: { - host: configService.get('MAIL_HOST'), - port: configService.get('MAIL_PORT'), - secure: false, - auth: { - user: configService.get('MAIL_USER'), - pass: configService.get('MAIL_PASSWORD'), - }, - tls: { - rejectUnauthorized: false, - }, - }, - defaults: { - from: configService.get('MAIL_FROM'), - }, - template: { - dir: join(__dirname, 'templates'), - adapter: new ReactAdapter({ - pretty: false, - plainText: false, - }), - options: { - strict: true, - }, - }, - }), - inject: [ConfigService], - }), + ConfigModule.forRoot({ + isGlobal: true, + validate: envSchema.parse, + validationOptions: { + abortEarly: true, + }, + }), + EventEmitterModule.forRoot(), + ThrottlerModule.forRoot([ + { + ttl: 60000, + limit: 50, + }, + ]), + LoggerModule.forRoot({ + pinoHttp: { + level: "error", + redact: ["req.headers", "req.remoteAddress", "res.headers"], + }, + }), + MailerModule.forRootAsync({ + useFactory: async (configService: ConfigService) => ({ + transport: { + host: configService.get("MAIL_HOST"), + port: configService.get("MAIL_PORT"), + secure: false, + auth: { + user: configService.get("MAIL_USER"), + pass: configService.get("MAIL_PASSWORD"), + }, + tls: { + rejectUnauthorized: false, + }, + }, + defaults: { + from: configService.get("MAIL_FROM"), + }, + template: { + dir: join(__dirname, "templates"), + adapter: new ReactAdapter({ + pretty: false, + plainText: false, + }), + options: { + strict: true, + }, + }, + }), + inject: [ConfigService], + }), ]; @Module({ - imports: [...GlobalModules, ...AuthModules], - controllers: [ - AuthController, - AiController, - EventsController, - FormController, - KanbanController, - OrgInviteController, - OrgMemberController, - OrganizationController, - StripeController, - UserController, - ], - providers: [ - { - provide: APP_GUARD, - useClass: ThrottlerGuard, - }, - ...AuthProviders, - AiService, - S3Service, - StripeService, - EventsService, - FormService, - KanbanService, - MailService, - OrganizationInviteService, - OrganizationMemberService, - OrganizationService, - PrismaService, - UserService, - ], + imports: [...GlobalModules, ...AuthModules], + controllers: [ + AuthController, + AiController, + EventsController, + FormController, + KanbanController, + OrgInviteController, + OrgMemberController, + OrganizationController, + UserController, + ], + providers: [ + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, + ...AuthProviders, + AiService, + S3Service, + EventsService, + FormService, + KanbanService, + MailService, + OrganizationInviteService, + OrganizationMemberService, + OrganizationService, + PrismaService, + UserService, + ], }) export class RootModule {} diff --git a/apps/api/src/services/organization.service.ts b/apps/api/src/services/organization.service.ts index 8c664291..44b716ab 100644 --- a/apps/api/src/services/organization.service.ts +++ b/apps/api/src/services/organization.service.ts @@ -1,9 +1,15 @@ -import { Role } from "@api/utils/db"; -import { Injectable, NotFoundException } from "@nestjs/common"; +import { Role, SystemTable } from "@api/utils/db"; +import { + Injectable, + InternalServerErrorException, + NotFoundException, +} from "@nestjs/common"; import { PrismaService } from "./prisma.service"; import { ORG_EXISTS, ORG_NOT_FOUND } from "../error"; import type { CreateOrgDto } from "./dto/create-org.dto"; import type { UpdateOrgDto } from "./dto/update-org.dto"; +import { OrgMemberModel, OrgModel } from "@api/models"; +import BaseContext from "@api/BaseContext"; @Injectable() export class OrganizationService { @@ -13,22 +19,37 @@ export class OrganizationService { try { const { name, slug } = createOrgDto; - const org = await this.prismaService.organization.create({ - data: { - name, - slug, - members: { - create: { - role: "ADMIN", - userUid: uid, - }, - }, - }, + const newOrg = await OrgModel.insert({ + name, + slug, }); - return org; + await OrgMemberModel.insert({ + fk_organization_id: newOrg.id, + fk_user_id: uid, + role: Role.ADMIN, + }); + + const getOrgWithMemberInfo = BaseContext.knex(SystemTable.Org) + .select("*") + .where({ + name, + }) + .leftJoin( + SystemTable.Org, + `${SystemTable.Org}.id`, + `${SystemTable.OrgMember}.fk_organization_id` + ); + + return getOrgWithMemberInfo; } catch (error) { - return ORG_EXISTS; + if (error instanceof NotFoundException) { + throw new NotFoundException(); + } + + throw new InternalServerErrorException({ + error, + }); } } diff --git a/apps/api/src/services/stripe.service.ts b/apps/api/src/services/stripe.service.ts deleted file mode 100644 index f88f8366..00000000 --- a/apps/api/src/services/stripe.service.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import type { Events } from "@prisma/client"; -import { ConfigService } from "@nestjs/config"; -import { PrismaService } from "./prisma.service"; -import Stripe from "stripe"; -import { EventEmitter2 } from "@nestjs/event-emitter"; - -@Injectable() -export class StripeService { - private stripe: Stripe; - - constructor( - private readonly configService: ConfigService, - private readonly eventEmitter: EventEmitter2, - private readonly prismaService: PrismaService - ) { - this.initStripe(); - } - - initStripe() { - this.stripe = new Stripe( - this.configService.get("STRIPE_SECRET_KEY") as string, - { - apiVersion: "2023-10-16", - } - ); - } - - async handleWebHookEvent(body, signature) { - try { - const event = this.stripe.webhooks.constructEvent( - body, - signature, - this.configService.get("STRIPE_WEBHOOK_SECRET") as string - ); - if (event.type === "payment_intent.created") { - const eventInfo = event.data.object.metadata; - const { event_id, user_id } = eventInfo; - if (!event_id || !user_id) { - throw new Error("Invalid metadata"); - } - const event = await this.prismaService.events.findUnique({ - where: { - id: event_id, - }, - }); - - await this.prismaService.events.update({ - where: { - id: event_id, - }, - data: { - Ticket: { - create: { - userUid: user_id, - }, - }, - maxTicketCount: event.maxTicketCount - 1, - }, - }); - - const user = await this.prismaService.user.findUnique({ - where: { - uid: user_id, - }, - }); - - this.eventEmitter.emit("payment.success", { - from: user.displayName ?? user.email.split("@")[0], - email: user.email, - amount: event.ticketPrice, - }); - } - } catch (e) { - console.log(e); - throw new Error("Failed to handle payments"); - } - } - - async createProductObject(event: Events): Promise { - try { - const product = await this.stripe.products.create({ - name: event.name, - description: event.name, - images: [event.coverImage], - shippable: false, - metadata: { - event_id: event.id, - }, - }); - - await this.prismaService.events.update({ - where: { - id: event.id, - }, - data: { - stripe_product_object: product.id, - }, - }); - - return product.id; - } catch (error) { - console.error("Stripe API Error:", error); - throw new Error("Failed to create product object"); - } - } - - async createProductPricingObject(event: Events): Promise { - try { - let stripe_product_object = ""; - if (!event.stripe_product_object) { - stripe_product_object = await this.createProductObject(event); - } else { - stripe_product_object = event.stripe_product_object; - } - const price = await this.stripe.prices.create({ - product: stripe_product_object, - unit_amount: event.ticketPrice * 100, // amount in inr , stripe default takes paisa in inr so we conver that to rupee - currency: "inr", - }); - - await this.prismaService.events.update({ - where: { - id: event.id, - }, - data: { - stripe_price_object: price.id, - }, - }); - - return price.id; - } catch (error) { - console.error("Stripe API Error:", error); - throw new Error("Failed to create product pricing object"); - } - } - - async createCheckoutSession( - items: Events, - user: string - ): Promise { - try { - const webUrl = this.configService.get("WEB_URL"); - // if there is already stripe_payment_object we will use it else we will create another one - let price_object = ""; - if (!items.stripe_price_object) { - price_object = await this.createProductPricingObject(items); - } else { - price_object = items.stripe_price_object; - } - - const session = await this.stripe.checkout.sessions.create({ - metadata: { - user_id: user, - event_id: items.id, - event_image: items.coverImage, - event_name: items.name, - }, - payment_method_types: ["card"], - line_items: [ - { - price: price_object, - quantity: 1, - // one user can only buy one ticket for now - }, - ], - mode: "payment", - // might need to create a success page then redirect to tickets page - // biome-ignore lint/style/useTemplate: - success_url: webUrl + "/tickets", - // can show a toast in frontend - cancel_url: `${webUrl}/events?payment_error=true`, - }); - - return { sessionId: session.id, url: session.url }; - } catch (error) { - console.log("Stripe API Error:", error); - throw new Error("Failed to create checkout"); - } - } -} - -type CheckOutReturnProp = { - sessionId: string; - url: string; -}; diff --git a/apps/api/src/utils/envSchema.ts b/apps/api/src/utils/envSchema.ts index b8d9acb9..64f8bc08 100644 --- a/apps/api/src/utils/envSchema.ts +++ b/apps/api/src/utils/envSchema.ts @@ -1,48 +1,57 @@ -import { z } from 'zod'; +import { z } from "zod"; export const envSchema = z.object({ - DATABASE_URL: z - .string({ - required_error: 'DATABASE_URL is required in the environment variables', - }) - .default('postgres://fossfolio:fossfolio@localhost:5432/fossfolio'), - GITHUB_CLIENT_ID: z.string(), - GITHUB_CLIENT_SECRET: z.string(), - GITHUB_CALLBACK_URL: z.string().url(), - GITHUB_SCOPE: z.string().default('user:email'), - ACCESS_TOKEN_VALIDITY: z.string().default('10h'), - API_BASE_URL: z.string().default('http://localhost:8000'), - GOOGLE_CLIENT_ID: z.string(), - GOOGLE_CLIENT_SECRET: z.string(), - GOOGLE_CALLBACK_URL: z.string().url(), - GOOGLE_SCOPE: z.string().default('profile,email'), - - WEB_URL: z.string().default('http://localhost:3000'), - - MAIL_HOST: z.string(), - MAIL_PORT: z.string().default('587'), - MAIL_USER: z.string(), - MAIL_PASSWORD: z.string(), - - AWS_ACCESS_KEY: z.string(), - AWS_SECRET_KEY: z.string(), - AWS_REGION: z.string(), - - STRIPE_SECRET_KEY: z.string(), - STRIPE_WEBHOOK_SECRET: z.string(), - - JWT_SECRET: z.string(), - - AI_KEY: z.string(), - - NODE_ENV: z.string().default('development'), - - HOST: z.string().default('0.0.0.0'), - PORT: z.number().default(8080), - - DB_HOST: z.string().default('localhost'), - DB_USER: z.string().default('fossfolio'), - DB_PASSWORD: z.string().default('fossfolio'), - DB_NAME: z.string().default('fossfolio'), - DB_PORT: z.string().default('5432'), + DATABASE_URL: z + .string({ + required_error: "DATABASE_URL is required in the environment variables", + }) + .default("postgres://fossfolio:fossfolio@localhost:5432/fossfolio"), + GITHUB_CLIENT_ID: z.string(), + GITHUB_CLIENT_SECRET: z.string(), + GITHUB_CALLBACK_URL: z.string().url(), + GITHUB_SCOPE: z.string().default("user:email"), + ACCESS_TOKEN_VALIDITY: z.string().default("10h"), + API_BASE_URL: z.string().default("http://localhost:8000"), + GOOGLE_CLIENT_ID: z.string(), + GOOGLE_CLIENT_SECRET: z.string(), + GOOGLE_CALLBACK_URL: z.string().url(), + GOOGLE_SCOPE: z.string().default("profile,email"), + + WEB_URL: z.string().default("http://localhost:3000"), + + MAIL_HOST: z.string(), + MAIL_PORT: z.string().default("587"), + MAIL_USER: z.string(), + MAIL_PASSWORD: z.string(), + + AWS_ACCESS_KEY: z.string(), + AWS_SECRET_KEY: z.string(), + AWS_REGION: z.string(), + + STRIPE_SECRET_KEY: z.string(), + STRIPE_WEBHOOK_SECRET: z.string(), + + JWT_SECRET: z.string(), + + AI_KEY: z.string(), + + NODE_ENV: z.string().default("development"), + + HOST: z.string().default("0.0.0.0"), + PORT: z + .string() + .refine( + (v) => { + const n = Number(v); + return !Number.isNaN(n) && v?.length > 0; + }, + { message: "Invalid PORT number" } + ) + .default("8080"), + + DB_HOST: z.string().default("localhost"), + DB_USER: z.string().default("fossfolio"), + DB_PASSWORD: z.string().default("fossfolio"), + DB_NAME: z.string().default("fossfolio"), + DB_PORT: z.string().default("5432"), }); diff --git a/apps/web/components/preloaders/components/OrgLoader.tsx b/apps/web/components/preloaders/components/OrgLoader.tsx index 0585b3f5..80aa7404 100644 --- a/apps/web/components/preloaders/components/OrgLoader.tsx +++ b/apps/web/components/preloaders/components/OrgLoader.tsx @@ -1,11 +1,14 @@ -import { Skeleton } from '@app/ui/components/skeleton'; +import { Skeleton } from "@app/ui/components/skeleton"; export const OrgLoader = () => { - return ( - <> - {new Array(9).fill(0).map(() => ( - - ))} - - ); + return ( + <> + {new Array(9).fill(0).map((_, index) => ( + + ))} + + ); }; diff --git a/apps/web/config/ENV.ts b/apps/web/config/ENV.ts index 8d4575ba..835ab446 100644 --- a/apps/web/config/ENV.ts +++ b/apps/web/config/ENV.ts @@ -1,6 +1,10 @@ export const ENV = { - api_base: process.env.NEXT_PUBLIC_API_URL + '/api' || 'http://localhost:3001/api', - web_base_url: process.env.NEXT_PUBLIC_WEBSITE_DOMAIN || 'http://localhost:3000', - aws_access_key: process.env.AWS_ACCESS_KEY, - aws_secret_key: process.env.AWS_SECRET_KEY, + api_base: + process.env.NEXT_PUBLIC_API_URL + "/api" || "http://localhost:3001/api", + web_base_url: + process.env.NEXT_PUBLIC_WEBSITE_DOMAIN || "http://localhost:3000", + aws_access_key: process.env.AWS_ACCESS_KEY, + aws_secret_key: process.env.AWS_SECRET_KEY, + post_hog_key: process.env.NEXT_PUBLIC_POSTHOG_KEY, + post_hog_host: process.env.NEXT_PUBLIC_POSTHOG_HOST, }; diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts new file mode 100644 index 00000000..4f11a03d --- /dev/null +++ b/apps/web/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 3a273ae7..c423f4c5 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,19 +1,19 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - reactStrictMode: true, - swcMinify: true, - typescript: { - ignoreBuildErrors: true, - }, - images: { - domains: [ - 'img.freepik.com', - 'fossfolio.s3.amazonaws.com', - 'loremflickr.com', - 'picsum.photos', - 'fossfolio.s3.us-east-1.amazonaws.com', - ], - }, + reactStrictMode: true, + swcMinify: true, + typescript: { + ignoreBuildErrors: true, + }, + images: { + domains: [ + "img.freepik.com", + "fossfolio.s3.amazonaws.com", + "loremflickr.com", + "picsum.photos", + "fossfolio.s3.us-east-1.amazonaws.com", + ], + }, }; module.exports = nextConfig; diff --git a/apps/web/pages/[org].tsx b/apps/web/pages/[org].tsx index cc4959c5..5a60c995 100644 --- a/apps/web/pages/[org].tsx +++ b/apps/web/pages/[org].tsx @@ -1,45 +1,46 @@ -import { EventCard, NoData, PreLoader } from '@app/components/events'; -import { usePublicOrgEvents } from '@app/hooks/api/Events'; -import { HomeLayout } from '@app/layout'; -import { NextPageWithLayout } from 'next'; +import { EventCard, NoData, PreLoader } from "@app/components/events"; +import { usePublicOrgEvents } from "@app/hooks/api/Events"; +import { HomeLayout } from "@app/layout"; +import { NextPageWithLayout } from "next"; const Event: NextPageWithLayout = () => { - const { data, isLoading } = usePublicOrgEvents(); + const { data, isLoading } = usePublicOrgEvents(); - if (isLoading) { - return ; - } - - if (data?.data.events.length === 0) { - return ( -
-

Find Events

-
- -
-
- ); - } + if (isLoading) { + return ; + } + if (data?.data.events.length === 0) { return ( -
-

{data?.data.name.toUpperCase()}

-
- {data?.data.events.map((el) => ( - - ))} -
+
+

Find Events

+
+
+
); + } + + return ( +
+

{data?.data.name.toUpperCase()}

+
+ {data?.data.events.map((el) => ( + + ))} +
+
+ ); }; Event.Layout = HomeLayout; diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx index e51f0b14..26bca944 100644 --- a/apps/web/pages/_app.tsx +++ b/apps/web/pages/_app.tsx @@ -1,115 +1,115 @@ -import 'nprogress/nprogress.css'; -import React, { useEffect } from 'react'; -import { useRouter } from 'next/router'; -import { DefaultSeo } from 'next-seo'; -import { Toaster } from 'sonner'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import type { AppProps } from 'next/app'; -import { Inter } from 'next/font/google'; -import NProgress from 'nprogress'; -import { Child } from '@app/types'; -import '../theme/style.css'; -import { AuthContext, AuthGuard } from '@app/context/Auth'; -import posthog from 'posthog-js'; -import { PostHogProvider } from 'posthog-js/react'; -import { Analytics } from '@vercel/analytics/react'; +import "nprogress/nprogress.css"; +import React, { useEffect } from "react"; +import { useRouter } from "next/router"; +import { DefaultSeo } from "next-seo"; +import { Toaster } from "sonner"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import type { AppProps } from "next/app"; +import { Inter } from "next/font/google"; +import NProgress from "nprogress"; +import { Child } from "@app/types"; +import "../theme/style.css"; +import { AuthContext, AuthGuard } from "@app/context/Auth"; +import posthog from "posthog-js"; +import { PostHogProvider } from "posthog-js/react"; +import { Analytics } from "@vercel/analytics/react"; +import { ENV } from "@app/config"; type ComponentWithPageLayout = AppProps & { - Component: AppProps['Component'] & { - Layout?: (arg: Child) => JSX.Element; - RequireAuth: boolean; - }; + Component: AppProps["Component"] & { + Layout?: (arg: Child) => JSX.Element; + RequireAuth: boolean; + }; }; -const inter = Inter({ subsets: ['latin'] }); +const inter = Inter({ subsets: ["latin"] }); export const queryClient = new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, - retry: 1, - }, + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + retry: 1, }, + }, }); -if (typeof window !== 'undefined') { - // checks that we are client-side - posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY, { - api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://us.i.posthog.com', - loaded: (posthog) => { - if (process.env.NODE_ENV === 'development') posthog.debug(); - }, - }); +if (typeof window !== "undefined") { + posthog.init(ENV.post_hog_key, { + api_host: ENV.post_hog_host || "https://us.i.posthog.com", + loaded: (posthog) => { + if (process.env.NODE_ENV === "development") posthog.debug(); + }, + }); } const MyApp = ({ Component, pageProps }: ComponentWithPageLayout) => { - const router = useRouter(); + const router = useRouter(); - useEffect(() => { - const handleStart = () => NProgress.start(); + useEffect(() => { + const handleStart = () => NProgress.start(); - const handleStop = () => NProgress.done(); + const handleStop = () => NProgress.done(); - router.events.on('routeChangeStart', handleStart); - router.events.on('routeChangeComplete', handleStop); - router.events.on('routeChangeError', handleStop); + router.events.on("routeChangeStart", handleStart); + router.events.on("routeChangeComplete", handleStop); + router.events.on("routeChangeError", handleStop); - return () => { - router.events.off('routeChangeStart', handleStart); - router.events.off('routeChangeComplete', handleStop); - router.events.off('routeChangeError', handleStop); - }; - }, [router]); + return () => { + router.events.off("routeChangeStart", handleStart); + router.events.off("routeChangeComplete", handleStop); + router.events.off("routeChangeError", handleStop); + }; + }, [router]); - if (Component.RequireAuth) { - return ( - -
- - - - - - {Component.Layout ? ( - - - - ) : ( - - )} - - - - -
-
- ); - } + if (Component.RequireAuth) { return ( - -
- - - - - {Component.Layout ? ( - - - - ) : ( - - )} - - - -
-
+ +
+ + + + + + {Component.Layout ? ( + + + + ) : ( + + )} + + + + +
+
); + } + return ( + +
+ + + + + {Component.Layout ? ( + + + + ) : ( + + )} + + + +
+
+ ); }; export default MyApp; diff --git a/apps/web/pages/org/[id]/[pk]/form.tsx b/apps/web/pages/org/[id]/[pk]/form.tsx index f63974ad..2311b801 100644 --- a/apps/web/pages/org/[id]/[pk]/form.tsx +++ b/apps/web/pages/org/[id]/[pk]/form.tsx @@ -1,513 +1,515 @@ -import { NextPageWithLayout } from 'next'; -import { DashboardLayout } from '@app/layout'; -import { Button } from '@app/components/ui/Button'; -import { Input } from '@app/ui/components/input'; -import { Separator } from '@app/ui/components/separator'; -import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@app/ui/components/card'; +import { NextPageWithLayout } from "next"; +import { DashboardLayout } from "@app/layout"; +import { Button } from "@app/components/ui/Button"; +import { Input } from "@app/ui/components/input"; +import { Separator } from "@app/ui/components/separator"; import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@app/ui/components/select'; + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@app/ui/components/card"; import { - Form as FormProvider, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from '@app/ui/components/form'; -import { Checkbox } from '@app/ui/components/checkbox'; -import { IFormInput, InputOption, SchemaPreview } from '@app/views/form'; -import * as yup from 'yup'; -import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form'; -import { yupResolver } from '@hookform/resolvers/yup'; -import { apiHandler } from '@app/config'; -import { useRouter } from 'next/router'; -import { useEvent, useFormSchema } from '@app/hooks/api/Events'; -import { useMutation } from '@tanstack/react-query'; -import { Iform } from '@app/types'; -import { toast } from 'sonner'; -import { IoIosAdd } from 'react-icons/io'; -import { MdDeleteForever } from 'react-icons/md'; -import { useRoles, useToggle } from '@app/hooks'; -import { useEffect, useState } from 'react'; -import { Textarea } from '@app/ui/components/textarea'; -import { Loader } from '@app/components/preloaders'; -import { FormBuilderHeader } from '@app/views/dashboard'; + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@app/ui/components/select"; +import { + Form as FormProvider, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@app/ui/components/form"; +import { Checkbox } from "@app/ui/components/checkbox"; +import { IFormInput, InputOption, SchemaPreview } from "@app/views/form"; +import * as yup from "yup"; +import { SubmitHandler, useFieldArray, useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { apiHandler } from "@app/config"; +import { useRouter } from "next/router"; +import { useEvent, useFormSchema } from "@app/hooks/api/Events"; +import { useMutation } from "@tanstack/react-query"; +import { Iform } from "@app/types"; +import { toast } from "sonner"; +import { IoIosAdd } from "react-icons/io"; +import { MdDeleteForever } from "react-icons/md"; +import { useRoles, useToggle } from "@app/hooks"; +import { useEffect, useState } from "react"; +import { Textarea } from "@app/ui/components/textarea"; +import { Loader } from "@app/components/preloaders"; +import { FormBuilderHeader } from "@app/views/dashboard"; const builderSchema = yup.object().shape({ - label: yup.string().required('label is required'), - placeholder: yup.string(), - required: yup.boolean().optional().default(false), - type: yup.string().required('question type is required') as yup.StringSchema, - selectOptions: yup - .array( - yup.object({ - option: yup.string().trim().required('this is a required field'), - }), - ) - .when('type', { - is: (val: IFormInput) => val === 'MultiSelect' || val === 'SingleSelect', - then: (schema) => schema.required('this is a required field'), - otherwise: (schema) => schema.notRequired(), - }), + label: yup.string().required("label is required"), + placeholder: yup.string(), + required: yup.boolean().optional().default(false), + type: yup + .string() + .required("question type is required") as yup.StringSchema, + selectOptions: yup + .array( + yup.object({ + option: yup.string().trim().required("this is a required field"), + }) + ) + .when("type", { + is: (val: IFormInput) => val === "MultiSelect" || val === "SingleSelect", + then: (schema) => schema.required("this is a required field"), + otherwise: (schema) => schema.notRequired(), + }), }); export type FormValidator = yup.InferType; const Form: NextPageWithLayout = () => { - const router = useRouter(); - const { data, isLoading, refetch } = useFormSchema(); - const { data: eventInfo } = useEvent('event'); - const [isFormStatusChanging, toggleFormStatus] = useToggle(false); - const [isAiForm, setAiForm] = useToggle(); - const { canEditEvent } = useRoles(); - - const [savingAIForm, setSavingAIForm] = useState(false); - const [prompt, setPrompt] = useState(''); - const [isFormLoading, setFormLoading] = useState(false); - const [tempForm, setTempForm] = useState([]); - const { pk, id } = router.query; - const [messages, setMessages] = useState< - Array<{ - ai: boolean; - text: string; - }> - >([]); + const router = useRouter(); + const { data, isLoading, refetch } = useFormSchema(); + const { data: eventInfo } = useEvent("event"); + const [isFormStatusChanging, toggleFormStatus] = useToggle(false); + const [isAiForm, setAiForm] = useToggle(); + const { canEditEvent } = useRoles(); - const form = useForm({ - mode: 'onSubmit', - resolver: yupResolver(builderSchema), - defaultValues: { - type: 'SingleLineText', - }, - }); + const [savingAIForm, setSavingAIForm] = useState(false); + const [prompt, setPrompt] = useState(""); + const [isFormLoading, setFormLoading] = useState(false); + const [tempForm, setTempForm] = useState([]); + const { pk, id } = router.query; + const [messages, setMessages] = useState< + Array<{ + ai: boolean; + text: string; + }> + >([]); - const { fields, append, remove } = useFieldArray({ - control: form.control, - name: 'selectOptions', - }); + const form = useForm({ + mode: "onSubmit", + resolver: yupResolver(builderSchema), + defaultValues: { + type: "SingleLineText", + }, + }); - const addNewField = () => { - append({ - option: '', - }); - }; + const { fields, append, remove } = useFieldArray({ + control: form.control, + name: "selectOptions", + }); - const generateForm = async () => { - try { - setFormLoading(true); - const data = await apiHandler.post('/ai/form', { - prompt: prompt, - messages: messages, - }); - setMessages([ - ...messages, - { - ai: false, - text: prompt, - }, - { ai: true, text: data.data?.fields }, - ]); - setTempForm(data.data?.fields); - } catch { - toast.error('Error generating form'); - } finally { - setFormLoading(false); - } - }; + const addNewField = () => { + append({ + option: "", + }); + }; - const publishForm = async (status: boolean) => { - try { - toggleFormStatus.on(); - await apiHandler.post(`/events/publish/form/${pk}`, { - organizationId: id, - shouldFormPublish: status, - }); + const generateForm = async () => { + try { + setFormLoading(true); + const data = await apiHandler.post("/ai/form", { + prompt: prompt, + messages: messages, + }); + setMessages([ + ...messages, + { + ai: false, + text: prompt, + }, + { ai: true, text: data.data?.fields }, + ]); + setTempForm(data.data?.fields); + } catch { + toast.error("Error generating form"); + } finally { + setFormLoading(false); + } + }; - if (status) { - toast.success('form was published successfully'); - } else { - toast.success('form was unpublished successfully'); - } - } catch { - toast.error("Couldn't complete the operation"); - } finally { - toggleFormStatus.off(); - } - }; + const publishForm = async (status: boolean) => { + try { + toggleFormStatus.on(); + await apiHandler.post(`/events/publish/form/${pk}`, { + organizationId: id, + shouldFormPublish: status, + }); - const updateSchema = async (schema: Iform) => { - try { - const options = schema.selectOptions && schema.selectOptions.map((data) => data.option); - const payload = { - ...schema, - selectOptions: options, - }; + if (status) { + toast.success("form was published successfully"); + } else { + toast.success("form was unpublished successfully"); + } + } catch { + toast.error("Couldn't complete the operation"); + } finally { + toggleFormStatus.off(); + } + }; - await apiHandler.post('/events/form', { - organizationId: router.query?.id, - data: payload, - eventId: eventInfo?.data.id, - }); - } catch { - toast.error('Error adding new schema'); - } - }; + const updateSchema = async (schema: Iform) => { + try { + const options = + schema.selectOptions && schema.selectOptions.map((data) => data.option); + const payload = { + ...schema, + selectOptions: options, + }; - const { isLoading: isSchemaUpdating, mutate } = useMutation(updateSchema, { - onSuccess: () => { - refetch(); - form.reset(); - }, - }); + await apiHandler.post("/events/form", { + organizationId: router.query?.id, + data: payload, + eventId: eventInfo?.data.id, + }); + } catch { + toast.error("Error adding new schema"); + } + }; - const handleUpdates: SubmitHandler = async (data) => { - mutate(data); - }; + const { isLoading: isSchemaUpdating, mutate } = useMutation(updateSchema, { + onSuccess: () => { + refetch(); + form.reset(); + }, + }); - const handleCancel = () => { - form.reset(); - }; + const handleUpdates: SubmitHandler = async (data) => { + mutate(data); + }; - const handleFieldDelete = (index: number) => { - if (fields.length === 1) return; + const handleCancel = () => { + form.reset(); + }; - remove(index); - }; + const handleFieldDelete = (index: number) => { + if (fields.length === 1) return; - const isSingleOrMultiSelect = - form.watch('type') === 'SingleSelect' || form.watch('type') === 'MultiSelect'; + remove(index); + }; - useEffect(() => { - if (isSingleOrMultiSelect) { - addNewField(); - } else { - for (let i = 0; i < fields.length; i++) { - remove(i); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isSingleOrMultiSelect]); + const isSingleOrMultiSelect = + form.watch("type") === "SingleSelect" || + form.watch("type") === "MultiSelect"; - const saveAIForm = async () => { - try { - setSavingAIForm(true); - await Promise.all(tempForm.map((schema) => updateSchema(schema))); - } catch { - toast.error('Error adding new schema'); - } finally { - setTempForm([]); - setSavingAIForm(false); - refetch(); - form.reset(); - } - }; + useEffect(() => { + if (isSingleOrMultiSelect) { + addNewField(); + } else { + for (let i = 0; i < fields.length; i++) { + remove(i); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isSingleOrMultiSelect]); - if (isLoading) { - return ; + const saveAIForm = async () => { + try { + setSavingAIForm(true); + await Promise.all(tempForm.map((schema) => updateSchema(schema))); + } catch { + toast.error("Error adding new schema"); + } finally { + setTempForm([]); + setSavingAIForm(false); + refetch(); + form.reset(); } + }; + + if (isLoading) { + return ; + } - return ( -
- {!eventInfo?.data.isFormPublished && ( + return ( +
+ {!eventInfo?.data.isFormPublished && ( + + )} + {eventInfo?.data.isFormPublished && ( + + )} +
+
+ {!isAiForm && ( +
+ + +
+ + + Create a new question + + +
+ ( + + Question + + + + + + )} + /> +
+
+ ( + + Placeholder (optional) + + + + + + )} + /> +
+
+ ( + + + Question Type + + + + + )} + /> +
+ {isSingleOrMultiSelect && ( + <> + {fields.map((dynamicField, index) => ( +
+ ( + + + Option {index + 1} + handleFieldDelete(index)} + > + + + + + + + + + )} + /> +
+ ))} + + + )} +
+ ( + + Required + + + + + + )} + /> +
+
+ + + + +
+
+
+ +
+ )} + {isAiForm && ( +
+ +

Generate Form With AI

+
+