From 3e784936dc6c41a0cb741d8bc5b4761aee278874 Mon Sep 17 00:00:00 2001 From: Jeroen Rinzema Date: Wed, 28 Jan 2026 22:28:52 +0100 Subject: [PATCH] refactor: removed platform service --- .github/copilot-instructions.md | 1 - .vscode/settings.json | 7 +- pnpm-lock.yaml | 6505 +------- services/platform/.dockerignore | 5 - services/platform/.eslintrc | 48 - services/platform/.gitignore | 113 - .../platform/@types/handlebars-utils.d.ts | 4 - services/platform/@types/knex.d.ts | 12 - services/platform/Dockerfile | 24 - services/platform/jest.config.js | 15 - services/platform/nodemon.json | 6 - services/platform/oapi/webhooks.generated.ts | 437 - services/platform/oapi/webhooks.ts | 4 - services/platform/package-lock.json | 13567 ---------------- services/platform/package.json | 104 - services/platform/pnpm-lock.yaml | 10654 ------------ services/platform/public/uploads/.gitkeep | 0 services/platform/src/api.ts | 82 - services/platform/src/app.ts | 150 - services/platform/src/auth/AccessToken.ts | 11 - services/platform/src/auth/Admin.ts | 17 - services/platform/src/auth/AdminController.ts | 109 - services/platform/src/auth/AdminRepository.ts | 43 - services/platform/src/auth/Auth.ts | 105 - services/platform/src/auth/AuthController.ts | 46 - services/platform/src/auth/AuthError.ts | 52 - services/platform/src/auth/AuthMiddleware.ts | 215 - services/platform/src/auth/AuthProvider.ts | 56 - .../platform/src/auth/BasicAuthProvider.ts | 41 - .../platform/src/auth/CloudAuthProvider.ts | 150 - .../platform/src/auth/EmailAuthProvider.ts | 128 - .../platform/src/auth/GoogleAuthProvider.ts | 31 - .../platform/src/auth/OpenIDAuthProvider.ts | 126 - .../platform/src/auth/SAMLAuthProvider.ts | 128 - services/platform/src/auth/TokenRepository.ts | 55 - services/platform/src/boot.ts | 6 - services/platform/src/campaigns/Campaign.ts | 121 - .../src/campaigns/CampaignAbortJob.ts | 32 - .../src/campaigns/CampaignController.ts | 165 - .../src/campaigns/CampaignEnqueueSendsJob.ts | 47 - .../platform/src/campaigns/CampaignError.ts | 24 - .../src/campaigns/CampaignGenerateListJob.ts | 35 - .../src/campaigns/CampaignInteractJob.ts | 49 - .../platform/src/campaigns/CampaignService.ts | 524 - .../src/campaigns/CampaignStateJob.ts | 39 - .../src/campaigns/ProcessCampaignsJob.ts | 30 - .../__tests__/CampaignService.spec.ts | 293 - services/platform/src/client/Client.ts | 80 - .../platform/src/client/ClientController.ts | 315 - services/platform/src/client/EventPostJob.ts | 55 - .../platform/src/client/SegmentController.ts | 146 - .../client/__tests__/ClientController.spec.ts | 114 - services/platform/src/config/channels.ts | 7 - services/platform/src/config/controllers.ts | 135 - services/platform/src/config/database.ts | 55 - services/platform/src/config/env.ts | 216 - services/platform/src/config/logger.ts | 18 - services/platform/src/config/queue.ts | 66 - services/platform/src/config/rateLimit.ts | 101 - services/platform/src/config/redis.ts | 124 - services/platform/src/config/scheduler.ts | 75 - services/platform/src/config/stats.ts | 53 - services/platform/src/config/storage.ts | 5 - services/platform/src/core/Lock.ts | 52 - services/platform/src/core/Model.ts | 34 - services/platform/src/core/Types.ts | 5 - services/platform/src/core/audit/Audit.ts | 23 - .../platform/src/core/audit/AuditService.ts | 65 - services/platform/src/core/aws.ts | 9 - services/platform/src/core/errors.ts | 43 - services/platform/src/core/models/RawModel.ts | 55 - services/platform/src/core/models/SQLModel.ts | 301 - services/platform/src/core/searchParams.ts | 81 - services/platform/src/core/validate.ts | 59 - .../platform/src/error/BugSnagProvider.ts | 38 - services/platform/src/error/ErrorHandler.ts | 44 - .../src/error/ErrorHandlerProvider.ts | 8 - services/platform/src/error/LoggerProvider.ts | 19 - services/platform/src/error/SentryProvider.ts | 33 - services/platform/src/index.ts | 13 - services/platform/src/jobs.ts | 3 - services/platform/src/journey/Journey.ts | 41 - .../platform/src/journey/JourneyController.ts | 293 - .../platform/src/journey/JourneyDelayJob.ts | 46 - services/platform/src/journey/JourneyError.ts | 14 - .../platform/src/journey/JourneyProcessJob.ts | 33 - .../platform/src/journey/JourneyRepository.ts | 424 - .../platform/src/journey/JourneyService.ts | 203 - services/platform/src/journey/JourneyState.ts | 221 - .../platform/src/journey/JourneyStatsJob.ts | 80 - services/platform/src/journey/JourneyStep.ts | 685 - .../platform/src/journey/JourneyUserStep.ts | 33 - .../src/journey/ScheduledEntranceJob.ts | 73 - .../ScheduledEntranceOrchestratorJob.ts | 46 - .../platform/src/journey/UpdateJourneysJob.ts | 18 - .../journey/__tests__/JourneyService.spec.ts | 340 - .../src/journey/__tests__/JourneyStep.spec.ts | 53 - .../__tests__/ScheduledEntranceJob.spec.ts | 63 - .../platform/src/journey/__tests__/helpers.ts | 49 - services/platform/src/lists/List.ts | 33 - services/platform/src/lists/ListController.ts | 232 - services/platform/src/lists/ListService.ts | 222 - services/platform/src/lists/ListStatsJob.ts | 31 - .../platform/src/lists/ProcessListsJob.ts | 21 - .../src/lists/__tests__/ListService.spec.ts | 127 - .../src/lists/__tests__/ListStatsJob.spec.ts | 60 - .../src/notifications/Notification.ts | 39 - .../src/notifications/NotificationService.ts | 31 - .../src/organizations/Organization.ts | 28 - .../organizations/OrganizationController.ts | 59 - .../organizations/OrganizationMiddleware.ts | 19 - .../src/organizations/OrganizationService.ts | 47 - .../platform/src/profile/ProfileController.ts | 13 - services/platform/src/projects/Locale.ts | 10 - services/platform/src/projects/Project.ts | 31 - .../src/projects/ProjectAdminController.ts | 106 - .../src/projects/ProjectAdminRepository.ts | 50 - .../platform/src/projects/ProjectAdmins.ts | 12 - .../platform/src/projects/ProjectApiKey.ts | 15 - .../src/projects/ProjectApiKeyController.ts | 84 - .../src/projects/ProjectController.ts | 230 - .../platform/src/projects/ProjectError.ts | 14 - .../src/projects/ProjectLocaleController.ts | 53 - .../src/projects/ProjectRulePathRepository.ts | 133 - .../platform/src/projects/ProjectService.ts | 253 - .../projects/__tests__/ProjectTestHelpers.ts | 16 - .../platform/src/providers/LoggerProvider.ts | 8 - .../platform/src/providers/MessageTrigger.ts | 9 - .../src/providers/MessageTriggerService.ts | 237 - services/platform/src/providers/Provider.ts | 148 - .../src/providers/ProviderController.ts | 89 - .../src/providers/ProviderRepository.ts | 98 - .../platform/src/providers/ProviderService.ts | 99 - .../src/providers/analytics/Analytics.ts | 17 - .../providers/analytics/AnalyticsProvider.ts | 27 - .../providers/analytics/MixpanelProvider.ts | 70 - .../providers/analytics/PosthogProvider.ts | 61 - .../providers/analytics/SegmentProvider.ts | 57 - .../platform/src/providers/analytics/index.ts | 26 - .../platform/src/providers/email/Email.ts | 14 - .../src/providers/email/EmailChannel.ts | 61 - .../src/providers/email/EmailError.ts | 3 - .../platform/src/providers/email/EmailJob.ts | 56 - .../src/providers/email/EmailProvider.ts | 71 - .../providers/email/LoggerEmailProvider.ts | 48 - .../providers/email/MailgunEmailProvider.ts | 122 - .../src/providers/email/SESEmailProvider.ts | 146 - .../src/providers/email/SMPTEmailProvider.ts | 60 - .../providers/email/SendGridEmailProvider.ts | 104 - .../providers/email/WebhookEmailProvider.ts | 48 - .../platform/src/providers/email/index.ts | 33 - .../src/providers/external/webhook.ts | 34 - .../src/providers/push/LocalPushProvider.ts | 180 - .../src/providers/push/LoggerPushProvider.ts | 40 - services/platform/src/providers/push/Push.ts | 17 - .../src/providers/push/PushChannel.ts | 41 - .../platform/src/providers/push/PushError.ts | 8 - .../platform/src/providers/push/PushJob.ts | 80 - .../src/providers/push/PushProvider.ts | 11 - .../src/providers/push/WebhookPushProvider.ts | 40 - services/platform/src/providers/push/index.ts | 27 - .../src/providers/text/HttpSMSProvider.ts | 82 - .../src/providers/text/LoggerTextProvider.ts | 47 - .../src/providers/text/NexmoTextProvider.ts | 95 - .../src/providers/text/PlivoTextProvider.ts | 90 - .../src/providers/text/TelnyxTextProvider.ts | 107 - .../src/providers/text/TextChannel.ts | 70 - .../platform/src/providers/text/TextError.ts | 17 - .../platform/src/providers/text/TextJob.ts | 53 - .../src/providers/text/TextMessage.ts | 14 - .../src/providers/text/TextProvider.ts | 83 - .../src/providers/text/TwilioTextProvider.ts | 107 - .../src/providers/text/WebhookTextProvider.ts | 44 - .../text/__tests__/TextChannel.spec.ts | 82 - services/platform/src/providers/text/index.ts | 35 - .../providers/webhook/LocalWebhookProvider.ts | 54 - .../webhook/LoggerWebhookProvider.ts | 39 - .../platform/src/providers/webhook/Webhook.ts | 13 - .../src/providers/webhook/WebhookChannel.ts | 36 - .../src/providers/webhook/WebhookJob.ts | 47 - .../src/providers/webhook/WebhookProvider.ts | 10 - .../platform/src/providers/webhook/index.ts | 25 - services/platform/src/queue/Job.ts | 99 - .../platform/src/queue/MemoryQueueProvider.ts | 86 - services/platform/src/queue/Queue.ts | 112 - services/platform/src/queue/QueueProvider.ts | 24 - .../platform/src/queue/RedisQueueProvider.ts | 149 - services/platform/src/queue/index.ts | 5 - services/platform/src/render/Helpers/Array.ts | 136 - .../platform/src/render/Helpers/Common.ts | 76 - services/platform/src/render/Helpers/Date.ts | 95 - .../platform/src/render/Helpers/Number.ts | 150 - .../platform/src/render/Helpers/String.ts | 216 - services/platform/src/render/Helpers/Url.ts | 29 - services/platform/src/render/Helpers/Util.ts | 13 - .../platform/src/render/LinkController.ts | 54 - services/platform/src/render/LinkService.ts | 149 - services/platform/src/render/Resource.ts | 15 - .../platform/src/render/ResourceController.ts | 62 - .../platform/src/render/ResourceService.ts | 26 - services/platform/src/render/Template.ts | 328 - .../platform/src/render/TemplateController.ts | 258 - .../platform/src/render/TemplateService.ts | 195 - .../src/render/__tests__/LinkService.spec.ts | 76 - .../src/render/__tests__/Template.spec.ts | 126 - .../__snapshots__/LinkService.spec.ts.snap | 17 - .../__snapshots__/Template.spec.ts.snap | 43 - services/platform/src/render/index.ts | 107 - services/platform/src/rules/ArrayRule.ts | 43 - services/platform/src/rules/BooleanRule.ts | 26 - services/platform/src/rules/DateRule.ts | 72 - services/platform/src/rules/NumberRule.ts | 65 - .../platform/src/rules/ProjectRulePath.ts | 17 - services/platform/src/rules/Rule.ts | 45 - services/platform/src/rules/RuleEngine.ts | 132 - services/platform/src/rules/RuleError.ts | 7 - services/platform/src/rules/RuleHelpers.ts | 153 - services/platform/src/rules/RuleService.ts | 41 - services/platform/src/rules/StringRule.ts | 72 - services/platform/src/rules/WrapperRule.ts | 145 - .../src/rules/__tests__/RuleEngine.spec.ts | 422 - .../platform/src/schema/UserSchemaService.ts | 177 - .../platform/src/schema/UserSchemaSyncJob.ts | 37 - .../__tests__/UserSchemaService.spec.ts | 168 - services/platform/src/storage/FileStream.ts | 67 - services/platform/src/storage/Image.ts | 33 - .../platform/src/storage/ImageController.ts | 97 - services/platform/src/storage/ImageService.ts | 34 - .../src/storage/LocalStorageProvider.ts | 26 - .../platform/src/storage/S3StorageProvider.ts | 61 - services/platform/src/storage/Storage.ts | 75 - services/platform/src/storage/StorageError.ts | 14 - .../platform/src/storage/StorageProvider.ts | 14 - services/platform/src/storage/index.ts | 5 - .../src/subscriptions/Subscription.ts | 26 - .../subscriptions/SubscriptionController.ts | 398 - .../src/subscriptions/SubscriptionError.ts | 18 - .../src/subscriptions/SubscriptionService.ts | 140 - .../src/subscriptions/UnsubscribeJob.ts | 26 - services/platform/src/tags/Tag.ts | 15 - services/platform/src/tags/TagController.ts | 80 - services/platform/src/tags/TagService.ts | 106 - services/platform/src/users/Device.ts | 19 - .../platform/src/users/DeviceRepository.ts | 34 - services/platform/src/users/User.ts | 113 - services/platform/src/users/UserAliasJob.ts | 20 - services/platform/src/users/UserController.ts | 382 - services/platform/src/users/UserDeleteJob.ts | 22 - services/platform/src/users/UserDeviceJob.ts | 36 - services/platform/src/users/UserError.ts | 6 - services/platform/src/users/UserEvent.ts | 28 - .../platform/src/users/UserEventRepository.ts | 44 - services/platform/src/users/UserImport.ts | 160 - services/platform/src/users/UserPatchJob.ts | 77 - services/platform/src/users/UserRepository.ts | 307 - .../users/__tests__/UserRepository.spec.ts | 241 - services/platform/src/utilities/index.ts | 414 - services/platform/src/worker.ts | 29 - services/platform/tests/setup.ts | 8 - services/platform/tsconfig.json | 23 - 260 files changed, 132 insertions(+), 52224 deletions(-) delete mode 100644 services/platform/.dockerignore delete mode 100644 services/platform/.eslintrc delete mode 100644 services/platform/.gitignore delete mode 100644 services/platform/@types/handlebars-utils.d.ts delete mode 100644 services/platform/@types/knex.d.ts delete mode 100644 services/platform/Dockerfile delete mode 100644 services/platform/jest.config.js delete mode 100644 services/platform/nodemon.json delete mode 100644 services/platform/oapi/webhooks.generated.ts delete mode 100644 services/platform/oapi/webhooks.ts delete mode 100644 services/platform/package-lock.json delete mode 100644 services/platform/package.json delete mode 100644 services/platform/pnpm-lock.yaml delete mode 100644 services/platform/public/uploads/.gitkeep delete mode 100644 services/platform/src/api.ts delete mode 100644 services/platform/src/app.ts delete mode 100644 services/platform/src/auth/AccessToken.ts delete mode 100644 services/platform/src/auth/Admin.ts delete mode 100644 services/platform/src/auth/AdminController.ts delete mode 100644 services/platform/src/auth/AdminRepository.ts delete mode 100644 services/platform/src/auth/Auth.ts delete mode 100644 services/platform/src/auth/AuthController.ts delete mode 100644 services/platform/src/auth/AuthError.ts delete mode 100644 services/platform/src/auth/AuthMiddleware.ts delete mode 100644 services/platform/src/auth/AuthProvider.ts delete mode 100644 services/platform/src/auth/BasicAuthProvider.ts delete mode 100644 services/platform/src/auth/CloudAuthProvider.ts delete mode 100644 services/platform/src/auth/EmailAuthProvider.ts delete mode 100644 services/platform/src/auth/GoogleAuthProvider.ts delete mode 100644 services/platform/src/auth/OpenIDAuthProvider.ts delete mode 100644 services/platform/src/auth/SAMLAuthProvider.ts delete mode 100644 services/platform/src/auth/TokenRepository.ts delete mode 100644 services/platform/src/boot.ts delete mode 100644 services/platform/src/campaigns/Campaign.ts delete mode 100644 services/platform/src/campaigns/CampaignAbortJob.ts delete mode 100644 services/platform/src/campaigns/CampaignController.ts delete mode 100644 services/platform/src/campaigns/CampaignEnqueueSendsJob.ts delete mode 100644 services/platform/src/campaigns/CampaignError.ts delete mode 100644 services/platform/src/campaigns/CampaignGenerateListJob.ts delete mode 100644 services/platform/src/campaigns/CampaignInteractJob.ts delete mode 100644 services/platform/src/campaigns/CampaignService.ts delete mode 100644 services/platform/src/campaigns/CampaignStateJob.ts delete mode 100644 services/platform/src/campaigns/ProcessCampaignsJob.ts delete mode 100644 services/platform/src/campaigns/__tests__/CampaignService.spec.ts delete mode 100644 services/platform/src/client/Client.ts delete mode 100644 services/platform/src/client/ClientController.ts delete mode 100644 services/platform/src/client/EventPostJob.ts delete mode 100644 services/platform/src/client/SegmentController.ts delete mode 100644 services/platform/src/client/__tests__/ClientController.spec.ts delete mode 100644 services/platform/src/config/channels.ts delete mode 100644 services/platform/src/config/controllers.ts delete mode 100644 services/platform/src/config/database.ts delete mode 100644 services/platform/src/config/env.ts delete mode 100644 services/platform/src/config/logger.ts delete mode 100644 services/platform/src/config/queue.ts delete mode 100644 services/platform/src/config/rateLimit.ts delete mode 100644 services/platform/src/config/redis.ts delete mode 100644 services/platform/src/config/scheduler.ts delete mode 100644 services/platform/src/config/stats.ts delete mode 100644 services/platform/src/config/storage.ts delete mode 100644 services/platform/src/core/Lock.ts delete mode 100644 services/platform/src/core/Model.ts delete mode 100644 services/platform/src/core/Types.ts delete mode 100644 services/platform/src/core/audit/Audit.ts delete mode 100644 services/platform/src/core/audit/AuditService.ts delete mode 100644 services/platform/src/core/aws.ts delete mode 100644 services/platform/src/core/errors.ts delete mode 100644 services/platform/src/core/models/RawModel.ts delete mode 100644 services/platform/src/core/models/SQLModel.ts delete mode 100644 services/platform/src/core/searchParams.ts delete mode 100644 services/platform/src/core/validate.ts delete mode 100644 services/platform/src/error/BugSnagProvider.ts delete mode 100644 services/platform/src/error/ErrorHandler.ts delete mode 100644 services/platform/src/error/ErrorHandlerProvider.ts delete mode 100644 services/platform/src/error/LoggerProvider.ts delete mode 100644 services/platform/src/error/SentryProvider.ts delete mode 100644 services/platform/src/index.ts delete mode 100644 services/platform/src/jobs.ts delete mode 100644 services/platform/src/journey/Journey.ts delete mode 100644 services/platform/src/journey/JourneyController.ts delete mode 100644 services/platform/src/journey/JourneyDelayJob.ts delete mode 100644 services/platform/src/journey/JourneyError.ts delete mode 100644 services/platform/src/journey/JourneyProcessJob.ts delete mode 100644 services/platform/src/journey/JourneyRepository.ts delete mode 100644 services/platform/src/journey/JourneyService.ts delete mode 100644 services/platform/src/journey/JourneyState.ts delete mode 100644 services/platform/src/journey/JourneyStatsJob.ts delete mode 100644 services/platform/src/journey/JourneyStep.ts delete mode 100644 services/platform/src/journey/JourneyUserStep.ts delete mode 100644 services/platform/src/journey/ScheduledEntranceJob.ts delete mode 100644 services/platform/src/journey/ScheduledEntranceOrchestratorJob.ts delete mode 100644 services/platform/src/journey/UpdateJourneysJob.ts delete mode 100644 services/platform/src/journey/__tests__/JourneyService.spec.ts delete mode 100644 services/platform/src/journey/__tests__/JourneyStep.spec.ts delete mode 100644 services/platform/src/journey/__tests__/ScheduledEntranceJob.spec.ts delete mode 100644 services/platform/src/journey/__tests__/helpers.ts delete mode 100644 services/platform/src/lists/List.ts delete mode 100644 services/platform/src/lists/ListController.ts delete mode 100644 services/platform/src/lists/ListService.ts delete mode 100644 services/platform/src/lists/ListStatsJob.ts delete mode 100644 services/platform/src/lists/ProcessListsJob.ts delete mode 100644 services/platform/src/lists/__tests__/ListService.spec.ts delete mode 100644 services/platform/src/lists/__tests__/ListStatsJob.spec.ts delete mode 100644 services/platform/src/notifications/Notification.ts delete mode 100644 services/platform/src/notifications/NotificationService.ts delete mode 100644 services/platform/src/organizations/Organization.ts delete mode 100644 services/platform/src/organizations/OrganizationController.ts delete mode 100644 services/platform/src/organizations/OrganizationMiddleware.ts delete mode 100644 services/platform/src/organizations/OrganizationService.ts delete mode 100644 services/platform/src/profile/ProfileController.ts delete mode 100644 services/platform/src/projects/Locale.ts delete mode 100644 services/platform/src/projects/Project.ts delete mode 100644 services/platform/src/projects/ProjectAdminController.ts delete mode 100644 services/platform/src/projects/ProjectAdminRepository.ts delete mode 100644 services/platform/src/projects/ProjectAdmins.ts delete mode 100644 services/platform/src/projects/ProjectApiKey.ts delete mode 100644 services/platform/src/projects/ProjectApiKeyController.ts delete mode 100644 services/platform/src/projects/ProjectController.ts delete mode 100644 services/platform/src/projects/ProjectError.ts delete mode 100644 services/platform/src/projects/ProjectLocaleController.ts delete mode 100644 services/platform/src/projects/ProjectRulePathRepository.ts delete mode 100644 services/platform/src/projects/ProjectService.ts delete mode 100644 services/platform/src/projects/__tests__/ProjectTestHelpers.ts delete mode 100644 services/platform/src/providers/LoggerProvider.ts delete mode 100644 services/platform/src/providers/MessageTrigger.ts delete mode 100644 services/platform/src/providers/MessageTriggerService.ts delete mode 100644 services/platform/src/providers/Provider.ts delete mode 100644 services/platform/src/providers/ProviderController.ts delete mode 100644 services/platform/src/providers/ProviderRepository.ts delete mode 100644 services/platform/src/providers/ProviderService.ts delete mode 100644 services/platform/src/providers/analytics/Analytics.ts delete mode 100644 services/platform/src/providers/analytics/AnalyticsProvider.ts delete mode 100644 services/platform/src/providers/analytics/MixpanelProvider.ts delete mode 100644 services/platform/src/providers/analytics/PosthogProvider.ts delete mode 100644 services/platform/src/providers/analytics/SegmentProvider.ts delete mode 100644 services/platform/src/providers/analytics/index.ts delete mode 100644 services/platform/src/providers/email/Email.ts delete mode 100644 services/platform/src/providers/email/EmailChannel.ts delete mode 100644 services/platform/src/providers/email/EmailError.ts delete mode 100644 services/platform/src/providers/email/EmailJob.ts delete mode 100644 services/platform/src/providers/email/EmailProvider.ts delete mode 100644 services/platform/src/providers/email/LoggerEmailProvider.ts delete mode 100644 services/platform/src/providers/email/MailgunEmailProvider.ts delete mode 100644 services/platform/src/providers/email/SESEmailProvider.ts delete mode 100644 services/platform/src/providers/email/SMPTEmailProvider.ts delete mode 100644 services/platform/src/providers/email/SendGridEmailProvider.ts delete mode 100644 services/platform/src/providers/email/WebhookEmailProvider.ts delete mode 100644 services/platform/src/providers/email/index.ts delete mode 100644 services/platform/src/providers/external/webhook.ts delete mode 100644 services/platform/src/providers/push/LocalPushProvider.ts delete mode 100644 services/platform/src/providers/push/LoggerPushProvider.ts delete mode 100644 services/platform/src/providers/push/Push.ts delete mode 100644 services/platform/src/providers/push/PushChannel.ts delete mode 100644 services/platform/src/providers/push/PushError.ts delete mode 100644 services/platform/src/providers/push/PushJob.ts delete mode 100644 services/platform/src/providers/push/PushProvider.ts delete mode 100644 services/platform/src/providers/push/WebhookPushProvider.ts delete mode 100644 services/platform/src/providers/push/index.ts delete mode 100644 services/platform/src/providers/text/HttpSMSProvider.ts delete mode 100644 services/platform/src/providers/text/LoggerTextProvider.ts delete mode 100644 services/platform/src/providers/text/NexmoTextProvider.ts delete mode 100644 services/platform/src/providers/text/PlivoTextProvider.ts delete mode 100644 services/platform/src/providers/text/TelnyxTextProvider.ts delete mode 100644 services/platform/src/providers/text/TextChannel.ts delete mode 100644 services/platform/src/providers/text/TextError.ts delete mode 100644 services/platform/src/providers/text/TextJob.ts delete mode 100644 services/platform/src/providers/text/TextMessage.ts delete mode 100644 services/platform/src/providers/text/TextProvider.ts delete mode 100644 services/platform/src/providers/text/TwilioTextProvider.ts delete mode 100644 services/platform/src/providers/text/WebhookTextProvider.ts delete mode 100644 services/platform/src/providers/text/__tests__/TextChannel.spec.ts delete mode 100644 services/platform/src/providers/text/index.ts delete mode 100644 services/platform/src/providers/webhook/LocalWebhookProvider.ts delete mode 100644 services/platform/src/providers/webhook/LoggerWebhookProvider.ts delete mode 100644 services/platform/src/providers/webhook/Webhook.ts delete mode 100644 services/platform/src/providers/webhook/WebhookChannel.ts delete mode 100644 services/platform/src/providers/webhook/WebhookJob.ts delete mode 100644 services/platform/src/providers/webhook/WebhookProvider.ts delete mode 100644 services/platform/src/providers/webhook/index.ts delete mode 100644 services/platform/src/queue/Job.ts delete mode 100644 services/platform/src/queue/MemoryQueueProvider.ts delete mode 100644 services/platform/src/queue/Queue.ts delete mode 100644 services/platform/src/queue/QueueProvider.ts delete mode 100644 services/platform/src/queue/RedisQueueProvider.ts delete mode 100644 services/platform/src/queue/index.ts delete mode 100644 services/platform/src/render/Helpers/Array.ts delete mode 100644 services/platform/src/render/Helpers/Common.ts delete mode 100644 services/platform/src/render/Helpers/Date.ts delete mode 100644 services/platform/src/render/Helpers/Number.ts delete mode 100644 services/platform/src/render/Helpers/String.ts delete mode 100644 services/platform/src/render/Helpers/Url.ts delete mode 100644 services/platform/src/render/Helpers/Util.ts delete mode 100644 services/platform/src/render/LinkController.ts delete mode 100644 services/platform/src/render/LinkService.ts delete mode 100644 services/platform/src/render/Resource.ts delete mode 100644 services/platform/src/render/ResourceController.ts delete mode 100644 services/platform/src/render/ResourceService.ts delete mode 100644 services/platform/src/render/Template.ts delete mode 100644 services/platform/src/render/TemplateController.ts delete mode 100644 services/platform/src/render/TemplateService.ts delete mode 100644 services/platform/src/render/__tests__/LinkService.spec.ts delete mode 100644 services/platform/src/render/__tests__/Template.spec.ts delete mode 100644 services/platform/src/render/__tests__/__snapshots__/LinkService.spec.ts.snap delete mode 100644 services/platform/src/render/__tests__/__snapshots__/Template.spec.ts.snap delete mode 100644 services/platform/src/render/index.ts delete mode 100644 services/platform/src/rules/ArrayRule.ts delete mode 100644 services/platform/src/rules/BooleanRule.ts delete mode 100644 services/platform/src/rules/DateRule.ts delete mode 100644 services/platform/src/rules/NumberRule.ts delete mode 100644 services/platform/src/rules/ProjectRulePath.ts delete mode 100644 services/platform/src/rules/Rule.ts delete mode 100644 services/platform/src/rules/RuleEngine.ts delete mode 100644 services/platform/src/rules/RuleError.ts delete mode 100644 services/platform/src/rules/RuleHelpers.ts delete mode 100644 services/platform/src/rules/RuleService.ts delete mode 100644 services/platform/src/rules/StringRule.ts delete mode 100644 services/platform/src/rules/WrapperRule.ts delete mode 100644 services/platform/src/rules/__tests__/RuleEngine.spec.ts delete mode 100644 services/platform/src/schema/UserSchemaService.ts delete mode 100644 services/platform/src/schema/UserSchemaSyncJob.ts delete mode 100644 services/platform/src/schema/__tests__/UserSchemaService.spec.ts delete mode 100644 services/platform/src/storage/FileStream.ts delete mode 100644 services/platform/src/storage/Image.ts delete mode 100644 services/platform/src/storage/ImageController.ts delete mode 100644 services/platform/src/storage/ImageService.ts delete mode 100644 services/platform/src/storage/LocalStorageProvider.ts delete mode 100644 services/platform/src/storage/S3StorageProvider.ts delete mode 100644 services/platform/src/storage/Storage.ts delete mode 100644 services/platform/src/storage/StorageError.ts delete mode 100644 services/platform/src/storage/StorageProvider.ts delete mode 100644 services/platform/src/storage/index.ts delete mode 100644 services/platform/src/subscriptions/Subscription.ts delete mode 100644 services/platform/src/subscriptions/SubscriptionController.ts delete mode 100644 services/platform/src/subscriptions/SubscriptionError.ts delete mode 100644 services/platform/src/subscriptions/SubscriptionService.ts delete mode 100644 services/platform/src/subscriptions/UnsubscribeJob.ts delete mode 100644 services/platform/src/tags/Tag.ts delete mode 100644 services/platform/src/tags/TagController.ts delete mode 100644 services/platform/src/tags/TagService.ts delete mode 100644 services/platform/src/users/Device.ts delete mode 100644 services/platform/src/users/DeviceRepository.ts delete mode 100644 services/platform/src/users/User.ts delete mode 100644 services/platform/src/users/UserAliasJob.ts delete mode 100644 services/platform/src/users/UserController.ts delete mode 100644 services/platform/src/users/UserDeleteJob.ts delete mode 100644 services/platform/src/users/UserDeviceJob.ts delete mode 100644 services/platform/src/users/UserError.ts delete mode 100644 services/platform/src/users/UserEvent.ts delete mode 100644 services/platform/src/users/UserEventRepository.ts delete mode 100644 services/platform/src/users/UserImport.ts delete mode 100644 services/platform/src/users/UserPatchJob.ts delete mode 100644 services/platform/src/users/UserRepository.ts delete mode 100644 services/platform/src/users/__tests__/UserRepository.spec.ts delete mode 100644 services/platform/src/utilities/index.ts delete mode 100644 services/platform/src/worker.ts delete mode 100644 services/platform/tests/setup.ts delete mode 100644 services/platform/tsconfig.json diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index f1ff3949..89711300 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -8,7 +8,6 @@ This is the Lunogram platform - a multi-service monorepo for customer engagement - **services/nexus** - Go backend API (OpenAPI 3.0, PostgreSQL) - **services/console** - React TypeScript frontend (Vite, React Router 7) -- **services/platform** - Legacy Node.js backend (being migrated to Nexus) ## Code Style & Conventions diff --git a/.vscode/settings.json b/.vscode/settings.json index feffbbb7..3bae7eb8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,3 @@ { - "eslint.workingDirectories": [ - "./services/console", - "./services/platform" - ] -} \ No newline at end of file + "eslint.workingDirectories": ["./services/console"], +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0841d37e..e02f7a6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -293,259 +293,6 @@ importers: specifier: ^7.1.11 version: 7.1.11(@types/node@16.18.126)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1) - services/platform: - dependencies: - '@aws-sdk/client-s3': - specifier: ^3.908.0 - version: 3.913.0 - '@aws-sdk/client-ses': - specifier: ^3.908.0 - version: 3.913.0 - '@aws-sdk/client-sqs': - specifier: ^3.908.0 - version: 3.913.0 - '@aws-sdk/lib-storage': - specifier: ^3.908.0 - version: 3.913.0(@aws-sdk/client-s3@3.913.0) - '@bugsnag/js': - specifier: ^8.6.0 - version: 8.6.0 - '@bugsnag/plugin-koa': - specifier: ^8.6.0 - version: 8.6.0(@bugsnag/core@8.6.0) - '@clerk/backend': - specifier: ^2.17.2 - version: 2.18.3 - '@koa/cors': - specifier: ^5.0.0 - version: 5.0.0 - '@koa/router': - specifier: ^11.0.2 - version: 11.0.2 - '@ladjs/country-language': - specifier: ^1.0.3 - version: 1.0.3 - '@node-saml/node-saml': - specifier: ^4.0.5 - version: 4.0.5 - '@segment/analytics-node': - specifier: ^1.3.0 - version: 1.3.0 - '@sentry/node': - specifier: ^7.120.4 - version: 7.120.4 - '@sentry/utils': - specifier: ^7.120.4 - version: 7.120.4 - ajv: - specifier: ^8.17.1 - version: 8.17.1 - ajv-errors: - specifier: ^3.0.0 - version: 3.0.0(ajv@8.17.1) - ajv-formats: - specifier: ^2.1.1 - version: 2.1.1(ajv@8.17.1) - bullmq: - specifier: ^5.61.0 - version: 5.61.0 - busboy: - specifier: ^1.6.0 - version: 1.6.0 - cookies: - specifier: ^0.9.1 - version: 0.9.1 - csv-parse: - specifier: ^5.6.0 - version: 5.6.0 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - date-fns-tz: - specifier: ^1.3.8 - version: 1.3.8(date-fns@2.30.0) - dotenv: - specifier: ^16.6.1 - version: 16.6.1 - eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eventemitter2: - specifier: ^6.4.9 - version: 6.4.9 - handlebars: - specifier: ^4.7.8 - version: 4.7.8 - handlebars-utils: - specifier: ^1.0.6 - version: 1.0.6 - html-to-text: - specifier: ^9.0.5 - version: 9.0.5 - ioredis: - specifier: ^5.8.1 - version: 5.8.1 - jsonpath: - specifier: ^1.1.1 - version: 1.1.1 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - jwks-rsa: - specifier: ^3.2.0 - version: 3.2.0 - knex: - specifier: ^2.5.1 - version: 2.5.1(pg@8.16.3) - koa: - specifier: ^2.16.2 - version: 2.16.3 - koa-body: - specifier: 5.0.0 - version: 5.0.0 - koa-send: - specifier: ^5.0.1 - version: 5.0.1 - koa-static: - specifier: ^5.0.0 - version: 5.0.0 - libphonenumber-js: - specifier: ^1.12.24 - version: 1.12.24 - node-pushnotifications: - specifier: ^3.1.1 - version: 3.1.1 - node-schedule: - specifier: ^2.1.1 - version: 2.1.1 - nodemailer: - specifier: ^6.10.1 - version: 6.10.1 - nodemailer-mailgun-transport: - specifier: ^2.1.5 - version: 2.1.5(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.1) - nodemailer-sendgrid: - specifier: ^1.0.3 - version: 1.0.3 - openid-client: - specifier: ^5.7.1 - version: 5.7.1 - pg: - specifier: ^8.16.3 - version: 8.16.3 - pg-query-stream: - specifier: ^4.10.3 - version: 4.10.3(pg@8.16.3) - pino: - specifier: ^8.21.0 - version: 8.21.0 - pino-pretty: - specifier: ^8.1.0 - version: 8.1.0 - posthog-node: - specifier: ^3.6.3 - version: 3.6.3 - raw-body: - specifier: ^3.0.1 - version: 3.0.1 - rrule: - specifier: 2.7.2 - version: 2.7.2 - svix: - specifier: ^1.77.0 - version: 1.77.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - devDependencies: - '@types/busboy': - specifier: ^1.5.4 - version: 1.5.4 - '@types/html-to-text': - specifier: ^9.0.4 - version: 9.0.4 - '@types/jest': - specifier: ^28.1.8 - version: 28.1.8 - '@types/jsonpath': - specifier: ^0.2.4 - version: 0.2.4 - '@types/jsonwebtoken': - specifier: ^9.0.10 - version: 9.0.10 - '@types/koa': - specifier: ^2.15.0 - version: 2.15.0 - '@types/koa-send': - specifier: ^4.1.6 - version: 4.1.6 - '@types/koa-static': - specifier: ^4.0.4 - version: 4.0.4 - '@types/koa__cors': - specifier: ^3.3.1 - version: 3.3.1 - '@types/koa__router': - specifier: ^8.0.11 - version: 8.0.11 - '@types/node': - specifier: ^24.7.1 - version: 24.9.0 - '@types/node-pushnotifications': - specifier: ^1.0.8 - version: 1.0.8 - '@types/node-schedule': - specifier: ^2.1.8 - version: 2.1.8 - '@types/nodemailer': - specifier: ^6.4.20 - version: 6.4.20 - '@types/nodemailer-mailgun-transport': - specifier: ^1.4.6 - version: 1.4.6 - '@types/nodemailer-sendgrid': - specifier: ^1.0.3 - version: 1.0.3 - '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 - '@types/uuid': - specifier: ^9.0.8 - version: 9.0.8 - '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-config-standard: - specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) - ioredis-mock: - specifier: ^8.13.0 - version: 8.13.0(@types/ioredis-mock@8.2.6(ioredis@5.8.1))(ioredis@5.8.1) - jest: - specifier: ^28.1.3 - version: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - supertest: - specifier: ^6.3.4 - version: 6.3.4 - ts-jest: - specifier: ^28.0.8 - version: 28.0.8(@babel/core@7.28.4)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.28.4))(jest@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)))(typescript@4.9.5) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5) - typescript: - specifier: ^4.9.5 - version: 4.9.5 - packages: '@adobe/css-tools@4.4.4': @@ -561,179 +308,6 @@ packages: peerDependencies: ajv: '>=8' - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/crc32c@5.2.0': - resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} - - '@aws-crypto/sha1-browser@5.2.0': - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-s3@3.913.0': - resolution: {integrity: sha512-YdWHIXn+TltH1MbMkBrFl8Ocxj/PJXleacQ1U5AZRAt8EqxctYkeTNB/+XYS5x6ieYQ4uWnF7sF74sJx+KTpwg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-ses@3.913.0': - resolution: {integrity: sha512-jUF1mN+webeAgkNXS/tl6KpJyUbsAWxQGsQgsWoHwaNCSnxMDBEyPmgBnzbqf2CrybIa7zmzaqCO0z6FgKeZRg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-sqs@3.913.0': - resolution: {integrity: sha512-ioN6O4guJPRph6TRqqMxvi29kFjKXqYKuu4Zt9Oi3JNMBmP5Uq7xxzdj72k5Dvx0B9iYtZ1hgjzqWhPL5xpTEg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-sso@3.911.0': - resolution: {integrity: sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/core@3.911.0': - resolution: {integrity: sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-env@3.911.0': - resolution: {integrity: sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-http@3.911.0': - resolution: {integrity: sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-ini@3.913.0': - resolution: {integrity: sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-node@3.913.0': - resolution: {integrity: sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-process@3.911.0': - resolution: {integrity: sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-sso@3.911.0': - resolution: {integrity: sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.911.0': - resolution: {integrity: sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/lib-storage@3.913.0': - resolution: {integrity: sha512-IOlCRCvq+DmN9d3o9LLBiGt9CFQDp11joKgZ4CziUQ59qkHonkaf0GOt6Oo4zITGBegJ0FvKsWj+sDgYoQ1U9g==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@aws-sdk/client-s3': ^3.913.0 - - '@aws-sdk/middleware-bucket-endpoint@3.910.0': - resolution: {integrity: sha512-8ZfA0WARwvAKQQ7vmoQTg6xFEewFqsQCltQIHd7NtNs3CLF1aU06Ixp0i7Mp68k6dUj9WJJO7mz3I5VFOecqHQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-expect-continue@3.910.0': - resolution: {integrity: sha512-jtnsBlxuRyRbK52WdNSry28Tn4ljIqUfUEzDFYWDTEymEGPpVguQKPudW/6M5BWEDmNsv3ai/X+fXd0GZ1fE/Q==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.911.0': - resolution: {integrity: sha512-ZeS5zPKRCBMqpO8e0S/isfDWBt8AtG604PopKFFqEowbbV8cf6ms3hddNZRajTHvaoWBlU7Fbcn0827RWJnBdw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-host-header@3.910.0': - resolution: {integrity: sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-location-constraint@3.913.0': - resolution: {integrity: sha512-iudUrAYV4ZyweYL0hW/VaJzJRjFVruHpK0NukwECs0FZ76Zn17/smbkFIeiaRdGi9cqQdRk9PfhKPvbufnnhPg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-logger@3.910.0': - resolution: {integrity: sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.910.0': - resolution: {integrity: sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.911.0': - resolution: {integrity: sha512-P0mIIW/QkAGNvFu15Jqa5NSmHeQvZkkQY8nbQpCT3tGObZe4wRsq5u1mOS+CJp4DIBbRZuHeX7ohbX5kPMi4dg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-sdk-sqs@3.910.0': - resolution: {integrity: sha512-v0R/63/rVmy3rU7sYGAl4wKBRnipUuV/FHR2JnTJiCeBlMPKAjjG4ejXAAskjvnrozP8vQkUwe9A4Y/kGFAJrQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-ssec@3.910.0': - resolution: {integrity: sha512-Ikb0WrIiOeaZo9UmeoVrO4GH2OHiMTKSbr5raTW8nTCArED8iTVZiBF6As+JicZMLSNiBiYSb7EjDihWQ0DrTQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-user-agent@3.911.0': - resolution: {integrity: sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/nested-clients@3.911.0': - resolution: {integrity: sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/region-config-resolver@3.910.0': - resolution: {integrity: sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.911.0': - resolution: {integrity: sha512-SJ4dUcY9+HPDIMCHiskT8F7JrRVZF2Y1NUN0Yiy6VUHSULgq2MDlIzSQpNICnmXhk1F1E1B2jJG9XtPYrvtqUg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/token-providers@3.911.0': - resolution: {integrity: sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/types@3.910.0': - resolution: {integrity: sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-arn-parser@3.893.0': - resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-endpoints@3.910.0': - resolution: {integrity: sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-locate-window@3.893.0': - resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-user-agent-browser@3.910.0': - resolution: {integrity: sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg==} - - '@aws-sdk/util-user-agent-node@3.911.0': - resolution: {integrity: sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA==} - engines: {node: '>=18.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.911.0': - resolution: {integrity: sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg==} - engines: {node: '>=18.0.0'} - - '@aws/lambda-invoke-store@0.0.1': - resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} - engines: {node: '>=18.0.0'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1503,33 +1077,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@bugsnag/browser@8.6.0': - resolution: {integrity: sha512-7UGqTGnQqXUQ09gOlWbDTFUSbeLIIrP+hML3kTOq8Zdc8nP/iuOEflXGLV2TxWBWW8xIUPc928caFPr9EcaDuw==} - - '@bugsnag/core@8.6.0': - resolution: {integrity: sha512-94Jo443JegaiKV8z8NXMFdyTGubiUnwppWhq3kG2ldlYKtEvrmIaO5+JA58B6oveySvoRu3cCe2W9ysY7G7mDw==} - - '@bugsnag/cuid@3.2.1': - resolution: {integrity: sha512-zpvN8xQ5rdRWakMd/BcVkdn2F8HKlDSbM3l7duueK590WmI1T0ObTLc1V/1e55r14WNjPd5AJTYX4yPEAFVi+Q==} - - '@bugsnag/js@8.6.0': - resolution: {integrity: sha512-U+ofNTTMA2Z6tCrOhK/QhHBhLoQHoalk8Y82WWc7FAcVSoJZYadND/QuXUriNRZpC4YgJ/s/AxPeQ2y+WvMxzw==} - - '@bugsnag/node@8.6.0': - resolution: {integrity: sha512-O91sELo6zBjflVeP3roRC9l68iYaafVs5lz2N0FDkrT08mP2UljtNWpjjoR/0h1so5Ny1OxHgnZ1IrsXhz5SMQ==} - - '@bugsnag/plugin-koa@8.6.0': - resolution: {integrity: sha512-4LBgQKFlgJsPuvGMK+b8BmB+9RiaLAzXB/pgAcrTx007Np8fIFrOXCfAcDpx+rqxYGW1F/g9bUKy8V4gFQLxxw==} - peerDependencies: - '@bugsnag/core': ^8.0.0 - - '@bugsnag/safe-json-stringify@6.1.0': - resolution: {integrity: sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A==} - - '@clerk/backend@2.18.3': - resolution: {integrity: sha512-fWMq/Tb2hgfUXLKJN8jr6pbpA5XLUwC4BjWz7lB5Y+YhXhBrO7GtfpZIS91L/aDhNb17X6IaE6XvS6tDJBCUUw==} - engines: {node: '>=18.17.0'} - '@clerk/clerk-react@5.53.2': resolution: {integrity: sha512-/ckRJC1dDS6hUVv+zzNX5VUCC49/UlbhKElN5LQqv172ntrx4Mw1TKBCJ3aO5Rct/RiJxhf1PfTUEohtY4QjUg==} engines: {node: '>=18.17.0'} @@ -1910,18 +1457,10 @@ packages: resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.38.0': resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1934,51 +1473,6 @@ packages: resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@firebase/app-check-interop-types@0.3.2': - resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} - - '@firebase/app-types@0.9.2': - resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} - - '@firebase/app-types@0.9.3': - resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} - - '@firebase/auth-interop-types@0.2.3': - resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} - - '@firebase/component@0.6.10': - resolution: {integrity: sha512-OsNbEKyz9iLZSmMUhsl6+kCADzte00iisJIRUspnUqvDCX+RSGZOBIqekukv/jN177ovjApBQNFaxSYIDc/SyQ==} - engines: {node: '>=18.0.0'} - - '@firebase/database-compat@1.0.10': - resolution: {integrity: sha512-x3baGMzEKG5BE5orwFRg+Zpaa33N9lZkcOFXoZSeN9Muw/Mx37stePZpa1YMpcAPqX3aDx1cSv55Nxh4ObgpUQ==} - - '@firebase/database-types@1.0.16': - resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==} - - '@firebase/database-types@1.0.6': - resolution: {integrity: sha512-sMI7IynSZBsyGbUugc8PKE1jwKbnvaieAz/RxuM57PZQNCi6Rteiviwcw/jqZOX6igqYJwXWZ3UzKOZo2nUDRA==} - - '@firebase/database@1.0.9': - resolution: {integrity: sha512-EkiPSKSu2TJJGtOjyISASf3UFpFJDil1lMbfqnxilfbmIsilvC8DzgjuLoYD+eOitcug4wtU9Fh1tt2vgBhskA==} - engines: {node: '>=18.0.0'} - - '@firebase/logger@0.4.3': - resolution: {integrity: sha512-Th42bWJg18EF5bJwhRosn2M/eYxmbWCwXZr4hHX7ltO0SE3QLrpgiMKeRBR/NW7vJke7i0n3i8esbCW2s93qBw==} - engines: {node: '>=18.0.0'} - - '@firebase/util@1.10.1': - resolution: {integrity: sha512-AIhFnCCjM8FmCqSNlNPTuOk3+gpHC1RkeNUBLtPbcqGYpN5MxI5q7Yby+rxycweOZOCboDzfIj8WyaY4tpQG/g==} - engines: {node: '>=18.0.0'} - - '@firebase/util@1.13.0': - resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==} - engines: {node: '>=20.0.0'} - '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -1997,40 +1491,6 @@ packages: '@fontsource/inter@4.5.15': resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==} - '@google-cloud/firestore@7.11.6': - resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==} - engines: {node: '>=14.0.0'} - - '@google-cloud/paginator@5.0.2': - resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} - engines: {node: '>=14.0.0'} - - '@google-cloud/projectify@4.0.0': - resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} - engines: {node: '>=14.0.0'} - - '@google-cloud/promisify@4.0.0': - resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} - engines: {node: '>=14'} - - '@google-cloud/storage@7.17.2': - resolution: {integrity: sha512-6xN0KNO8L/LIA5zu3CJwHkJiB6n65eykBLOb0E+RooiHYgX8CSao6lvQiKT9TBk2gL5g33LL3fmhDodZnt56rw==} - engines: {node: '>=14'} - - '@grpc/grpc-js@1.14.0': - resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} - engines: {node: '>=6'} - hasBin: true - '@headlessui/react@1.7.18': resolution: {integrity: sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==} engines: {node: '>=10'} @@ -2051,29 +1511,14 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@ioredis/as-callback@3.0.0': - resolution: {integrity: sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg==} - - '@ioredis/commands@1.4.0': - resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2103,47 +1548,18 @@ packages: node-notifier: optional: true - '@jest/core@28.1.3': - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - '@jest/environment@27.5.1': resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/environment@28.1.3': - resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/expect-utils@28.1.3': - resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/expect@28.1.3': - resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/fake-timers@27.5.1': resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/fake-timers@28.1.3': - resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/globals@27.5.1': resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/globals@28.1.3': - resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/reporters@27.5.1': resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2153,15 +1569,6 @@ packages: node-notifier: optional: true - '@jest/reporters@28.1.3': - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - '@jest/schemas@28.1.3': resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -2170,10 +1577,6 @@ packages: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/source-map@28.1.2': - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/test-result@27.5.1': resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2186,18 +1589,10 @@ packages: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/test-sequencer@28.1.3': - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/transform@27.5.1': resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/transform@28.1.3': - resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/types@27.5.1': resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2228,33 +1623,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - - '@koa/cors@5.0.0': - resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} - engines: {node: '>= 14.0.0'} - - '@koa/router@11.0.2': - resolution: {integrity: sha512-VmlGwc5n0d+0vbudFXWsAHcfLn8cJ34gS4ktf8bxmN1yzmWBGts1IbaAjvNr6LBAXf+/U51qxLNv8oalh/UYKQ==} - engines: {node: '>= 12'} - deprecated: Please upgrade to v15 or higher. All reported bugs in this version are fixed in newer releases, dependencies have been updated, and security has been improved. - - '@ladjs/country-language@1.0.3': - resolution: {integrity: sha512-FJROu9/hh4eqVAGDyfL8vpv6Vb0qKHX1ozYLRZ+beUzD5xFf+3r0J+SVIWKviEa7W524Qvqou+ta1WrsRgzxGw==} - engines: {node: '>= 14'} - '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@lukeed/csprng@1.1.0': - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} - - '@lukeed/uuid@2.0.1': - resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} - engines: {node: '>=8'} - '@measured/puck@0.21.0-canary.72e4fcca': resolution: {integrity: sha512-dw0YOtV8ZtZn14aLPysfTXG+hJxqkrpIH3oPJNPleavbMRsWbcN0lICBssU4kw8PxfdNApNpD3Yzcz+04127FA==} deprecated: 'Puck has moved. Please use @puckeditor/core instead: https://www.npmjs.com/package/@puckeditor/core' @@ -2274,36 +1645,6 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - '@mui/core-downloads-tracker@5.18.0': resolution: {integrity: sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==} @@ -2384,14 +1725,6 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@node-saml/node-saml@4.0.5': - resolution: {integrity: sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw==} - engines: {node: '>= 14'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2416,17 +1749,6 @@ packages: resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@paralleldrive/cuid2@2.2.2': - resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - - '@parse/node-apn@6.0.1': - resolution: {integrity: sha512-QQxqEN/zbtEkSgj41oX/tQUavML+G+JHeQi2YVlgZlponnwIxA3fb5tEbXPm+fdR6rL1pi2/z2PcOwINOyx2eA==} - engines: {node: '>= 14'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2463,36 +1785,6 @@ packages: '@preact/signals-core@1.12.1': resolution: {integrity: sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -3305,286 +2597,18 @@ packages: '@rushstack/eslint-patch@1.15.0': resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} - '@segment/analytics-core@1.4.1': - resolution: {integrity: sha512-kV0Pf33HnthuBOVdYNani21kYyj118Fn+9757bxqoksiXoZlYvBsFq6giNdCsKcTIE1eAMqNDq3xE1VQ0cfsHA==} - - '@segment/analytics-generic-utils@1.1.1': - resolution: {integrity: sha512-THTIzBPHnvu1HYJU3fARdJ3qIkukO3zDXsmDm+kAeUks5R9CBXOQ6rPChiASVzSmwAIIo5uFIXXnCraojlq/Gw==} - - '@segment/analytics-node@1.3.0': - resolution: {integrity: sha512-lRLz1WZaDokMoUe299yP5JkInc3OgJuqNNlxb6j0q22umCiq6b5iDo2gRmFn93reirIvJxWIicQsGrHd93q8GQ==} - engines: {node: '>=14'} - '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sendgrid/client@6.5.5': - resolution: {integrity: sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==} - engines: {node: '>=6.0.0'} - - '@sendgrid/helpers@6.5.5': - resolution: {integrity: sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==} - engines: {node: '>= 6.0.0'} + '@sinclair/typebox@0.24.51': + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - '@sendgrid/mail@6.5.5': - resolution: {integrity: sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==} - engines: {node: '>=6.0.0'} - - '@sentry-internal/tracing@7.120.4': - resolution: {integrity: sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw==} - engines: {node: '>=8'} - - '@sentry/core@7.120.4': - resolution: {integrity: sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA==} - engines: {node: '>=8'} - - '@sentry/integrations@7.120.4': - resolution: {integrity: sha512-kkBTLk053XlhDCg7OkBQTIMF4puqFibeRO3E3YiVc4PGLnocXMaVpOSCkMqAc1k1kZ09UgGi8DxfQhnFEjUkpA==} - engines: {node: '>=8'} - - '@sentry/node@7.120.4': - resolution: {integrity: sha512-qq3wZAXXj2SRWhqErnGCSJKUhPSlZ+RGnCZjhfjHpP49KNpcd9YdPTIUsFMgeyjdh6Ew6aVCv23g1hTP0CHpYw==} - engines: {node: '>=8'} - - '@sentry/types@7.120.4': - resolution: {integrity: sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==} - engines: {node: '>=8'} - - '@sentry/utils@7.120.4': - resolution: {integrity: sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==} - engines: {node: '>=8'} - - '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - - '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + '@sinonjs/commons@1.8.6': + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} '@sinonjs/fake-timers@8.1.0': resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - '@sinonjs/fake-timers@9.1.2': - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - - '@smithy/abort-controller@4.2.3': - resolution: {integrity: sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==} - engines: {node: '>=18.0.0'} - - '@smithy/chunked-blob-reader-native@4.2.1': - resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} - engines: {node: '>=18.0.0'} - - '@smithy/chunked-blob-reader@5.2.0': - resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} - engines: {node: '>=18.0.0'} - - '@smithy/config-resolver@4.3.3': - resolution: {integrity: sha512-xSql8A1Bl41O9JvGU/CtgiLBlwkvpHTSKRlvz9zOBvBCPjXghZ6ZkcVzmV2f7FLAA+80+aqKmIOmy8pEDrtCaw==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.17.0': - resolution: {integrity: sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.2.3': - resolution: {integrity: sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-codec@4.2.3': - resolution: {integrity: sha512-rcr0VH0uNoMrtgKuY7sMfyKqbHc4GQaQ6Yp4vwgm+Z6psPuOgL+i/Eo/QWdXRmMinL3EgFM0Z1vkfyPyfzLmjw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.2.3': - resolution: {integrity: sha512-EcS0kydOr2qJ3vV45y7nWnTlrPmVIMbUFOZbMG80+e2+xePQISX9DrcbRpVRFTS5Nqz3FiEbDcTCAV0or7bqdw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.3.3': - resolution: {integrity: sha512-GewKGZ6lIJ9APjHFqR2cUW+Efp98xLu1KmN0jOWxQ1TN/gx3HTUPVbLciFD8CfScBj2IiKifqh9vYFRRXrYqXA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.2.3': - resolution: {integrity: sha512-uQobOTQq2FapuSOlmGLUeGTpvcBLE5Fc7XjERUSk4dxEi4AhTwuyHYZNAvL4EMUp7lzxxkKDFaJ1GY0ovrj0Kg==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-universal@4.2.3': - resolution: {integrity: sha512-QIvH/CKOk1BZPz/iwfgbh1SQD5Y0lpaw2kLA8zpLRRtYMPXeYUEWh+moTaJyqDaKlbrB174kB7FSRFiZ735tWw==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.3.4': - resolution: {integrity: sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-blob-browser@4.2.4': - resolution: {integrity: sha512-W7eIxD+rTNsLB/2ynjmbdeP7TgxRXprfvqQxKFEfy9HW2HeD7t+g+KCIrY0pIn/GFjA6/fIpH+JQnfg5TTk76Q==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-node@4.2.3': - resolution: {integrity: sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-stream-node@4.2.3': - resolution: {integrity: sha512-EXMSa2yiStVII3x/+BIynyOAZlS7dGvI7RFrzXa/XssBgck/7TXJIvnjnCu328GY/VwHDC4VeDyP1S4rqwpYag==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.3': - resolution: {integrity: sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==} - engines: {node: '>=18.0.0'} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} - engines: {node: '>=18.0.0'} - - '@smithy/md5-js@4.2.3': - resolution: {integrity: sha512-5+4bUEJQi/NRgzdA5SVXvAwyvEnD0ZAiKzV3yLO6dN5BG8ScKBweZ8mxXXUtdxq+Dx5k6EshKk0XJ7vgvIPSnA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.2.3': - resolution: {integrity: sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.3.4': - resolution: {integrity: sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.4.4': - resolution: {integrity: sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.2.3': - resolution: {integrity: sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.2.3': - resolution: {integrity: sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.3.3': - resolution: {integrity: sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-http-handler@4.4.2': - resolution: {integrity: sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ==} - engines: {node: '>=18.0.0'} - - '@smithy/property-provider@4.2.3': - resolution: {integrity: sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==} - engines: {node: '>=18.0.0'} - - '@smithy/protocol-http@5.3.3': - resolution: {integrity: sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-builder@4.2.3': - resolution: {integrity: sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-parser@4.2.3': - resolution: {integrity: sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==} - engines: {node: '>=18.0.0'} - - '@smithy/service-error-classification@4.2.3': - resolution: {integrity: sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.3.3': - resolution: {integrity: sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.3.3': - resolution: {integrity: sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==} - engines: {node: '>=18.0.0'} - - '@smithy/smithy-client@4.9.0': - resolution: {integrity: sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.8.0': - resolution: {integrity: sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==} - engines: {node: '>=18.0.0'} - - '@smithy/url-parser@4.2.3': - resolution: {integrity: sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-base64@4.3.0': - resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-browser@4.2.0': - resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.2.1': - resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} - engines: {node: '>=18.0.0'} - - '@smithy/util-config-provider@4.2.0': - resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-browser@4.3.3': - resolution: {integrity: sha512-vqHoybAuZXbFXZqgzquiUXtdY+UT/aU33sxa4GBPkiYklmR20LlCn+d3Wc3yA5ZM13gQ92SZe/D8xh6hkjx+IQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.2.4': - resolution: {integrity: sha512-X5/xrPHedifo7hJUUWKlpxVb2oDOiqPUXlvsZv1EZSjILoutLiJyWva3coBpn00e/gPSpH8Rn2eIbgdwHQdW7Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.2.3': - resolution: {integrity: sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.2.3': - resolution: {integrity: sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.2.3': - resolution: {integrity: sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.5.3': - resolution: {integrity: sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A==} - engines: {node: '>=18.0.0'} - - '@smithy/util-uri-escape@4.2.0': - resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-waiter@4.2.3': - resolution: {integrity: sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ==} - engines: {node: '>=18.0.0'} - - '@smithy/uuid@1.1.0': - resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} - engines: {node: '>=18.0.0'} - - '@stablelib/base64@1.0.1': - resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} - '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -4042,10 +3066,6 @@ packages: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -4062,9 +3082,6 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/accepts@1.3.7': - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -4086,27 +3103,12 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - '@types/busboy@1.5.4': - resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} - - '@types/caseless@0.12.5': - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/content-disposition@0.5.9': - resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} - - '@types/cookiejar@2.1.5': - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - - '@types/cookies@0.9.1': - resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} - '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -4200,9 +3202,6 @@ packages: '@types/d3@7.4.3': resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -4224,18 +3223,12 @@ packages: '@types/express-serve-static-core@5.1.0': resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} - '@types/express@4.17.23': - resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} '@types/express@5.0.3': resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} - '@types/formidable@2.0.6': - resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} - '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -4245,23 +3238,12 @@ packages: '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - '@types/html-to-text@9.0.4': - resolution: {integrity: sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==} - - '@types/http-assert@1.5.6': - resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/http-proxy@1.17.17': resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} - '@types/ioredis-mock@8.2.6': - resolution: {integrity: sha512-5heqtZMvQ4nXARY0o8rc8cjkJjct2ScM12yCJ/h731S9He93a2cv+kAhwPCNwTKDfNH9gjRfLG4VpAEYJU0/gQ==} - peerDependencies: - ioredis: '>=5' - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -4274,48 +3256,15 @@ packages: '@types/jest@27.5.2': resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} - '@types/jest@28.1.8': - resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonpath@0.2.4': - resolution: {integrity: sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==} - - '@types/jsonwebtoken@9.0.10': - resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - - '@types/keygrip@1.0.6': - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - - '@types/koa-compose@3.2.8': - resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} - - '@types/koa-send@4.1.6': - resolution: {integrity: sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==} - - '@types/koa-static@4.0.4': - resolution: {integrity: sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A==} - - '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} - - '@types/koa__cors@3.3.1': - resolution: {integrity: sha512-aFGYhTFW7651KhmZZ05VG0QZJre7QxBxDj2LF1lf6GA/wSXEfKVAJxiQQWzRV4ZoMzQIO8vJBXKsUcRuvYK9qw==} - - '@types/koa__router@8.0.11': - resolution: {integrity: sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==} - '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} @@ -4325,48 +3274,21 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/methods@1.1.4': - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node-pushnotifications@1.0.8': - resolution: {integrity: sha512-nIYuR0zgluQfoKW3gI0HRaWi+NU4/M16KUpovjcu06WL/hc34DHiVv1OGfFkP+z7yL46TXpa0y0tiFlXW8ivVQ==} - - '@types/node-schedule@2.1.8': - resolution: {integrity: sha512-k00g6Yj/oUg/CDC+MeLHUzu0+OFxWbIqrFfDiLi6OPKxTujvpv29mHGM8GtKr7B+9Vv92FcK/8mRqi1DK5f3hA==} - '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} '@types/node@20.19.22': resolution: {integrity: sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==} - '@types/node@24.9.0': - resolution: {integrity: sha512-MKNwXh3seSK8WurXF7erHPJ2AONmMwkI7zAMrXZDPIru8jRqkk6rGDBVbw4mLwfqA+ZZliiDPg05JQ3uW66tKQ==} - - '@types/nodemailer-mailgun-transport@1.4.6': - resolution: {integrity: sha512-6qhtDo+1ZLtrmmpQN7O9e3NLK5ggnTS2Oca+22SvmhwChNKxDZErecTlF6qTOLnNW/CCcHmDaSmG2MXUeP1w9g==} - - '@types/nodemailer-sendgrid@1.0.3': - resolution: {integrity: sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==} - - '@types/nodemailer@6.4.20': - resolution: {integrity: sha512-uj83z0GqwqMUE6RI4EKptPlav0FYE6vpIlqJAnxzu+/sSezRdbH69rSBCMsdW6DdsCAzoFQZ52c2UIlhRVQYDA==} - '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/passport@1.0.17': - resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} - '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} @@ -4400,9 +3322,6 @@ packages: '@types/react@19.2.8': resolution: {integrity: sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==} - '@types/request@2.48.13': - resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} - '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -4412,9 +3331,6 @@ packages: '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -4427,27 +3343,15 @@ packages: '@types/serve-static@1.15.10': resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} - '@types/serve-static@1.15.9': - resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==} - '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/superagent@8.1.9': - resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - - '@types/supertest@2.0.16': - resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} - '@types/testing-library__jest-dom@5.14.9': resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -4457,24 +3361,12 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/web-push@3.6.4': - resolution: {integrity: sha512-GnJmSr40H3RAnj0s34FNTcJi1hmWFV5KXugE0mYWnYhgTAHLJ/dJKAwDmvPJYMke0RplY2XE9LnM4hqSqKIjhQ==} - '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/xml-crypto@1.4.6': - resolution: {integrity: sha512-A6jEW2FxLZo1CXsRWnZHUX2wzR3uDju2Bozt6rDbSmU/W8gkilaVbwFEVN0/NhnUdMVzwYobWtM6bU1QJJFb7Q==} - - '@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==} @@ -4607,9 +3499,6 @@ packages: resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-react-swc@4.1.0': resolution: {integrity: sha512-Ff690TUck0Anlh7wdIcnsVMhofeEVgm44Y4OYdeeEEPSKyZHzDI9gfVBvySEhDfXtBp8tLCbfsVKPWEMEjq8/g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4667,10 +3556,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} - engines: {node: '>=10.0.0'} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -4681,10 +3566,6 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -4737,11 +3618,6 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv-errors@3.0.0: - resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} - peerDependencies: - ajv: ^8.0.1 - ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -4881,23 +3757,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -4905,9 +3767,6 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -4918,10 +3777,6 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - autoprefixer@10.4.23: resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} @@ -4933,12 +3788,6 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axe-core@4.11.0: resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} engines: {node: '>=4'} @@ -4946,12 +3795,6 @@ packages: axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -4965,12 +3808,6 @@ packages: peerDependencies: '@babel/core': ^7.8.0 - babel-jest@28.1.3: - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - babel-loader@8.4.1: resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} engines: {node: '>= 8.9'} @@ -4986,10 +3823,6 @@ packages: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -5028,24 +3861,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-jest@28.1.3: - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - babel-preset-react-app@10.1.0: resolution: {integrity: sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.18: resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} hasBin: true @@ -5061,9 +3882,6 @@ packages: batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - bfj@7.1.0: resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} engines: {node: '>= 8.0.0'} @@ -5071,22 +3889,13 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - 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.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -5101,9 +3910,6 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - bowser@2.12.1: - resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -5127,10 +3933,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -5139,39 +3941,13 @@ packages: engines: {node: '>= 0.4.0'} hasBin: true - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.6.0: - resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - - bullmq@5.61.0: - resolution: {integrity: sha512-khaTjc1JnzaYFl4FrUtsSsqugAW/urRrcZ9Q0ZE+REAw8W+gkHFqxbGlutOu6q7j7n91wibVaaNlOUMdiEvoSQ==} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -5180,10 +3956,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -5228,9 +4000,6 @@ packages: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5268,9 +4037,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -5298,10 +4064,6 @@ packages: 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'} - clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -5310,19 +4072,12 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc - co-body@5.2.0: - resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==} - co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -5369,9 +4124,6 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -5382,10 +4134,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -5408,9 +4156,6 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -5429,172 +4174,6 @@ packages: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} - consolidate@0.15.1: - resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} - engines: {node: '>= 0.10.0'} - deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog - peerDependencies: - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - babel-core: ^6.26.3 - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jade: ^1.11.0 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - marko: ^3.14.4 - mote: ^0.2.0 - mustache: ^3.0.0 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - razor-tmpl: ^1.3.1 - react: ^16.13.1 - react-dom: ^16.13.1 - slm: ^2.0.0 - squirrelly: ^5.1.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-jade: '*' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - arc-templates: - optional: true - atpl: - optional: true - babel-core: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jade: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - marko: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - razor-tmpl: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - squirrelly: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-jade: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -5627,13 +4206,6 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - - cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} - copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -5650,9 +4222,6 @@ packages: core-js@3.47.0: resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -5679,10 +4248,6 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} - cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -5829,9 +4394,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - csv-parse@5.6.0: - resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} - d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -5901,10 +4463,6 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - data-urls@2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} @@ -5921,26 +4479,14 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns-tz@1.3.8: - resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} - peerDependencies: - date-fns: '>=2.0.0' - date-fns-tz@3.2.0: resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} peerDependencies: date-fns: ^3.0.0 || ^4.0.0 - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5957,24 +4503,6 @@ packages: supports-color: optional: true - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5990,10 +4518,6 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -6009,17 +4533,10 @@ packages: resolution: {integrity: sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -6047,13 +4564,6 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -6089,9 +4599,6 @@ packages: engines: {node: '>= 4.2.1'} hasBin: true - dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -6099,10 +4606,6 @@ packages: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - diff-sequences@28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -6122,10 +4625,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -6182,14 +4681,6 @@ packages: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - - dset@3.1.4: - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} - engines: {node: '>=4'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -6197,18 +4688,9 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -6249,9 +4731,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} @@ -6280,10 +4759,6 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -6362,12 +4837,6 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - eslint-config-react-app@7.0.1: resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} @@ -6378,15 +4847,6 @@ packages: typescript: optional: true - eslint-config-standard@17.1.0: - resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: '^15.0.0 || ^16.0.0 ' - eslint-plugin-promise: ^6.0.0 - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -6411,12 +4871,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - eslint-plugin-flowtype@8.0.3: resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} @@ -6454,18 +4908,6 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-n@16.6.2: - resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-promise@6.6.0: - resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} @@ -6499,10 +4941,6 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6526,12 +4964,6 @@ packages: eslint: ^7.0.0 || ^8.0.0 webpack: ^5.0.0 - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - eslint@9.38.0: resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6542,18 +4974,10 @@ packages: jiti: optional: true - esm@3.2.25: - resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} - engines: {node: '>=6'} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@1.2.2: resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} engines: {node: '>=0.4.0'} @@ -6594,13 +5018,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -6620,18 +5037,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - expect@27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - expect@28.1.3: - resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} @@ -6640,24 +5049,6 @@ packages: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - extsprintf@1.4.1: - resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} - engines: {'0': node >=0.6.0} - - farmhash@3.3.1: - resolution: {integrity: sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==} - engines: {node: '>=10'} - - fast-copy@2.1.7: - resolution: {integrity: sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==} - fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} @@ -6686,27 +5077,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-sha256@1.3.0: - resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} - fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@4.5.3: - resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} - hasBin: true - - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} - hasBin: true - fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -6726,18 +5099,6 @@ packages: picomatch: optional: true - fengari-interop@0.1.3: - resolution: {integrity: sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==} - peerDependencies: - fengari: ^0.1.0 - - fengari@0.1.4: - resolution: {integrity: sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -6786,14 +5147,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase-admin@12.1.1: - resolution: {integrity: sha512-Nuoxk//gaYrspS7TvwBINdGvFhh2QeiaWpRW6+PJ+tWyn2/CugBc7jKa1NaBg0AvhGSOXFOCIsXhzCzHA47Rew==} - engines: {node: '>=14'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -6822,9 +5175,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - fork-ts-checker-webpack-plugin@6.5.3: resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} @@ -6839,14 +5189,6 @@ packages: vue-template-compiler: optional: true - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - - form-data@2.5.5: - resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} - engines: {node: '>= 0.12'} - form-data@3.0.4: resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} engines: {node: '>= 6'} @@ -6855,9 +5197,6 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formidable@2.1.5: - resolution: {integrity: sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -6869,9 +5208,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -6898,20 +5234,9 @@ packages: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} - - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} - generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -6955,18 +5280,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - - getopts@2.3.0: - resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6986,11 +5299,6 @@ packages: 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 - global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} @@ -6999,10 +5307,6 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -7027,18 +5331,6 @@ packages: peerDependencies: csstype: ^3.0.10 - google-auth-library@9.15.1: - resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} - engines: {node: '>=14'} - - google-gax@4.6.1: - resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==} - engines: {node: '>=14'} - - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} - engines: {node: '>=14'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -7049,10 +5341,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -7060,10 +5348,6 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - handlebars-utils@1.0.6: - resolution: {integrity: sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==} - engines: {node: '>=0.10.0'} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -7073,15 +5357,6 @@ packages: resolution: {integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==} engines: {node: '>=20.0.0'} - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} @@ -7120,9 +5395,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - help-me@4.2.0: - resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} - hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -7202,10 +5474,6 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} - http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -7213,10 +5481,6 @@ packages: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} - http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} - http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -7232,10 +5496,6 @@ packages: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http-proxy-middleware@2.0.9: resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} engines: {node: '>=12.0.0'} @@ -7249,14 +5509,6 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - http_ece@1.2.0: - resolution: {integrity: sha512-JrF8SSLVmcvc5NducxgyOrKXe3EsyHMgBFgSaIUGmArKe+rwr0uphRkRXvwiom3I+fpIfoItveHrfudL8/rxuA==} - engines: {node: '>=16'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -7283,10 +5535,6 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} - icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -7300,12 +5548,6 @@ packages: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -7314,9 +5556,6 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -7341,10 +5580,6 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} - inflation@2.1.0: - resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} - engines: {node: '>= 0.8.0'} - 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. @@ -7369,21 +5604,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - interpret@2.2.0: - resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} - engines: {node: '>= 0.10'} - - ioredis-mock@8.13.0: - resolution: {integrity: sha512-oO6s5xeL3A+EmcmyoEAMxJnwsnXaBfo5IYD2cctsqxLbX9d6dZm67k5nDXAUWMtkIVJJeEbDa4LuFpDowJbvaw==} - engines: {node: '>=12.22'} - peerDependencies: - '@types/ioredis-mock': ^8 - ioredis: ^5 - - ioredis@5.8.1: - resolution: {integrity: sha512-Qho8TgIamqEPdgiMadJwzRMW3TudIg6vpg4YONokGDudy4eqRIJtDbVX72pfLBcWxvbn3qm/40TyGUObdW4tLQ==} - engines: {node: '>=12.22.0'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -7422,10 +5642,6 @@ packages: is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -7494,10 +5710,6 @@ packages: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -7573,15 +5785,9 @@ packages: resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} engines: {node: '>=18'} - iserror@0.0.2: - resolution: {integrity: sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -7618,18 +5824,10 @@ packages: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-changed-files@28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-circus@27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-cli@27.5.1: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7640,16 +5838,6 @@ packages: node-notifier: optional: true - jest-cli@28.1.3: - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - jest-config@27.5.1: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7659,42 +5847,18 @@ packages: ts-node: optional: true - jest-config@28.1.3: - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-diff@28.1.3: - resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-docblock@28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-each@27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-each@28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-environment-jsdom@27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7703,26 +5867,14 @@ packages: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-environment-node@28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-get-type@27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-get-type@28.0.2: - resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-haste-map@28.1.3: - resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-jasmine2@27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7731,18 +5883,10 @@ packages: resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-leak-detector@28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-matcher-utils@27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-matcher-utils@28.1.3: - resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7755,10 +5899,6 @@ packages: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-mock@28.1.3: - resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -7780,34 +5920,18 @@ packages: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-resolve-dependencies@28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-resolve@27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-resolve@28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-runner@27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-runner@28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-runtime@27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-runtime@28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-serializer@27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7816,10 +5940,6 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-snapshot@28.1.3: - resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-util@27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7832,10 +5952,6 @@ packages: resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-validate@28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-watch-typeahead@1.1.0: resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7872,31 +5988,14 @@ packages: node-notifier: optional: true - jest@28.1.3: - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -7908,10 +6007,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -7920,9 +6015,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} @@ -7942,9 +6034,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -7967,9 +6056,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -7989,50 +6075,13 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - jsonwebtoken@9.0.0: - resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} - engines: {node: '>=12', npm: '>=6'} - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - jwa@1.4.2: - resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - - jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - - jwks-rsa@3.2.0: - resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==} - engines: {node: '>=14'} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - jws@4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} - - keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -8045,56 +6094,6 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - knex@2.5.1: - resolution: {integrity: sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==} - engines: {node: '>=12'} - 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 - - koa-body@5.0.0: - resolution: {integrity: sha512-nHwEODrQGiyKBILCWO8QSS40C87cKr2cp3y/Cw8u9Z8w5t0CdSkGm3+y9WK5BIAlPpo9tTw5RtSbxpVyG79vmw==} - - koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - - koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} - - koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} - - koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} - - koa@2.16.3: - resolution: {integrity: sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -8120,12 +6119,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.12.24: - resolution: {integrity: sha512-l5IlyL9AONj4voSd7q9xkuQOL4u8Ty44puTic7J88CmdXkxfGsRfoVLXHCxppwehgpb/Chdb80FFehHqjN3ItQ==} - - lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -8204,9 +6197,6 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} - limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8228,9 +6218,6 @@ packages: resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} - localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -8243,48 +6230,15 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.padend@4.6.1: resolution: {integrity: sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==} @@ -8303,12 +6257,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - long-timeout@0.1.1: - resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} - - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -8322,26 +6270,15 @@ 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'} - lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - lucide-react@0.546.0: resolution: {integrity: sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - luxon@3.7.2: - resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} - engines: {node: '>=12'} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -8352,9 +6289,6 @@ packages: magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - mailgun.js@8.2.2: - resolution: {integrity: sha512-po/KtofzrTuKhHLenbmliDsVVOFANwcfDFUGnggwnyZJmZz7JgBlV6nzK9o2Fk+OK2SiBmJTK25RbkAj57Hd+Q==} - make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -8437,24 +6371,10 @@ packages: engines: {node: '>=4'} hasBin: true - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -8486,9 +6406,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -8508,19 +6425,9 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.5: - resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} - multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true @@ -8533,9 +6440,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -8556,20 +6460,6 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.78.0: - resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==} - engines: {node: '>=10'} - - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - - node-adm@0.9.1: - resolution: {integrity: sha512-npudU9I1l6wUEUcZme6yhe1WTi48nMSM7v2BxqGtE7hO12knzCnRj+IeUmaDdNzNMNiOU8ZYqN6PE6PXX2F/3w==} - engines: {node: '>= 0.6.0'} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -8579,54 +6469,19 @@ packages: encoding: optional: true - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - node-forge@1.3.3: resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} - node-gcm@1.1.4: - resolution: {integrity: sha512-6Z3Ksmum3xsux/Ejwg2pn+yELvL13nIP5ZbdJDZupnipfP10xyPvJGt5jlB3pCrKkIzcTKL87OI0xsbbz8YkpA==} - engines: {node: '>= 12'} - - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-pushnotifications@3.1.1: - resolution: {integrity: sha512-rgA6jvs5DbSZPhUBhbbym3h0iZvncN9s8wpSDpQ0rt8+ICKkCmMDVzzQFjcd1nRL91zdF7zpLKYptCxdsmv6Aw==} - engines: {node: '>=14.x.x'} - node-releases@2.0.25: resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - node-schedule@2.1.1: - resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} - engines: {node: '>=6'} - - nodemailer-mailgun-transport@2.1.5: - resolution: {integrity: sha512-hF7POkaxFgMvYEd5aHLaQJI2511ld+aQlQi7JH6bGjhjlZ33cIbTB9PimlIrLu5XC3z76Kde6e65OIwL9lOdTA==} - - nodemailer-sendgrid@1.0.3: - resolution: {integrity: sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==} - - nodemailer@6.10.1: - resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==} - engines: {node: '>=6.0.0'} - - nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} - hasBin: true - noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} @@ -8671,17 +6526,10 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -8725,17 +6573,6 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - oidc-token-hash@5.1.1: - resolution: {integrity: sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==} - engines: {node: ^10.13.0 || >=12.0.0} - - on-exit-leak-free@1.0.0: - resolution: {integrity: sha512-Ve8ubhrXRdnuCJ5bQSQpP3uaV43K1PMcOfSRC1pqHgRZommXCgsXwh08jVC5NpjwScE23BPDwDvVg4cov3mwjw==} - - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -8755,9 +6592,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -8778,9 +6612,6 @@ packages: peerDependencies: typescript: ^5.x - openid-client@5.7.1: - resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} - optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -8792,10 +6623,6 @@ packages: orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -8885,9 +6712,6 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -8904,53 +6728,6 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - pg-cloudflare@1.2.7: - resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} - - pg-connection-string@2.6.1: - resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} - - pg-connection-string@2.9.1: - resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} - - pg-cursor@2.15.3: - resolution: {integrity: sha512-eHw63TsiGtFEfAd7tOTZ+TLy+i/2ePKS20H84qCQ+aQ60pve05Okon9tKMC+YN3j6XyeFoHnaim7Lt9WVafQsA==} - peerDependencies: - pg: ^8 - - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-pool@3.10.1: - resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} - peerDependencies: - pg: '>=8.0' - - pg-protocol@1.10.3: - resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - - pg-query-stream@4.10.3: - resolution: {integrity: sha512-h2utrzpOIzeT9JfaqfvBbVuvCfBjH86jNfVrGGTbyepKAIOyTfDew0lAt8bbJjs9n/I5bGDl7S2sx6h5hPyJxw==} - peerDependencies: - pg: ^8 - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - - pg@8.16.3: - resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} - engines: {node: '>= 16.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - - pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} @@ -8969,20 +6746,6 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} - - pino-pretty@8.1.0: - resolution: {integrity: sha512-oKfI8qKXR2a3haHs/X8iB6QSnWLqoOGAjwxIAXem4+XOGIGNw7IKpozId1uE7j89Rj46HIfWnGbAgmQmr8+yRw==} - hasBin: true - - pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - - pino@8.21.0: - resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} - hasBin: true - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -9439,31 +7202,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - 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-node@3.6.3: - resolution: {integrity: sha512-JB+ei0LkwE+rKHyW5z79Nd1jUaGxU6TvkfjFqY9vQaHxU5aU8dRl0UUaEmZdZbHwjp3WmXCBQQRNyimwbNQfCw==} - engines: {node: '>=15.0.0'} - - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -9503,13 +7241,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -9590,30 +7321,13 @@ packages: prosemirror-view@1.41.4: resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} - proto3-json-serializer@2.0.2: - resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} - engines: {node: '>=14.0.0'} - - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -9638,25 +7352,15 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - ramda@0.30.1: - resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -9672,14 +7376,6 @@ packages: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} - raw-body@3.0.1: - resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} - engines: {node: '>= 0.10'} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-app-polyfill@3.0.0: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} @@ -9872,10 +7568,6 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -9884,14 +7576,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - readline-sync@1.4.10: - resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} - engines: {node: '>= 0.8.0'} - - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -9902,10 +7586,6 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} engines: {node: '>=6.0.0'} @@ -9914,14 +7594,6 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - - redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -9961,11 +7633,6 @@ packages: renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9989,13 +7656,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve-url-loader@4.0.0: resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} engines: {node: '>=8.9'} @@ -10026,10 +7686,6 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - retry-request@7.0.2: - resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} - engines: {node: '>=14'} - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -10086,9 +7742,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rusha@0.8.14: - resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -10107,10 +7760,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -10139,9 +7788,6 @@ packages: sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -10165,9 +7811,6 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -10186,10 +7829,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -10277,16 +7916,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - 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-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -10304,12 +7933,6 @@ packages: sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - sonic-boom@3.8.1: - resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} - - sorted-array-functions@1.3.0: - resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} - source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} @@ -10328,9 +7951,6 @@ packages: peerDependencies: webpack: ^5.0.0 - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -10374,28 +7994,13 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} - stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -10403,12 +8008,6 @@ packages: stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - - standardwebhooks@1.0.0: - resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} - state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} @@ -10434,19 +8033,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - - stream-events@1.0.5: - resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -10533,23 +8119,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - - stubs@3.0.0: - resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - style-loader@3.3.4: resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} @@ -10576,16 +8149,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net - - supertest@6.3.4: - resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} - engines: {node: '>=6.4.0'} - deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net - supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} @@ -10624,9 +8187,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - svix@1.77.0: - resolution: {integrity: sha512-rqyvcFHMq1eGIjYwZEEsW5MkeLH4FRr23TuSsLLhH+/wilK4sjdJSYmALTke3kyMqab7lqWTc9jyKFw6o0/oKg==} - swr@2.3.4: resolution: {integrity: sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==} peerDependencies: @@ -10659,21 +8219,6 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tarn@3.0.2: - resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} - engines: {node: '>=8.0.0'} - - teeny-request@9.0.0: - resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} - engines: {node: '>=14'} - temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -10725,9 +8270,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@2.7.0: - resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} - throat@6.0.2: resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} @@ -10737,10 +8279,6 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - tildify@2.0.0: - resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} - engines: {node: '>=8'} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -10748,10 +8286,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -10766,14 +8300,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true - - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -10800,27 +8326,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@28.0.8: - resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^28.0.0 - babel-jest: ^28.0.0 - esbuild: '*' - jest: ^28.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -10854,25 +8359,15 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -10889,10 +8384,6 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -10924,10 +8415,6 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typeof-article@0.1.1: - resolution: {integrity: sha512-Vn42zdX3FhmUrzEmitX3iYyLb+Umwpmv8fkZRIknYh84lmdrwqZA5xYaoKiIj2Rc5i/5wcDrpUmZcbk1U51vTw==} - engines: {node: '>=4'} - typescript-eslint@8.46.2: resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10935,11 +8422,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -10957,21 +8439,12 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - underscore@1.13.1: - resolution: {integrity: sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -11033,9 +8506,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -11083,19 +8553,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - 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 @@ -11111,10 +8568,6 @@ packages: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - valibot@1.1.0: resolution: {integrity: sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==} peerDependencies: @@ -11134,14 +8587,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - verror@1.10.1: - resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} - engines: {node: '>=0.6.0'} - victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} @@ -11231,11 +8676,6 @@ packages: wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - web-push@3.6.7: - resolution: {integrity: sha512-OpiIUe8cuGjrj3mMBFWY+e4MMIkW3SVT+7vEIjvD9kejGUypv8GPDf84JdPWskK8zMRIJ6xYGm+Kxr8YkPyA0A==} - engines: {node: '>= 16'} - hasBin: true - web-streams-polyfill@4.2.0: resolution: {integrity: sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA==} engines: {node: '>= 8'} @@ -11365,10 +8805,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - wns@0.5.4: - resolution: {integrity: sha512-WYiJ7khIwUGBD5KAm+YYmwJDDRzFRs4YGAjtbFSoRIdbn9Jcix3p9khJmpvBTXGommaKkvduAn+pc9l4d9yzVQ==} - engines: {node: '>= 0.6.17'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -11447,10 +8883,6 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -11475,39 +8907,12 @@ packages: utf-8-validate: optional: true - xml-crypto@3.2.1: - resolution: {integrity: sha512-0GUNbPtQt+PLMsC5HoZRONX+K6NBJEqpXe/lsvrFj0EqfpGPpVfJKGE7a5jCg8s2+Wkrf/2U1G41kIH+zC9eyQ==} - engines: {node: '>=4.0.0'} - - xml-encryption@3.1.0: - resolution: {integrity: sha512-PV7qnYpoAMXbf1kvQkqMScLeQpjCMixddAKq9PtqVrho8HnYbBOWNfG0kA4R7zxQDo7w9kiYAyzS/ullAyO55Q==} - xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - 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==} - xpath@0.0.27: - resolution: {integrity: sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==} - engines: {node: '>=0.6.0'} - - xpath@0.0.32: - resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} - engines: {node: '>=0.6.0'} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -11519,9 +8924,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml-ast-parser@0.0.43: resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} @@ -11541,14 +8943,6 @@ packages: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -11612,585 +9006,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - tslib: 2.8.1 - - '@aws-crypto/crc32c@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - tslib: 2.8.1 - - '@aws-crypto/sha1-browser@5.2.0': - dependencies: - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-locate-window': 3.893.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-browser@5.2.0': - dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-locate-window': 3.893.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-js@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - tslib: 2.8.1 - - '@aws-crypto/supports-web-crypto@5.2.0': - dependencies: - tslib: 2.8.1 - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-sdk/client-s3@3.913.0': - dependencies: - '@aws-crypto/sha1-browser': 5.2.0 - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-node': 3.913.0 - '@aws-sdk/middleware-bucket-endpoint': 3.910.0 - '@aws-sdk/middleware-expect-continue': 3.910.0 - '@aws-sdk/middleware-flexible-checksums': 3.911.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-location-constraint': 3.913.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-sdk-s3': 3.911.0 - '@aws-sdk/middleware-ssec': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/signature-v4-multi-region': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@aws-sdk/xml-builder': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/eventstream-serde-browser': 4.2.3 - '@smithy/eventstream-serde-config-resolver': 4.3.3 - '@smithy/eventstream-serde-node': 4.2.3 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-blob-browser': 4.2.4 - '@smithy/hash-node': 4.2.3 - '@smithy/hash-stream-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/md5-js': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.3 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-ses@3.913.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-node': 3.913.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.3 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sqs@3.913.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-node': 3.913.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-sdk-sqs': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/md5-js': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.911.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.911.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@aws-sdk/xml-builder': 3.911.0 - '@smithy/core': 3.17.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/node-http-handler': 4.4.2 - '@smithy/property-provider': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-stream': 4.5.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.913.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-env': 3.911.0 - '@aws-sdk/credential-provider-http': 3.911.0 - '@aws-sdk/credential-provider-process': 3.911.0 - '@aws-sdk/credential-provider-sso': 3.911.0 - '@aws-sdk/credential-provider-web-identity': 3.911.0 - '@aws-sdk/nested-clients': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.913.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.911.0 - '@aws-sdk/credential-provider-http': 3.911.0 - '@aws-sdk/credential-provider-ini': 3.913.0 - '@aws-sdk/credential-provider-process': 3.911.0 - '@aws-sdk/credential-provider-sso': 3.911.0 - '@aws-sdk/credential-provider-web-identity': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-process@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.911.0': - dependencies: - '@aws-sdk/client-sso': 3.911.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/token-providers': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/nested-clients': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/lib-storage@3.913.0(@aws-sdk/client-s3@3.913.0)': - dependencies: - '@aws-sdk/client-s3': 3.913.0 - '@smithy/abort-controller': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/smithy-client': 4.9.0 - buffer: 5.6.0 - events: 3.3.0 - stream-browserify: 3.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-bucket-endpoint@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.911.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.913.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@aws/lambda-invoke-store': 0.0.1 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.17.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-sqs@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-ssec@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@smithy/core': 3.17.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.911.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/region-config-resolver@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.911.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/nested-clients': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/types@3.910.0': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.893.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-endpoints': 3.2.3 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.893.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-browser@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - bowser: 2.12.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.911.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.911.0': - dependencies: - '@smithy/types': 4.8.0 - fast-xml-parser: 5.2.5 - tslib: 2.8.1 - - '@aws/lambda-invoke-store@0.0.1': {} - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -13172,51 +9987,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@bugsnag/browser@8.6.0': - dependencies: - '@bugsnag/core': 8.6.0 - - '@bugsnag/core@8.6.0': - dependencies: - '@bugsnag/cuid': 3.2.1 - '@bugsnag/safe-json-stringify': 6.1.0 - error-stack-parser: 2.1.4 - iserror: 0.0.2 - stack-generator: 2.0.10 - - '@bugsnag/cuid@3.2.1': {} - - '@bugsnag/js@8.6.0': - dependencies: - '@bugsnag/browser': 8.6.0 - '@bugsnag/node': 8.6.0 - - '@bugsnag/node@8.6.0': - dependencies: - '@bugsnag/core': 8.6.0 - byline: 5.0.0 - error-stack-parser: 2.1.4 - iserror: 0.0.2 - pump: 3.0.3 - stack-generator: 2.0.10 - - '@bugsnag/plugin-koa@8.6.0(@bugsnag/core@8.6.0)': - dependencies: - '@bugsnag/core': 8.6.0 - - '@bugsnag/safe-json-stringify@6.1.0': {} - - '@clerk/backend@2.18.3': - dependencies: - '@clerk/shared': 3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clerk/types': 4.95.0 - cookie: 1.0.2 - standardwebhooks: 1.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - react - - react-dom - '@clerk/clerk-react@5.53.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@clerk/shared': 3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -13244,6 +10014,7 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true '@csstools/normalize.css@12.1.1': {} @@ -13530,11 +10301,6 @@ snapshots: '@esbuild/win32-x64@0.25.11': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@1.21.7))': dependencies: eslint: 9.38.0(jiti@1.21.7) @@ -13560,20 +10326,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.3(supports-color@10.2.2) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -13588,8 +10340,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - '@eslint/js@9.38.0': {} '@eslint/object-schema@2.1.7': {} @@ -13599,62 +10349,6 @@ snapshots: '@eslint/core': 0.16.0 levn: 0.4.1 - '@fastify/busboy@2.1.1': {} - - '@firebase/app-check-interop-types@0.3.2': {} - - '@firebase/app-types@0.9.2': {} - - '@firebase/app-types@0.9.3': {} - - '@firebase/auth-interop-types@0.2.3': {} - - '@firebase/component@0.6.10': - dependencies: - '@firebase/util': 1.10.1 - tslib: 2.8.1 - - '@firebase/database-compat@1.0.10': - dependencies: - '@firebase/component': 0.6.10 - '@firebase/database': 1.0.9 - '@firebase/database-types': 1.0.6 - '@firebase/logger': 0.4.3 - '@firebase/util': 1.10.1 - tslib: 2.8.1 - - '@firebase/database-types@1.0.16': - dependencies: - '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 - - '@firebase/database-types@1.0.6': - dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.10.1 - - '@firebase/database@1.0.9': - dependencies: - '@firebase/app-check-interop-types': 0.3.2 - '@firebase/auth-interop-types': 0.2.3 - '@firebase/component': 0.6.10 - '@firebase/logger': 0.4.3 - '@firebase/util': 1.10.1 - faye-websocket: 0.11.4 - tslib: 2.8.1 - - '@firebase/logger@0.4.3': - dependencies: - tslib: 2.8.1 - - '@firebase/util@1.10.1': - dependencies: - tslib: 2.8.1 - - '@firebase/util@1.13.0': - dependencies: - tslib: 2.8.1 - '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -13674,111 +10368,29 @@ snapshots: '@fontsource/inter@4.5.15': {} - '@google-cloud/firestore@7.11.6': + '@headlessui/react@1.7.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@opentelemetry/api': 1.9.0 - fast-deep-equal: 3.1.3 - functional-red-black-tree: 1.0.1 - google-gax: 4.6.1 - protobufjs: 7.5.4 - transitivePeerDependencies: - - encoding - - supports-color - optional: true + '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + client-only: 0.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@google-cloud/paginator@5.0.2': + '@hookform/resolvers@5.2.2(react-hook-form@7.51.1(react@18.3.1))': dependencies: - arrify: 2.0.1 - extend: 3.0.2 - optional: true + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.51.1(react@18.3.1) - '@google-cloud/projectify@4.0.0': - optional: true + '@humanfs/core@0.19.1': {} - '@google-cloud/promisify@4.0.0': - optional: true - - '@google-cloud/storage@7.17.2': - dependencies: - '@google-cloud/paginator': 5.0.2 - '@google-cloud/projectify': 4.0.0 - '@google-cloud/promisify': 4.0.0 - abort-controller: 3.0.0 - async-retry: 1.3.3 - duplexify: 4.1.3 - fast-xml-parser: 4.5.3 - gaxios: 6.7.1 - google-auth-library: 9.15.1 - html-entities: 2.6.0 - mime: 3.0.0 - p-limit: 3.1.0 - retry-request: 7.0.2 - teeny-request: 9.0.0 - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@grpc/grpc-js@1.14.0': - dependencies: - '@grpc/proto-loader': 0.8.0 - '@js-sdsl/ordered-map': 4.4.2 - optional: true - - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - optional: true - - '@grpc/proto-loader@0.8.0': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - optional: true - - '@headlessui/react@1.7.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - client-only: 0.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@hookform/resolvers@5.2.2(react-hook-form@7.51.1(react@18.3.1))': - dependencies: - '@standard-schema/utils': 0.3.0 - react-hook-form: 7.51.1(react@18.3.1) - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.7': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@10.2.2) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.4.3': {} - '@ioredis/as-callback@3.0.0': {} - - '@ioredis/commands@1.4.0': {} - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -13793,7 +10405,7 @@ snapshots: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.1 + js-yaml: 3.14.2 resolve-from: 5.0.0 '@istanbuljs/schema@0.1.3': {} @@ -13801,7 +10413,7 @@ snapshots: '@jest/console@27.5.1': dependencies: '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -13823,7 +10435,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -13853,98 +10465,28 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@28.1.3(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5))': - dependencies: - '@jest/console': 28.1.3 - '@jest/reporters': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-resolve-dependencies: 28.1.3 - jest-runner: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - jest-watcher: 28.1.3 - micromatch: 4.0.8 - pretty-format: 28.1.3 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - '@jest/environment@27.5.1': dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 jest-mock: 27.5.1 - '@jest/environment@28.1.3': - dependencies: - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - jest-mock: 28.1.3 - - '@jest/expect-utils@28.1.3': - dependencies: - jest-get-type: 28.0.2 - - '@jest/expect@28.1.3': - dependencies: - expect: 28.1.3 - jest-snapshot: 28.1.3 - transitivePeerDependencies: - - supports-color - '@jest/fake-timers@27.5.1': dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 24.9.0 + '@types/node': 16.18.126 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 - '@jest/fake-timers@28.1.3': - dependencies: - '@jest/types': 28.1.3 - '@sinonjs/fake-timers': 9.1.2 - '@types/node': 24.9.0 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-util: 28.1.3 - '@jest/globals@27.5.1': dependencies: '@jest/environment': 27.5.1 '@jest/types': 27.5.1 expect: 27.5.1 - '@jest/globals@28.1.3': - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/types': 28.1.3 - transitivePeerDependencies: - - supports-color - '@jest/reporters@27.5.1': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -13952,7 +10494,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -13975,36 +10517,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/reporters@28.1.3': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 24.9.0 - chalk: 4.1.2 - collect-v8-coverage: 1.0.3 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.2.0 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - jest-worker: 28.1.3 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - terminal-link: 2.1.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - '@jest/schemas@28.1.3': dependencies: '@sinclair/typebox': 0.24.51 @@ -14015,12 +10527,6 @@ snapshots: graceful-fs: 4.2.11 source-map: 0.6.1 - '@jest/source-map@28.1.2': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - callsites: 3.1.0 - graceful-fs: 4.2.11 - '@jest/test-result@27.5.1': dependencies: '@jest/console': 27.5.1 @@ -14044,13 +10550,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/test-sequencer@28.1.3': - dependencies: - '@jest/test-result': 28.1.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - slash: 3.0.0 - '@jest/transform@27.5.1': dependencies: '@babel/core': 7.28.4 @@ -14071,31 +10570,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/transform@28.1.3': - dependencies: - '@babel/core': 7.28.4 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - '@jest/types@27.5.1': dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/yargs': 16.0.11 chalk: 4.1.2 @@ -14136,34 +10615,10 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - - '@js-sdsl/ordered-map@4.4.2': optional: true - '@koa/cors@5.0.0': - dependencies: - vary: 1.1.2 - - '@koa/router@11.0.2': - dependencies: - debug: 4.4.3(supports-color@10.2.2) - http-errors: 2.0.0 - koa-compose: 4.1.0 - methods: 1.1.2 - path-to-regexp: 6.3.0 - transitivePeerDependencies: - - supports-color - - '@ladjs/country-language@1.0.3': {} - '@leichtgewicht/ip-codec@2.0.5': {} - '@lukeed/csprng@1.1.0': {} - - '@lukeed/uuid@2.0.1': - dependencies: - '@lukeed/csprng': 1.1.0 - '@measured/puck@0.21.0-canary.72e4fcca(@floating-ui/dom@1.7.4)(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1))': dependencies: '@dnd-kit/helpers': 0.1.18 @@ -14220,24 +10675,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - '@mui/core-downloads-tracker@5.18.0': {} '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@19.2.8)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.8)(react@18.3.1))(@types/react@19.2.8)(react@18.3.1))(@types/react@19.2.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -14318,24 +10755,6 @@ snapshots: dependencies: eslint-scope: 5.1.1 - '@noble/hashes@1.8.0': {} - - '@node-saml/node-saml@4.0.5': - dependencies: - '@types/debug': 4.1.12 - '@types/passport': 1.0.17 - '@types/xml-crypto': 1.4.6 - '@types/xml-encryption': 1.2.4 - '@types/xml2js': 0.4.14 - '@xmldom/xmldom': 0.8.11 - debug: 4.4.3(supports-color@10.2.2) - xml-crypto: 3.2.1 - xml-encryption: 3.1.0 - xml2js: 0.5.0 - xmlbuilder: 15.1.1 - transitivePeerDependencies: - - supports-color - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14377,22 +10796,6 @@ snapshots: dependencies: which: 3.0.1 - '@opentelemetry/api@1.9.0': - optional: true - - '@paralleldrive/cuid2@2.2.2': - dependencies: - '@noble/hashes': 1.8.0 - - '@parse/node-apn@6.0.1': - dependencies: - debug: 4.3.3 - jsonwebtoken: 9.0.0 - node-forge: 1.3.1 - verror: 1.10.1 - transitivePeerDependencies: - - supports-color - '@pkgjs/parseargs@0.11.0': optional: true @@ -14415,39 +10818,6 @@ snapshots: '@preact/signals-core@1.12.1': {} - '@protobufjs/aspromise@1.1.2': - optional: true - - '@protobufjs/base64@1.1.2': - optional: true - - '@protobufjs/codegen@2.0.4': - optional: true - - '@protobufjs/eventemitter@1.1.0': - optional: true - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - optional: true - - '@protobufjs/float@1.0.2': - optional: true - - '@protobufjs/inquire@1.1.0': - optional: true - - '@protobufjs/path@1.1.2': - optional: true - - '@protobufjs/pool@1.1.0': - optional: true - - '@protobufjs/utf8@1.1.0': - optional: true - '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -15297,472 +11667,59 @@ snapshots: '@rushstack/eslint-patch@1.15.0': {} - '@segment/analytics-core@1.4.1': - dependencies: - '@lukeed/uuid': 2.0.1 - '@segment/analytics-generic-utils': 1.1.1 - dset: 3.1.4 - tslib: 2.8.1 - - '@segment/analytics-generic-utils@1.1.1': - dependencies: - tslib: 2.8.1 - - '@segment/analytics-node@1.3.0': - dependencies: - '@lukeed/uuid': 2.0.1 - '@segment/analytics-core': 1.4.1 - '@segment/analytics-generic-utils': 1.1.1 - buffer: 6.0.3 - node-fetch: 2.7.0 - tslib: 2.8.1 - transitivePeerDependencies: - - encoding - '@selderee/plugin-htmlparser2@0.11.0': dependencies: domhandler: 5.0.3 selderee: 0.11.0 - '@sendgrid/client@6.5.5': - dependencies: - '@sendgrid/helpers': 6.5.5 - '@types/request': 2.48.13 - request: 2.88.2 + '@sinclair/typebox@0.24.51': {} - '@sendgrid/helpers@6.5.5': + '@sinonjs/commons@1.8.6': dependencies: - chalk: 2.4.2 - deepmerge: 4.3.1 + type-detect: 4.0.8 - '@sendgrid/mail@6.5.5': + '@sinonjs/fake-timers@8.1.0': dependencies: - '@sendgrid/client': 6.5.5 - '@sendgrid/helpers': 6.5.5 + '@sinonjs/commons': 1.8.6 - '@sentry-internal/tracing@7.120.4': - dependencies: - '@sentry/core': 7.120.4 - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 + '@standard-schema/utils@0.3.0': {} - '@sentry/core@7.120.4': + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.12 - '@sentry/integrations@7.120.4': - dependencies: - '@sentry/core': 7.120.4 - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 - localforage: 1.10.0 + '@svgr/babel-plugin-add-jsx-attribute@5.4.0': {} - '@sentry/node@7.120.4': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.4)': dependencies: - '@sentry-internal/tracing': 7.120.4 - '@sentry/core': 7.120.4 - '@sentry/integrations': 7.120.4 - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 + '@babel/core': 7.28.4 - '@sentry/types@7.120.4': {} + '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': {} - '@sentry/utils@7.120.4': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.4)': dependencies: - '@sentry/types': 7.120.4 + '@babel/core': 7.28.4 - '@sinclair/typebox@0.24.51': {} + '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': {} - '@sinonjs/commons@1.8.6': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.4)': dependencies: - type-detect: 4.0.8 + '@babel/core': 7.28.4 - '@sinonjs/fake-timers@8.1.0': - dependencies: - '@sinonjs/commons': 1.8.6 + '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': {} - '@sinonjs/fake-timers@9.1.2': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.4)': dependencies: - '@sinonjs/commons': 1.8.6 + '@babel/core': 7.28.4 - '@smithy/abort-controller@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 + '@svgr/babel-plugin-svg-dynamic-title@5.4.0': {} - '@smithy/chunked-blob-reader-native@4.2.1': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.4)': dependencies: - '@smithy/util-base64': 4.3.0 - tslib: 2.8.1 - - '@smithy/chunked-blob-reader@5.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/config-resolver@4.3.3': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - tslib: 2.8.1 - - '@smithy/core@3.17.0': - dependencies: - '@smithy/middleware-serde': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.2.3': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - tslib: 2.8.1 - - '@smithy/eventstream-codec@4.2.3': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.8.0 - '@smithy/util-hex-encoding': 4.2.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-browser@4.2.3': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.3.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.2.3': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-universal@4.2.3': - dependencies: - '@smithy/eventstream-codec': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.3.4': - dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/querystring-builder': 4.2.3 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - tslib: 2.8.1 - - '@smithy/hash-blob-browser@4.2.4': - dependencies: - '@smithy/chunked-blob-reader': 5.2.0 - '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/hash-node@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/hash-stream-node@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/is-array-buffer@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/md5-js@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.2.3': - dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.3.4': - dependencies: - '@smithy/core': 3.17.0 - '@smithy/middleware-serde': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-middleware': 4.2.3 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.4.4': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/service-error-classification': 4.2.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.2.3': - dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.3': - dependencies: - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.4.2': - dependencies: - '@smithy/abort-controller': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/querystring-builder': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/property-provider@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/protocol-http@5.3.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-uri-escape': 4.2.0 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - - '@smithy/shared-ini-file-loader@4.3.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/signature-v4@5.3.3': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-uri-escape': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/smithy-client@4.9.0': - dependencies: - '@smithy/core': 3.17.0 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-stack': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-stream': 4.5.3 - tslib: 2.8.1 - - '@smithy/types@4.8.0': - dependencies: - tslib: 2.8.1 - - '@smithy/url-parser@4.2.3': - dependencies: - '@smithy/querystring-parser': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-base64@4.3.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-body-length-node@4.2.1': - dependencies: - tslib: 2.8.1 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-buffer-from@4.2.0': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-config-provider@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.3.3': - dependencies: - '@smithy/property-provider': 4.2.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.2.4': - dependencies: - '@smithy/config-resolver': 4.3.3 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.2.3': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-middleware@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-retry@4.2.3': - dependencies: - '@smithy/service-error-classification': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-stream@4.5.3': - dependencies: - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/node-http-handler': 4.4.2 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-uri-escape@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@4.2.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-waiter@4.2.3': - dependencies: - '@smithy/abort-controller': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/uuid@1.1.0': - dependencies: - tslib: 2.8.1 - - '@stablelib/base64@1.0.1': {} - - '@standard-schema/utils@0.3.0': {} - - '@surma/rollup-plugin-off-main-thread@2.2.3': - dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.12 - - '@svgr/babel-plugin-add-jsx-attribute@5.4.0': {} - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': {} - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': {} - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': {} - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-svg-dynamic-title@5.4.0': {} - - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.4 '@svgr/babel-plugin-svg-em-dimensions@5.4.0': {} @@ -16185,22 +12142,19 @@ snapshots: '@tootallnate/once@1.1.2': {} - '@tootallnate/once@2.0.0': - optional: true - '@trysound/sax@0.2.0': {} - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} + '@tsconfig/node10@1.0.11': + optional: true - '@tsconfig/node14@1.0.3': {} + '@tsconfig/node12@1.0.11': + optional: true - '@tsconfig/node16@1.0.4': {} + '@tsconfig/node14@1.0.3': + optional: true - '@types/accepts@1.3.7': - dependencies: - '@types/node': 24.9.0 + '@tsconfig/node16@1.0.4': + optional: true '@types/aria-query@5.0.4': {} @@ -16232,34 +12186,17 @@ snapshots: '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.9.0 - - '@types/busboy@1.5.4': - dependencies: - '@types/node': 24.9.0 - - '@types/caseless@0.12.5': {} + '@types/node': 16.18.126 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.0 - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/connect@3.4.38': dependencies: '@types/node': 16.18.126 - '@types/content-disposition@0.5.9': {} - - '@types/cookiejar@2.1.5': {} - - '@types/cookies@0.9.1': - dependencies: - '@types/connect': 3.4.38 - '@types/express': 5.0.3 - '@types/keygrip': 1.0.6 - '@types/node': 24.9.0 - '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -16377,10 +12314,6 @@ snapshots: '@types/d3-transition': 3.0.9 '@types/d3-zoom': 3.0.8 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -16414,13 +12347,6 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 1.2.0 - '@types/express@4.17.23': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.9 - '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 @@ -16432,11 +12358,7 @@ snapshots: dependencies: '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 5.1.0 - '@types/serve-static': 1.15.9 - - '@types/formidable@2.0.6': - dependencies: - '@types/node': 24.9.0 + '@types/serve-static': 1.15.10 '@types/geojson@7946.0.16': {} @@ -16446,19 +12368,11 @@ snapshots: '@types/html-minifier-terser@6.1.0': {} - '@types/html-to-text@9.0.4': {} - - '@types/http-assert@1.5.6': {} - '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.9.0 - - '@types/ioredis-mock@8.2.6(ioredis@5.8.1)': - dependencies: - ioredis: 5.8.1 + '@types/node': 16.18.126 '@types/istanbul-lib-coverage@2.0.6': {} @@ -16475,61 +12389,12 @@ snapshots: jest-matcher-utils: 27.5.1 pretty-format: 27.5.1 - '@types/jest@28.1.8': - dependencies: - expect: 28.1.3 - pretty-format: 28.1.3 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/jsonpath@0.2.4': {} - - '@types/jsonwebtoken@9.0.10': - dependencies: - '@types/ms': 2.1.0 - '@types/node': 24.9.0 - - '@types/keygrip@1.0.6': {} - - '@types/koa-compose@3.2.8': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa-send@4.1.6': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa-static@4.0.4': - dependencies: - '@types/koa': 2.15.0 - '@types/koa-send': 4.1.6 - - '@types/koa@2.15.0': - dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.9 - '@types/cookies': 0.9.1 - '@types/http-assert': 1.5.6 - '@types/http-errors': 2.0.5 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.8 - '@types/node': 24.9.0 - - '@types/koa__cors@3.3.1': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa__router@8.0.11': - dependencies: - '@types/koa': 2.15.0 - '@types/linkify-it@5.0.0': {} - '@types/long@4.0.2': - optional: true - '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 @@ -16539,24 +12404,11 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/methods@1.1.4': {} - '@types/mime@1.3.5': {} - '@types/ms@2.1.0': {} - '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.9.0 - - '@types/node-pushnotifications@1.0.8': - dependencies: - '@types/node': 24.9.0 - '@types/web-push': 3.6.4 - - '@types/node-schedule@2.1.8': - dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/node@16.18.126': {} @@ -16564,35 +12416,8 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.9.0': - dependencies: - undici-types: 7.16.0 - - '@types/nodemailer-mailgun-transport@1.4.6': - dependencies: - '@types/nodemailer': 6.4.20 - transitivePeerDependencies: - - aws-crt - - '@types/nodemailer-sendgrid@1.0.3': - dependencies: - '@types/nodemailer': 6.4.20 - transitivePeerDependencies: - - aws-crt - - '@types/nodemailer@6.4.20': - dependencies: - '@aws-sdk/client-ses': 3.913.0 - '@types/node': 24.9.0 - transitivePeerDependencies: - - aws-crt - '@types/parse-json@4.0.2': {} - '@types/passport@1.0.17': - dependencies: - '@types/express': 5.0.3 - '@types/prettier@2.7.3': {} '@types/prop-types@15.7.15': {} @@ -16619,30 +12444,18 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/request@2.48.13': - dependencies: - '@types/caseless': 0.12.5 - '@types/node': 24.9.0 - '@types/tough-cookie': 4.0.5 - form-data: 2.5.5 - '@types/resolve@1.17.1': dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/retry@0.12.0': {} '@types/semver@7.7.1': {} - '@types/send@0.17.5': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 16.18.126 - '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/send@1.2.0': dependencies: @@ -16653,68 +12466,32 @@ snapshots: '@types/express': 5.0.3 '@types/serve-static@1.15.10': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 24.9.0 - '@types/send': 0.17.6 - - '@types/serve-static@1.15.9': dependencies: '@types/http-errors': 2.0.5 '@types/node': 16.18.126 - '@types/send': 0.17.5 + '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/stack-utils@2.0.3': {} - '@types/superagent@8.1.9': - dependencies: - '@types/cookiejar': 2.1.5 - '@types/methods': 1.1.4 - '@types/node': 24.9.0 - form-data: 4.0.4 - - '@types/supertest@2.0.16': - dependencies: - '@types/superagent': 8.1.9 - '@types/testing-library__jest-dom@5.14.9': dependencies: '@types/jest': 27.5.2 - '@types/tough-cookie@4.0.5': {} - '@types/trusted-types@2.0.7': {} '@types/use-sync-external-store@0.0.6': {} '@types/uuid@9.0.8': {} - '@types/web-push@3.6.4': - dependencies: - '@types/node': 24.9.0 - '@types/whatwg-mimetype@3.0.2': {} '@types/ws@8.18.1': dependencies: - '@types/node': 24.9.0 - - '@types/xml-crypto@1.4.6': - dependencies: - '@types/node': 24.9.0 - xpath: 0.0.27 - - '@types/xml-encryption@1.2.4': - dependencies: - '@types/node': 24.9.0 - - '@types/xml2js@0.4.14': - dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 '@types/yargs-parser@21.0.3': {} @@ -16726,28 +12503,9 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3(supports-color@10.2.2) - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.7.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3))(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3) @@ -16789,18 +12547,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@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.4.3(supports-color@10.2.2) - eslint: 8.57.1 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 @@ -16848,18 +12594,6 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3(supports-color@10.2.2) - eslint: 8.57.1 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) @@ -16888,20 +12622,6 @@ snapshots: '@typescript-eslint/types@8.46.2': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.3(supports-color@10.2.2) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.3 - 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.9.3)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -16932,21 +12652,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@1.21.7)) @@ -16983,8 +12688,6 @@ snapshots: '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react-swc@4.1.0(vite@7.1.11(@types/node@16.18.126)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.35 @@ -17081,18 +12784,12 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@xmldom/xmldom@0.8.11': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} abab@2.0.6: {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -17116,6 +12813,7 @@ snapshots: acorn-walk@8.3.4: dependencies: acorn: 8.15.0 + optional: true acorn@7.4.1: {} @@ -17136,10 +12834,6 @@ snapshots: agent-base@7.1.4: {} - ajv-errors@3.0.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -17200,7 +12894,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@4.1.3: {} + arg@4.1.3: + optional: true arg@5.0.2: {} @@ -17232,7 +12927,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -17254,7 +12949,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -17263,14 +12958,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.reduce@1.0.8: @@ -17297,46 +12992,23 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@2.0.1: - optional: true - asap@2.0.6: {} - asn1.js@5.4.1: - dependencies: - bn.js: 4.12.2 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - ast-types-flow@0.0.8: {} async-function@1.0.0: {} - async-retry@1.3.3: - dependencies: - retry: 0.13.1 - optional: true - async@3.2.6: {} asynckit@0.4.0: {} at-least-node@1.0.0: {} - atomic-sleep@1.0.0: {} - autoprefixer@10.4.23(postcss@8.5.6): dependencies: browserslist: 4.28.1 @@ -17350,32 +13022,12 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - axe-core@4.11.0: {} axios@0.27.2: dependencies: - follow-redirects: 1.15.11(debug@3.2.7) - form-data: 4.0.4 - transitivePeerDependencies: - - debug - - axios@1.12.2: - dependencies: - follow-redirects: 1.15.11(debug@3.2.7) + follow-redirects: 1.15.11 form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - axios@1.6.8(debug@3.2.7): - dependencies: - follow-redirects: 1.15.11(debug@3.2.7) - form-data: 4.0.4 - proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -17404,19 +13056,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@28.1.3(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - '@jest/transform': 28.1.3 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.28.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - babel-loader@8.4.1(@babel/core@7.28.4)(webpack@5.104.1(@swc/core@1.13.5)): dependencies: '@babel/core': 7.28.4 @@ -17443,13 +13082,6 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 - babel-plugin-jest-hoist@28.1.3: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.28.4 @@ -17511,12 +13143,6 @@ snapshots: babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) - babel-preset-jest@28.1.3(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) - babel-preset-react-app@10.1.0: dependencies: '@babel/core': 7.28.4 @@ -17541,10 +13167,6 @@ snapshots: balanced-match@1.0.2: {} - base-64@1.0.0: {} - - base64-js@1.5.1: {} - baseline-browser-mapping@2.8.18: {} baseline-browser-mapping@2.9.11: {} @@ -17555,10 +13177,6 @@ snapshots: batch@0.6.1: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - bfj@7.1.0: dependencies: bluebird: 3.7.2 @@ -17569,21 +13187,10 @@ snapshots: big.js@5.2.2: {} - bignumber.js@9.3.1: - optional: true - binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - bluebird@3.7.2: {} - bn.js@4.12.2: {} - body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -17625,8 +13232,6 @@ snapshots: boolbase@1.0.0: {} - bowser@2.12.1: {} - brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -17658,68 +13263,20 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - bser@2.1.1: dependencies: node-int64: 0.4.0 btoa@1.2.1: {} - buffer-equal-constant-time@1.0.1: {} - buffer-from@1.1.2: {} - buffer@5.6.0: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - builtin-modules@3.3.0: {} - builtins@5.1.0: - dependencies: - semver: 7.7.3 - - bullmq@5.61.0: - dependencies: - cron-parser: 4.9.0 - ioredis: 5.8.1 - msgpackr: 1.11.5 - node-abort-controller: 3.1.1 - semver: 7.7.3 - tslib: 2.8.1 - uuid: 11.1.0 - transitivePeerDependencies: - - supports-color - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - byline@5.0.0: {} - bytes@3.1.2: {} cac@6.7.14: {} - cache-content-type@1.0.1: - dependencies: - mime-types: 2.1.35 - ylru: 1.4.0 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -17763,8 +13320,6 @@ snapshots: case-sensitive-paths-webpack-plugin@2.4.0: {} - caseless@0.12.0: {} - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -17807,8 +13362,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@1.1.4: {} - chrome-trace-event@1.0.4: {} ci-info@3.9.0: {} @@ -17833,18 +13386,10 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - clsx@1.2.1: {} clsx@2.1.1: {} - cluster-key-slot@1.1.2: {} - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@18.3.1) @@ -17857,13 +13402,6 @@ snapshots: - '@types/react' - '@types/react-dom' - co-body@5.2.0: - dependencies: - inflation: 2.1.0 - qs: 6.14.0 - raw-body: 2.5.2 - type-is: 1.6.18 - co@4.6.0: {} coa@2.0.2: @@ -17905,8 +13443,6 @@ snapshots: colorette@1.4.0: {} - colorette@2.0.19: {} - colorette@2.0.20: {} colornames@1.1.1: {} @@ -17915,8 +13451,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@10.0.1: {} - commander@2.20.3: {} commander@4.1.1: {} @@ -17929,8 +13463,6 @@ snapshots: commondir@1.0.1: {} - component-emitter@1.3.1: {} - compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -17953,15 +13485,6 @@ snapshots: connect-history-api-fallback@2.0.0: {} - consolidate@0.15.1(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.1): - dependencies: - bluebird: 3.7.2 - optionalDependencies: - ejs: 3.1.10 - handlebars: 4.7.8 - lodash: 4.17.21 - underscore: 1.13.1 - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -17982,13 +13505,6 @@ snapshots: cookie@1.0.2: {} - cookiejar@2.1.4: {} - - cookies@0.9.1: - dependencies: - depd: 2.0.0 - keygrip: 1.1.0 - copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 @@ -18011,8 +13527,6 @@ snapshots: core-js@3.47.0: {} - core-util-is@1.0.2: {} - core-util-is@1.0.3: {} cosmiconfig@6.0.0: @@ -18040,14 +13554,11 @@ snapshots: optionalDependencies: typescript: 5.9.3 - create-require@1.1.1: {} + create-require@1.1.1: + optional: true crelt@1.0.6: {} - cron-parser@4.9.0: - dependencies: - luxon: 3.7.2 - cross-fetch@4.0.0: dependencies: node-fetch: 2.7.0 @@ -18202,8 +13713,6 @@ snapshots: csstype@3.2.3: {} - csv-parse@5.6.0: {} - d3-array@3.2.4: dependencies: internmap: 2.0.3 @@ -18270,10 +13779,6 @@ snapshots: damerau-levenshtein@1.0.8: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - data-urls@2.0.0: dependencies: abab: 2.0.6 @@ -18298,39 +13803,19 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns-tz@1.3.8(date-fns@2.30.0): - dependencies: - date-fns: 2.30.0 - date-fns-tz@3.2.0(date-fns@4.1.0): dependencies: date-fns: 4.1.0 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.28.4 - date-fns@4.1.0: {} - dateformat@4.6.3: {} - debug@2.6.9: dependencies: ms: 2.0.0 - debug@3.2.7(supports-color@5.5.0): + debug@3.2.7: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - - debug@4.3.3: - dependencies: - ms: 2.1.2 - - debug@4.3.4: - dependencies: - ms: 2.1.2 debug@4.4.3(supports-color@10.2.2): dependencies: @@ -18342,10 +13827,6 @@ snapshots: decimal.js@10.6.0: {} - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - dedent@0.7.0: {} dedent@1.7.0(babel-plugin-macros@3.1.0): @@ -18354,8 +13835,6 @@ snapshots: deep-diff@1.0.2: {} - deep-equal@1.0.1: {} - deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.2 @@ -18377,8 +13856,6 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.19 - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -18403,10 +13880,6 @@ snapshots: delayed-stream@1.0.0: {} - delegates@1.0.0: {} - - denque@2.1.0: {} - depd@1.1.2: {} depd@2.0.0: {} @@ -18430,18 +13903,12 @@ snapshots: transitivePeerDependencies: - supports-color - dezalgo@1.0.4: - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - didyoumean@1.2.2: {} diff-sequences@27.5.1: {} - diff-sequences@28.1.1: {} - - diff@4.0.2: {} + diff@4.0.2: + optional: true dir-glob@3.0.1: dependencies: @@ -18457,10 +13924,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-converter@0.2.0: @@ -18531,10 +13994,6 @@ snapshots: dotenv@10.0.0: {} - dotenv@16.6.1: {} - - dset@3.1.4: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -18543,25 +14002,8 @@ snapshots: duplexer@0.1.2: {} - duplexify@4.1.3: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - optional: true - eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - ee-first@1.1.1: {} ejs@3.1.10: @@ -18586,10 +14028,6 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 @@ -18616,63 +14054,6 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -18848,11 +14229,6 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - semver: 7.7.3 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(eslint@9.38.0(jiti@1.21.7))(jest@27.5.1(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)))(typescript@5.9.3): dependencies: '@babel/core': 7.28.4 @@ -18880,34 +14256,17 @@ snapshots: - jest - supports-color - eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eslint-plugin-n: 16.6.2(eslint@8.57.1) - eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-import-resolver-node@0.3.9: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7(supports-color@5.5.0) - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 + resolve: 1.22.11 transitivePeerDependencies: - supports-color eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@1.21.7)): dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3) eslint: 9.38.0(jiti@1.21.7) @@ -18915,13 +14274,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(eslint@9.38.0(jiti@1.21.7)): dependencies: '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) @@ -18930,35 +14282,6 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@5.5.0) - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3))(eslint@9.38.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 @@ -18966,7 +14289,7 @@ snapshots: array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 doctrine: 2.1.0 eslint: 9.38.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 @@ -19018,25 +14341,6 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-n@16.6.2(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - builtins: 5.1.0 - eslint: 8.57.1 - eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.13.0 - globals: 13.24.0 - ignore: 5.3.2 - is-builtin-module: 3.2.1 - is-core-module: 2.16.1 - minimatch: 3.1.2 - resolve: 1.22.11 - semver: 7.7.3 - - eslint-plugin-promise@6.6.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-react-hooks@4.6.2(eslint@9.38.0(jiti@1.21.7)): dependencies: eslint: 9.38.0(jiti@1.21.7) @@ -19091,11 +14395,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -19117,49 +14416,6 @@ snapshots: schema-utils: 4.3.3 webpack: 5.104.1(@swc/core@1.13.5) - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@10.2.2) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - eslint@9.38.0(jiti@1.21.7): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@1.21.7)) @@ -19201,20 +14457,12 @@ snapshots: transitivePeerDependencies: - supports-color - esm@3.2.25: {} - espree@10.4.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@1.2.2: {} esprima@4.0.1: {} @@ -19239,10 +14487,6 @@ snapshots: etag@1.8.1: {} - event-target-shim@5.0.1: {} - - eventemitter2@6.4.9: {} - eventemitter3@4.0.7: {} events@3.3.0: {} @@ -19263,8 +14507,6 @@ snapshots: exit@0.1.2: {} - expand-template@2.0.3: {} - expect@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -19272,14 +14514,6 @@ snapshots: jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 - expect@28.1.3: - dependencies: - '@jest/expect-utils': 28.1.3 - jest-get-type: 28.0.2 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - express@4.21.2: dependencies: accepts: 1.3.8 @@ -19352,19 +14586,6 @@ snapshots: transitivePeerDependencies: - supports-color - extend@3.0.2: {} - - extsprintf@1.3.0: {} - - extsprintf@1.4.1: {} - - farmhash@3.3.1: - dependencies: - node-addon-api: 5.1.0 - prebuild-install: 7.1.3 - - fast-copy@2.1.7: {} - fast-deep-equal@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -19387,23 +14608,8 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-redact@3.5.0: {} - - fast-safe-stringify@2.1.1: {} - - fast-sha256@1.3.0: {} - fast-uri@3.1.0: {} - fast-xml-parser@4.5.3: - dependencies: - strnum: 1.1.2 - optional: true - - fast-xml-parser@5.2.5: - dependencies: - strnum: 2.1.1 - fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -19420,20 +14626,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fengari-interop@0.1.3(fengari@0.1.4): - dependencies: - fengari: 0.1.4 - - fengari@0.1.4: - dependencies: - readline-sync: 1.4.10 - sprintf-js: 1.1.3 - tmp: 0.0.33 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -19500,31 +14692,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - firebase-admin@12.1.1: - dependencies: - '@fastify/busboy': 2.1.1 - '@firebase/database-compat': 1.0.10 - '@firebase/database-types': 1.0.16 - '@types/node': 20.19.22 - farmhash: 3.3.1 - jsonwebtoken: 9.0.2 - jwks-rsa: 3.2.0 - long: 5.3.2 - node-forge: 1.3.1 - uuid: 9.0.1 - optionalDependencies: - '@google-cloud/firestore': 7.11.6 - '@google-cloud/storage': 7.17.2 - transitivePeerDependencies: - - encoding - - supports-color - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -19534,9 +14701,7 @@ snapshots: flatted@3.3.3: {} - follow-redirects@1.15.11(debug@3.2.7): - optionalDependencies: - debug: 3.2.7(supports-color@5.5.0) + follow-redirects@1.15.11: {} for-each@0.3.5: dependencies: @@ -19547,8 +14712,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.13.5)): dependencies: '@babel/code-frame': 7.27.1 @@ -19569,21 +14732,6 @@ snapshots: optionalDependencies: eslint: 9.38.0(jiti@1.21.7) - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@2.5.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - safe-buffer: 5.2.1 - form-data@3.0.4: dependencies: asynckit: 0.4.0 @@ -19600,21 +14748,12 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - formidable@2.1.5: - dependencies: - '@paralleldrive/cuid2': 2.2.2 - dezalgo: 1.0.4 - once: 1.4.0 - qs: 6.14.0 - forwarded@0.2.0: {} fraction.js@5.3.4: {} fresh@0.5.2: {} - fs-constants@1.0.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -19641,37 +14780,12 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functional-red-black-tree@1.0.1: - optional: true - - functions-have-names@1.2.3: {} - - gaxios@6.7.1: - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6(supports-color@10.2.2) - is-stream: 2.0.1 - node-fetch: 2.7.0 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 - gcp-metadata@6.1.1: - dependencies: - gaxios: 6.7.1 - google-logging-utils: 0.0.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true + functions-have-names@1.2.3: {} generator-function@2.0.1: {} @@ -19713,18 +14827,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - getopts@2.3.0: {} - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - github-from-package@0.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -19753,14 +14855,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - global-modules@2.0.0: dependencies: global-prefix: 3.0.0 @@ -19771,10 +14865,6 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} globals@16.4.0: {} @@ -19799,67 +14889,18 @@ snapshots: dependencies: csstype: 3.1.3 - google-auth-library@9.15.1: - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1 - gcp-metadata: 6.1.1 - gtoken: 7.1.0 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - google-gax@4.6.1: - dependencies: - '@grpc/grpc-js': 1.14.0 - '@grpc/proto-loader': 0.7.15 - '@types/long': 4.0.2 - abort-controller: 3.0.0 - duplexify: 4.1.3 - google-auth-library: 9.15.1 - node-fetch: 2.7.0 - object-hash: 3.0.0 - proto3-json-serializer: 2.0.2 - protobufjs: 7.5.4 - retry-request: 7.0.2 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - google-logging-utils@0.0.2: - optional: true - gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - gtoken@7.1.0: - dependencies: - gaxios: 6.7.1 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 handle-thing@2.0.1: {} - handlebars-utils@1.0.6: - dependencies: - kind-of: 6.0.3 - typeof-article: 0.1.1 - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -19875,13 +14916,6 @@ snapshots: '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - harmony-reflect@1.6.2: {} has-bigints@1.1.0: {} @@ -19910,11 +14944,6 @@ snapshots: he@1.2.0: {} - help-me@4.2.0: - dependencies: - glob: 8.1.0 - readable-stream: 3.6.2 - hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -20016,11 +15045,6 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-assert@1.5.0: - dependencies: - deep-equal: 1.0.1 - http-errors: 1.8.1 - http-deceiver@1.2.7: {} http-errors@1.6.3: @@ -20030,14 +15054,6 @@ snapshots: setprototypeof: 1.1.0 statuses: 1.5.0 - http-errors@1.8.1: - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 1.5.0 - toidentifier: 1.0.1 - http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -20064,15 +15080,6 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - optional: true - http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 @@ -20088,19 +15095,11 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@3.2.7) + follow-redirects: 1.15.11 requires-port: 1.0.0 transitivePeerDependencies: - debug - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - - http_ece@1.2.0: {} - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -20135,10 +15134,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.0: - dependencies: - safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -20149,16 +15144,10 @@ snapshots: dependencies: harmony-reflect: 1.6.2 - ieee754@1.2.1: {} - - ignore-by-default@1.0.1: {} - ignore@5.3.2: {} ignore@7.0.5: {} - immediate@3.0.6: {} - immer@9.0.21: {} import-fresh@3.3.1: @@ -20177,8 +15166,6 @@ snapshots: index-to-position@1.2.0: {} - inflation@2.1.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -20200,32 +15187,6 @@ snapshots: internmap@2.0.3: {} - interpret@2.2.0: {} - - ioredis-mock@8.13.0(@types/ioredis-mock@8.2.6(ioredis@5.8.1))(ioredis@5.8.1): - dependencies: - '@ioredis/as-callback': 3.0.0 - '@ioredis/commands': 1.4.0 - '@types/ioredis-mock': 8.2.6(ioredis@5.8.1) - fengari: 0.1.4 - fengari-interop: 0.1.3(fengari@0.1.4) - ioredis: 5.8.1 - semver: 7.7.3 - - ioredis@5.8.1: - dependencies: - '@ioredis/commands': 1.4.0 - cluster-key-slot: 1.1.2 - debug: 4.4.3(supports-color@10.2.2) - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - ipaddr.js@1.9.1: {} ipaddr.js@2.3.0: {} @@ -20266,10 +15227,6 @@ snapshots: is-buffer@1.1.6: {} - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-callable@1.2.7: {} is-core-module@2.16.1: @@ -20326,8 +15283,6 @@ snapshots: is-obj@1.0.1: {} - is-path-inside@3.0.3: {} - is-plain-obj@3.0.0: {} is-potential-custom-element-name@1.0.1: {} @@ -20391,18 +15346,14 @@ snapshots: isbot@5.1.31: {} - iserror@0.0.2: {} - isexe@2.0.0: {} - isstream@0.1.2: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -20455,17 +15406,12 @@ snapshots: execa: 5.1.1 throat: 6.0.2 - jest-changed-files@28.1.3: - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - jest-circus@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -20484,30 +15430,6 @@ snapshots: transitivePeerDependencies: - supports-color - jest-circus@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - p-limit: 3.1.0 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - jest-cli@27.5.1(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)): dependencies: '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)) @@ -20529,25 +15451,6 @@ snapshots: - ts-node - utf-8-validate - jest-cli@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)): - dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.2.0 - jest-config: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - jest-util: 28.1.3 - jest-validate: 28.1.3 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - jest-config@27.5.1(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.4 @@ -20582,36 +15485,6 @@ snapshots: - supports-color - utf-8-validate - jest-config@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)): - dependencies: - '@babel/core': 7.28.4 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.28.4) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 28.1.3 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 24.9.0 - ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5) - transitivePeerDependencies: - - supports-color - jest-diff@27.5.1: dependencies: chalk: 4.1.2 @@ -20619,21 +15492,10 @@ snapshots: jest-get-type: 27.5.1 pretty-format: 27.5.1 - jest-diff@28.1.3: - dependencies: - chalk: 4.1.2 - diff-sequences: 28.1.1 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - jest-docblock@27.5.1: dependencies: detect-newline: 3.1.0 - jest-docblock@28.1.1: - dependencies: - detect-newline: 3.1.0 - jest-each@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -20642,20 +15504,12 @@ snapshots: jest-util: 27.5.1 pretty-format: 27.5.1 - jest-each@28.1.3: - dependencies: - '@jest/types': 28.1.3 - chalk: 4.1.2 - jest-get-type: 28.0.2 - jest-util: 28.1.3 - pretty-format: 28.1.3 - jest-environment-jsdom@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -20670,28 +15524,17 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 jest-mock: 27.5.1 jest-util: 27.5.1 - jest-environment-node@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - jest-mock: 28.1.3 - jest-util: 28.1.3 - jest-get-type@27.5.1: {} - jest-get-type@28.0.2: {} - jest-haste-map@27.5.1: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.9 - '@types/node': 24.9.0 + '@types/node': 16.18.126 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -20704,29 +15547,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-haste-map@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 24.9.0 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - jest-worker: 28.1.3 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - jest-jasmine2@27.5.1: dependencies: '@jest/environment': 27.5.1 '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -20747,11 +15574,6 @@ snapshots: jest-get-type: 27.5.1 pretty-format: 27.5.1 - jest-leak-detector@28.1.3: - dependencies: - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - jest-matcher-utils@27.5.1: dependencies: chalk: 4.1.2 @@ -20759,13 +15581,6 @@ snapshots: jest-get-type: 27.5.1 pretty-format: 27.5.1 - jest-matcher-utils@28.1.3: - dependencies: - chalk: 4.1.2 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - jest-message-util@27.5.1: dependencies: '@babel/code-frame': 7.27.1 @@ -20793,21 +15608,12 @@ snapshots: jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 24.9.0 - - jest-mock@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/node': 24.9.0 + '@types/node': 16.18.126 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): optionalDependencies: jest-resolve: 27.5.1 - jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - optionalDependencies: - jest-resolve: 28.1.3 - jest-regex-util@27.5.1: {} jest-regex-util@28.0.2: {} @@ -20820,13 +15626,6 @@ snapshots: transitivePeerDependencies: - supports-color - jest-resolve-dependencies@28.1.3: - dependencies: - jest-regex-util: 28.0.2 - jest-snapshot: 28.1.3 - transitivePeerDependencies: - - supports-color - jest-resolve@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -20840,18 +15639,6 @@ snapshots: resolve.exports: 1.1.1 slash: 3.0.0 - jest-resolve@28.1.3: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) - jest-util: 28.1.3 - jest-validate: 28.1.3 - resolve: 1.22.10 - resolve.exports: 1.1.1 - slash: 3.0.0 - jest-runner@27.5.1: dependencies: '@jest/console': 27.5.1 @@ -20859,7 +15646,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -20881,32 +15668,6 @@ snapshots: - supports-color - utf-8-validate - jest-runner@28.1.3: - dependencies: - '@jest/console': 28.1.3 - '@jest/environment': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - chalk: 4.1.2 - emittery: 0.10.2 - graceful-fs: 4.2.11 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - jest-runtime@27.5.1: dependencies: '@jest/environment': 27.5.1 @@ -20923,39 +15684,12 @@ snapshots: glob: 7.2.3 graceful-fs: 4.2.11 jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-runtime@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/globals': 28.1.3 - '@jest/source-map': 28.1.2 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.3 - execa: 5.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: @@ -20963,7 +15697,7 @@ snapshots: jest-serializer@27.5.1: dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 graceful-fs: 4.2.11 jest-snapshot@27.5.1: @@ -20993,38 +15727,10 @@ snapshots: transitivePeerDependencies: - supports-color - jest-snapshot@28.1.3: - dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@jest/expect-utils': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/babel__traverse': 7.28.0 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) - chalk: 4.1.2 - expect: 28.1.3 - graceful-fs: 4.2.11 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - jest-haste-map: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - natural-compare: 1.4.0 - pretty-format: 28.1.3 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - jest-util@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -21048,15 +15754,6 @@ snapshots: leven: 3.1.0 pretty-format: 27.5.1 - jest-validate@28.1.3: - dependencies: - '@jest/types': 28.1.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 28.0.2 - leven: 3.1.0 - pretty-format: 28.1.3 - jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))): dependencies: ansi-escapes: 4.3.2 @@ -21072,7 +15769,7 @@ snapshots: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 24.9.0 + '@types/node': 16.18.126 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -21091,13 +15788,13 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 24.9.0 + '@types/node': 16.18.126 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -21119,36 +15816,16 @@ snapshots: - ts-node - utf-8-validate - jest@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)): - dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - '@jest/types': 28.1.3 - import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - jiti@1.21.7: {} jiti@2.6.1: {} - jose@4.15.9: {} - - joycon@3.1.1: {} - js-cookie@3.0.5: {} js-levenshtein@1.1.6: {} js-tokens@4.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -21158,8 +15835,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@0.1.1: {} - jsdom@16.7.0: dependencies: abab: 2.0.6 @@ -21198,11 +15873,6 @@ snapshots: jsesc@3.1.0: {} - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - optional: true - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -21217,8 +15887,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} - json5@1.0.2: dependencies: minimist: 1.2.8 @@ -21239,33 +15907,6 @@ snapshots: jsonpointer@5.0.1: {} - jsonwebtoken@9.0.0: - dependencies: - jws: 3.2.2 - lodash: 4.17.21 - ms: 2.1.3 - semver: 7.7.3 - - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.3 - - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -21273,134 +15914,16 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - jwa@1.4.2: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwa@2.0.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwks-rsa@3.2.0: - dependencies: - '@types/express': 4.17.23 - '@types/jsonwebtoken': 9.0.10 - debug: 4.4.3(supports-color@10.2.2) - jose: 4.15.9 - limiter: 1.1.5 - lru-memoizer: 2.3.0 - transitivePeerDependencies: - - supports-color - - jws@3.2.2: - dependencies: - jwa: 1.4.2 - safe-buffer: 5.2.1 - - jws@4.0.0: - dependencies: - jwa: 2.0.1 - safe-buffer: 5.2.1 - - keygrip@1.1.0: - dependencies: - tsscmp: 1.0.6 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - kind-of@6.0.3: {} kleur@3.0.3: {} klona@2.0.6: {} - knex@2.5.1(pg@8.16.3): - dependencies: - colorette: 2.0.19 - commander: 10.0.1 - debug: 4.3.4 - escalade: 3.2.0 - 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.1 - rechoir: 0.8.0 - resolve-from: 5.0.0 - tarn: 3.0.2 - tildify: 2.0.0 - optionalDependencies: - pg: 8.16.3 - transitivePeerDependencies: - - supports-color - - koa-body@5.0.0: - dependencies: - '@types/formidable': 2.0.6 - co-body: 5.2.0 - formidable: 2.1.5 - - koa-compose@4.1.0: {} - - koa-convert@2.0.0: - dependencies: - co: 4.6.0 - koa-compose: 4.1.0 - - koa-send@5.0.1: - dependencies: - debug: 4.4.3(supports-color@10.2.2) - http-errors: 1.8.1 - resolve-path: 1.4.0 - transitivePeerDependencies: - - supports-color - - koa-static@5.0.0: - dependencies: - debug: 3.2.7(supports-color@5.5.0) - koa-send: 5.0.1 - transitivePeerDependencies: - - supports-color - - koa@2.16.3: - dependencies: - accepts: 1.3.8 - cache-content-type: 1.0.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - debug: 4.4.3(supports-color@10.2.2) - delegates: 1.0.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 1.8.1 - is-generator-function: 1.1.2 - koa-compose: 4.1.0 - koa-convert: 2.0.0 - on-finished: 2.4.1 - only: 0.0.2 - parseurl: 1.3.3 - statuses: 1.5.0 - type-is: 1.6.18 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -21426,12 +15949,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.12.24: {} - - lie@3.1.1: - dependencies: - immediate: 3.0.6 - lightningcss-android-arm64@1.30.2: optional: true @@ -21485,8 +16002,6 @@ snapshots: lilconfig@3.1.3: {} - limiter@1.1.5: {} - lines-and-columns@1.2.4: {} linkify-it@5.0.0: @@ -21505,10 +16020,6 @@ snapshots: loader-utils@3.3.1: {} - localforage@1.10.0: - dependencies: - lie: 3.1.1 - locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -21522,35 +16033,12 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.camelcase@4.3.0: - optional: true - - lodash.clonedeep@4.5.0: {} - lodash.debounce@4.0.8: {} - lodash.defaults@4.2.0: {} - - lodash.includes@4.3.0: {} - - lodash.isarguments@3.1.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} - lodash.padend@4.6.1: {} lodash.sortby@4.7.0: {} @@ -21563,10 +16051,6 @@ snapshots: lodash@4.17.21: {} - long-timeout@0.1.1: {} - - long@5.3.2: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -21581,23 +16065,12 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lru-cache@7.18.3: {} - lru-memoizer@2.3.0: - dependencies: - lodash.clonedeep: 4.5.0 - lru-cache: 6.0.0 - lucide-react@0.546.0(react@18.3.1): dependencies: react: 18.3.1 - luxon@3.7.2: {} - lz-string@1.5.0: {} magic-string@0.25.9: @@ -21608,14 +16081,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - mailgun.js@8.2.2: - dependencies: - axios: 1.12.2 - base-64: 1.0.0 - url-join: 4.0.1 - transitivePeerDependencies: - - debug - make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -21624,7 +16089,8 @@ snapshots: dependencies: semver: 7.7.3 - make-error@1.3.6: {} + make-error@1.3.6: + optional: true makeerror@1.0.12: dependencies: @@ -21684,15 +16150,8 @@ snapshots: mime@1.6.0: {} - mime@2.6.0: {} - - mime@3.0.0: - optional: true - mimic-fn@2.1.0: {} - mimic-response@3.1.0: {} - min-indent@1.0.1: {} mini-css-extract-plugin@2.9.4(webpack@5.104.1(@swc/core@1.13.5)): @@ -21719,8 +16178,6 @@ snapshots: minipass@7.1.2: {} - mkdirp-classic@0.5.3: {} - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -21741,26 +16198,8 @@ snapshots: ms@2.0.0: {} - ms@2.1.2: {} - ms@2.1.3: {} - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.5: - optionalDependencies: - msgpackr-extract: 3.0.3 - multicast-dns@7.2.5: dependencies: dns-packet: 5.6.1 @@ -21774,8 +16213,6 @@ snapshots: nanoid@3.3.11: {} - napi-build-utils@2.0.0: {} - natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -21791,142 +16228,18 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.78.0: - dependencies: - semver: 7.7.3 - - node-abort-controller@3.1.1: {} - - node-addon-api@5.1.0: {} - - node-adm@0.9.1: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-forge@1.3.1: {} - node-forge@1.3.3: {} - node-gcm@1.1.4: - dependencies: - axios: 1.6.8(debug@3.2.7) - debug: 3.2.7(supports-color@5.5.0) - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.2 - optional: true - node-int64@0.4.0: {} - node-pushnotifications@3.1.1: - dependencies: - '@parse/node-apn': 6.0.1 - firebase-admin: 12.1.1 - node-adm: 0.9.1 - node-gcm: 1.1.4 - ramda: 0.30.1 - web-push: 3.6.7 - wns: 0.5.4 - transitivePeerDependencies: - - encoding - - supports-color - node-releases@2.0.25: {} node-releases@2.0.27: {} - node-schedule@2.1.1: - dependencies: - cron-parser: 4.9.0 - long-timeout: 0.1.1 - sorted-array-functions: 1.3.0 - - nodemailer-mailgun-transport@2.1.5(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.1): - dependencies: - consolidate: 0.15.1(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.1) - form-data: 4.0.4 - mailgun.js: 8.2.2 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - debug - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - - nodemailer-sendgrid@1.0.3: - dependencies: - '@sendgrid/mail': 6.5.5 - - nodemailer@6.10.1: {} - - nodemon@2.0.22: - dependencies: - chokidar: 3.6.0 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 5.7.2 - simple-update-notifier: 1.1.0 - supports-color: 5.5.0 - touch: 3.1.1 - undefsafe: 2.0.5 - noms@0.0.0: dependencies: inherits: 2.0.4 @@ -21977,12 +16290,8 @@ snapshots: nwsapi@2.2.23: {} - oauth-sign@0.9.0: {} - object-assign@4.1.1: {} - object-hash@2.2.0: {} - object-hash@3.0.0: {} object-inspect@1.13.4: {} @@ -22014,7 +16323,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 object.getownpropertydescriptors@2.1.9: @@ -22031,7 +16340,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 object.values@1.2.1: dependencies: @@ -22042,12 +16351,6 @@ snapshots: obuf@1.1.2: {} - oidc-token-hash@5.1.1: {} - - on-exit-leak-free@1.0.0: {} - - on-exit-leak-free@2.1.2: {} - on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -22066,8 +16369,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - only@0.0.2: {} - open@7.4.2: dependencies: is-docker: 2.2.1 @@ -22095,13 +16396,6 @@ snapshots: typescript: 5.9.3 yargs-parser: 21.1.1 - openid-client@5.7.1: - dependencies: - jose: 4.15.9 - lru-cache: 6.0.0 - object-hash: 2.2.0 - oidc-token-hash: 5.1.1 - optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -22122,8 +16416,6 @@ snapshots: orderedmap@2.1.1: {} - os-tmpdir@1.0.2: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -22212,8 +16504,6 @@ snapshots: path-to-regexp@0.1.12: {} - path-to-regexp@6.3.0: {} - path-type@4.0.0: {} pathe@1.1.2: {} @@ -22224,99 +16514,15 @@ snapshots: performance-now@2.1.0: {} - pg-cloudflare@1.2.7: - optional: true - - pg-connection-string@2.6.1: {} - - pg-connection-string@2.9.1: {} - - pg-cursor@2.15.3(pg@8.16.3): - dependencies: - pg: 8.16.3 - - pg-int8@1.0.1: {} - - pg-pool@3.10.1(pg@8.16.3): - dependencies: - pg: 8.16.3 - - pg-protocol@1.10.3: {} - - pg-query-stream@4.10.3(pg@8.16.3): - dependencies: - pg: 8.16.3 - pg-cursor: 2.15.3(pg@8.16.3) - - 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.16.3: - dependencies: - pg-connection-string: 2.9.1 - pg-pool: 3.10.1(pg@8.16.3) - pg-protocol: 1.10.3 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.2.7 - - pgpass@1.0.5: - dependencies: - split2: 4.2.0 - picocolors@0.2.1: {} picocolors@1.1.1: {} - picomatch@2.3.1: {} - - picomatch@4.0.3: {} - - pify@2.3.0: {} - - pino-abstract-transport@1.2.0: - dependencies: - readable-stream: 4.7.0 - split2: 4.2.0 - - pino-pretty@8.1.0: - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 2.1.7 - fast-safe-stringify: 2.1.1 - help-me: 4.2.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 1.0.0 - pino-abstract-transport: 1.2.0 - pump: 3.0.3 - readable-stream: 4.7.0 - secure-json-parse: 2.7.0 - sonic-boom: 3.8.1 - strip-json-comments: 3.1.1 - - pino-std-serializers@6.2.2: {} + picomatch@2.3.1: {} - pino@8.21.0: - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.5.0 - on-exit-leak-free: 2.1.2 - 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.5.0 - sonic-boom: 3.8.1 - thread-stream: 2.7.0 + picomatch@4.0.3: {} + + pify@2.3.0: {} pirates@4.0.7: {} @@ -22761,38 +16967,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: {} - - postgres-bytea@1.0.0: {} - - postgres-date@1.0.7: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - - posthog-node@3.6.3: - dependencies: - axios: 1.12.2 - rusha: 0.8.14 - transitivePeerDependencies: - - debug - - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.1.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.78.0 - pump: 3.0.3 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.4 - tunnel-agent: 0.6.0 - prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -22825,10 +16999,6 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@3.0.0: {} - - process@0.11.10: {} - promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -22954,45 +17124,15 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-transform: 1.10.5 - proto3-json-serializer@2.0.2: - dependencies: - protobufjs: 7.5.4 - optional: true - - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 24.9.0 - long: 5.3.2 - optional: true - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} - psl@1.15.0: dependencies: punycode: 2.3.1 - pstree.remy@1.1.8: {} - - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -23007,20 +17147,14 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.5.3: {} - querystringify@2.2.0: {} queue-microtask@1.2.3: {} - quick-format-unescaped@4.0.4: {} - raf@3.4.1: dependencies: performance-now: 2.1.0 - ramda@0.30.1: {} - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -23041,20 +17175,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.7.0 - unpipe: 1.0.0 - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-app-polyfill@3.0.0: dependencies: core-js: 3.47.0 @@ -23357,24 +17477,12 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 readdirp@4.1.2: {} - readline-sync@1.4.10: {} - - real-require@0.2.0: {} - recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -23392,10 +17500,6 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 - rechoir@0.8.0: - dependencies: - resolve: 1.22.10 - recursive-readdir@2.2.3: dependencies: minimatch: 3.1.2 @@ -23405,17 +17509,11 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - redis-errors@1.2.0: {} - - redis-parser@3.0.0: - dependencies: - redis-errors: 1.2.0 - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -23466,29 +17564,6 @@ snapshots: lodash: 4.17.21 strip-ansi: 6.0.1 - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -23503,13 +17578,6 @@ snapshots: resolve-from@5.0.0: {} - resolve-path@1.4.0: - dependencies: - http-errors: 1.6.3 - path-is-absolute: 1.0.1 - - resolve-pkg-maps@1.0.0: {} - resolve-url-loader@4.0.0: dependencies: adjust-sourcemap-loader: 4.0.0 @@ -23538,16 +17606,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - retry-request@7.0.2: - dependencies: - '@types/request': 2.48.13 - extend: 3.0.2 - teeny-request: 9.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - retry@0.12.0: {} retry@0.13.1: {} @@ -23618,8 +17676,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rusha@0.8.14: {} - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -23643,8 +17699,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} sanitize.css@13.0.0: {} @@ -23657,8 +17711,6 @@ snapshots: sax@1.2.4: {} - sax@1.4.1: {} - saxes@5.0.1: dependencies: xmlchars: 2.2.0 @@ -23692,8 +17744,6 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) - secure-json-parse@2.7.0: {} - selderee@0.11.0: dependencies: parseley: 0.12.1 @@ -23709,8 +17759,6 @@ snapshots: semver@6.3.1: {} - semver@7.0.0: {} - semver@7.7.3: {} send@0.19.0: @@ -23855,18 +17903,6 @@ snapshots: signal-exit@4.1.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-update-notifier@1.1.0: - dependencies: - semver: 7.0.0 - sisteransi@1.0.5: {} slash@3.0.0: {} @@ -23884,12 +17920,6 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.4 - sonic-boom@3.8.1: - dependencies: - atomic-sleep: 1.0.0 - - sorted-array-functions@1.3.0: {} - source-list-map@2.0.1: {} source-map-explorer@2.5.3: @@ -23916,11 +17946,6 @@ snapshots: source-map-js: 1.2.1 webpack: 5.104.1(@swc/core@1.13.5) - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -23973,43 +17998,16 @@ snapshots: transitivePeerDependencies: - supports-color - split2@4.2.0: {} - sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - stable@0.1.8: {} - stack-generator@2.0.10: - dependencies: - stackframe: 1.3.4 - stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 stackframe@1.3.4: {} - standard-as-callback@2.1.0: {} - - standardwebhooks@1.0.0: - dependencies: - '@stablelib/base64': 1.0.1 - fast-sha256: 1.3.0 - state-local@1.0.7: {} static-eval@2.0.2: @@ -24029,21 +18027,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - stream-browserify@3.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - - stream-events@1.0.5: - dependencies: - stubs: 3.0.0 - optional: true - - stream-shift@1.0.3: - optional: true - - streamsearch@1.1.0: {} - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -24110,7 +18093,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -24163,18 +18146,8 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} - strnum@1.1.2: - optional: true - - strnum@2.1.1: {} - - stubs@3.0.0: - optional: true - style-loader@3.3.4(webpack@5.104.1(@swc/core@1.13.5)): dependencies: webpack: 5.104.1(@swc/core@1.13.5) @@ -24205,28 +18178,6 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 - superagent@8.1.2: - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.4.3(supports-color@10.2.2) - fast-safe-stringify: 2.1.1 - form-data: 4.0.4 - formidable: 2.1.5 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.14.0 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - supertest@6.3.4: - dependencies: - methods: 1.1.2 - superagent: 8.1.2 - transitivePeerDependencies: - - supports-color - supports-color@10.2.2: {} supports-color@5.5.0: @@ -24276,12 +18227,6 @@ snapshots: picocolors: 1.1.1 stable: 0.1.8 - svix@1.77.0: - dependencies: - '@stablelib/base64': 1.0.1 - fast-sha256: 1.3.0 - uuid: 10.0.0 - swr@2.3.4(react@18.3.1): dependencies: dequal: 2.0.3 @@ -24330,35 +18275,6 @@ snapshots: tapable@2.3.0: {} - tar-fs@2.1.4: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tarn@3.0.2: {} - - teeny-request@9.0.0: - dependencies: - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - stream-events: 1.0.5 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - temp-dir@2.0.0: {} temp@0.9.4: @@ -24412,10 +18328,6 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@2.7.0: - dependencies: - real-require: 0.2.0 - throat@6.0.2: {} through2@2.0.5: @@ -24425,8 +18337,6 @@ snapshots: thunky@1.1.0: {} - tildify@2.0.0: {} - tiny-invariant@1.3.3: {} tinyglobby@0.2.15: @@ -24434,10 +18344,6 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - tmpl@1.0.5: {} to-regex-range@5.0.1: @@ -24448,13 +18354,6 @@ snapshots: toidentifier@1.0.1: {} - touch@3.1.1: {} - - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - tough-cookie@4.1.4: dependencies: psl: 1.15.0 @@ -24480,23 +18379,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@28.0.8(@babel/core@7.28.4)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.28.4))(jest@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)))(typescript@4.9.5): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5)) - jest-util: 28.1.3 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.3 - typescript: 4.9.5 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.28.4 - '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.28.4) - ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -24518,26 +18400,6 @@ snapshots: '@swc/core': 1.13.5 optional: true - ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.0)(typescript@4.9.5): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.9.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.13.5 - tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -24553,26 +18415,13 @@ snapshots: tslib@2.8.1: {} - tsscmp@1.0.6: {} - - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - tsutils@3.21.0(typescript@5.9.3): dependencies: tslib: 1.14.1 typescript: 5.9.3 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - tw-animate-css@1.4.0: {} - tweetnacl@0.14.5: {} - type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -24585,8 +18434,6 @@ snapshots: type-fest@0.16.0: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-fest@4.41.0: {} @@ -24633,10 +18480,6 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typeof-article@0.1.1: - dependencies: - kind-of: 3.2.2 - typescript-eslint@8.46.2(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3))(eslint@9.38.0(jiti@1.21.7))(typescript@5.9.3) @@ -24648,8 +18491,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@4.9.5: {} - typescript@5.9.3: {} uc.micro@2.1.0: {} @@ -24664,17 +18505,10 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undefsafe@2.0.5: {} - underscore@1.12.1: {} - underscore@1.13.1: - optional: true - undici-types@6.21.0: {} - undici-types@7.16.0: {} - unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -24720,8 +18554,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-join@4.0.1: {} - url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -24763,17 +18595,12 @@ snapshots: utils-merge@1.0.1: {} - uuid@10.0.0: {} - - uuid@11.1.0: {} - - uuid@3.4.0: {} - uuid@8.3.2: {} uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true v8-to-istanbul@8.1.1: dependencies: @@ -24781,12 +18608,6 @@ snapshots: convert-source-map: 1.9.0 source-map: 0.7.6 - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - valibot@1.1.0(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -24800,18 +18621,6 @@ snapshots: vary@1.1.2: {} - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - - verror@1.10.1: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.2 @@ -24916,16 +18725,6 @@ snapshots: dependencies: minimalistic-assert: 1.0.1 - web-push@3.6.7: - dependencies: - asn1.js: 5.4.1 - http_ece: 1.2.0 - https-proxy-agent: 7.0.6(supports-color@10.2.2) - jws: 4.0.0 - minimist: 1.2.8 - transitivePeerDependencies: - - supports-color - web-streams-polyfill@4.2.0: {} web-vitals@2.1.4: {} @@ -25125,8 +18924,6 @@ snapshots: dependencies: isexe: 2.0.0 - wns@0.5.4: {} - word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -25277,51 +19074,20 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - ws@7.5.10: {} ws@8.18.3: {} - xml-crypto@3.2.1: - dependencies: - '@xmldom/xmldom': 0.8.11 - xpath: 0.0.32 - - xml-encryption@3.1.0: - dependencies: - '@xmldom/xmldom': 0.8.11 - escape-html: 1.0.3 - xpath: 0.0.32 - xml-name-validator@3.0.0: {} - xml2js@0.5.0: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - xmlbuilder@15.1.1: {} - xmlchars@2.2.0: {} - xpath@0.0.27: {} - - xpath@0.0.32: {} - xtend@4.0.2: {} y18n@5.0.8: {} yallist@3.1.1: {} - yallist@4.0.0: {} - yaml-ast-parser@0.0.43: {} yaml@1.10.2: {} @@ -25340,19 +19106,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - ylru@1.4.0: {} - - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} diff --git a/services/platform/.dockerignore b/services/platform/.dockerignore deleted file mode 100644 index 8ae4c896..00000000 --- a/services/platform/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -.git -.DS_Store -.env -node_modules -build \ No newline at end of file diff --git a/services/platform/.eslintrc b/services/platform/.eslintrc deleted file mode 100644 index cf90e146..00000000 --- a/services/platform/.eslintrc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "root": true, - "env": { - "node": true - }, - "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint", - "import" - ], - "extends": [ - "standard", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "rules": { - "indent": ["error", 4], - "padded-blocks": "off", - "camelcase": "off", - "no-use-before-define": "off", - "no-useless-constructor": 0, - "comma-dangle": "off", - "space-before-function-paren": ["error", { - "anonymous": "never", - "named": "never", - "asyncArrow": "always" - }], - "@typescript-eslint/comma-dangle": ["error", "always-multiline"], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "operator-linebreak": ["error", "before"], - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "after-used", - "ignoreRestSiblings": true, - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - }] - }, - "globals": { - "NodeJS": true - } -} diff --git a/services/platform/.gitignore b/services/platform/.gitignore deleted file mode 100644 index 69cf1ac9..00000000 --- a/services/platform/.gitignore +++ /dev/null @@ -1,113 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test -*.local - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist -build - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# VS Code -.DS_Store - -# Uploads -/public/uploads/* -!/public/uploads/.gitkeep diff --git a/services/platform/@types/handlebars-utils.d.ts b/services/platform/@types/handlebars-utils.d.ts deleted file mode 100644 index 7462455b..00000000 --- a/services/platform/@types/handlebars-utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module 'handlebars-utils' { - export function value(val: any, context: any, options: any) - export function isOptions(val: any): boolean; -} diff --git a/services/platform/@types/knex.d.ts b/services/platform/@types/knex.d.ts deleted file mode 100644 index 3a55f33a..00000000 --- a/services/platform/@types/knex.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Knex as KnexOriginal } from 'knex' -declare module 'knex' { - namespace Knex { - interface QueryInterface { - when( - condition: boolean, - fnif: (builder: QueryBuilder) => QueryBuilder, - fnelse?: (builder: QueryBuilder) => QueryBuilder, - ): KnexOriginal.QueryBuilder - } - } -} diff --git a/services/platform/Dockerfile b/services/platform/Dockerfile deleted file mode 100644 index 5654e6c2..00000000 --- a/services/platform/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM node:24 AS build - -WORKDIR /usr/src/app - -RUN corepack enable - -COPY . . - -RUN pnpm install --filter "@lunogram/platform" --frozen-lockfile --config.platform=linux --config.architecture=x64 -RUN pnpm --filter "@lunogram/platform" build -RUN pnpm --filter "@lunogram/platform" --prod deploy packages - -FROM gcr.io/distroless/nodejs24-debian12:nonroot -ENV NODE_ENV=production -WORKDIR /usr/src/app - -COPY --chown=65532:65532 --from=build /usr/src/app/packages/node_modules ./node_modules -COPY --chown=65532:65532 --from=build /usr/src/app/services/platform/package*.json ./ -COPY --chown=65532:65532 --from=build /usr/src/app/services/platform/build ./build -COPY --chown=65532:65532 --from=build /usr/src/app/services/platform/db ./build/db - -EXPOSE 8080 - -CMD ["build/src/boot.js"] \ No newline at end of file diff --git a/services/platform/jest.config.js b/services/platform/jest.config.js deleted file mode 100644 index fba543f6..00000000 --- a/services/platform/jest.config.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - setupFilesAfterEnv: ['./tests/setup.ts'], - testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], - testPathIgnorePatterns: [ - '/node_modules/', - '/build', - ], - globals: { - 'ts-jest': { - isolatedModules: true, - }, - }, -} diff --git a/services/platform/nodemon.json b/services/platform/nodemon.json deleted file mode 100644 index 8d6d599e..00000000 --- a/services/platform/nodemon.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ignore": ["**/*.test.ts", "**/*.spec.ts", "node_modules"], - "watch": ["src", ".env"], - "exec": "TZ=utc ts-node --transpile-only ./src/boot.ts", - "ext": "ts,js,json" -} \ No newline at end of file diff --git a/services/platform/oapi/webhooks.generated.ts b/services/platform/oapi/webhooks.generated.ts deleted file mode 100644 index dadd3df7..00000000 --- a/services/platform/oapi/webhooks.generated.ts +++ /dev/null @@ -1,437 +0,0 @@ -/** - * This file was auto-generated by openapi-typescript. - * Do not make direct changes to the file. - */ - -export interface paths { - "/webhooks/providers/bootstrap": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Bootstrap default integrations for a new project - * @description Called by Lunogram when a new project is created. - * The endpoint should return one or more default providers and/or an `external_id` - * that can be used by Lunogram to send or fetch configuration. - * - */ - post: operations["bootstrapProviders"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/webhooks/provider/send": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Send a message through an external provider - * @description Called by Lunogram to send a message through the external provider identified by `external_id`. - * The request body can represent an **email**, **SMS**, or **push** notification. - * - */ - post: operations["sendMessage"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/webhooks/journey/templates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List available journey step templates - * @description Returns a list of available journey step templates that define how users can get started - * with Journeys. Each template includes an identifier and a brief description. - * - */ - get: operations["journeyTemplates"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/webhooks/journey/template": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Retrieve a journey step template - * @description Returns a predefined journey step template that defines how users can get started - * with Journeys. The template contains a map of step definitions, including `entrance`, - * `action`, and `sticky` types. - * - */ - get: operations["journeyTemplate"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; -} -export type webhooks = Record; -export interface components { - schemas: { - Providers: { - /** @description List of providers to create */ - providers: components["schemas"]["Provider"][]; - }; - Provider: { - /** @description Provider type (e.g., "twilio", "sendgrid", "slack") */ - type: string; - /** @description Display name of the provider */ - name: string; - /** - * @description Group of the provider - * @enum {string} - */ - group: "email" | "text" | "push" | "webhook" | "analytics"; - /** @description Provider-specific configuration data */ - data: { - [key: string]: unknown; - }; - /** @description Whether this provider is marked as default */ - is_default: boolean; - /** - * @description Rate limit interval - * @enum {string} - */ - rate_interval?: "second" | "minute" | "hour" | "day"; - /** @description Maximum number of requests allowed in the specified interval */ - rate_limit?: number; - /** @description External identifier to fetch or send through */ - external_id: string; - }; - /** - * @description Represents a journey step template map, where each key is a unique step ID (UUID) - * and the value defines the step configuration. - * - * @example { - * "819fbabf-c3c0-4fe3-b41f-7f6bbe068379": { - * "type": "entrance", - * "data": {}, - * "name": "", - * "data_key": null, - * "x": 0, - * "y": 0, - * "children": [ - * { - * "external_id": "a9b91772-f555-4d0b-999e-bae513202821", - * "path": "", - * "data": {} - * } - * ] - * }, - * "e6eed3fb-9d7f-4295-947e-6fceb546ad40": { - * "type": "sticky", - * "data": { - * "text": "Journeys define how users progress through your automated steps and actions over time." - * }, - * "name": "Getting Started! 🎉", - * "data_key": null, - * "x": 303.37, - * "y": -10.8, - * "children": [] - * }, - * "a9b91772-f555-4d0b-999e-bae513202821": { - * "type": "action", - * "data": { - * "campaign_id": "00000000-0000-0000-0000-000000000000" - * }, - * "name": "", - * "data_key": null, - * "x": -40.62, - * "y": 289.19, - * "children": [] - * }, - * "a197e316-c2aa-4290-9231-31a56218e5a8": { - * "type": "sticky", - * "data": { - * "text": "Use actions to send emails, SMS, push notifications, or trigger webhooks." - * }, - * "name": "Deliver your Message 📣", - * "data_key": null, - * "x": 302.03, - * "y": 385.81, - * "children": [] - * } - * } - */ - Journey: { - [key: string]: components["schemas"]["JourneyStep"]; - }; - JourneyStep: { - /** @enum {string} */ - type: "entrance" | "action" | "sticky"; - name?: string | null; - data?: { - [key: string]: unknown; - } | null; - data_key?: string | null; - x: number; - y: number; - children?: components["schemas"]["JourneyStepChild"][] | null; - }; - JourneyStepChild: { - external_id: string; - path?: string | null; - data?: { - [key: string]: unknown; - } | null; - }; - Email: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "email"; - to: string; - from: string | components["schemas"]["NamedEmail"]; - cc?: string; - bcc?: string; - reply_to?: string; - subject: string; - text?: string; - html?: string; - headers?: { - [key: string]: string; - }; - list?: { - unsubscribe?: string; - }; - }; - TextMessage: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "text"; - to: string; - text: string; - }; - Push: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "push"; - tokens: string | string[]; - title: string; - body: string; - custom?: { - [key: string]: unknown; - }; - }; - NamedEmail: { - name: string; - email: string; - }; - }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; -} -export type $defs = Record; -export interface operations { - bootstrapProviders: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - /** - * Format: uuid - * @description Unique identifier of the project - */ - project_id: string; - /** - * Format: uuid - * @description Organization to which the project belongs - */ - organization_id?: string; - }; - }; - }; - responses: { - /** @description Default providers and/or external reference */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Providers"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Server error in external system */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - sendMessage: { - parameters: { - query: { - /** @description External identifier of the provider */ - external_id: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Email"] | components["schemas"]["TextMessage"] | components["schemas"]["Push"]; - }; - }; - responses: { - /** @description Message accepted by the external system */ - 201: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Invalid payload or unsupported message type */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Provider not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Server error in external system */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - journeyTemplates: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of journey templates retrieved successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Identifier of the journey template */ - template_id: string; - /** @description Name of the journey template */ - name: string; - /** @description Brief description of the journey template */ - description?: string; - }[]; - }; - }; - /** @description Server error in external system */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - journeyTemplate: { - parameters: { - query: { - /** @description Identifier of the journey template */ - template_id: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Journey template retrieved successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Journey"]; - }; - }; - /** @description Invalid template_id or malformed request */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Template not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Server error in external system */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; -} diff --git a/services/platform/oapi/webhooks.ts b/services/platform/oapi/webhooks.ts deleted file mode 100644 index b589bb09..00000000 --- a/services/platform/oapi/webhooks.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { paths } from './webhooks.generated' - -export type BootstrapResponse = paths['/webhooks/providers/bootstrap']['post']['responses']['200']['content']['application/json'] -export type SendRequest = paths['/webhooks/provider/send']['post']['requestBody']['content']['application/json'] \ No newline at end of file diff --git a/services/platform/package-lock.json b/services/platform/package-lock.json deleted file mode 100644 index 54f4b229..00000000 --- a/services/platform/package-lock.json +++ /dev/null @@ -1,13567 +0,0 @@ -{ - "name": "@lunogram/platform", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@lunogram/platform", - "version": "0.1.0", - "dependencies": { - "@aws-sdk/client-s3": "^3.171.0", - "@aws-sdk/client-ses": "^3.121.0", - "@aws-sdk/client-sns": "^3.121.0", - "@aws-sdk/client-sqs": "^3.171.0", - "@aws-sdk/lib-storage": "^3.171.0", - "@bugsnag/js": "^7.20.0", - "@bugsnag/plugin-koa": "^7.19.0", - "@koa/cors": "^5.0.0", - "@koa/router": "^11.0.1", - "@ladjs/country-language": "^1.0.3", - "@node-saml/node-saml": "^4.0.5", - "@segment/analytics-node": "^1.0.0-beta.23", - "@sentry/node": "^7.46.0", - "@sentry/utils": "^7.46.0", - "ajv": "^8.11.0", - "ajv-errors": "^3.0.0", - "ajv-formats": "^2.1.1", - "bullmq": "^5.12.14", - "busboy": "^1.6.0", - "csv-parse": "^5.3.3", - "date-fns": "^2.29.2", - "date-fns-tz": "^1.3.7", - "dotenv": "^16.0.1", - "eslint-plugin-import": "^2.29.0", - "eventemitter2": "^6.4.9", - "handlebars": "^4.7.7", - "handlebars-utils": "^1.0.6", - "hashids": "^2.2.10", - "html-to-text": "^9.0.4", - "ioredis": "^5.3.1", - "jsonpath": "^1.1.1", - "jsonwebtoken": "^9.0.0", - "knex": "^2.3.0", - "koa": "^2.13.4", - "koa-body": "5.0.0", - "koa-jwt": "^4.0.3", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "libphonenumber-js": "^1.10.24", - "mysql2": "^3.11.0", - "node-pushnotifications": "^3.0.0", - "node-schedule": "^2.1.0", - "nodemailer": "^6.9.5", - "nodemailer-mailgun-transport": "^2.1.5", - "nodemailer-sendgrid": "^1.0.3", - "openid-client": "^5.2.1", - "pino": "^8.1.0", - "pino-pretty": "^8.1.0", - "posthog-node": "^3.1.2", - "rrule": "2.7.2", - "sqs-consumer": "^7.0.0" - }, - "devDependencies": { - "@types/busboy": "^1.5.0", - "@types/html-to-text": "^9.0.0", - "@types/jest": "^28.1.6", - "@types/jsonpath": "^0.2.0", - "@types/jsonwebtoken": "^9.0.5", - "@types/koa__cors": "^3.3.0", - "@types/koa__router": "^8.0.11", - "@types/koa-static": "^4.0.2", - "@types/node": "^18.15.11", - "@types/node-pushnotifications": "^1.0.4", - "@types/node-schedule": "^2.1.0", - "@types/nodemailer": "^6.4.4", - "@types/nodemailer-mailgun-transport": "^1.4.3", - "@types/nodemailer-sendgrid": "^1.0.1", - "@types/supertest": "^2.0.12", - "@typescript-eslint/eslint-plugin": "^5.30.5", - "@typescript-eslint/parser": "^5.30.5", - "eslint": "^8.19.0", - "eslint-config-standard": "^17.0.0", - "ioredis-mock": "^8.8.3", - "jest": "^28.1.3", - "nodemon": "^2.0.19", - "supertest": "^6.3.3", - "ts-jest": "^28.0.7", - "ts-node": "^10.8.2", - "typescript": "^4.9.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.716.0.tgz", - "integrity": "sha512-B49DwXnZS9GjjV+auIuqnCx86cqpACd//4mC5AXb5MsrLJJ6bPE/U2T+C/0NqUTfb31aqYbZ/cwhJELvpDU9mA==", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/client-sts": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-bucket-endpoint": "3.714.0", - "@aws-sdk/middleware-expect-continue": "3.714.0", - "@aws-sdk/middleware-flexible-checksums": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-location-constraint": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-sdk-s3": "3.716.0", - "@aws-sdk/middleware-ssec": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/signature-v4-multi-region": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@aws-sdk/xml-builder": "3.709.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/eventstream-serde-browser": "^3.0.14", - "@smithy/eventstream-serde-config-resolver": "^3.0.11", - "@smithy/eventstream-serde-node": "^3.0.13", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-blob-browser": "^3.1.10", - "@smithy/hash-node": "^3.0.11", - "@smithy/hash-stream-node": "^3.1.10", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/md5-js": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ses": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.716.0.tgz", - "integrity": "sha512-lYsg2x3Z6R5ngBX1EqFKR6jf77ewbGg+aZV6V4ucVCghaGGcGnGisRP4FAep3IgkrZuByEYeJaA6cTli98qaOQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/client-sts": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sns": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.716.0.tgz", - "integrity": "sha512-Qg7EqlS83yiHRpfbhlyanRQ5aKmj1M8K7OJcDYgjI8FNf4YlS/YKJkv02SQVdW0lFLT2adceUXBjdAQXlbXC7g==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/client-sts": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.716.0.tgz", - "integrity": "sha512-nDpnXvmo65dDGw+/c/c6e/ic9HUvJRayzs9Rc4DdatsnAZE71gcWoLUBupJ/IOkNwgoVau0TDs9SRlmsuDsm1w==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/client-sts": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-sdk-sqs": "3.716.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/md5-js": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.716.0.tgz", - "integrity": "sha512-5Nb0jJXce2TclbjG7WVPufwhgV1TRydz1QnsuBtKU0AdViEpr787YrZhPpGnNIM1Dx+R1H/tmAHZnOoohS6D8g==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.716.0.tgz", - "integrity": "sha512-lA4IB9FzR2KjH7EVCo+mHGFKqdViVyeBQEIX9oVratL/l7P0bMS1fMwgfHOc3ACazqNxBxDES7x08ZCp32y6Lw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.716.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.716.0.tgz", - "integrity": "sha512-i4SVNsrdXudp8T4bkm7Fi3YWlRnvXCSwvNDqf6nLqSJxqr4CN3VlBELueDyjBK7TAt453/qSif+eNx+bHmwo4Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@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.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.716.0.tgz", - "integrity": "sha512-5DkUiTrbyzO8/W4g7UFEqRFpuhgizayHI/Zbh0wtFMcot8801nJV+MP/YMhdjimlvAr/OqYB08FbGsPyWppMTw==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/core": "^2.5.5", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/signature-v4": "^4.2.4", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.716.0.tgz", - "integrity": "sha512-JI2KQUnn2arICwP9F3CnqP1W3nAbm4+meQg/yOhp9X0DMzQiHrHRd4HIrK2vyVgi2/6hGhONY5uLF26yRTA7nQ==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.716.0.tgz", - "integrity": "sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/property-provider": "^3.1.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-stream": "^3.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.716.0.tgz", - "integrity": "sha512-P37We2GtZvdROxiwP0zrpEL81/HuYK1qlYxp5VCj3uV+G4mG8UQN2gMIU/baYrpOQqa0h81RfyQGRFUjVaDVqw==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-env": "3.716.0", - "@aws-sdk/credential-provider-http": "3.716.0", - "@aws-sdk/credential-provider-process": "3.716.0", - "@aws-sdk/credential-provider-sso": "3.716.0", - "@aws-sdk/credential-provider-web-identity": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.716.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.716.0.tgz", - "integrity": "sha512-FGQPK2uKfS53dVvoskN/s/t6m0Po24BGd1PzJdzHBFCOjxbZLM6+8mDMXeyi2hCLVVQOUcuW41kOgmJ0+zMbww==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.716.0", - "@aws-sdk/credential-provider-http": "3.716.0", - "@aws-sdk/credential-provider-ini": "3.716.0", - "@aws-sdk/credential-provider-process": "3.716.0", - "@aws-sdk/credential-provider-sso": "3.716.0", - "@aws-sdk/credential-provider-web-identity": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.716.0.tgz", - "integrity": "sha512-0spcu2MWVVHSTHH3WE2E//ttUJPwXRM3BCp+WyI41xLzpNu1Fd8zjOrDpEo0SnGUzsSiRTIJWgkuu/tqv9NJ2A==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.716.0.tgz", - "integrity": "sha512-J2IA3WuCpRGGoZm6VHZVFCnrxXP+41iUWb9Ct/1spljegTa1XjiaZ5Jf3+Ubj7WKiyvP9/dgz1L0bu2bYEjliw==", - "dependencies": { - "@aws-sdk/client-sso": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/token-providers": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.716.0.tgz", - "integrity": "sha512-vzgpWKs2gGXZGdbMKRFrMW4PqEFWkGvwWH2T7ZwQv9m+8lQ7P4Dk2uimqu0f37HZAbpn8HFMqRh4CaySjU354A==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.716.0" - } - }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.716.0.tgz", - "integrity": "sha512-bTcZ8MwceFmw0sxg9M5PeEHtmr6/TgHDEeF4HOGjOF3tEd+0/CpjtRXf27Q1iD4ywPvtjAu2sEot3xeKQTMw6A==", - "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/smithy-client": "^3.5.1", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-s3": "^3.716.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.714.0.tgz", - "integrity": "sha512-I/xSOskiseJJ8i183Z522BgqbgYzLKP7jGcg2Qeib/IWoG2IP+9DH8pwqagKaPAycyswtnoKBJiiFXY43n0CkA==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-arn-parser": "3.693.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.714.0.tgz", - "integrity": "sha512-rlzsXdG8Lzo4Qpl35ZnpOBAWlzvDHpP9++0AXoUwAJA0QmMm7auIRmgxJuNj91VwT9h15ZU6xjU4S7fJl4W0+w==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.716.0.tgz", - "integrity": "sha512-1j8PoBYyn0oQlRhPPzOnqf0sdXO0x34pG19cMC0a7cv+En17m7W44BtVplFPRKpGfto3DU5frozV+wu8d9v/hQ==", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.714.0.tgz", - "integrity": "sha512-6l68kjNrh5QC8FGX3I3geBDavWN5Tg1RLHJ2HLA8ByGBtJyCwnz3hEkKfaxn0bBx0hF9DzbfjEOUF6cDqy2Kjg==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.714.0.tgz", - "integrity": "sha512-MX7M+V+FblujKck3fyuzePVIAy9530gY719IiSxV6uN1qLHl7VDJxNblpF/KpXakD6rOg8OpvtmqsXj9aBMftw==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.714.0.tgz", - "integrity": "sha512-RkqHlMvQWUaRklU1bMfUuBvdWwxgUtEqpADaHXlGVj3vtEY2UgBjy+57CveC4MByqKIunNvVHBBbjrGVtwY7Lg==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.714.0.tgz", - "integrity": "sha512-AVU5ixnh93nqtsfgNc284oXsXaadyHGPHpql/jwgaaqQfEXjS/1/j3j9E/vpacfTTz2Vzo7hAOjnvrOXSEVDaA==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.716.0.tgz", - "integrity": "sha512-Qzz5OfRA/5brqfvq+JHTInwS1EuJ1+tC6qMtwKWJN3czMnVJVdnnsPTf+G5IM/1yYaGEIjY8rC1ExQLcc8ApFQ==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-arn-parser": "3.693.0", - "@smithy/core": "^2.5.5", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/signature-v4": "^4.2.4", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.716.0.tgz", - "integrity": "sha512-dAkFlLv4W0GO9lP419eXxFZ7UgO/mTGC/WlS6OYrSDFemzySSpxE+PNL6Eg2rqVNLiwhW4U9+6e8CC8RE++lEQ==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.714.0.tgz", - "integrity": "sha512-RkK8REAVwNUQmYbIDRw8eYbMJ8F1Rw4C9mlME4BBMhFlelGcD3ErU2ce24moQbDxBjNwHNESmIqgmdQk93CDCQ==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.716.0.tgz", - "integrity": "sha512-FpAtT6nNKrYdkDZndutEraiRMf+TgDzAGvniqRtZ/YTPA+gIsWrsn+TwMKINR81lFC3nQfb9deS5CFtxd021Ew==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@smithy/core": "^2.5.5", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.714.0.tgz", - "integrity": "sha512-HJzsQxgMOAzZrbf/YIqEx30or4tZK1oNAk6Wm6xecUQx+23JXIaePRu1YFUOLBBERQ4QBPpISFurZWBMZ5ibAw==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.716.0.tgz", - "integrity": "sha512-k0goWotZKKz+kV6Ln0qeAMSeSVi4NipuIIz5R8A0uCF2zBK4CXWdZR7KeaIoLBhJwQnHj1UU7E+2MK74KIUBzA==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/signature-v4": "^4.2.4", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.714.0.tgz", - "integrity": "sha512-vKN064aLE3kl+Zl16Ony3jltHnMddMBT7JRkP1L+lLywhA0PcAKxpdvComul/sTBWnbnwLnaS5NsDUhcWySH8A==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.714.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.714.0.tgz", - "integrity": "sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.693.0.tgz", - "integrity": "sha512-WC8x6ca+NRrtpAH64rWu+ryDZI3HuLwlEr8EU6/dbC/pt+r/zC0PBoC15VEygUaBA+isppCikQpGyEDu0Yj7gQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.714.0.tgz", - "integrity": "sha512-Xv+Z2lhe7w7ZZRsgBwBMZgGTVmS+dkkj2S13uNHAx9lhB5ovM8PhK5G/j28xYf6vIibeuHkRAbb7/ozdZIGR+A==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", - "@smithy/util-endpoints": "^2.1.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz", - "integrity": "sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.714.0.tgz", - "integrity": "sha512-OdJJ03cP9/MgIVToPJPCPUImbpZzTcwdIgbXC0tUQPJhbD7b7cB4LdnkhNHko+MptpOrCq4CPY/33EpOjRdofw==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.716.0.tgz", - "integrity": "sha512-3PqaXmQbxrtHKAsPCdp7kn5FrQktj8j3YyuNsqFZ8rWZeEQ88GWlsvE61PTsr2peYCKzpFqYVddef2x1axHU0w==", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.709.0.tgz", - "integrity": "sha512-2GPCwlNxeHspoK/Mc8nbk9cBOkSpp3j2SJUQmFnyQK6V/pR6II2oPRyZkMomug1Rc10hqlBHByMecq4zhV2uUw==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@bugsnag/browser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.25.0.tgz", - "integrity": "sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==", - "dependencies": { - "@bugsnag/core": "^7.25.0" - } - }, - "node_modules/@bugsnag/core": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.25.0.tgz", - "integrity": "sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ==", - "dependencies": { - "@bugsnag/cuid": "^3.0.0", - "@bugsnag/safe-json-stringify": "^6.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "0.0.2", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/cuid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.1.1.tgz", - "integrity": "sha512-d2z4b0rEo3chI07FNN1Xds8v25CNeekecU6FC/2Fs9MxY2EipkZTThVcV2YinMn8dvRUlViKOyC50evoUxg8tw==" - }, - "node_modules/@bugsnag/js": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.25.0.tgz", - "integrity": "sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg==", - "dependencies": { - "@bugsnag/browser": "^7.25.0", - "@bugsnag/node": "^7.25.0" - } - }, - "node_modules/@bugsnag/node": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.25.0.tgz", - "integrity": "sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA==", - "dependencies": { - "@bugsnag/core": "^7.25.0", - "byline": "^5.0.0", - "error-stack-parser": "^2.0.2", - "iserror": "^0.0.2", - "pump": "^3.0.0", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/plugin-koa": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@bugsnag/plugin-koa/-/plugin-koa-7.25.0.tgz", - "integrity": "sha512-XtGiWUToXMG31QtA/TPFztHIPdgBbeDA90I4iZ3rk8y/77P1xBgrncp3yj6/fMbX1s5k7+w6jkkvXANf2U/stA==", - "dependencies": { - "iserror": "^0.0.2" - }, - "peerDependencies": { - "@bugsnag/core": "^7.0.0" - } - }, - "node_modules/@bugsnag/safe-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", - "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", - "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==" - }, - "node_modules/@firebase/app-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==" - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", - "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==" - }, - "node_modules/@firebase/component": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.10.tgz", - "integrity": "sha512-OsNbEKyz9iLZSmMUhsl6+kCADzte00iisJIRUspnUqvDCX+RSGZOBIqekukv/jN177ovjApBQNFaxSYIDc/SyQ==", - "dependencies": { - "@firebase/util": "1.10.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.9.tgz", - "integrity": "sha512-EkiPSKSu2TJJGtOjyISASf3UFpFJDil1lMbfqnxilfbmIsilvC8DzgjuLoYD+eOitcug4wtU9Fh1tt2vgBhskA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.10", - "@firebase/logger": "0.4.3", - "@firebase/util": "1.10.1", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.10.tgz", - "integrity": "sha512-x3baGMzEKG5BE5orwFRg+Zpaa33N9lZkcOFXoZSeN9Muw/Mx37stePZpa1YMpcAPqX3aDx1cSv55Nxh4ObgpUQ==", - "dependencies": { - "@firebase/component": "0.6.10", - "@firebase/database": "1.0.9", - "@firebase/database-types": "1.0.6", - "@firebase/logger": "0.4.3", - "@firebase/util": "1.10.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat/node_modules/@firebase/app-types": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", - "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" - }, - "node_modules/@firebase/database-compat/node_modules/@firebase/database-types": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.6.tgz", - "integrity": "sha512-sMI7IynSZBsyGbUugc8PKE1jwKbnvaieAz/RxuM57PZQNCi6Rteiviwcw/jqZOX6igqYJwXWZ3UzKOZo2nUDRA==", - "dependencies": { - "@firebase/app-types": "0.9.2", - "@firebase/util": "1.10.1" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.7.tgz", - "integrity": "sha512-I7zcLfJXrM0WM+ksFmFdAMdlq/DFmpeMNa+/GNsLyFo5u/lX5zzkPzGe3srVWqaBQBY5KprylDGxOsP6ETfL0A==", - "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.10.2" - } - }, - "node_modules/@firebase/database-types/node_modules/@firebase/util": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.2.tgz", - "integrity": "sha512-qnSHIoE9FK+HYnNhTI8q14evyqbc/vHRivfB4TgCIUOl4tosmKSQlp7ltymOlMP4xVIJTg5wrkfcZ60X4nUf7Q==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.3.tgz", - "integrity": "sha512-Th42bWJg18EF5bJwhRosn2M/eYxmbWCwXZr4hHX7ltO0SE3QLrpgiMKeRBR/NW7vJke7i0n3i8esbCW2s93qBw==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/util": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.1.tgz", - "integrity": "sha512-AIhFnCCjM8FmCqSNlNPTuOk3+gpHC1RkeNUBLtPbcqGYpN5MxI5q7Yby+rxycweOZOCboDzfIj8WyaY4tpQG/g==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.0.tgz", - "integrity": "sha512-88uZ+jLsp1aVMj7gh3EKYH1aulTAMFAp8sH/v5a9w8q8iqSG27RiWLoxSAFr/XocZ9hGiWH1kEnBw+zl3xAgNA==", - "optional": true, - "dependencies": { - "@opentelemetry/api": "^1.3.0", - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.3", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.14.0.tgz", - "integrity": "sha512-H41bPL2cMfSi4EEnFzKvg7XSb7T67ocSXrmF7MPjfgFB0L6CKGzfIYJheAZi1iqXjz6XaCT1OBf6HCG5vDBTOQ==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "html-entities": "^2.5.2", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.12.5", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", - "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" - }, - "node_modules/@ioredis/as-callback": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ioredis/as-callback/-/as-callback-3.0.0.tgz", - "integrity": "sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg==", - "dev": true - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", - "dev": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz", - "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@koa/router": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-11.0.2.tgz", - "integrity": "sha512-VmlGwc5n0d+0vbudFXWsAHcfLn8cJ34gS4ktf8bxmN1yzmWBGts1IbaAjvNr6LBAXf+/U51qxLNv8oalh/UYKQ==", - "dependencies": { - "debug": "^4.3.4", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@ladjs/country-language": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@ladjs/country-language/-/country-language-1.0.3.tgz", - "integrity": "sha512-FJROu9/hh4eqVAGDyfL8vpv6Vb0qKHX1ozYLRZ+beUzD5xFf+3r0J+SVIWKviEa7W524Qvqou+ta1WrsRgzxGw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@lukeed/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", - "dependencies": { - "@lukeed/csprng": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@node-saml/node-saml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@node-saml/node-saml/-/node-saml-4.0.5.tgz", - "integrity": "sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw==", - "dependencies": { - "@types/debug": "^4.1.7", - "@types/passport": "^1.0.11", - "@types/xml-crypto": "^1.4.2", - "@types/xml-encryption": "^1.2.1", - "@types/xml2js": "^0.4.11", - "@xmldom/xmldom": "^0.8.6", - "debug": "^4.3.4", - "xml-crypto": "^3.0.1", - "xml-encryption": "^3.0.2", - "xml2js": "^0.5.0", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "optional": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@parse/node-apn": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-6.0.1.tgz", - "integrity": "sha512-QQxqEN/zbtEkSgj41oX/tQUavML+G+JHeQi2YVlgZlponnwIxA3fb5tEbXPm+fdR6rL1pi2/z2PcOwINOyx2eA==", - "dependencies": { - "debug": "4.3.3", - "jsonwebtoken": "9.0.0", - "node-forge": "1.3.1", - "verror": "1.10.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@parse/node-apn/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@parse/node-apn/node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/@parse/node-apn/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "optional": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "optional": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "optional": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "optional": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "optional": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "optional": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "optional": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "optional": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "optional": true - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" - }, - "node_modules/@segment/analytics-core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.4.1.tgz", - "integrity": "sha512-kV0Pf33HnthuBOVdYNani21kYyj118Fn+9757bxqoksiXoZlYvBsFq6giNdCsKcTIE1eAMqNDq3xE1VQ0cfsHA==", - "dependencies": { - "@lukeed/uuid": "^2.0.0", - "@segment/analytics-generic-utils": "1.1.1", - "dset": "^3.1.2", - "tslib": "^2.4.1" - } - }, - "node_modules/@segment/analytics-generic-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@segment/analytics-generic-utils/-/analytics-generic-utils-1.1.1.tgz", - "integrity": "sha512-THTIzBPHnvu1HYJU3fARdJ3qIkukO3zDXsmDm+kAeUks5R9CBXOQ6rPChiASVzSmwAIIo5uFIXXnCraojlq/Gw==", - "dependencies": { - "tslib": "^2.4.1" - } - }, - "node_modules/@segment/analytics-node": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@segment/analytics-node/-/analytics-node-1.3.0.tgz", - "integrity": "sha512-lRLz1WZaDokMoUe299yP5JkInc3OgJuqNNlxb6j0q22umCiq6b5iDo2gRmFn93reirIvJxWIicQsGrHd93q8GQ==", - "dependencies": { - "@lukeed/uuid": "^2.0.0", - "@segment/analytics-core": "1.4.1", - "@segment/analytics-generic-utils": "1.1.1", - "buffer": "^6.0.3", - "node-fetch": "^2.6.7", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@segment/analytics-node/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@selderee/plugin-htmlparser2": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", - "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", - "dependencies": { - "domhandler": "^5.0.3", - "selderee": "^0.11.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/@sendgrid/client": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.5.5.tgz", - "integrity": "sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==", - "dependencies": { - "@sendgrid/helpers": "^6.5.5", - "@types/request": "^2.48.4", - "request": "^2.88.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@sendgrid/helpers": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-6.5.5.tgz", - "integrity": "sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==", - "dependencies": { - "chalk": "^2.0.1", - "deepmerge": "^4.2.2" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@sendgrid/helpers/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/helpers/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/helpers/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@sendgrid/helpers/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@sendgrid/helpers/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@sendgrid/helpers/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/helpers/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/mail": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-6.5.5.tgz", - "integrity": "sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==", - "dependencies": { - "@sendgrid/client": "^6.5.5", - "@sendgrid/helpers": "^6.5.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@sentry-internal/tracing": { - "version": "7.120.2", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.2.tgz", - "integrity": "sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==", - "dependencies": { - "@sentry/core": "7.120.2", - "@sentry/types": "7.120.2", - "@sentry/utils": "7.120.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core": { - "version": "7.120.2", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.2.tgz", - "integrity": "sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==", - "dependencies": { - "@sentry/types": "7.120.2", - "@sentry/utils": "7.120.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/integrations": { - "version": "7.120.2", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.2.tgz", - "integrity": "sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==", - "dependencies": { - "@sentry/core": "7.120.2", - "@sentry/types": "7.120.2", - "@sentry/utils": "7.120.2", - "localforage": "^1.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/node": { - "version": "7.120.2", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.2.tgz", - "integrity": "sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==", - "dependencies": { - "@sentry-internal/tracing": "7.120.2", - "@sentry/core": "7.120.2", - "@sentry/integrations": "7.120.2", - "@sentry/types": "7.120.2", - "@sentry/utils": "7.120.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/types": { - "version": "7.120.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.2.tgz", - "integrity": "sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.120.2", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.2.tgz", - "integrity": "sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==", - "dependencies": { - "@sentry/types": "7.120.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", - "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", - "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", - "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", - "dependencies": { - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz", - "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.5.tgz", - "integrity": "sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz", - "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.10.tgz", - "integrity": "sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.14.tgz", - "integrity": "sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.13", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.11.tgz", - "integrity": "sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.13.tgz", - "integrity": "sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.13", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.13.tgz", - "integrity": "sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==", - "dependencies": { - "@smithy/eventstream-codec": "^3.1.10", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz", - "integrity": "sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==", - "dependencies": { - "@smithy/protocol-http": "^4.1.8", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.10.tgz", - "integrity": "sha512-elwslXOoNunmfS0fh55jHggyhccobFkexLYC1ZeZ1xP2BTSrcIBaHV2b4xUQOdctrSNOpMqOZH1r2XzWTEhyfA==", - "dependencies": { - "@smithy/chunked-blob-reader": "^4.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.1", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz", - "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==", - "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.10.tgz", - "integrity": "sha512-olomK/jZQ93OMayW1zfTHwcbwBdhcZOHsyWyiZ9h9IXvc1mCD/VuvzbLb3Gy/qNJwI4MANPLctTp2BucV2oU/Q==", - "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz", - "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.11.tgz", - "integrity": "sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==", - "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz", - "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.6.tgz", - "integrity": "sha512-WAqzyulvvSKrT5c6VrQelgNVNNO7BlTQW9Z+s9tcG6G5CaBS1YBpPtT3VuhXLQbewSiGi7oXQROwpw26EG9PLQ==", - "dependencies": { - "@smithy/core": "^2.5.5", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-middleware": "^3.0.11", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.31", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.31.tgz", - "integrity": "sha512-yq9wawrJLYHAYFpChLujxRN4My+SiKXvZk9Ml/CvTdRSA8ew+hvuR5LT+mjSlSBv3c4XJrkN8CWegkBaeD0Vrg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/service-error-classification": "^3.0.11", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", - "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", - "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", - "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.2.tgz", - "integrity": "sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA==", - "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/protocol-http": "^4.1.8", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", - "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", - "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", - "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", - "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", - "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", - "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", - "dependencies": { - "@smithy/types": "^3.7.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", - "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", - "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.5.1.tgz", - "integrity": "sha512-PmjskH4Os1Eh3rd5vSsa5uVelZ4DRu+N5CBEgb9AT96hQSJGWSEb6pGxKV/PtKQSIp9ft3+KvnT8ViMKaguzgA==", - "dependencies": { - "@smithy/core": "^2.5.5", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-stream": "^3.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", - "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", - "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.11", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.31.tgz", - "integrity": "sha512-eO+zkbqrPnmsagqzrmF7IJrCoU2wTQXWVYxMPqA9Oue55kw9WEvhyuw2XQzTVTCRcYsg6KgmV3YYhLlWQJfK1A==", - "dependencies": { - "@smithy/property-provider": "^3.1.11", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.31.tgz", - "integrity": "sha512-0/nJfpSpbGZOs6qs42wCe2TdjobbnnD4a3YUUlvTXSQqLy4qa63luDaV04hGvqSHP7wQ7/WGehbvHkDhMZd1MQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.13", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz", - "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", - "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", - "dependencies": { - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", - "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.11", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.2.tgz", - "integrity": "sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg==", - "dependencies": { - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/types": "^3.7.2", - "@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" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.2.0.tgz", - "integrity": "sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/types": "^3.7.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/busboy": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.4.tgz", - "integrity": "sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", - "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", - "dev": true - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true - }, - "node_modules/@types/cookies": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", - "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", - "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/formidable": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", - "integrity": "sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/html-to-text": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz", - "integrity": "sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==", - "dev": true - }, - "node_modules/@types/http-assert": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", - "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/ioredis-mock": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/@types/ioredis-mock/-/ioredis-mock-8.2.5.tgz", - "integrity": "sha512-cZyuwC9LGtg7s5G9/w6rpy3IOZ6F/hFR0pQlWYZESMo1xQUYbDpa6haqB4grTePjsGzcB/YLBFCjqRunK5wieg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "ioredis": ">=5" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "28.1.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", - "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", - "dev": true, - "dependencies": { - "expect": "^28.0.0", - "pretty-format": "^28.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/jsonpath": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@types/jsonpath/-/jsonpath-0.2.4.tgz", - "integrity": "sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", - "dev": true - }, - "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", - "dev": true, - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__cors": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-3.3.1.tgz", - "integrity": "sha512-aFGYhTFW7651KhmZZ05VG0QZJre7QxBxDj2LF1lf6GA/wSXEfKVAJxiQQWzRV4ZoMzQIO8vJBXKsUcRuvYK9qw==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa__router": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.11.tgz", - "integrity": "sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-send": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/koa-send/-/koa-send-4.1.6.tgz", - "integrity": "sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-static": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.4.tgz", - "integrity": "sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A==", - "dev": true, - "dependencies": { - "@types/koa": "*", - "@types/koa-send": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "18.19.68", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz", - "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-pushnotifications": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/node-pushnotifications/-/node-pushnotifications-1.0.8.tgz", - "integrity": "sha512-nIYuR0zgluQfoKW3gI0HRaWi+NU4/M16KUpovjcu06WL/hc34DHiVv1OGfFkP+z7yL46TXpa0y0tiFlXW8ivVQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/web-push": "*" - } - }, - "node_modules/@types/node-schedule": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.7.tgz", - "integrity": "sha512-G7Z3R9H7r3TowoH6D2pkzUHPhcJrDF4Jz1JOQ80AX0K2DWTHoN9VC94XzFAPNMdbW9TBzMZ3LjpFi7RYdbxtXA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/nodemailer": { - "version": "6.4.17", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz", - "integrity": "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/nodemailer-mailgun-transport": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/nodemailer-mailgun-transport/-/nodemailer-mailgun-transport-1.4.6.tgz", - "integrity": "sha512-6qhtDo+1ZLtrmmpQN7O9e3NLK5ggnTS2Oca+22SvmhwChNKxDZErecTlF6qTOLnNW/CCcHmDaSmG2MXUeP1w9g==", - "dev": true, - "dependencies": { - "@types/nodemailer": "*" - } - }, - "node_modules/@types/nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==", - "dev": true, - "dependencies": { - "@types/nodemailer": "*" - } - }, - "node_modules/@types/passport": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", - "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", - "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", - "dev": true, - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/supertest": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.16.tgz", - "integrity": "sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==", - "dev": true, - "dependencies": { - "@types/superagent": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" - }, - "node_modules/@types/web-push": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@types/web-push/-/web-push-3.6.4.tgz", - "integrity": "sha512-GnJmSr40H3RAnj0s34FNTcJi1hmWFV5KXugE0mYWnYhgTAHLJ/dJKAwDmvPJYMke0RplY2XE9LnM4hqSqKIjhQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/xml-crypto": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/xml-crypto/-/xml-crypto-1.4.6.tgz", - "integrity": "sha512-A6jEW2FxLZo1CXsRWnZHUX2wzR3uDju2Bozt6rDbSmU/W8gkilaVbwFEVN0/NhnUdMVzwYobWtM6bU1QJJFb7Q==", - "dependencies": { - "@types/node": "*", - "xpath": "0.0.27" - } - }, - "node_modules/@types/xml-encryption": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/xml-encryption/-/xml-encryption-1.2.4.tgz", - "integrity": "sha512-I69K/WW1Dv7j6O3jh13z0X8sLWJRXbu5xnHDl9yHzUNDUBtUoBY058eb5s+x/WG6yZC1h8aKdI2EoyEPjyEh+Q==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/xml2js": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", - "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "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.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==" - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", - "dev": true, - "dependencies": { - "@jest/transform": "^28.1.3", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base-64": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", - "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bullmq": { - "version": "5.34.3", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.34.3.tgz", - "integrity": "sha512-S8/V11w7p6jYAGvv+00skLza/4inTOupWPe0uCD8mZSUiYKzvmW4/YEB+KVjZI2CC2oD3KJ3t7/KkUd31MxMig==", - "dependencies": { - "cron-parser": "^4.6.0", - "ioredis": "^5.4.1", - "msgpackr": "^1.11.2", - "node-abort-controller": "^3.1.1", - "semver": "^7.5.4", - "tslib": "^2.0.0", - "uuid": "^9.0.0" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/co-body": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz", - "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==", - "dependencies": { - "inflation": "^2.0.0", - "qs": "^6.4.0", - "raw-body": "^2.2.0", - "type-is": "^1.6.14" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", - "dependencies": { - "bluebird": "^3.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csv-parse": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", - "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/date-fns-tz": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", - "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", - "peerDependencies": { - "date-fns": ">=2.0.0" - } - }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dset": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.75", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", - "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.23.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.6.tgz", - "integrity": "sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "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.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.7", - "get-intrinsic": "^1.2.6", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.0.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-regex-test": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "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.3", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" - ], - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "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-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-n": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fast-copy": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz", - "integrity": "sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-redact": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fengari": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.4.tgz", - "integrity": "sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", - "dev": true, - "dependencies": { - "readline-sync": "^1.4.9", - "sprintf-js": "^1.1.1", - "tmp": "^0.0.33" - } - }, - "node_modules/fengari-interop": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fengari-interop/-/fengari-interop-0.1.3.tgz", - "integrity": "sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==", - "dev": true, - "peerDependencies": { - "fengari": "^0.1.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase-admin": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.1.tgz", - "integrity": "sha512-Nuoxk//gaYrspS7TvwBINdGvFhh2QeiaWpRW6+PJ+tWyn2/CugBc7jKa1NaBg0AvhGSOXFOCIsXhzCzHA47Rew==", - "dependencies": { - "@fastify/busboy": "^2.1.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "farmhash": "^3.3.1", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.1.0", - "long": "^5.2.3", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.7.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/firebase-admin/node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/firebase-admin/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.7.tgz", - "integrity": "sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "optional": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "devOptional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "peer": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-auth-library": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz", - "integrity": "sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-auth-library/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/google-auth-library/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/google-gax": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.4.1.tgz", - "integrity": "sha512-Phyp9fMfA00J3sZbJxbbB4jC55b7DBjE3F6poyL3wKMEBVKA79q6BGuHcTiM28yOzVql0NDbRL8MLLh8Iwk9Dg==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "^1.10.9", - "@grpc/proto-loader": "^0.7.13", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.7.0", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.2", - "protobufjs": "^7.3.2", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/gtoken/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/gtoken/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars-utils": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz", - "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==", - "dependencies": { - "kind-of": "^6.0.0", - "typeof-article": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hashids": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hashids/-/hashids-2.3.0.tgz", - "integrity": "sha512-ljM73TE/avEhNnazxaj0Dw3BbEUuLC5yYCQ9RSkSUcT4ZSU6ZebdKCIBJ+xT/DnSYW36E9k82GH1Q6MydSIosQ==" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/help-me": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", - "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", - "dependencies": { - "glob": "^8.0.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/help-me/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/help-me/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/help-me/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "optional": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-to-text": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", - "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", - "dependencies": { - "@selderee/plugin-htmlparser2": "^0.11.0", - "deepmerge": "^4.3.1", - "dom-serializer": "^2.0.0", - "htmlparser2": "^8.0.2", - "selderee": "^0.11.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http_ece": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http_ece/-/http_ece-1.2.0.tgz", - "integrity": "sha512-JrF8SSLVmcvc5NducxgyOrKXe3EsyHMgBFgSaIUGmArKe+rwr0uphRkRXvwiom3I+fpIfoItveHrfudL8/rxuA==", - "engines": { - "node": ">=16" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ioredis-mock": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-8.9.0.tgz", - "integrity": "sha512-yIglcCkI1lvhwJVoMsR51fotZVsPsSk07ecTCgRTRlicG0Vq3lke6aAaHklyjmRNRsdYAgswqC2A0bPtQK4LSw==", - "dev": true, - "dependencies": { - "@ioredis/as-callback": "^3.0.0", - "@ioredis/commands": "^1.2.0", - "fengari": "^0.1.4", - "fengari-interop": "^0.1.3", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12.22" - }, - "peerDependencies": { - "@types/ioredis-mock": "^8", - "ioredis": "^5" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "peer": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", - "dependencies": { - "call-bound": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/iserror": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", - "integrity": "sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", - "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", - "dev": true, - "dependencies": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", - "import-local": "^3.0.2", - "jest-cli": "^28.1.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", - "dev": true, - "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonpath": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", - "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jsprim/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jwks-rsa/node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/jwks-rsa/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/knex": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/knex/-/knex-2.5.1.tgz", - "integrity": "sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==", - "dependencies": { - "colorette": "2.0.19", - "commander": "^10.0.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "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.1", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" - }, - "engines": { - "node": ">=12" - }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/knex/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-body": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-5.0.0.tgz", - "integrity": "sha512-nHwEODrQGiyKBILCWO8QSS40C87cKr2cp3y/Cw8u9Z8w5t0CdSkGm3+y9WK5BIAlPpo9tTw5RtSbxpVyG79vmw==", - "dependencies": { - "@types/formidable": "^2.0.4", - "co-body": "^5.1.1", - "formidable": "^2.0.1" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-jwt": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/koa-jwt/-/koa-jwt-4.0.4.tgz", - "integrity": "sha512-Tid9BQfpVtUG/8YZV38a+hDKll0pfVhfl7A/2cNaYThS1cxMFXylZzfARqHQqvNhHy9qM+qkxd4/z6EaIV4SAQ==", - "dependencies": { - "jsonwebtoken": "^9.0.0", - "koa-unless": "^1.0.7", - "p-any": "^2.1.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa-unless": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/koa-unless/-/koa-unless-1.0.7.tgz", - "integrity": "sha512-NKiz+nk4KxSJFskiJMuJvxeA41Lcnx3d8Zy+8QETgifm4ab4aOeGD3RgR6bIz0FGNWwo3Fz0DtnK77mEIqHWxA==" - }, - "node_modules/koa/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/leac": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", - "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.11.17", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.17.tgz", - "integrity": "sha512-Jr6v8thd5qRlOlc6CslSTzGzzQW03uiscab7KHQZX1Dfo4R6n6FDhZ0Hri6/X7edLIDv9gl4VMZXhxTjLnl0VQ==" - }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dependencies": { - "lie": "3.1.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "optional": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/long-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/lru.min": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", - "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", - "engines": { - "bun": ">=1.0.0", - "deno": ">=1.30.0", - "node": ">=8.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wellwelwel" - } - }, - "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/mailgun.js": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/mailgun.js/-/mailgun.js-8.2.2.tgz", - "integrity": "sha512-po/KtofzrTuKhHLenbmliDsVVOFANwcfDFUGnggwnyZJmZz7JgBlV6nzK9o2Fk+OK2SiBmJTK25RbkAj57Hd+Q==", - "dependencies": { - "axios": "^1.3.3", - "base-64": "^1.0.0", - "url-join": "^4.0.1" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/msgpackr": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", - "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/mysql2": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.11.5.tgz", - "integrity": "sha512-0XFu8rUmFN9vC0ME36iBvCUObftiMHItrYFhlCRvFWbLgpNqtC4Br/NmZX1HNCszxT0GGy5QtP+k3Q3eCJPaYA==", - "dependencies": { - "aws-ssl-profiles": "^1.1.1", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.3", - "long": "^5.2.1", - "lru.min": "^1.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", - "dependencies": { - "lru-cache": "^7.14.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "node_modules/node-adm": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/node-adm/-/node-adm-0.9.1.tgz", - "integrity": "sha512-npudU9I1l6wUEUcZme6yhe1WTi48nMSM7v2BxqGtE7hO12knzCnRj+IeUmaDdNzNMNiOU8ZYqN6PE6PXX2F/3w==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gcm": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-gcm/-/node-gcm-1.1.4.tgz", - "integrity": "sha512-6Z3Ksmum3xsux/Ejwg2pn+yELvL13nIP5ZbdJDZupnipfP10xyPvJGt5jlB3pCrKkIzcTKL87OI0xsbbz8YkpA==", - "dependencies": { - "axios": "~1.6.8", - "debug": "^3.1.0", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/node-gcm/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-pushnotifications": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-pushnotifications/-/node-pushnotifications-3.1.1.tgz", - "integrity": "sha512-rgA6jvs5DbSZPhUBhbbym3h0iZvncN9s8wpSDpQ0rt8+ICKkCmMDVzzQFjcd1nRL91zdF7zpLKYptCxdsmv6Aw==", - "dependencies": { - "@parse/node-apn": "6.0.1", - "firebase-admin": "12.1.1", - "node-adm": "0.9.1", - "node-gcm": "1.1.4", - "ramda": "0.30.1", - "web-push": "3.6.7", - "wns": "0.5.4" - }, - "engines": { - "node": ">=14.x.x" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true - }, - "node_modules/node-schedule": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", - "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", - "dependencies": { - "cron-parser": "^4.2.0", - "long-timeout": "0.1.1", - "sorted-array-functions": "^1.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemailer-mailgun-transport": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/nodemailer-mailgun-transport/-/nodemailer-mailgun-transport-2.1.5.tgz", - "integrity": "sha512-hF7POkaxFgMvYEd5aHLaQJI2511ld+aQlQi7JH6bGjhjlZ33cIbTB9PimlIrLu5XC3z76Kde6e65OIwL9lOdTA==", - "dependencies": { - "consolidate": "^0.15.1", - "form-data": "^4.0.0", - "mailgun.js": "^8.0.1" - } - }, - "node_modules/nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==", - "dependencies": { - "@sendgrid/mail": "^6.2.1" - } - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" - }, - "node_modules/openid-client": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", - "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", - "dependencies": { - "jose": "^4.15.9", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/openid-client/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/openid-client/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-any": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-any/-/p-any-2.1.0.tgz", - "integrity": "sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg==", - "dependencies": { - "p-cancelable": "^2.0.0", - "p-some": "^4.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-any/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-some": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-some/-/p-some-4.1.0.tgz", - "integrity": "sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g==", - "dependencies": { - "aggregate-error": "^3.0.0", - "p-cancelable": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseley": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", - "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", - "dependencies": { - "leac": "^0.6.0", - "peberminta": "^0.9.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/peberminta": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", - "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/pg-connection-string": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", - "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pino": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", - "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.2.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^3.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.6.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-pretty": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-8.1.0.tgz", - "integrity": "sha512-oKfI8qKXR2a3haHs/X8iB6QSnWLqoOGAjwxIAXem4+XOGIGNw7IKpozId1uE7j89Rj46HIfWnGbAgmQmr8+yRw==", - "dependencies": { - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-copy": "^2.1.1", - "fast-safe-stringify": "^2.1.1", - "help-me": "^4.0.1", - "joycon": "^3.1.1", - "minimist": "^1.2.6", - "on-exit-leak-free": "^1.0.0", - "pino-abstract-transport": "^1.0.0", - "pump": "^3.0.0", - "readable-stream": "^4.0.0", - "secure-json-parse": "^2.4.0", - "sonic-boom": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "pino-pretty": "bin.js" - } - }, - "node_modules/pino-pretty/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/pino-pretty/node_modules/on-exit-leak-free": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-1.0.0.tgz", - "integrity": "sha512-Ve8ubhrXRdnuCJ5bQSQpP3uaV43K1PMcOfSRC1pqHgRZommXCgsXwh08jVC5NpjwScE23BPDwDvVg4cov3mwjw==" - }, - "node_modules/pino-pretty/node_modules/readable-stream": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/posthog-node": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.6.3.tgz", - "integrity": "sha512-JB+ei0LkwE+rKHyW5z79Nd1jUaGxU6TvkfjFqY9vQaHxU5aU8dRl0UUaEmZdZbHwjp3WmXCBQQRNyimwbNQfCw==", - "dependencies": { - "axios": "^1.6.2", - "rusha": "^0.8.14" - }, - "engines": { - "node": ">=15.0.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proto3-json-serializer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "node_modules/ramda": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", - "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readline-sync": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "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.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", - "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/resolve-path/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "peer": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rrule": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.7.2.tgz", - "integrity": "sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rusha": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", - "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" - }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" - }, - "node_modules/selderee": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", - "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", - "dependencies": { - "parseley": "^0.12.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sonic-boom": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", - "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/sorted-array-functions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", - "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/sqs-consumer": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sqs-consumer/-/sqs-consumer-7.5.0.tgz", - "integrity": "sha512-aY3akgMjuK1aj4E7ZVAURUUnC8aNgUBES+b4SN+6ccMmJhi37MamWl7g1JbPow8sjIp1fBPz1bXCCDJmtjOTAg==", - "dependencies": { - "@aws-sdk/client-sqs": "^3.428.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sqs": "^3.428.0" - } - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-generator": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "node_modules/superagent": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", - "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", - "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=6.4.0 <13 || >=14" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/supertest": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", - "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^8.1.2" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thread-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", - "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-jest": { - "version": "28.0.8", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", - "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^28.0.0", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typeof-article": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz", - "integrity": "sha512-Vn42zdX3FhmUrzEmitX3iYyLb+Umwpmv8fkZRIknYh84lmdrwqZA5xYaoKiIj2Rc5i/5wcDrpUmZcbk1U51vTw==", - "dependencies": { - "kind-of": "^3.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/typeof-article/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/web-push": { - "version": "3.6.7", - "resolved": "https://registry.npmjs.org/web-push/-/web-push-3.6.7.tgz", - "integrity": "sha512-OpiIUe8cuGjrj3mMBFWY+e4MMIkW3SVT+7vEIjvD9kejGUypv8GPDf84JdPWskK8zMRIJ6xYGm+Kxr8YkPyA0A==", - "dependencies": { - "asn1.js": "^5.3.0", - "http_ece": "1.2.0", - "https-proxy-agent": "^7.0.0", - "jws": "^4.0.0", - "minimist": "^1.2.5" - }, - "bin": { - "web-push": "src/cli.js" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/web-push/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/web-push/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wns": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/wns/-/wns-0.5.4.tgz", - "integrity": "sha512-WYiJ7khIwUGBD5KAm+YYmwJDDRzFRs4YGAjtbFSoRIdbn9Jcix3p9khJmpvBTXGommaKkvduAn+pc9l4d9yzVQ==", - "engines": { - "node": ">= 0.6.17" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "devOptional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xml-crypto": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-3.2.0.tgz", - "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "xpath": "0.0.32" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml-crypto/node_modules/xpath": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", - "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/xml-encryption": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.0.2.tgz", - "integrity": "sha512-VxYXPvsWB01/aqVLd6ZMPWZ+qaj0aIdF+cStrVJMcFj3iymwZeI0ABzB3VqMYv48DkSpRhnrXqTUkR34j+UDyg==", - "dependencies": { - "@xmldom/xmldom": "^0.8.5", - "escape-html": "^1.0.3", - "xpath": "0.0.32" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/xml-encryption/node_modules/xpath": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", - "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/ylru": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} \ No newline at end of file diff --git a/services/platform/package.json b/services/platform/package.json deleted file mode 100644 index 937a6f2e..00000000 --- a/services/platform/package.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "name": "@lunogram/platform", - "version": "0.1.0", - "repository": "https://github.com/lunogram/platform", - "main": "build/index.js", - "types": "build/index.d.ts", - "dependencies": { - "@aws-sdk/client-s3": "^3.908.0", - "@aws-sdk/client-ses": "^3.908.0", - "@aws-sdk/client-sqs": "^3.908.0", - "@aws-sdk/lib-storage": "^3.908.0", - "@bugsnag/js": "^8.6.0", - "@bugsnag/plugin-koa": "^8.6.0", - "@clerk/backend": "^2.17.2", - "@koa/cors": "^5.0.0", - "@koa/router": "^11.0.2", - "@ladjs/country-language": "^1.0.3", - "@node-saml/node-saml": "^4.0.5", - "@segment/analytics-node": "^1.3.0", - "@sentry/node": "^7.120.4", - "@sentry/utils": "^7.120.4", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^2.1.1", - "bullmq": "^5.61.0", - "busboy": "^1.6.0", - "cookies": "^0.9.1", - "csv-parse": "^5.6.0", - "date-fns": "^2.30.0", - "date-fns-tz": "^1.3.8", - "dotenv": "^16.6.1", - "eslint-plugin-import": "^2.32.0", - "eventemitter2": "^6.4.9", - "handlebars": "^4.7.8", - "handlebars-utils": "^1.0.6", - "html-to-text": "^9.0.5", - "ioredis": "^5.8.1", - "jsonpath": "^1.1.1", - "jsonwebtoken": "^9.0.2", - "jwks-rsa": "^3.2.0", - "knex": "^2.5.1", - "koa": "^2.16.2", - "koa-body": "5.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "libphonenumber-js": "^1.12.24", - "node-pushnotifications": "^3.1.1", - "node-schedule": "^2.1.1", - "nodemailer": "^6.10.1", - "nodemailer-mailgun-transport": "^2.1.5", - "nodemailer-sendgrid": "^1.0.3", - "openid-client": "^5.7.1", - "pg": "^8.16.3", - "pg-query-stream": "^4.10.3", - "pino": "^8.21.0", - "pino-pretty": "^8.1.0", - "posthog-node": "^3.6.3", - "raw-body": "^3.0.1", - "rrule": "2.7.2", - "svix": "^1.77.0", - "uuid": "^9.0.1" - }, - "scripts": { - "start": "nodemon", - "build": "tsc --build", - "lint": "eslint --ext .ts --max-warnings 0 src/", - "test": "jest --forceExit --runInBand --testTimeout 10000", - "docker:build": "docker buildx build -f ./Dockerfile -t ghcr.io/lunogram/api:latest -t ghcr.io/lunogram/api:$TAG ../../", - "docker:build:push": "pnpm docker:build --push", - "migration:create": "node ./scripts/create-migration.mjs", - "migration:output": "node ./scripts/output-migration.mjs" - }, - "devDependencies": { - "@types/busboy": "^1.5.4", - "@types/html-to-text": "^9.0.4", - "@types/jest": "^28.1.8", - "@types/jsonpath": "^0.2.4", - "@types/jsonwebtoken": "^9.0.10", - "@types/koa": "^2.15.0", - "@types/koa-send": "^4.1.6", - "@types/koa-static": "^4.0.4", - "@types/koa__cors": "^3.3.1", - "@types/koa__router": "^8.0.11", - "@types/node": "^24.7.1", - "@types/node-pushnotifications": "^1.0.8", - "@types/node-schedule": "^2.1.8", - "@types/nodemailer": "^6.4.20", - "@types/nodemailer-mailgun-transport": "^1.4.6", - "@types/nodemailer-sendgrid": "^1.0.3", - "@types/supertest": "^2.0.16", - "@types/uuid": "^9.0.8", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.57.1", - "eslint-config-standard": "^17.1.0", - "ioredis-mock": "^8.13.0", - "jest": "^28.1.3", - "nodemon": "^2.0.22", - "supertest": "^6.3.4", - "ts-jest": "^28.0.8", - "ts-node": "^10.9.2", - "typescript": "^4.9.5" - } -} \ No newline at end of file diff --git a/services/platform/pnpm-lock.yaml b/services/platform/pnpm-lock.yaml deleted file mode 100644 index 6a4294e0..00000000 --- a/services/platform/pnpm-lock.yaml +++ /dev/null @@ -1,10654 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@aws-sdk/client-s3': - specifier: ^3.908.0 - version: 3.913.0 - '@aws-sdk/client-ses': - specifier: ^3.908.0 - version: 3.913.0 - '@aws-sdk/client-sqs': - specifier: ^3.908.0 - version: 3.913.0 - '@aws-sdk/lib-storage': - specifier: ^3.908.0 - version: 3.913.0(@aws-sdk/client-s3@3.913.0) - '@bugsnag/js': - specifier: ^8.6.0 - version: 8.6.0 - '@bugsnag/plugin-koa': - specifier: ^8.6.0 - version: 8.6.0(@bugsnag/core@8.6.0) - '@clerk/backend': - specifier: ^2.17.2 - version: 2.18.3 - '@koa/cors': - specifier: ^5.0.0 - version: 5.0.0 - '@koa/router': - specifier: ^11.0.2 - version: 11.0.2 - '@ladjs/country-language': - specifier: ^1.0.3 - version: 1.0.3 - '@node-saml/node-saml': - specifier: ^4.0.5 - version: 4.0.5 - '@segment/analytics-node': - specifier: ^1.3.0 - version: 1.3.0 - '@sentry/node': - specifier: ^7.120.4 - version: 7.120.4 - '@sentry/utils': - specifier: ^7.120.4 - version: 7.120.4 - ajv: - specifier: ^8.17.1 - version: 8.17.1 - ajv-errors: - specifier: ^3.0.0 - version: 3.0.0(ajv@8.17.1) - ajv-formats: - specifier: ^2.1.1 - version: 2.1.1(ajv@8.17.1) - bullmq: - specifier: ^5.61.0 - version: 5.61.0 - busboy: - specifier: ^1.6.0 - version: 1.6.0 - cookies: - specifier: ^0.9.1 - version: 0.9.1 - csv-parse: - specifier: ^5.6.0 - version: 5.6.0 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - date-fns-tz: - specifier: ^1.3.8 - version: 1.3.8(date-fns@2.30.0) - dotenv: - specifier: ^16.6.1 - version: 16.6.1 - eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eventemitter2: - specifier: ^6.4.9 - version: 6.4.9 - handlebars: - specifier: ^4.7.8 - version: 4.7.8 - handlebars-utils: - specifier: ^1.0.6 - version: 1.0.6 - html-to-text: - specifier: ^9.0.5 - version: 9.0.5 - ioredis: - specifier: ^5.8.1 - version: 5.8.1 - jsonpath: - specifier: ^1.1.1 - version: 1.1.1 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - jwks-rsa: - specifier: ^3.2.0 - version: 3.2.0 - knex: - specifier: ^2.5.1 - version: 2.5.1(pg@8.16.3) - koa: - specifier: ^2.16.2 - version: 2.16.3 - koa-body: - specifier: 5.0.0 - version: 5.0.0 - koa-send: - specifier: ^5.0.1 - version: 5.0.1 - koa-static: - specifier: ^5.0.0 - version: 5.0.0 - libphonenumber-js: - specifier: ^1.12.24 - version: 1.12.24 - node-pushnotifications: - specifier: ^3.1.1 - version: 3.1.1 - node-schedule: - specifier: ^2.1.1 - version: 2.1.1 - nodemailer: - specifier: ^6.10.1 - version: 6.10.1 - nodemailer-mailgun-transport: - specifier: ^2.1.5 - version: 2.1.5(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.12.1) - nodemailer-sendgrid: - specifier: ^1.0.3 - version: 1.0.3 - openid-client: - specifier: ^5.7.1 - version: 5.7.1 - pg: - specifier: ^8.16.3 - version: 8.16.3 - pg-query-stream: - specifier: ^4.10.3 - version: 4.10.3(pg@8.16.3) - pino: - specifier: ^8.21.0 - version: 8.21.0 - pino-pretty: - specifier: ^8.1.0 - version: 8.1.0 - posthog-node: - specifier: ^3.6.3 - version: 3.6.3 - raw-body: - specifier: ^3.0.1 - version: 3.0.1 - rrule: - specifier: 2.7.2 - version: 2.7.2 - svix: - specifier: ^1.77.0 - version: 1.77.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - devDependencies: - '@types/busboy': - specifier: ^1.5.4 - version: 1.5.4 - '@types/html-to-text': - specifier: ^9.0.4 - version: 9.0.4 - '@types/jest': - specifier: ^28.1.8 - version: 28.1.8 - '@types/jsonpath': - specifier: ^0.2.4 - version: 0.2.4 - '@types/jsonwebtoken': - specifier: ^9.0.10 - version: 9.0.10 - '@types/koa': - specifier: ^2.15.0 - version: 2.15.0 - '@types/koa-send': - specifier: ^4.1.6 - version: 4.1.6 - '@types/koa-static': - specifier: ^4.0.4 - version: 4.0.4 - '@types/koa__cors': - specifier: ^3.3.1 - version: 3.3.1 - '@types/koa__router': - specifier: ^8.0.11 - version: 8.0.11 - '@types/node': - specifier: ^24.7.1 - version: 24.9.0 - '@types/node-pushnotifications': - specifier: ^1.0.8 - version: 1.0.8 - '@types/node-schedule': - specifier: ^2.1.8 - version: 2.1.8 - '@types/nodemailer': - specifier: ^6.4.20 - version: 6.4.20 - '@types/nodemailer-mailgun-transport': - specifier: ^1.4.6 - version: 1.4.6 - '@types/nodemailer-sendgrid': - specifier: ^1.0.3 - version: 1.0.3 - '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 - '@types/uuid': - specifier: ^9.0.8 - version: 9.0.8 - '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-config-standard: - specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) - ioredis-mock: - specifier: ^8.13.0 - version: 8.13.0(@types/ioredis-mock@8.2.6(ioredis@5.8.1))(ioredis@5.8.1) - jest: - specifier: ^28.1.3 - version: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - supertest: - specifier: ^6.3.4 - version: 6.3.4 - ts-jest: - specifier: ^28.0.8 - version: 28.0.8(@babel/core@7.28.4)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.28.4))(jest@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)))(typescript@4.9.5) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@24.9.0)(typescript@4.9.5) - typescript: - specifier: ^4.9.5 - version: 4.9.5 - -packages: - - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/crc32c@5.2.0': - resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} - - '@aws-crypto/sha1-browser@5.2.0': - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-s3@3.913.0': - resolution: {integrity: sha512-YdWHIXn+TltH1MbMkBrFl8Ocxj/PJXleacQ1U5AZRAt8EqxctYkeTNB/+XYS5x6ieYQ4uWnF7sF74sJx+KTpwg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-ses@3.913.0': - resolution: {integrity: sha512-jUF1mN+webeAgkNXS/tl6KpJyUbsAWxQGsQgsWoHwaNCSnxMDBEyPmgBnzbqf2CrybIa7zmzaqCO0z6FgKeZRg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-sqs@3.913.0': - resolution: {integrity: sha512-ioN6O4guJPRph6TRqqMxvi29kFjKXqYKuu4Zt9Oi3JNMBmP5Uq7xxzdj72k5Dvx0B9iYtZ1hgjzqWhPL5xpTEg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-sso@3.911.0': - resolution: {integrity: sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/core@3.911.0': - resolution: {integrity: sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-env@3.911.0': - resolution: {integrity: sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-http@3.911.0': - resolution: {integrity: sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-ini@3.913.0': - resolution: {integrity: sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-node@3.913.0': - resolution: {integrity: sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-process@3.911.0': - resolution: {integrity: sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-sso@3.911.0': - resolution: {integrity: sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.911.0': - resolution: {integrity: sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/lib-storage@3.913.0': - resolution: {integrity: sha512-IOlCRCvq+DmN9d3o9LLBiGt9CFQDp11joKgZ4CziUQ59qkHonkaf0GOt6Oo4zITGBegJ0FvKsWj+sDgYoQ1U9g==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@aws-sdk/client-s3': ^3.913.0 - - '@aws-sdk/middleware-bucket-endpoint@3.910.0': - resolution: {integrity: sha512-8ZfA0WARwvAKQQ7vmoQTg6xFEewFqsQCltQIHd7NtNs3CLF1aU06Ixp0i7Mp68k6dUj9WJJO7mz3I5VFOecqHQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-expect-continue@3.910.0': - resolution: {integrity: sha512-jtnsBlxuRyRbK52WdNSry28Tn4ljIqUfUEzDFYWDTEymEGPpVguQKPudW/6M5BWEDmNsv3ai/X+fXd0GZ1fE/Q==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.911.0': - resolution: {integrity: sha512-ZeS5zPKRCBMqpO8e0S/isfDWBt8AtG604PopKFFqEowbbV8cf6ms3hddNZRajTHvaoWBlU7Fbcn0827RWJnBdw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-host-header@3.910.0': - resolution: {integrity: sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-location-constraint@3.913.0': - resolution: {integrity: sha512-iudUrAYV4ZyweYL0hW/VaJzJRjFVruHpK0NukwECs0FZ76Zn17/smbkFIeiaRdGi9cqQdRk9PfhKPvbufnnhPg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-logger@3.910.0': - resolution: {integrity: sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.910.0': - resolution: {integrity: sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.911.0': - resolution: {integrity: sha512-P0mIIW/QkAGNvFu15Jqa5NSmHeQvZkkQY8nbQpCT3tGObZe4wRsq5u1mOS+CJp4DIBbRZuHeX7ohbX5kPMi4dg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-sdk-sqs@3.910.0': - resolution: {integrity: sha512-v0R/63/rVmy3rU7sYGAl4wKBRnipUuV/FHR2JnTJiCeBlMPKAjjG4ejXAAskjvnrozP8vQkUwe9A4Y/kGFAJrQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-ssec@3.910.0': - resolution: {integrity: sha512-Ikb0WrIiOeaZo9UmeoVrO4GH2OHiMTKSbr5raTW8nTCArED8iTVZiBF6As+JicZMLSNiBiYSb7EjDihWQ0DrTQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-user-agent@3.911.0': - resolution: {integrity: sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/nested-clients@3.911.0': - resolution: {integrity: sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/region-config-resolver@3.910.0': - resolution: {integrity: sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.911.0': - resolution: {integrity: sha512-SJ4dUcY9+HPDIMCHiskT8F7JrRVZF2Y1NUN0Yiy6VUHSULgq2MDlIzSQpNICnmXhk1F1E1B2jJG9XtPYrvtqUg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/token-providers@3.911.0': - resolution: {integrity: sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/types@3.910.0': - resolution: {integrity: sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-arn-parser@3.893.0': - resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-endpoints@3.910.0': - resolution: {integrity: sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-locate-window@3.893.0': - resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-user-agent-browser@3.910.0': - resolution: {integrity: sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg==} - - '@aws-sdk/util-user-agent-node@3.911.0': - resolution: {integrity: sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA==} - engines: {node: '>=18.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.911.0': - resolution: {integrity: sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg==} - engines: {node: '>=18.0.0'} - - '@aws/lambda-invoke-store@0.0.1': - resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} - engines: {node: '>=18.0.0'} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.4': - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@bugsnag/browser@8.6.0': - resolution: {integrity: sha512-7UGqTGnQqXUQ09gOlWbDTFUSbeLIIrP+hML3kTOq8Zdc8nP/iuOEflXGLV2TxWBWW8xIUPc928caFPr9EcaDuw==} - - '@bugsnag/core@8.6.0': - resolution: {integrity: sha512-94Jo443JegaiKV8z8NXMFdyTGubiUnwppWhq3kG2ldlYKtEvrmIaO5+JA58B6oveySvoRu3cCe2W9ysY7G7mDw==} - - '@bugsnag/cuid@3.2.1': - resolution: {integrity: sha512-zpvN8xQ5rdRWakMd/BcVkdn2F8HKlDSbM3l7duueK590WmI1T0ObTLc1V/1e55r14WNjPd5AJTYX4yPEAFVi+Q==} - - '@bugsnag/js@8.6.0': - resolution: {integrity: sha512-U+ofNTTMA2Z6tCrOhK/QhHBhLoQHoalk8Y82WWc7FAcVSoJZYadND/QuXUriNRZpC4YgJ/s/AxPeQ2y+WvMxzw==} - - '@bugsnag/node@8.6.0': - resolution: {integrity: sha512-O91sELo6zBjflVeP3roRC9l68iYaafVs5lz2N0FDkrT08mP2UljtNWpjjoR/0h1so5Ny1OxHgnZ1IrsXhz5SMQ==} - - '@bugsnag/plugin-koa@8.6.0': - resolution: {integrity: sha512-4LBgQKFlgJsPuvGMK+b8BmB+9RiaLAzXB/pgAcrTx007Np8fIFrOXCfAcDpx+rqxYGW1F/g9bUKy8V4gFQLxxw==} - peerDependencies: - '@bugsnag/core': ^8.0.0 - - '@bugsnag/safe-json-stringify@6.1.0': - resolution: {integrity: sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A==} - - '@clerk/backend@2.18.3': - resolution: {integrity: sha512-fWMq/Tb2hgfUXLKJN8jr6pbpA5XLUwC4BjWz7lB5Y+YhXhBrO7GtfpZIS91L/aDhNb17X6IaE6XvS6tDJBCUUw==} - engines: {node: '>=18.17.0'} - - '@clerk/shared@3.28.2': - resolution: {integrity: sha512-BfBCPaoPoLCiU0b0MhQUfCjs+bWRRLkdHw0vBffSjtsFLxp1b5IL5D8nKgDPIKIIv7DmCCmO15tr+GqG3CGpYQ==} - engines: {node: '>=18.17.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@clerk/types@4.95.0': - resolution: {integrity: sha512-K1kI3BjvufG1mZBZJ5Q8Yu9wV6AFpjjITml5vhvP95xibJWOi3eYvlRCTKXDNKBFGvQfrTJbwn67jSG2VdyLKw==} - engines: {node: '>=18.17.0'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@firebase/app-check-interop-types@0.3.2': - resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} - - '@firebase/app-types@0.9.2': - resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} - - '@firebase/app-types@0.9.3': - resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} - - '@firebase/auth-interop-types@0.2.3': - resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} - - '@firebase/component@0.6.10': - resolution: {integrity: sha512-OsNbEKyz9iLZSmMUhsl6+kCADzte00iisJIRUspnUqvDCX+RSGZOBIqekukv/jN177ovjApBQNFaxSYIDc/SyQ==} - engines: {node: '>=18.0.0'} - - '@firebase/database-compat@1.0.10': - resolution: {integrity: sha512-x3baGMzEKG5BE5orwFRg+Zpaa33N9lZkcOFXoZSeN9Muw/Mx37stePZpa1YMpcAPqX3aDx1cSv55Nxh4ObgpUQ==} - - '@firebase/database-types@1.0.16': - resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==} - - '@firebase/database-types@1.0.6': - resolution: {integrity: sha512-sMI7IynSZBsyGbUugc8PKE1jwKbnvaieAz/RxuM57PZQNCi6Rteiviwcw/jqZOX6igqYJwXWZ3UzKOZo2nUDRA==} - - '@firebase/database@1.0.9': - resolution: {integrity: sha512-EkiPSKSu2TJJGtOjyISASf3UFpFJDil1lMbfqnxilfbmIsilvC8DzgjuLoYD+eOitcug4wtU9Fh1tt2vgBhskA==} - engines: {node: '>=18.0.0'} - - '@firebase/logger@0.4.3': - resolution: {integrity: sha512-Th42bWJg18EF5bJwhRosn2M/eYxmbWCwXZr4hHX7ltO0SE3QLrpgiMKeRBR/NW7vJke7i0n3i8esbCW2s93qBw==} - engines: {node: '>=18.0.0'} - - '@firebase/util@1.10.1': - resolution: {integrity: sha512-AIhFnCCjM8FmCqSNlNPTuOk3+gpHC1RkeNUBLtPbcqGYpN5MxI5q7Yby+rxycweOZOCboDzfIj8WyaY4tpQG/g==} - engines: {node: '>=18.0.0'} - - '@firebase/util@1.13.0': - resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==} - engines: {node: '>=20.0.0'} - - '@google-cloud/firestore@7.11.6': - resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==} - engines: {node: '>=14.0.0'} - - '@google-cloud/paginator@5.0.2': - resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} - engines: {node: '>=14.0.0'} - - '@google-cloud/projectify@4.0.0': - resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} - engines: {node: '>=14.0.0'} - - '@google-cloud/promisify@4.0.0': - resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} - engines: {node: '>=14'} - - '@google-cloud/storage@7.17.2': - resolution: {integrity: sha512-6xN0KNO8L/LIA5zu3CJwHkJiB6n65eykBLOb0E+RooiHYgX8CSao6lvQiKT9TBk2gL5g33LL3fmhDodZnt56rw==} - engines: {node: '>=14'} - - '@grpc/grpc-js@1.14.0': - resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} - engines: {node: '>=6'} - hasBin: true - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@ioredis/as-callback@3.0.0': - resolution: {integrity: sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg==} - - '@ioredis/commands@1.4.0': - resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@28.1.3': - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/core@28.1.3': - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@28.1.3': - resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/expect-utils@28.1.3': - resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/expect@28.1.3': - resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/fake-timers@28.1.3': - resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/globals@28.1.3': - resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/reporters@28.1.3': - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@28.1.3': - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/source-map@28.1.2': - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/test-result@28.1.3': - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/test-sequencer@28.1.3': - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/transform@28.1.3': - resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jest/types@28.1.3': - resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - - '@koa/cors@5.0.0': - resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} - engines: {node: '>= 14.0.0'} - - '@koa/router@11.0.2': - resolution: {integrity: sha512-VmlGwc5n0d+0vbudFXWsAHcfLn8cJ34gS4ktf8bxmN1yzmWBGts1IbaAjvNr6LBAXf+/U51qxLNv8oalh/UYKQ==} - engines: {node: '>= 12'} - - '@ladjs/country-language@1.0.3': - resolution: {integrity: sha512-FJROu9/hh4eqVAGDyfL8vpv6Vb0qKHX1ozYLRZ+beUzD5xFf+3r0J+SVIWKviEa7W524Qvqou+ta1WrsRgzxGw==} - engines: {node: '>= 14'} - - '@lukeed/csprng@1.1.0': - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} - - '@lukeed/uuid@2.0.1': - resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} - engines: {node: '>=8'} - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@node-saml/node-saml@4.0.5': - resolution: {integrity: sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw==} - engines: {node: '>= 14'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@paralleldrive/cuid2@2.2.2': - resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - - '@parse/node-apn@6.0.1': - resolution: {integrity: sha512-QQxqEN/zbtEkSgj41oX/tQUavML+G+JHeQi2YVlgZlponnwIxA3fb5tEbXPm+fdR6rL1pi2/z2PcOwINOyx2eA==} - engines: {node: '>= 14'} - - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@segment/analytics-core@1.4.1': - resolution: {integrity: sha512-kV0Pf33HnthuBOVdYNani21kYyj118Fn+9757bxqoksiXoZlYvBsFq6giNdCsKcTIE1eAMqNDq3xE1VQ0cfsHA==} - - '@segment/analytics-generic-utils@1.1.1': - resolution: {integrity: sha512-THTIzBPHnvu1HYJU3fARdJ3qIkukO3zDXsmDm+kAeUks5R9CBXOQ6rPChiASVzSmwAIIo5uFIXXnCraojlq/Gw==} - - '@segment/analytics-node@1.3.0': - resolution: {integrity: sha512-lRLz1WZaDokMoUe299yP5JkInc3OgJuqNNlxb6j0q22umCiq6b5iDo2gRmFn93reirIvJxWIicQsGrHd93q8GQ==} - engines: {node: '>=14'} - - '@selderee/plugin-htmlparser2@0.11.0': - resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - - '@sendgrid/client@6.5.5': - resolution: {integrity: sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==} - engines: {node: '>=6.0.0'} - - '@sendgrid/helpers@6.5.5': - resolution: {integrity: sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==} - engines: {node: '>= 6.0.0'} - - '@sendgrid/mail@6.5.5': - resolution: {integrity: sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==} - engines: {node: '>=6.0.0'} - - '@sentry-internal/tracing@7.120.4': - resolution: {integrity: sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw==} - engines: {node: '>=8'} - - '@sentry/core@7.120.4': - resolution: {integrity: sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA==} - engines: {node: '>=8'} - - '@sentry/integrations@7.120.4': - resolution: {integrity: sha512-kkBTLk053XlhDCg7OkBQTIMF4puqFibeRO3E3YiVc4PGLnocXMaVpOSCkMqAc1k1kZ09UgGi8DxfQhnFEjUkpA==} - engines: {node: '>=8'} - - '@sentry/node@7.120.4': - resolution: {integrity: sha512-qq3wZAXXj2SRWhqErnGCSJKUhPSlZ+RGnCZjhfjHpP49KNpcd9YdPTIUsFMgeyjdh6Ew6aVCv23g1hTP0CHpYw==} - engines: {node: '>=8'} - - '@sentry/types@7.120.4': - resolution: {integrity: sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==} - engines: {node: '>=8'} - - '@sentry/utils@7.120.4': - resolution: {integrity: sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==} - engines: {node: '>=8'} - - '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - - '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - - '@sinonjs/fake-timers@9.1.2': - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - - '@smithy/abort-controller@4.2.3': - resolution: {integrity: sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==} - engines: {node: '>=18.0.0'} - - '@smithy/chunked-blob-reader-native@4.2.1': - resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} - engines: {node: '>=18.0.0'} - - '@smithy/chunked-blob-reader@5.2.0': - resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} - engines: {node: '>=18.0.0'} - - '@smithy/config-resolver@4.3.3': - resolution: {integrity: sha512-xSql8A1Bl41O9JvGU/CtgiLBlwkvpHTSKRlvz9zOBvBCPjXghZ6ZkcVzmV2f7FLAA+80+aqKmIOmy8pEDrtCaw==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.17.0': - resolution: {integrity: sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.2.3': - resolution: {integrity: sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-codec@4.2.3': - resolution: {integrity: sha512-rcr0VH0uNoMrtgKuY7sMfyKqbHc4GQaQ6Yp4vwgm+Z6psPuOgL+i/Eo/QWdXRmMinL3EgFM0Z1vkfyPyfzLmjw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.2.3': - resolution: {integrity: sha512-EcS0kydOr2qJ3vV45y7nWnTlrPmVIMbUFOZbMG80+e2+xePQISX9DrcbRpVRFTS5Nqz3FiEbDcTCAV0or7bqdw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.3.3': - resolution: {integrity: sha512-GewKGZ6lIJ9APjHFqR2cUW+Efp98xLu1KmN0jOWxQ1TN/gx3HTUPVbLciFD8CfScBj2IiKifqh9vYFRRXrYqXA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.2.3': - resolution: {integrity: sha512-uQobOTQq2FapuSOlmGLUeGTpvcBLE5Fc7XjERUSk4dxEi4AhTwuyHYZNAvL4EMUp7lzxxkKDFaJ1GY0ovrj0Kg==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-universal@4.2.3': - resolution: {integrity: sha512-QIvH/CKOk1BZPz/iwfgbh1SQD5Y0lpaw2kLA8zpLRRtYMPXeYUEWh+moTaJyqDaKlbrB174kB7FSRFiZ735tWw==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.3.4': - resolution: {integrity: sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-blob-browser@4.2.4': - resolution: {integrity: sha512-W7eIxD+rTNsLB/2ynjmbdeP7TgxRXprfvqQxKFEfy9HW2HeD7t+g+KCIrY0pIn/GFjA6/fIpH+JQnfg5TTk76Q==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-node@4.2.3': - resolution: {integrity: sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-stream-node@4.2.3': - resolution: {integrity: sha512-EXMSa2yiStVII3x/+BIynyOAZlS7dGvI7RFrzXa/XssBgck/7TXJIvnjnCu328GY/VwHDC4VeDyP1S4rqwpYag==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.3': - resolution: {integrity: sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==} - engines: {node: '>=18.0.0'} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} - engines: {node: '>=18.0.0'} - - '@smithy/md5-js@4.2.3': - resolution: {integrity: sha512-5+4bUEJQi/NRgzdA5SVXvAwyvEnD0ZAiKzV3yLO6dN5BG8ScKBweZ8mxXXUtdxq+Dx5k6EshKk0XJ7vgvIPSnA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.2.3': - resolution: {integrity: sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.3.4': - resolution: {integrity: sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.4.4': - resolution: {integrity: sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.2.3': - resolution: {integrity: sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.2.3': - resolution: {integrity: sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.3.3': - resolution: {integrity: sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-http-handler@4.4.2': - resolution: {integrity: sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ==} - engines: {node: '>=18.0.0'} - - '@smithy/property-provider@4.2.3': - resolution: {integrity: sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==} - engines: {node: '>=18.0.0'} - - '@smithy/protocol-http@5.3.3': - resolution: {integrity: sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-builder@4.2.3': - resolution: {integrity: sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-parser@4.2.3': - resolution: {integrity: sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==} - engines: {node: '>=18.0.0'} - - '@smithy/service-error-classification@4.2.3': - resolution: {integrity: sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.3.3': - resolution: {integrity: sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.3.3': - resolution: {integrity: sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==} - engines: {node: '>=18.0.0'} - - '@smithy/smithy-client@4.9.0': - resolution: {integrity: sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.8.0': - resolution: {integrity: sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==} - engines: {node: '>=18.0.0'} - - '@smithy/url-parser@4.2.3': - resolution: {integrity: sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-base64@4.3.0': - resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-browser@4.2.0': - resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.2.1': - resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} - engines: {node: '>=18.0.0'} - - '@smithy/util-config-provider@4.2.0': - resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-browser@4.3.3': - resolution: {integrity: sha512-vqHoybAuZXbFXZqgzquiUXtdY+UT/aU33sxa4GBPkiYklmR20LlCn+d3Wc3yA5ZM13gQ92SZe/D8xh6hkjx+IQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.2.4': - resolution: {integrity: sha512-X5/xrPHedifo7hJUUWKlpxVb2oDOiqPUXlvsZv1EZSjILoutLiJyWva3coBpn00e/gPSpH8Rn2eIbgdwHQdW7Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.2.3': - resolution: {integrity: sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.2.3': - resolution: {integrity: sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.2.3': - resolution: {integrity: sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.5.3': - resolution: {integrity: sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A==} - engines: {node: '>=18.0.0'} - - '@smithy/util-uri-escape@4.2.0': - resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-waiter@4.2.3': - resolution: {integrity: sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ==} - engines: {node: '>=18.0.0'} - - '@smithy/uuid@1.1.0': - resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} - engines: {node: '>=18.0.0'} - - '@stablelib/base64@1.0.1': - resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@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==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/accepts@1.3.7': - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/busboy@1.5.4': - resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} - - '@types/caseless@0.12.5': - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/content-disposition@0.5.9': - resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} - - '@types/cookiejar@2.1.5': - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - - '@types/cookies@0.9.1': - resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/express-serve-static-core@4.19.7': - resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - - '@types/express-serve-static-core@5.1.0': - resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} - - '@types/express@4.17.23': - resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - - '@types/express@5.0.3': - resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} - - '@types/formidable@2.0.6': - resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} - - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@types/html-to-text@9.0.4': - resolution: {integrity: sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==} - - '@types/http-assert@1.5.6': - resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} - - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/ioredis-mock@8.2.6': - resolution: {integrity: sha512-5heqtZMvQ4nXARY0o8rc8cjkJjct2ScM12yCJ/h731S9He93a2cv+kAhwPCNwTKDfNH9gjRfLG4VpAEYJU0/gQ==} - peerDependencies: - ioredis: '>=5' - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@28.1.8': - resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/jsonpath@0.2.4': - resolution: {integrity: sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==} - - '@types/jsonwebtoken@9.0.10': - resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - - '@types/keygrip@1.0.6': - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - - '@types/koa-compose@3.2.8': - resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} - - '@types/koa-send@4.1.6': - resolution: {integrity: sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==} - - '@types/koa-static@4.0.4': - resolution: {integrity: sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A==} - - '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} - - '@types/koa__cors@3.3.1': - resolution: {integrity: sha512-aFGYhTFW7651KhmZZ05VG0QZJre7QxBxDj2LF1lf6GA/wSXEfKVAJxiQQWzRV4ZoMzQIO8vJBXKsUcRuvYK9qw==} - - '@types/koa__router@8.0.11': - resolution: {integrity: sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==} - - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - - '@types/methods@1.1.4': - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node-pushnotifications@1.0.8': - resolution: {integrity: sha512-nIYuR0zgluQfoKW3gI0HRaWi+NU4/M16KUpovjcu06WL/hc34DHiVv1OGfFkP+z7yL46TXpa0y0tiFlXW8ivVQ==} - - '@types/node-schedule@2.1.8': - resolution: {integrity: sha512-k00g6Yj/oUg/CDC+MeLHUzu0+OFxWbIqrFfDiLi6OPKxTujvpv29mHGM8GtKr7B+9Vv92FcK/8mRqi1DK5f3hA==} - - '@types/node@20.19.22': - resolution: {integrity: sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==} - - '@types/node@24.9.0': - resolution: {integrity: sha512-MKNwXh3seSK8WurXF7erHPJ2AONmMwkI7zAMrXZDPIru8jRqkk6rGDBVbw4mLwfqA+ZZliiDPg05JQ3uW66tKQ==} - - '@types/nodemailer-mailgun-transport@1.4.6': - resolution: {integrity: sha512-6qhtDo+1ZLtrmmpQN7O9e3NLK5ggnTS2Oca+22SvmhwChNKxDZErecTlF6qTOLnNW/CCcHmDaSmG2MXUeP1w9g==} - - '@types/nodemailer-sendgrid@1.0.3': - resolution: {integrity: sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==} - - '@types/nodemailer@6.4.20': - resolution: {integrity: sha512-uj83z0GqwqMUE6RI4EKptPlav0FYE6vpIlqJAnxzu+/sSezRdbH69rSBCMsdW6DdsCAzoFQZ52c2UIlhRVQYDA==} - - '@types/passport@1.0.17': - resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} - - '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/request@2.48.13': - resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} - - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - - '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - - '@types/send@1.2.0': - resolution: {integrity: sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==} - - '@types/serve-static@1.15.9': - resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==} - - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/superagent@8.1.9': - resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - - '@types/supertest@2.0.16': - resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} - - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - - '@types/web-push@3.6.4': - resolution: {integrity: sha512-GnJmSr40H3RAnj0s34FNTcJi1hmWFV5KXugE0mYWnYhgTAHLJ/dJKAwDmvPJYMke0RplY2XE9LnM4hqSqKIjhQ==} - - '@types/xml-crypto@1.4.6': - resolution: {integrity: sha512-A6jEW2FxLZo1CXsRWnZHUX2wzR3uDju2Bozt6rDbSmU/W8gkilaVbwFEVN0/NhnUdMVzwYobWtM6bU1QJJFb7Q==} - - '@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==} - - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} - engines: {node: '>=10.0.0'} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - ajv-errors@3.0.0: - resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} - peerDependencies: - ajv: ^8.0.1 - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - - babel-jest@28.1.3: - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} - peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 - - babel-preset-jest@28.1.3: - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - baseline-browser-mapping@2.8.18: - resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} - hasBin: true - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - 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.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - - bowser@2.12.1: - resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.26.3: - resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.6.0: - resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - - bullmq@5.61.0: - resolution: {integrity: sha512-khaTjc1JnzaYFl4FrUtsSsqugAW/urRrcZ9Q0ZE+REAw8W+gkHFqxbGlutOu6q7j7n91wibVaaNlOUMdiEvoSQ==} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001751: - resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - - co-body@5.2.0: - resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - collect-v8-coverage@1.0.3: - resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - consolidate@0.15.1: - resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} - engines: {node: '>= 0.10.0'} - deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog - peerDependencies: - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - babel-core: ^6.26.3 - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jade: ^1.11.0 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - marko: ^3.14.4 - mote: ^0.2.0 - mustache: ^3.0.0 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - razor-tmpl: ^1.3.1 - react: ^16.13.1 - react-dom: ^16.13.1 - slm: ^2.0.0 - squirrelly: ^5.1.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-jade: '*' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - arc-templates: - optional: true - atpl: - optional: true - babel-core: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jade: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - marko: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - razor-tmpl: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - squirrelly: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-jade: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} - engines: {node: '>=18'} - - cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - - cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} - - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - csv-parse@5.6.0: - resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} - - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - date-fns-tz@1.3.8: - resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} - peerDependencies: - date-fns: '>=2.0.0' - - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - - deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - - diff-sequences@28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - - dset@3.1.4: - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} - engines: {node: '>=4'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.237: - resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} - - emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - - error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true - - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-standard@17.1.0: - resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: '^15.0.0 || ^16.0.0 ' - eslint-plugin-promise: ^6.0.0 - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-n@16.6.2: - resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-promise@6.6.0: - resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - 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} - - esprima@1.2.2: - resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} - engines: {node: '>=0.4.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - expect@28.1.3: - resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - extsprintf@1.4.1: - resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} - engines: {'0': node >=0.6.0} - - farmhash@3.3.1: - resolution: {integrity: sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==} - engines: {node: '>=10'} - - fast-copy@2.1.7: - resolution: {integrity: sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-sha256@1.3.0: - resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - - fast-xml-parser@4.5.3: - resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} - hasBin: true - - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} - hasBin: true - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - - fengari-interop@0.1.3: - resolution: {integrity: sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==} - peerDependencies: - fengari: ^0.1.0 - - fengari@0.1.4: - resolution: {integrity: sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - firebase-admin@12.1.1: - resolution: {integrity: sha512-Nuoxk//gaYrspS7TvwBINdGvFhh2QeiaWpRW6+PJ+tWyn2/CugBc7jKa1NaBg0AvhGSOXFOCIsXhzCzHA47Rew==} - engines: {node: '>=14'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - - form-data@2.5.5: - resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} - engines: {node: '>= 0.12'} - - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - - formidable@2.1.5: - resolution: {integrity: sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} - - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.12.0: - resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} - - getopts@2.3.0: - resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - 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 - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - google-auth-library@9.15.1: - resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} - engines: {node: '>=14'} - - google-gax@4.6.1: - resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==} - engines: {node: '>=14'} - - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} - engines: {node: '>=14'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} - - handlebars-utils@1.0.6: - resolution: {integrity: sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==} - engines: {node: '>=0.10.0'} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - help-me@4.2.0: - resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} - - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - html-to-text@9.0.5: - resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} - engines: {node: '>=14'} - - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - - http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} - - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - - http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - http_ece@1.2.0: - resolution: {integrity: sha512-JrF8SSLVmcvc5NducxgyOrKXe3EsyHMgBFgSaIUGmArKe+rwr0uphRkRXvwiom3I+fpIfoItveHrfudL8/rxuA==} - engines: {node: '>=16'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflation@2.1.0: - resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} - engines: {node: '>= 0.8.0'} - - 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.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - interpret@2.2.0: - resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} - engines: {node: '>= 0.10'} - - ioredis-mock@8.13.0: - resolution: {integrity: sha512-oO6s5xeL3A+EmcmyoEAMxJnwsnXaBfo5IYD2cctsqxLbX9d6dZm67k5nDXAUWMtkIVJJeEbDa4LuFpDowJbvaw==} - engines: {node: '>=12.22'} - peerDependencies: - '@types/ioredis-mock': ^8 - ioredis: ^5 - - ioredis@5.8.1: - resolution: {integrity: sha512-Qho8TgIamqEPdgiMadJwzRMW3TudIg6vpg4YONokGDudy4eqRIJtDbVX72pfLBcWxvbn3qm/40TyGUObdW4tLQ==} - engines: {node: '>=12.22.0'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - iserror@0.0.2: - resolution: {integrity: sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - 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-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - - jest-changed-files@28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-cli@28.1.3: - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@28.1.3: - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@28.1.3: - resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-docblock@28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-each@28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-environment-node@28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-get-type@28.0.2: - resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-haste-map@28.1.3: - resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-leak-detector@28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-matcher-utils@28.1.3: - resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-message-util@28.1.3: - resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-mock@28.1.3: - resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@28.0.2: - resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-resolve-dependencies@28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-resolve@28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-runner@28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-runtime@28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-snapshot@28.1.3: - resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-util@28.1.3: - resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-validate@28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-watcher@28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-worker@28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest@28.1.3: - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonpath@1.1.1: - resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} - - jsonwebtoken@9.0.0: - resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} - engines: {node: '>=12', npm: '>=6'} - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - - jwa@1.4.2: - resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - - jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - - jwks-rsa@3.2.0: - resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==} - engines: {node: '>=14'} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - jws@4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} - - keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - knex@2.5.1: - resolution: {integrity: sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==} - engines: {node: '>=12'} - 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 - - koa-body@5.0.0: - resolution: {integrity: sha512-nHwEODrQGiyKBILCWO8QSS40C87cKr2cp3y/Cw8u9Z8w5t0CdSkGm3+y9WK5BIAlPpo9tTw5RtSbxpVyG79vmw==} - - koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - - koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} - - koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} - - koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} - - koa@2.16.3: - resolution: {integrity: sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - - leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - libphonenumber-js@1.12.24: - resolution: {integrity: sha512-l5IlyL9AONj4voSd7q9xkuQOL4u8Ty44puTic7J88CmdXkxfGsRfoVLXHCxppwehgpb/Chdb80FFehHqjN3ItQ==} - - lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - - limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - long-timeout@0.1.1: - resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} - - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - - 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'} - - lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - - luxon@3.7.2: - resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} - engines: {node: '>=12'} - - mailgun.js@8.2.2: - resolution: {integrity: sha512-po/KtofzrTuKhHLenbmliDsVVOFANwcfDFUGnggwnyZJmZz7JgBlV6nzK9o2Fk+OK2SiBmJTK25RbkAj57Hd+Q==} - - 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==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.5: - resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} - - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-abi@3.78.0: - resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==} - engines: {node: '>=10'} - - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - - node-adm@0.9.1: - resolution: {integrity: sha512-npudU9I1l6wUEUcZme6yhe1WTi48nMSM7v2BxqGtE7hO12knzCnRj+IeUmaDdNzNMNiOU8ZYqN6PE6PXX2F/3w==} - engines: {node: '>= 0.6.0'} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - node-gcm@1.1.4: - resolution: {integrity: sha512-6Z3Ksmum3xsux/Ejwg2pn+yELvL13nIP5ZbdJDZupnipfP10xyPvJGt5jlB3pCrKkIzcTKL87OI0xsbbz8YkpA==} - engines: {node: '>= 12'} - - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-pushnotifications@3.1.1: - resolution: {integrity: sha512-rgA6jvs5DbSZPhUBhbbym3h0iZvncN9s8wpSDpQ0rt8+ICKkCmMDVzzQFjcd1nRL91zdF7zpLKYptCxdsmv6Aw==} - engines: {node: '>=14.x.x'} - - node-releases@2.0.25: - resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} - - node-schedule@2.1.1: - resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} - engines: {node: '>=6'} - - nodemailer-mailgun-transport@2.1.5: - resolution: {integrity: sha512-hF7POkaxFgMvYEd5aHLaQJI2511ld+aQlQi7JH6bGjhjlZ33cIbTB9PimlIrLu5XC3z76Kde6e65OIwL9lOdTA==} - - nodemailer-sendgrid@1.0.3: - resolution: {integrity: sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==} - - nodemailer@6.10.1: - resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==} - engines: {node: '>=6.0.0'} - - nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - - object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - oidc-token-hash@5.1.1: - resolution: {integrity: sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==} - engines: {node: ^10.13.0 || >=12.0.0} - - on-exit-leak-free@1.0.0: - resolution: {integrity: sha512-Ve8ubhrXRdnuCJ5bQSQpP3uaV43K1PMcOfSRC1pqHgRZommXCgsXwh08jVC5NpjwScE23BPDwDvVg4cov3mwjw==} - - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - - openid-client@5.7.1: - resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parseley@0.12.1: - resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - peberminta@0.9.0: - resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - - pg-cloudflare@1.2.7: - resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} - - pg-connection-string@2.6.1: - resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} - - pg-connection-string@2.9.1: - resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} - - pg-cursor@2.15.3: - resolution: {integrity: sha512-eHw63TsiGtFEfAd7tOTZ+TLy+i/2ePKS20H84qCQ+aQ60pve05Okon9tKMC+YN3j6XyeFoHnaim7Lt9WVafQsA==} - peerDependencies: - pg: ^8 - - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-pool@3.10.1: - resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} - peerDependencies: - pg: '>=8.0' - - pg-protocol@1.10.3: - resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - - pg-query-stream@4.10.3: - resolution: {integrity: sha512-h2utrzpOIzeT9JfaqfvBbVuvCfBjH86jNfVrGGTbyepKAIOyTfDew0lAt8bbJjs9n/I5bGDl7S2sx6h5hPyJxw==} - peerDependencies: - pg: ^8 - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - - pg@8.16.3: - resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} - engines: {node: '>= 16.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - - pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} - - pino-pretty@8.1.0: - resolution: {integrity: sha512-oKfI8qKXR2a3haHs/X8iB6QSnWLqoOGAjwxIAXem4+XOGIGNw7IKpozId1uE7j89Rj46HIfWnGbAgmQmr8+yRw==} - hasBin: true - - pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - - pino@8.21.0: - resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} - hasBin: true - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - 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-node@3.6.3: - resolution: {integrity: sha512-JB+ei0LkwE+rKHyW5z79Nd1jUaGxU6TvkfjFqY9vQaHxU5aU8dRl0UUaEmZdZbHwjp3WmXCBQQRNyimwbNQfCw==} - engines: {node: '>=15.0.0'} - - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - pretty-format@28.1.3: - resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - proto3-json-serializer@2.0.2: - resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} - engines: {node: '>=14.0.0'} - - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - - ramda@0.30.1: - resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - raw-body@3.0.1: - resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} - engines: {node: '>= 0.10'} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readline-sync@1.4.10: - resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} - engines: {node: '>= 0.8.0'} - - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - - redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - - redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - retry-request@7.0.2: - resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} - engines: {node: '>=14'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rrule@2.7.2: - resolution: {integrity: sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rusha@0.8.14: - resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - selderee@0.11.0: - resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - 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-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - sonic-boom@3.8.1: - resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} - - sorted-array-functions@1.3.0: - resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} - - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - - standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - - standardwebhooks@1.0.0: - resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} - - static-eval@2.0.2: - resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} - - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - - stream-events@1.0.5: - resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - - stubs@3.0.0: - resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - - superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net - - supertest@6.3.4: - resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} - engines: {node: '>=6.4.0'} - deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - svix@1.77.0: - resolution: {integrity: sha512-rqyvcFHMq1eGIjYwZEEsW5MkeLH4FRr23TuSsLLhH+/wilK4sjdJSYmALTke3kyMqab7lqWTc9jyKFw6o0/oKg==} - - swr@2.3.4: - resolution: {integrity: sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tarn@3.0.2: - resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} - engines: {node: '>=8.0.0'} - - teeny-request@9.0.0: - resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} - engines: {node: '>=14'} - - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thread-stream@2.7.0: - resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} - - tildify@2.0.0: - resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} - engines: {node: '>=8'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true - - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-jest@28.0.8: - resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^28.0.0 - babel-jest: ^28.0.0 - esbuild: '*' - jest: ^28.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typeof-article@0.1.1: - resolution: {integrity: sha512-Vn42zdX3FhmUrzEmitX3iYyLb+Umwpmv8fkZRIknYh84lmdrwqZA5xYaoKiIj2Rc5i/5wcDrpUmZcbk1U51vTw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - - underscore@1.12.1: - resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - 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.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - verror@1.10.1: - resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} - engines: {node: '>=0.6.0'} - - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - web-push@3.6.7: - resolution: {integrity: sha512-OpiIUe8cuGjrj3mMBFWY+e4MMIkW3SVT+7vEIjvD9kejGUypv8GPDf84JdPWskK8zMRIJ6xYGm+Kxr8YkPyA0A==} - engines: {node: '>= 16'} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wns@0.5.4: - resolution: {integrity: sha512-WYiJ7khIwUGBD5KAm+YYmwJDDRzFRs4YGAjtbFSoRIdbn9Jcix3p9khJmpvBTXGommaKkvduAn+pc9l4d9yzVQ==} - engines: {node: '>= 0.6.17'} - - 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==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - xml-crypto@3.2.1: - resolution: {integrity: sha512-0GUNbPtQt+PLMsC5HoZRONX+K6NBJEqpXe/lsvrFj0EqfpGPpVfJKGE7a5jCg8s2+Wkrf/2U1G41kIH+zC9eyQ==} - engines: {node: '>=4.0.0'} - - xml-encryption@3.1.0: - resolution: {integrity: sha512-PV7qnYpoAMXbf1kvQkqMScLeQpjCMixddAKq9PtqVrho8HnYbBOWNfG0kA4R7zxQDo7w9kiYAyzS/ullAyO55Q==} - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - 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'} - - xpath@0.0.27: - resolution: {integrity: sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==} - engines: {node: '>=0.6.0'} - - xpath@0.0.32: - resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} - engines: {node: '>=0.6.0'} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - tslib: 2.8.1 - - '@aws-crypto/crc32c@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - tslib: 2.8.1 - - '@aws-crypto/sha1-browser@5.2.0': - dependencies: - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-locate-window': 3.893.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-browser@5.2.0': - dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-locate-window': 3.893.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-js@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.910.0 - tslib: 2.8.1 - - '@aws-crypto/supports-web-crypto@5.2.0': - dependencies: - tslib: 2.8.1 - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-sdk/client-s3@3.913.0': - dependencies: - '@aws-crypto/sha1-browser': 5.2.0 - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-node': 3.913.0 - '@aws-sdk/middleware-bucket-endpoint': 3.910.0 - '@aws-sdk/middleware-expect-continue': 3.910.0 - '@aws-sdk/middleware-flexible-checksums': 3.911.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-location-constraint': 3.913.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-sdk-s3': 3.911.0 - '@aws-sdk/middleware-ssec': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/signature-v4-multi-region': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@aws-sdk/xml-builder': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/eventstream-serde-browser': 4.2.3 - '@smithy/eventstream-serde-config-resolver': 4.3.3 - '@smithy/eventstream-serde-node': 4.2.3 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-blob-browser': 4.2.4 - '@smithy/hash-node': 4.2.3 - '@smithy/hash-stream-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/md5-js': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.3 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-ses@3.913.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-node': 3.913.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.3 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sqs@3.913.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-node': 3.913.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-sdk-sqs': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/md5-js': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.911.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.911.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@aws-sdk/xml-builder': 3.911.0 - '@smithy/core': 3.17.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/node-http-handler': 4.4.2 - '@smithy/property-provider': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-stream': 4.5.3 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.913.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/credential-provider-env': 3.911.0 - '@aws-sdk/credential-provider-http': 3.911.0 - '@aws-sdk/credential-provider-process': 3.911.0 - '@aws-sdk/credential-provider-sso': 3.911.0 - '@aws-sdk/credential-provider-web-identity': 3.911.0 - '@aws-sdk/nested-clients': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.913.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.911.0 - '@aws-sdk/credential-provider-http': 3.911.0 - '@aws-sdk/credential-provider-ini': 3.913.0 - '@aws-sdk/credential-provider-process': 3.911.0 - '@aws-sdk/credential-provider-sso': 3.911.0 - '@aws-sdk/credential-provider-web-identity': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-process@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.911.0': - dependencies: - '@aws-sdk/client-sso': 3.911.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/token-providers': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/nested-clients': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/lib-storage@3.913.0(@aws-sdk/client-s3@3.913.0)': - dependencies: - '@aws-sdk/client-s3': 3.913.0 - '@smithy/abort-controller': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/smithy-client': 4.9.0 - buffer: 5.6.0 - events: 3.3.0 - stream-browserify: 3.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-bucket-endpoint@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.911.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.913.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@aws/lambda-invoke-store': 0.0.1 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.17.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-sqs@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-ssec@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@smithy/core': 3.17.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.911.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.911.0 - '@aws-sdk/middleware-host-header': 3.910.0 - '@aws-sdk/middleware-logger': 3.910.0 - '@aws-sdk/middleware-recursion-detection': 3.910.0 - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/region-config-resolver': 3.910.0 - '@aws-sdk/types': 3.910.0 - '@aws-sdk/util-endpoints': 3.910.0 - '@aws-sdk/util-user-agent-browser': 3.910.0 - '@aws-sdk/util-user-agent-node': 3.911.0 - '@smithy/config-resolver': 4.3.3 - '@smithy/core': 3.17.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-retry': 4.4.4 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.2 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.3 - '@smithy/util-defaults-mode-node': 4.2.4 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/region-config-resolver@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.911.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.911.0': - dependencies: - '@aws-sdk/core': 3.911.0 - '@aws-sdk/nested-clients': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/types@3.910.0': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.893.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-endpoints': 3.2.3 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.893.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-browser@3.910.0': - dependencies: - '@aws-sdk/types': 3.910.0 - '@smithy/types': 4.8.0 - bowser: 2.12.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.911.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.911.0 - '@aws-sdk/types': 3.910.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.911.0': - dependencies: - '@smithy/types': 4.8.0 - fast-xml-parser: 5.2.5 - tslib: 2.8.1 - - '@aws/lambda-invoke-store@0.0.1': {} - - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.4': {} - - '@babel/core@7.28.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.28.3': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.4 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.28.4 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/runtime@7.28.4': {} - - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - - '@babel/traverse@7.28.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@bcoe/v8-coverage@0.2.3': {} - - '@bugsnag/browser@8.6.0': - dependencies: - '@bugsnag/core': 8.6.0 - - '@bugsnag/core@8.6.0': - dependencies: - '@bugsnag/cuid': 3.2.1 - '@bugsnag/safe-json-stringify': 6.1.0 - error-stack-parser: 2.1.4 - iserror: 0.0.2 - stack-generator: 2.0.10 - - '@bugsnag/cuid@3.2.1': {} - - '@bugsnag/js@8.6.0': - dependencies: - '@bugsnag/browser': 8.6.0 - '@bugsnag/node': 8.6.0 - - '@bugsnag/node@8.6.0': - dependencies: - '@bugsnag/core': 8.6.0 - byline: 5.0.0 - error-stack-parser: 2.1.4 - iserror: 0.0.2 - pump: 3.0.3 - stack-generator: 2.0.10 - - '@bugsnag/plugin-koa@8.6.0(@bugsnag/core@8.6.0)': - dependencies: - '@bugsnag/core': 8.6.0 - - '@bugsnag/safe-json-stringify@6.1.0': {} - - '@clerk/backend@2.18.3': - dependencies: - '@clerk/shared': 3.28.2 - '@clerk/types': 4.95.0 - cookie: 1.0.2 - standardwebhooks: 1.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - react - - react-dom - - '@clerk/shared@3.28.2': - dependencies: - '@clerk/types': 4.95.0 - dequal: 2.0.3 - glob-to-regexp: 0.4.1 - js-cookie: 3.0.5 - std-env: 3.10.0 - swr: 2.3.4 - - '@clerk/types@4.95.0': - dependencies: - csstype: 3.1.3 - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@fastify/busboy@2.1.1': {} - - '@firebase/app-check-interop-types@0.3.2': {} - - '@firebase/app-types@0.9.2': {} - - '@firebase/app-types@0.9.3': {} - - '@firebase/auth-interop-types@0.2.3': {} - - '@firebase/component@0.6.10': - dependencies: - '@firebase/util': 1.10.1 - tslib: 2.8.1 - - '@firebase/database-compat@1.0.10': - dependencies: - '@firebase/component': 0.6.10 - '@firebase/database': 1.0.9 - '@firebase/database-types': 1.0.6 - '@firebase/logger': 0.4.3 - '@firebase/util': 1.10.1 - tslib: 2.8.1 - - '@firebase/database-types@1.0.16': - dependencies: - '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 - - '@firebase/database-types@1.0.6': - dependencies: - '@firebase/app-types': 0.9.2 - '@firebase/util': 1.10.1 - - '@firebase/database@1.0.9': - dependencies: - '@firebase/app-check-interop-types': 0.3.2 - '@firebase/auth-interop-types': 0.2.3 - '@firebase/component': 0.6.10 - '@firebase/logger': 0.4.3 - '@firebase/util': 1.10.1 - faye-websocket: 0.11.4 - tslib: 2.8.1 - - '@firebase/logger@0.4.3': - dependencies: - tslib: 2.8.1 - - '@firebase/util@1.10.1': - dependencies: - tslib: 2.8.1 - - '@firebase/util@1.13.0': - dependencies: - tslib: 2.8.1 - - '@google-cloud/firestore@7.11.6': - dependencies: - '@opentelemetry/api': 1.9.0 - fast-deep-equal: 3.1.3 - functional-red-black-tree: 1.0.1 - google-gax: 4.6.1 - protobufjs: 7.5.4 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@google-cloud/paginator@5.0.2': - dependencies: - arrify: 2.0.1 - extend: 3.0.2 - optional: true - - '@google-cloud/projectify@4.0.0': - optional: true - - '@google-cloud/promisify@4.0.0': - optional: true - - '@google-cloud/storage@7.17.2': - dependencies: - '@google-cloud/paginator': 5.0.2 - '@google-cloud/projectify': 4.0.0 - '@google-cloud/promisify': 4.0.0 - abort-controller: 3.0.0 - async-retry: 1.3.3 - duplexify: 4.1.3 - fast-xml-parser: 4.5.3 - gaxios: 6.7.1 - google-auth-library: 9.15.1 - html-entities: 2.6.0 - mime: 3.0.0 - p-limit: 3.1.0 - retry-request: 7.0.2 - teeny-request: 9.0.0 - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@grpc/grpc-js@1.14.0': - dependencies: - '@grpc/proto-loader': 0.8.0 - '@js-sdsl/ordered-map': 4.4.2 - optional: true - - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - optional: true - - '@grpc/proto-loader@0.8.0': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 - optional: true - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@ioredis/as-callback@3.0.0': {} - - '@ioredis/commands@1.4.0': {} - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@28.1.3': - dependencies: - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - chalk: 4.1.2 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - slash: 3.0.0 - - '@jest/core@28.1.3(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5))': - dependencies: - '@jest/console': 28.1.3 - '@jest/reporters': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-resolve-dependencies: 28.1.3 - jest-runner: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - jest-watcher: 28.1.3 - micromatch: 4.0.8 - pretty-format: 28.1.3 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - - '@jest/environment@28.1.3': - dependencies: - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - jest-mock: 28.1.3 - - '@jest/expect-utils@28.1.3': - dependencies: - jest-get-type: 28.0.2 - - '@jest/expect@28.1.3': - dependencies: - expect: 28.1.3 - jest-snapshot: 28.1.3 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@28.1.3': - dependencies: - '@jest/types': 28.1.3 - '@sinonjs/fake-timers': 9.1.2 - '@types/node': 24.9.0 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-util: 28.1.3 - - '@jest/globals@28.1.3': - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/types': 28.1.3 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@28.1.3': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 24.9.0 - chalk: 4.1.2 - collect-v8-coverage: 1.0.3 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.2.0 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - jest-worker: 28.1.3 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - terminal-link: 2.1.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@28.1.3': - dependencies: - '@sinclair/typebox': 0.24.51 - - '@jest/source-map@28.1.2': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@28.1.3': - dependencies: - '@jest/console': 28.1.3 - '@jest/types': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.3 - - '@jest/test-sequencer@28.1.3': - dependencies: - '@jest/test-result': 28.1.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - slash: 3.0.0 - - '@jest/transform@28.1.3': - dependencies: - '@babel/core': 7.28.4 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@28.1.3': - dependencies: - '@jest/schemas': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 24.9.0 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@js-sdsl/ordered-map@4.4.2': - optional: true - - '@koa/cors@5.0.0': - dependencies: - vary: 1.1.2 - - '@koa/router@11.0.2': - dependencies: - debug: 4.4.3 - http-errors: 2.0.0 - koa-compose: 4.1.0 - methods: 1.1.2 - path-to-regexp: 6.3.0 - transitivePeerDependencies: - - supports-color - - '@ladjs/country-language@1.0.3': {} - - '@lukeed/csprng@1.1.0': {} - - '@lukeed/uuid@2.0.1': - dependencies: - '@lukeed/csprng': 1.1.0 - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@noble/hashes@1.8.0': {} - - '@node-saml/node-saml@4.0.5': - dependencies: - '@types/debug': 4.1.12 - '@types/passport': 1.0.17 - '@types/xml-crypto': 1.4.6 - '@types/xml-encryption': 1.2.4 - '@types/xml2js': 0.4.14 - '@xmldom/xmldom': 0.8.11 - debug: 4.4.3 - xml-crypto: 3.2.1 - xml-encryption: 3.1.0 - xml2js: 0.5.0 - xmlbuilder: 15.1.1 - transitivePeerDependencies: - - supports-color - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@opentelemetry/api@1.9.0': - optional: true - - '@paralleldrive/cuid2@2.2.2': - dependencies: - '@noble/hashes': 1.8.0 - - '@parse/node-apn@6.0.1': - dependencies: - debug: 4.3.3 - jsonwebtoken: 9.0.0 - node-forge: 1.3.1 - verror: 1.10.1 - transitivePeerDependencies: - - supports-color - - '@protobufjs/aspromise@1.1.2': - optional: true - - '@protobufjs/base64@1.1.2': - optional: true - - '@protobufjs/codegen@2.0.4': - optional: true - - '@protobufjs/eventemitter@1.1.0': - optional: true - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - optional: true - - '@protobufjs/float@1.0.2': - optional: true - - '@protobufjs/inquire@1.1.0': - optional: true - - '@protobufjs/path@1.1.2': - optional: true - - '@protobufjs/pool@1.1.0': - optional: true - - '@protobufjs/utf8@1.1.0': - optional: true - - '@rtsao/scc@1.1.0': {} - - '@segment/analytics-core@1.4.1': - dependencies: - '@lukeed/uuid': 2.0.1 - '@segment/analytics-generic-utils': 1.1.1 - dset: 3.1.4 - tslib: 2.8.1 - - '@segment/analytics-generic-utils@1.1.1': - dependencies: - tslib: 2.8.1 - - '@segment/analytics-node@1.3.0': - dependencies: - '@lukeed/uuid': 2.0.1 - '@segment/analytics-core': 1.4.1 - '@segment/analytics-generic-utils': 1.1.1 - buffer: 6.0.3 - node-fetch: 2.7.0 - tslib: 2.8.1 - transitivePeerDependencies: - - encoding - - '@selderee/plugin-htmlparser2@0.11.0': - dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 - - '@sendgrid/client@6.5.5': - dependencies: - '@sendgrid/helpers': 6.5.5 - '@types/request': 2.48.13 - request: 2.88.2 - - '@sendgrid/helpers@6.5.5': - dependencies: - chalk: 2.4.2 - deepmerge: 4.3.1 - - '@sendgrid/mail@6.5.5': - dependencies: - '@sendgrid/client': 6.5.5 - '@sendgrid/helpers': 6.5.5 - - '@sentry-internal/tracing@7.120.4': - dependencies: - '@sentry/core': 7.120.4 - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 - - '@sentry/core@7.120.4': - dependencies: - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 - - '@sentry/integrations@7.120.4': - dependencies: - '@sentry/core': 7.120.4 - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 - localforage: 1.10.0 - - '@sentry/node@7.120.4': - dependencies: - '@sentry-internal/tracing': 7.120.4 - '@sentry/core': 7.120.4 - '@sentry/integrations': 7.120.4 - '@sentry/types': 7.120.4 - '@sentry/utils': 7.120.4 - - '@sentry/types@7.120.4': {} - - '@sentry/utils@7.120.4': - dependencies: - '@sentry/types': 7.120.4 - - '@sinclair/typebox@0.24.51': {} - - '@sinonjs/commons@1.8.6': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@9.1.2': - dependencies: - '@sinonjs/commons': 1.8.6 - - '@smithy/abort-controller@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/chunked-blob-reader-native@4.2.1': - dependencies: - '@smithy/util-base64': 4.3.0 - tslib: 2.8.1 - - '@smithy/chunked-blob-reader@5.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/config-resolver@4.3.3': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - tslib: 2.8.1 - - '@smithy/core@3.17.0': - dependencies: - '@smithy/middleware-serde': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.3 - '@smithy/util-utf8': 4.2.0 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.2.3': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - tslib: 2.8.1 - - '@smithy/eventstream-codec@4.2.3': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.8.0 - '@smithy/util-hex-encoding': 4.2.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-browser@4.2.3': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.3.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.2.3': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-universal@4.2.3': - dependencies: - '@smithy/eventstream-codec': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.3.4': - dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/querystring-builder': 4.2.3 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - tslib: 2.8.1 - - '@smithy/hash-blob-browser@4.2.4': - dependencies: - '@smithy/chunked-blob-reader': 5.2.0 - '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/hash-node@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/hash-stream-node@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/is-array-buffer@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/md5-js@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.2.3': - dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.3.4': - dependencies: - '@smithy/core': 3.17.0 - '@smithy/middleware-serde': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-middleware': 4.2.3 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.4.4': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/service-error-classification': 4.2.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.2.3': - dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.3': - dependencies: - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.4.2': - dependencies: - '@smithy/abort-controller': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/querystring-builder': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/property-provider@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/protocol-http@5.3.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - '@smithy/util-uri-escape': 4.2.0 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - - '@smithy/shared-ini-file-loader@4.3.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/signature-v4@5.3.3': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-uri-escape': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/smithy-client@4.9.0': - dependencies: - '@smithy/core': 3.17.0 - '@smithy/middleware-endpoint': 4.3.4 - '@smithy/middleware-stack': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-stream': 4.5.3 - tslib: 2.8.1 - - '@smithy/types@4.8.0': - dependencies: - tslib: 2.8.1 - - '@smithy/url-parser@4.2.3': - dependencies: - '@smithy/querystring-parser': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-base64@4.3.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-body-length-node@4.2.1': - dependencies: - tslib: 2.8.1 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-buffer-from@4.2.0': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-config-provider@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.3.3': - dependencies: - '@smithy/property-provider': 4.2.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.2.4': - dependencies: - '@smithy/config-resolver': 4.3.3 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/smithy-client': 4.9.0 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.2.3': - dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-middleware@4.2.3': - dependencies: - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-retry@4.2.3': - dependencies: - '@smithy/service-error-classification': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/util-stream@4.5.3': - dependencies: - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/node-http-handler': 4.4.2 - '@smithy/types': 4.8.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-uri-escape@4.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@4.2.0': - dependencies: - '@smithy/util-buffer-from': 4.2.0 - tslib: 2.8.1 - - '@smithy/util-waiter@4.2.3': - dependencies: - '@smithy/abort-controller': 4.2.3 - '@smithy/types': 4.8.0 - tslib: 2.8.1 - - '@smithy/uuid@1.1.0': - dependencies: - tslib: 2.8.1 - - '@stablelib/base64@1.0.1': {} - - '@tootallnate/once@2.0.0': - optional: true - - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@types/accepts@1.3.7': - dependencies: - '@types/node': 24.9.0 - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.28.4 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.28.4 - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 24.9.0 - - '@types/busboy@1.5.4': - dependencies: - '@types/node': 24.9.0 - - '@types/caseless@0.12.5': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 24.9.0 - - '@types/content-disposition@0.5.9': {} - - '@types/cookiejar@2.1.5': {} - - '@types/cookies@0.9.1': - dependencies: - '@types/connect': 3.4.38 - '@types/express': 5.0.3 - '@types/keygrip': 1.0.6 - '@types/node': 24.9.0 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - - '@types/express-serve-static-core@4.19.7': - dependencies: - '@types/node': 24.9.0 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.0 - - '@types/express-serve-static-core@5.1.0': - dependencies: - '@types/node': 24.9.0 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.0 - - '@types/express@4.17.23': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.9 - - '@types/express@5.0.3': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.0 - '@types/serve-static': 1.15.9 - - '@types/formidable@2.0.6': - dependencies: - '@types/node': 24.9.0 - - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 24.9.0 - - '@types/html-to-text@9.0.4': {} - - '@types/http-assert@1.5.6': {} - - '@types/http-errors@2.0.5': {} - - '@types/ioredis-mock@8.2.6(ioredis@5.8.1)': - dependencies: - ioredis: 5.8.1 - - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@28.1.8': - dependencies: - expect: 28.1.3 - pretty-format: 28.1.3 - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/jsonpath@0.2.4': {} - - '@types/jsonwebtoken@9.0.10': - dependencies: - '@types/ms': 2.1.0 - '@types/node': 24.9.0 - - '@types/keygrip@1.0.6': {} - - '@types/koa-compose@3.2.8': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa-send@4.1.6': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa-static@4.0.4': - dependencies: - '@types/koa': 2.15.0 - '@types/koa-send': 4.1.6 - - '@types/koa@2.15.0': - dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.9 - '@types/cookies': 0.9.1 - '@types/http-assert': 1.5.6 - '@types/http-errors': 2.0.5 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.8 - '@types/node': 24.9.0 - - '@types/koa__cors@3.3.1': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa__router@8.0.11': - dependencies: - '@types/koa': 2.15.0 - - '@types/long@4.0.2': - optional: true - - '@types/methods@1.1.4': {} - - '@types/mime@1.3.5': {} - - '@types/ms@2.1.0': {} - - '@types/node-pushnotifications@1.0.8': - dependencies: - '@types/node': 24.9.0 - '@types/web-push': 3.6.4 - - '@types/node-schedule@2.1.8': - dependencies: - '@types/node': 24.9.0 - - '@types/node@20.19.22': - dependencies: - undici-types: 6.21.0 - - '@types/node@24.9.0': - dependencies: - undici-types: 7.16.0 - - '@types/nodemailer-mailgun-transport@1.4.6': - dependencies: - '@types/nodemailer': 6.4.20 - transitivePeerDependencies: - - aws-crt - - '@types/nodemailer-sendgrid@1.0.3': - dependencies: - '@types/nodemailer': 6.4.20 - transitivePeerDependencies: - - aws-crt - - '@types/nodemailer@6.4.20': - dependencies: - '@aws-sdk/client-ses': 3.913.0 - '@types/node': 24.9.0 - transitivePeerDependencies: - - aws-crt - - '@types/passport@1.0.17': - dependencies: - '@types/express': 5.0.3 - - '@types/prettier@2.7.3': {} - - '@types/qs@6.14.0': {} - - '@types/range-parser@1.2.7': {} - - '@types/request@2.48.13': - dependencies: - '@types/caseless': 0.12.5 - '@types/node': 24.9.0 - '@types/tough-cookie': 4.0.5 - form-data: 2.5.5 - - '@types/semver@7.7.1': {} - - '@types/send@0.17.5': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 24.9.0 - - '@types/send@1.2.0': - dependencies: - '@types/node': 24.9.0 - - '@types/serve-static@1.15.9': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 24.9.0 - '@types/send': 0.17.5 - - '@types/stack-utils@2.0.3': {} - - '@types/superagent@8.1.9': - dependencies: - '@types/cookiejar': 2.1.5 - '@types/methods': 1.1.4 - '@types/node': 24.9.0 - form-data: 4.0.4 - - '@types/supertest@2.0.16': - dependencies: - '@types/superagent': 8.1.9 - - '@types/tough-cookie@4.0.5': {} - - '@types/uuid@9.0.8': {} - - '@types/web-push@3.6.4': - dependencies: - '@types/node': 24.9.0 - - '@types/xml-crypto@1.4.6': - dependencies: - '@types/node': 24.9.0 - xpath: 0.0.27 - - '@types/xml-encryption@1.2.4': - dependencies: - '@types/node': 24.9.0 - - '@types/xml2js@0.4.14': - dependencies: - '@types/node': 24.9.0 - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.33': - dependencies: - '@types/yargs-parser': 21.0.3 - - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.7.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@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.4.3 - eslint: 8.57.1 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.3.0': {} - - '@xmldom/xmldom@0.8.11': {} - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn-walk@8.3.4: - dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - - agent-base@7.1.4: {} - - ajv-errors@3.0.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@4.1.3: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array-union@2.1.0: {} - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - - arrify@2.0.1: - optional: true - - asap@2.0.6: {} - - asn1.js@5.4.1: - dependencies: - bn.js: 4.12.2 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - - async-function@1.0.0: {} - - async-retry@1.3.3: - dependencies: - retry: 0.13.1 - optional: true - - asynckit@0.4.0: {} - - atomic-sleep@1.0.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - - axios@1.12.2: - dependencies: - follow-redirects: 1.15.11(debug@3.2.7) - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - axios@1.6.8(debug@3.2.7): - dependencies: - follow-redirects: 1.15.11(debug@3.2.7) - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - babel-jest@28.1.3(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - '@jest/transform': 28.1.3 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.28.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@28.1.3: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - - babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) - - babel-preset-jest@28.1.3(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) - - balanced-match@1.0.2: {} - - base-64@1.0.0: {} - - base64-js@1.5.1: {} - - baseline-browser-mapping@2.8.18: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - bignumber.js@9.3.1: - optional: true - - binary-extensions@2.3.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - bluebird@3.7.2: {} - - bn.js@4.12.2: {} - - bowser@2.12.1: {} - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.26.3: - dependencies: - baseline-browser-mapping: 2.8.18 - caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.237 - node-releases: 2.0.25 - update-browserslist-db: 1.1.3(browserslist@4.26.3) - - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - - buffer-equal-constant-time@1.0.1: {} - - buffer-from@1.1.2: {} - - buffer@5.6.0: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - builtin-modules@3.3.0: {} - - builtins@5.1.0: - dependencies: - semver: 7.7.3 - - bullmq@5.61.0: - dependencies: - cron-parser: 4.9.0 - ioredis: 5.8.1 - msgpackr: 1.11.5 - node-abort-controller: 3.1.1 - semver: 7.7.3 - tslib: 2.8.1 - uuid: 11.1.0 - transitivePeerDependencies: - - supports-color - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - byline@5.0.0: {} - - bytes@3.1.2: {} - - cache-content-type@1.0.1: - dependencies: - mime-types: 2.1.35 - ylru: 1.4.0 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001751: {} - - caseless@0.12.0: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - char-regex@1.0.2: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@1.1.4: {} - - ci-info@3.9.0: {} - - cjs-module-lexer@1.4.3: {} - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cluster-key-slot@1.1.2: {} - - co-body@5.2.0: - dependencies: - inflation: 2.1.0 - qs: 6.14.0 - raw-body: 2.5.2 - type-is: 1.6.18 - - co@4.6.0: {} - - collect-v8-coverage@1.0.3: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - colorette@2.0.19: {} - - colorette@2.0.20: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@10.0.1: {} - - component-emitter@1.3.1: {} - - concat-map@0.0.1: {} - - consolidate@0.15.1(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.12.1): - dependencies: - bluebird: 3.7.2 - optionalDependencies: - handlebars: 4.7.8 - lodash: 4.17.21 - underscore: 1.12.1 - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie@1.0.2: {} - - cookiejar@2.1.4: {} - - cookies@0.9.1: - dependencies: - depd: 2.0.0 - keygrip: 1.1.0 - - core-util-is@1.0.2: {} - - create-require@1.1.1: {} - - cron-parser@4.9.0: - dependencies: - luxon: 3.7.2 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - csstype@3.1.3: {} - - csv-parse@5.6.0: {} - - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - date-fns-tz@1.3.8(date-fns@2.30.0): - dependencies: - date-fns: 2.30.0 - - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.28.4 - - dateformat@4.6.3: {} - - debug@3.2.7(supports-color@5.5.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - - debug@4.3.3: - dependencies: - ms: 2.1.2 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - dedent@0.7.0: {} - - deep-equal@1.0.1: {} - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delayed-stream@1.0.0: {} - - delegates@1.0.0: {} - - denque@2.1.0: {} - - depd@1.1.2: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - detect-libc@2.1.2: {} - - detect-newline@3.1.0: {} - - dezalgo@1.0.4: - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - - diff-sequences@28.1.1: {} - - diff@4.0.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dotenv@16.6.1: {} - - dset@3.1.4: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - duplexify@4.1.3: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - optional: true - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.237: {} - - emittery@0.10.2: {} - - emoji-regex@8.0.0: {} - - encodeurl@1.0.2: {} - - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - entities@4.5.0: {} - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - - error-stack-parser@2.1.4: - dependencies: - stackframe: 1.3.4 - - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@2.0.0: {} - - escape-string-regexp@4.0.0: {} - - escodegen@1.14.3: - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-compat-utils@0.5.1(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - semver: 7.7.3 - - eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1))(eslint-plugin-n@16.6.2(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eslint-plugin-n: 16.6.2(eslint@8.57.1) - eslint-plugin-promise: 6.6.0(eslint@8.57.1) - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7(supports-color@5.5.0) - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7(supports-color@5.5.0) - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es-x@7.8.0(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@5.5.0) - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-n@16.6.2(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - builtins: 5.1.0 - eslint: 8.57.1 - eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.12.0 - globals: 13.24.0 - ignore: 5.3.2 - is-builtin-module: 3.2.1 - is-core-module: 2.16.1 - minimatch: 3.1.2 - resolve: 1.22.10 - semver: 7.7.3 - - eslint-plugin-promise@6.6.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - 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.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - - esprima@1.2.2: {} - - esprima@4.0.1: {} - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - event-target-shim@5.0.1: {} - - eventemitter2@6.4.9: {} - - events@3.3.0: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - exit@0.1.2: {} - - expand-template@2.0.3: {} - - expect@28.1.3: - dependencies: - '@jest/expect-utils': 28.1.3 - jest-get-type: 28.0.2 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - - extend@3.0.2: {} - - extsprintf@1.3.0: {} - - extsprintf@1.4.1: {} - - farmhash@3.3.1: - dependencies: - node-addon-api: 5.1.0 - prebuild-install: 7.1.3 - - fast-copy@2.1.7: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - 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.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-redact@3.5.0: {} - - fast-safe-stringify@2.1.1: {} - - fast-sha256@1.3.0: {} - - fast-uri@3.1.0: {} - - fast-xml-parser@4.5.3: - dependencies: - strnum: 1.1.2 - optional: true - - fast-xml-parser@5.2.5: - dependencies: - strnum: 2.1.1 - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - - fengari-interop@0.1.3(fengari@0.1.4): - dependencies: - fengari: 0.1.4 - - fengari@0.1.4: - dependencies: - readline-sync: 1.4.10 - sprintf-js: 1.1.3 - tmp: 0.0.33 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - firebase-admin@12.1.1: - dependencies: - '@fastify/busboy': 2.1.1 - '@firebase/database-compat': 1.0.10 - '@firebase/database-types': 1.0.16 - '@types/node': 20.19.22 - farmhash: 3.3.1 - jsonwebtoken: 9.0.2 - jwks-rsa: 3.2.0 - long: 5.3.2 - node-forge: 1.3.1 - uuid: 9.0.1 - optionalDependencies: - '@google-cloud/firestore': 7.11.6 - '@google-cloud/storage': 7.17.2 - transitivePeerDependencies: - - encoding - - supports-color - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.3: {} - - follow-redirects@1.15.11(debug@3.2.7): - optionalDependencies: - debug: 3.2.7(supports-color@5.5.0) - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - forever-agent@0.6.1: {} - - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@2.5.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - safe-buffer: 5.2.1 - - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - formidable@2.1.5: - dependencies: - '@paralleldrive/cuid2': 2.2.2 - dezalgo: 1.0.4 - once: 1.4.0 - qs: 6.14.0 - - fresh@0.5.2: {} - - fs-constants@1.0.0: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functional-red-black-tree@1.0.1: - optional: true - - functions-have-names@1.2.3: {} - - gaxios@6.7.1: - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6 - is-stream: 2.0.1 - node-fetch: 2.7.0 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - gcp-metadata@6.1.1: - dependencies: - gaxios: 6.7.1 - google-logging-utils: 0.0.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - generator-function@2.0.1: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-package-type@0.1.0: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@6.0.1: {} - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - get-tsconfig@4.12.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - getopts@2.3.0: {} - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - github-from-package@0.0.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - google-auth-library@9.15.1: - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1 - gcp-metadata: 6.1.1 - gtoken: 7.1.0 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - google-gax@4.6.1: - dependencies: - '@grpc/grpc-js': 1.14.0 - '@grpc/proto-loader': 0.7.15 - '@types/long': 4.0.2 - abort-controller: 3.0.0 - duplexify: 4.1.3 - google-auth-library: 9.15.1 - node-fetch: 2.7.0 - object-hash: 3.0.0 - proto3-json-serializer: 2.0.2 - protobufjs: 7.5.4 - retry-request: 7.0.2 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - google-logging-utils@0.0.2: - optional: true - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - gtoken@7.1.0: - dependencies: - gaxios: 6.7.1 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - handlebars-utils@1.0.6: - dependencies: - kind-of: 6.0.3 - typeof-article: 0.1.1 - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - - has-bigints@1.1.0: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - help-me@4.2.0: - dependencies: - glob: 8.1.0 - readable-stream: 3.6.2 - - html-entities@2.6.0: - optional: true - - html-escaper@2.0.2: {} - - html-to-text@9.0.5: - dependencies: - '@selderee/plugin-htmlparser2': 0.11.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.11.0 - - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - - http-assert@1.5.0: - dependencies: - deep-equal: 1.0.1 - http-errors: 1.8.1 - - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - - http-errors@1.8.1: - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 1.5.0 - toidentifier: 1.0.1 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-parser-js@0.5.10: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - - http_ece@1.2.0: {} - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.7.0: - dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - - ignore-by-default@1.0.1: {} - - ignore@5.3.2: {} - - immediate@3.0.6: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - imurmurhash@0.1.4: {} - - inflation@2.1.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.3: {} - - inherits@2.0.4: {} - - ini@1.3.8: {} - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - interpret@2.2.0: {} - - ioredis-mock@8.13.0(@types/ioredis-mock@8.2.6(ioredis@5.8.1))(ioredis@5.8.1): - dependencies: - '@ioredis/as-callback': 3.0.0 - '@ioredis/commands': 1.4.0 - '@types/ioredis-mock': 8.2.6(ioredis@5.8.1) - fengari: 0.1.4 - fengari-interop: 0.1.3(fengari@0.1.4) - ioredis: 5.8.1 - semver: 7.7.3 - - ioredis@5.8.1: - dependencies: - '@ioredis/commands': 1.4.0 - cluster-key-slot: 1.1.2 - debug: 4.4.3 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-buffer@1.1.6: {} - - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-callable@1.2.7: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-fullwidth-code-point@3.0.0: {} - - is-generator-fn@2.1.0: {} - - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-stream@2.0.1: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-typedarray@1.0.0: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - isarray@2.0.5: {} - - iserror@0.0.2: {} - - isexe@2.0.0: {} - - isstream@0.1.2: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - '@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-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jest-changed-files@28.1.3: - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - - jest-circus@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - p-limit: 3.1.0 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - - jest-cli@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)): - dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.2.0 - jest-config: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - jest-util: 28.1.3 - jest-validate: 28.1.3 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - - jest-config@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)): - dependencies: - '@babel/core': 7.28.4 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.28.4) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 28.1.3 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 24.9.0 - ts-node: 10.9.2(@types/node@24.9.0)(typescript@4.9.5) - transitivePeerDependencies: - - supports-color - - jest-diff@28.1.3: - dependencies: - chalk: 4.1.2 - diff-sequences: 28.1.1 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - - jest-docblock@28.1.1: - dependencies: - detect-newline: 3.1.0 - - jest-each@28.1.3: - dependencies: - '@jest/types': 28.1.3 - chalk: 4.1.2 - jest-get-type: 28.0.2 - jest-util: 28.1.3 - pretty-format: 28.1.3 - - jest-environment-node@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - jest-mock: 28.1.3 - jest-util: 28.1.3 - - jest-get-type@28.0.2: {} - - jest-haste-map@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 24.9.0 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - jest-worker: 28.1.3 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@28.1.3: - dependencies: - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - - jest-matcher-utils@28.1.3: - dependencies: - chalk: 4.1.2 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - - jest-message-util@28.1.3: - dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 28.1.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - - jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - optionalDependencies: - jest-resolve: 28.1.3 - - jest-regex-util@28.0.2: {} - - jest-resolve-dependencies@28.1.3: - dependencies: - jest-regex-util: 28.0.2 - jest-snapshot: 28.1.3 - transitivePeerDependencies: - - supports-color - - jest-resolve@28.1.3: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) - jest-util: 28.1.3 - jest-validate: 28.1.3 - resolve: 1.22.10 - resolve.exports: 1.1.1 - slash: 3.0.0 - - jest-runner@28.1.3: - dependencies: - '@jest/console': 28.1.3 - '@jest/environment': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - chalk: 4.1.2 - emittery: 0.10.2 - graceful-fs: 4.2.11 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - - jest-runtime@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/globals': 28.1.3 - '@jest/source-map': 28.1.2 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.3 - execa: 5.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-snapshot@28.1.3: - dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@jest/expect-utils': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/babel__traverse': 7.28.0 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) - chalk: 4.1.2 - expect: 28.1.3 - graceful-fs: 4.2.11 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - jest-haste-map: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - natural-compare: 1.4.0 - pretty-format: 28.1.3 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - jest-util@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-validate@28.1.3: - dependencies: - '@jest/types': 28.1.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 28.0.2 - leven: 3.1.0 - pretty-format: 28.1.3 - - jest-watcher@28.1.3: - dependencies: - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 24.9.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.10.2 - jest-util: 28.1.3 - string-length: 4.0.2 - - jest-worker@28.1.3: - dependencies: - '@types/node': 24.9.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)): - dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - '@jest/types': 28.1.3 - import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - - jose@4.15.9: {} - - joycon@3.1.1: {} - - js-cookie@3.0.5: {} - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@0.1.1: {} - - jsesc@3.1.0: {} - - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - optional: true - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema@0.4.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonpath@1.1.1: - dependencies: - esprima: 1.2.2 - static-eval: 2.0.2 - underscore: 1.12.1 - - jsonwebtoken@9.0.0: - dependencies: - jws: 3.2.2 - lodash: 4.17.21 - ms: 2.1.3 - semver: 7.7.3 - - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.3 - - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - - jwa@1.4.2: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwa@2.0.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwks-rsa@3.2.0: - dependencies: - '@types/express': 4.17.23 - '@types/jsonwebtoken': 9.0.10 - debug: 4.4.3 - jose: 4.15.9 - limiter: 1.1.5 - lru-memoizer: 2.3.0 - transitivePeerDependencies: - - supports-color - - jws@3.2.2: - dependencies: - jwa: 1.4.2 - safe-buffer: 5.2.1 - - jws@4.0.0: - dependencies: - jwa: 2.0.1 - safe-buffer: 5.2.1 - - keygrip@1.1.0: - dependencies: - tsscmp: 1.0.6 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - knex@2.5.1(pg@8.16.3): - dependencies: - colorette: 2.0.19 - commander: 10.0.1 - debug: 4.3.4 - escalade: 3.2.0 - 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.1 - rechoir: 0.8.0 - resolve-from: 5.0.0 - tarn: 3.0.2 - tildify: 2.0.0 - optionalDependencies: - pg: 8.16.3 - transitivePeerDependencies: - - supports-color - - koa-body@5.0.0: - dependencies: - '@types/formidable': 2.0.6 - co-body: 5.2.0 - formidable: 2.1.5 - - koa-compose@4.1.0: {} - - koa-convert@2.0.0: - dependencies: - co: 4.6.0 - koa-compose: 4.1.0 - - koa-send@5.0.1: - dependencies: - debug: 4.4.3 - http-errors: 1.8.1 - resolve-path: 1.4.0 - transitivePeerDependencies: - - supports-color - - koa-static@5.0.0: - dependencies: - debug: 3.2.7(supports-color@5.5.0) - koa-send: 5.0.1 - transitivePeerDependencies: - - supports-color - - koa@2.16.3: - dependencies: - accepts: 1.3.8 - cache-content-type: 1.0.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - debug: 4.4.3 - delegates: 1.0.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 1.8.1 - is-generator-function: 1.1.2 - koa-compose: 4.1.0 - koa-convert: 2.0.0 - on-finished: 2.4.1 - only: 0.0.2 - parseurl: 1.3.3 - statuses: 1.5.0 - type-is: 1.6.18 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - leac@0.6.0: {} - - leven@3.1.0: {} - - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - libphonenumber-js@1.12.24: {} - - lie@3.1.1: - dependencies: - immediate: 3.0.6 - - limiter@1.1.5: {} - - lines-and-columns@1.2.4: {} - - localforage@1.10.0: - dependencies: - lie: 3.1.1 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.camelcase@4.3.0: - optional: true - - lodash.clonedeep@4.5.0: {} - - lodash.defaults@4.2.0: {} - - lodash.includes@4.3.0: {} - - lodash.isarguments@3.1.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - - lodash.memoize@4.1.2: {} - - lodash.merge@4.6.2: {} - - lodash.once@4.1.1: {} - - lodash@4.17.21: {} - - long-timeout@0.1.1: {} - - long@5.3.2: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-memoizer@2.3.0: - dependencies: - lodash.clonedeep: 4.5.0 - lru-cache: 6.0.0 - - luxon@3.7.2: {} - - mailgun.js@8.2.2: - dependencies: - axios: 1.12.2 - base-64: 1.0.0 - url-join: 4.0.1 - transitivePeerDependencies: - - debug - - make-dir@4.0.0: - dependencies: - semver: 7.7.3 - - make-error@1.3.6: {} - - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - - math-intrinsics@1.1.0: {} - - media-typer@0.3.0: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@2.6.0: {} - - mime@3.0.0: - optional: true - - mimic-fn@2.1.0: {} - - mimic-response@3.1.0: {} - - minimalistic-assert@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - - minimist@1.2.8: {} - - mkdirp-classic@0.5.3: {} - - ms@2.1.2: {} - - ms@2.1.3: {} - - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.5: - optionalDependencies: - msgpackr-extract: 3.0.3 - - napi-build-utils@2.0.0: {} - - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - neo-async@2.6.2: {} - - node-abi@3.78.0: - dependencies: - semver: 7.7.3 - - node-abort-controller@3.1.1: {} - - node-addon-api@5.1.0: {} - - node-adm@0.9.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-forge@1.3.1: {} - - node-gcm@1.1.4: - dependencies: - axios: 1.6.8(debug@3.2.7) - debug: 3.2.7(supports-color@5.5.0) - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.2 - optional: true - - node-int64@0.4.0: {} - - node-pushnotifications@3.1.1: - dependencies: - '@parse/node-apn': 6.0.1 - firebase-admin: 12.1.1 - node-adm: 0.9.1 - node-gcm: 1.1.4 - ramda: 0.30.1 - web-push: 3.6.7 - wns: 0.5.4 - transitivePeerDependencies: - - encoding - - supports-color - - node-releases@2.0.25: {} - - node-schedule@2.1.1: - dependencies: - cron-parser: 4.9.0 - long-timeout: 0.1.1 - sorted-array-functions: 1.3.0 - - nodemailer-mailgun-transport@2.1.5(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.12.1): - dependencies: - consolidate: 0.15.1(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.12.1) - form-data: 4.0.4 - mailgun.js: 8.2.2 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - debug - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - - nodemailer-sendgrid@1.0.3: - dependencies: - '@sendgrid/mail': 6.5.5 - - nodemailer@6.10.1: {} - - nodemon@2.0.22: - dependencies: - chokidar: 3.6.0 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 5.7.2 - simple-update-notifier: 1.1.0 - supports-color: 5.5.0 - touch: 3.1.1 - undefsafe: 2.0.5 - - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - oauth-sign@0.9.0: {} - - object-hash@2.2.0: {} - - object-hash@3.0.0: - optional: true - - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - oidc-token-hash@5.1.1: {} - - on-exit-leak-free@1.0.0: {} - - on-exit-leak-free@2.1.2: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - only@0.0.2: {} - - openid-client@5.7.1: - dependencies: - jose: 4.15.9 - lru-cache: 6.0.0 - object-hash: 2.2.0 - oidc-token-hash: 5.1.1 - - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - - optionator@0.9.4: - dependencies: - 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 - - os-tmpdir@1.0.2: {} - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-try@2.2.0: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parseley@0.12.1: - dependencies: - leac: 0.6.0 - peberminta: 0.9.0 - - parseurl@1.3.3: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-to-regexp@6.3.0: {} - - path-type@4.0.0: {} - - peberminta@0.9.0: {} - - performance-now@2.1.0: {} - - pg-cloudflare@1.2.7: - optional: true - - pg-connection-string@2.6.1: {} - - pg-connection-string@2.9.1: {} - - pg-cursor@2.15.3(pg@8.16.3): - dependencies: - pg: 8.16.3 - - pg-int8@1.0.1: {} - - pg-pool@3.10.1(pg@8.16.3): - dependencies: - pg: 8.16.3 - - pg-protocol@1.10.3: {} - - pg-query-stream@4.10.3(pg@8.16.3): - dependencies: - pg: 8.16.3 - pg-cursor: 2.15.3(pg@8.16.3) - - 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.16.3: - dependencies: - pg-connection-string: 2.9.1 - pg-pool: 3.10.1(pg@8.16.3) - pg-protocol: 1.10.3 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.2.7 - - pgpass@1.0.5: - dependencies: - split2: 4.2.0 - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - pino-abstract-transport@1.2.0: - dependencies: - readable-stream: 4.7.0 - split2: 4.2.0 - - pino-pretty@8.1.0: - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 2.1.7 - fast-safe-stringify: 2.1.1 - help-me: 4.2.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 1.0.0 - pino-abstract-transport: 1.2.0 - pump: 3.0.3 - readable-stream: 4.7.0 - secure-json-parse: 2.7.0 - sonic-boom: 3.8.1 - strip-json-comments: 3.1.1 - - pino-std-serializers@6.2.2: {} - - pino@8.21.0: - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.5.0 - on-exit-leak-free: 2.1.2 - 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.5.0 - sonic-boom: 3.8.1 - thread-stream: 2.7.0 - - pirates@4.0.7: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - possible-typed-array-names@1.1.0: {} - - postgres-array@2.0.0: {} - - postgres-bytea@1.0.0: {} - - postgres-date@1.0.7: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - - posthog-node@3.6.3: - dependencies: - axios: 1.12.2 - rusha: 0.8.14 - transitivePeerDependencies: - - debug - - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.1.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.78.0 - pump: 3.0.3 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.4 - tunnel-agent: 0.6.0 - - prelude-ls@1.1.2: {} - - prelude-ls@1.2.1: {} - - pretty-format@28.1.3: - dependencies: - '@jest/schemas': 28.1.3 - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - process-warning@3.0.0: {} - - process@0.11.10: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - proto3-json-serializer@2.0.2: - dependencies: - protobufjs: 7.5.4 - optional: true - - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 24.9.0 - long: 5.3.2 - optional: true - - proxy-from-env@1.1.0: {} - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - - pstree.remy@1.1.8: {} - - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - punycode@2.3.1: {} - - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - - qs@6.5.3: {} - - queue-microtask@1.2.3: {} - - quick-format-unescaped@4.0.4: {} - - ramda@0.30.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - raw-body@3.0.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.7.0 - unpipe: 1.0.0 - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - react-is@18.3.1: {} - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readline-sync@1.4.10: {} - - real-require@0.2.0: {} - - rechoir@0.8.0: - dependencies: - resolve: 1.22.10 - - redis-errors@1.2.0: {} - - redis-parser@3.0.0: - dependencies: - redis-errors: 1.2.0 - - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve-path@1.4.0: - dependencies: - http-errors: 1.6.3 - path-is-absolute: 1.0.1 - - resolve-pkg-maps@1.0.0: {} - - resolve.exports@1.1.1: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - retry-request@7.0.2: - dependencies: - '@types/request': 2.48.13 - extend: 3.0.2 - teeny-request: 9.0.0 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - retry@0.13.1: - optional: true - - reusify@1.1.0: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rrule@2.7.2: - dependencies: - tslib: 2.8.1 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rusha@0.8.14: {} - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-buffer@5.2.1: {} - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - safe-stable-stringify@2.5.0: {} - - safer-buffer@2.1.2: {} - - sax@1.4.1: {} - - secure-json-parse@2.7.0: {} - - selderee@0.11.0: - dependencies: - parseley: 0.12.1 - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.0.0: {} - - semver@7.7.3: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - 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 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - - setprototypeof@1.1.0: {} - - setprototypeof@1.2.0: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - signal-exit@3.0.7: {} - - 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-update-notifier@1.1.0: - dependencies: - semver: 7.0.0 - - sisteransi@1.0.5: {} - - slash@3.0.0: {} - - sonic-boom@3.8.1: - dependencies: - atomic-sleep: 1.0.0 - - sorted-array-functions@1.3.0: {} - - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - split2@4.2.0: {} - - sprintf-js@1.0.3: {} - - sprintf-js@1.1.3: {} - - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - stack-generator@2.0.10: - dependencies: - stackframe: 1.3.4 - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - stackframe@1.3.4: {} - - standard-as-callback@2.1.0: {} - - standardwebhooks@1.0.0: - dependencies: - '@stablelib/base64': 1.0.1 - fast-sha256: 1.3.0 - - static-eval@2.0.2: - dependencies: - escodegen: 1.14.3 - - statuses@1.5.0: {} - - statuses@2.0.1: {} - - std-env@3.10.0: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - stream-browserify@3.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - - stream-events@1.0.5: - dependencies: - stubs: 3.0.0 - optional: true - - stream-shift@1.0.3: - optional: true - - streamsearch@1.1.0: {} - - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-json-comments@2.0.1: {} - - strip-json-comments@3.1.1: {} - - strnum@1.1.2: - optional: true - - strnum@2.1.1: {} - - stubs@3.0.0: - optional: true - - superagent@8.1.2: - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.4.3 - fast-safe-stringify: 2.1.1 - form-data: 4.0.4 - formidable: 2.1.5 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.14.0 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - supertest@6.3.4: - dependencies: - methods: 1.1.2 - superagent: 8.1.2 - transitivePeerDependencies: - - supports-color - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - svix@1.77.0: - dependencies: - '@stablelib/base64': 1.0.1 - fast-sha256: 1.3.0 - uuid: 10.0.0 - - swr@2.3.4: - dependencies: - dequal: 2.0.3 - use-sync-external-store: 1.6.0 - - tar-fs@2.1.4: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tarn@3.0.2: {} - - teeny-request@9.0.0: - dependencies: - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - stream-events: 1.0.5 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - text-table@0.2.0: {} - - thread-stream@2.7.0: - dependencies: - real-require: 0.2.0 - - tildify@2.0.0: {} - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - tmpl@1.0.5: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - touch@3.1.1: {} - - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - - tr46@0.0.3: {} - - ts-jest@28.0.8(@babel/core@7.28.4)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.28.4))(jest@28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)))(typescript@4.9.5): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 28.1.3(@types/node@24.9.0)(ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5)) - jest-util: 28.1.3 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.3 - typescript: 4.9.5 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.28.4 - '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.28.4) - - ts-node@10.9.2(@types/node@24.9.0)(typescript@4.9.5): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.9.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - - tslib@2.8.1: {} - - tsscmp@1.0.6: {} - - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tweetnacl@0.14.5: {} - - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.0.8: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typeof-article@0.1.1: - dependencies: - kind-of: 3.2.2 - - typescript@4.9.5: {} - - uglify-js@3.19.3: - optional: true - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - undefsafe@2.0.5: {} - - underscore@1.12.1: {} - - undici-types@6.21.0: {} - - undici-types@7.16.0: {} - - unpipe@1.0.0: {} - - update-browserslist-db@1.1.3(browserslist@4.26.3): - dependencies: - browserslist: 4.26.3 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - url-join@4.0.1: {} - - use-sync-external-store@1.6.0: {} - - util-deprecate@1.0.2: {} - - uuid@10.0.0: {} - - uuid@11.1.0: {} - - uuid@3.4.0: {} - - uuid@8.3.2: - optional: true - - uuid@9.0.1: {} - - v8-compile-cache-lib@3.0.1: {} - - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - - vary@1.1.2: {} - - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - - verror@1.10.1: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - - web-push@3.6.7: - dependencies: - asn1.js: 5.4.1 - http_ece: 1.2.0 - https-proxy-agent: 7.0.6 - jws: 4.0.0 - minimist: 1.2.8 - transitivePeerDependencies: - - supports-color - - webidl-conversions@3.0.1: {} - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.10 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - wns@0.5.4: {} - - word-wrap@1.2.5: {} - - wordwrap@1.0.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - xml-crypto@3.2.1: - dependencies: - '@xmldom/xmldom': 0.8.11 - xpath: 0.0.32 - - xml-encryption@3.1.0: - dependencies: - '@xmldom/xmldom': 0.8.11 - escape-html: 1.0.3 - xpath: 0.0.32 - - xml2js@0.5.0: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - xmlbuilder@15.1.1: {} - - xpath@0.0.27: {} - - xpath@0.0.32: {} - - xtend@4.0.2: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - ylru@1.4.0: {} - - yn@3.1.1: {} - - yocto-queue@0.1.0: {} diff --git a/services/platform/public/uploads/.gitkeep b/services/platform/public/uploads/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/services/platform/src/api.ts b/services/platform/src/api.ts deleted file mode 100644 index 234ed1b4..00000000 --- a/services/platform/src/api.ts +++ /dev/null @@ -1,82 +0,0 @@ -import Koa from 'koa' -import koaBody from 'koa-body' -import cors from '@koa/cors' -import controllers, { SubRouter, register } from './config/controllers' -import { RequestError } from './core/errors' -import { logger } from './config/logger' -import Router from '@koa/router' - -export default class Api extends Koa { - router = new Router() - controllers?: Record - - constructor( - public app: import('./app').default, - ) { - super() - - this.proxy = process.env.NODE_ENV !== 'development' - - app.error.attach(this) - this.use(async (ctx, next) => { - logger.info({ method: ctx.method, path: ctx.path, query: ctx.query }, 'request') - try { - await next() - } catch (error: any) { - - logger.error({ error, ctx }, 'error') - if (error instanceof RequestError) { - ctx.status = error.statusCode ?? 400 - ctx.body = error - return - } else if (error.status === 404) { - return - } else { - ctx.status = 400 - ctx.body = process.env.NODE_ENV === 'production' - ? { - status: 'error', - error: 'An error occurred with this request.', - } - : { - status: 'error', - error: { - message: error.message, - stack: error.stack, - }, - } - } - - ctx.app.emit('error', error, ctx) - } - }) - - this.keys = [app.env.secret] - this.use(koaBody()) - .use(cors()) - - this.registerControllers() - } - - getControllers() { - return controllers() - } - - registerControllers() { - this.controllers = this.getControllers() - this.register(...Object.values(this.controllers)) - } - - register(...routers: SubRouter[]) { - const apiRouter = new Router({ prefix: '/api' }) - for (const router of routers.filter(r => !r.global)) { - register(apiRouter, router) - } - register(this.router, apiRouter) - for (const router of routers.filter(r => r.global)) { - register(this.router, router) - } - this.use(this.router.routes()) - .use(this.router.allowedMethods()) - } -} diff --git a/services/platform/src/app.ts b/services/platform/src/app.ts deleted file mode 100644 index e02ca1f4..00000000 --- a/services/platform/src/app.ts +++ /dev/null @@ -1,150 +0,0 @@ -import loadDatabase, { Database } from './config/database' -import loadQueue from './config/queue' -import loadStorage from './config/storage' -import loadError, { logger } from './config/logger' -import loadRateLimit, { RateLimiter } from './config/rateLimit' -import loadStats, { Stats } from './config/stats' -import type { Env } from './config/env' -import type Queue from './queue' -import Storage from './storage' -import { uuid } from './utilities' -import Api from './api' -import Worker from './worker' -import ErrorHandler from './error/ErrorHandler' -import { DefaultRedis, Redis } from './config/redis' -import EventEmitter from 'eventemitter2' - -export default class App { - private static $main: App - static get main() { - if (!App.$main) { - throw new Error('Instance not setup') - } - return App.$main - } - - static async init(this: T, env: Env): Promise> { - - logger.info('lunogram:initializing') - - // Boot up error tracking - const error = await loadError(env.logger) - - // Load & migrate database - const database = await loadDatabase(env.db) - - // Load queue - const queue = loadQueue(env.queue) - - // Load storage - const storage = loadStorage(env.storage) - - // Setup app - const app = new this(env, - database, - queue, - storage, - error, - ) as any - - this.setMain(app) - - return app - } - - static setMain(this: T, app: InstanceType) { - this.$main = app - return app - } - - uuid = uuid() - api?: Api - worker?: Worker - rateLimiter: RateLimiter - redis: Redis - stats: Stats - events = new EventEmitter({ wildcard: true, delimiter: ':' }) - #registered: { [key: string | number]: unknown } - - constructor( - public env: Env, - public db: Database, - public queue: Queue, - public storage: Storage, - public error: ErrorHandler, - ) { - this.#registered = {} - this.rateLimiter = loadRateLimit(env.redis) - this.redis = DefaultRedis(env.redis) - this.stats = loadStats(env.redis) - this.unhandledErrorListener() - } - - start() { - const runners = this.env.runners - if (runners.includes('api')) { - this.startApi() - } - if (runners.includes('worker')) { - this.startWorker() - } - return this - } - - startApi(api?: Api) { - this.api = api ?? new Api(this) - const server = this.api?.listen(this.env.port) - server.keepAliveTimeout = 65000 - server.requestTimeout = 0 - logger.info('lunogram:api ready') - } - - startWorker(worker?: Worker) { - this.worker = worker ?? new Worker(this) - this.worker?.run() - logger.info('lunogram:worker ready') - } - - async close() { - await this.worker?.close() - await this.db.destroy() - await this.queue.close() - await this.rateLimiter.close() - } - - get(key: number | string): T { - return this.#registered[key] as T - } - - set(key: number | string, value: unknown) { - this.#registered[key] = value - } - - remove(key: number | string) { - delete this.#registered[key] - } - - async forceClose(signal: string, reason: string, error?: Error) { - logger.error({ signal, error }, reason) - await this.close() - process.exit() - } - - unhandledErrorListener() { - ['exit', 'beforeExit', 'SIGINT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM'].forEach((eventType) => { - process.on(eventType, async () => { - await this.forceClose(eventType, `received exit signal: ${eventType}`) - }) - }) - - process.on('uncaughtException', async (error) => { - console.error('Uncaught exception:', error.stack || error) - await this.forceClose('uncaughtException', 'uncaught error', error) - }) - - process.on('unhandledRejection', async (error, promise) => { - console.error('Uncaught exception:', error instanceof Error ? error.stack || error : error) - await this.forceClose('unhandledRejection', `uncaught error: ${promise}, reason: ${error}`) - }) - } -} diff --git a/services/platform/src/auth/AccessToken.ts b/services/platform/src/auth/AccessToken.ts deleted file mode 100644 index ab6cbe96..00000000 --- a/services/platform/src/auth/AccessToken.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { UUID } from 'crypto' -import Model from '../core/Model' - -export class AccessToken extends Model { - admin_id!: UUID - expires_at!: Date - token!: string - revoked!: boolean - ip!: string - user_agent!: string -} diff --git a/services/platform/src/auth/Admin.ts b/services/platform/src/auth/Admin.ts deleted file mode 100644 index e1db00aa..00000000 --- a/services/platform/src/auth/Admin.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { OrganizationRole } from '../organizations/Organization' -import Model, { ModelParams } from '../core/Model' -import { UUID } from 'crypto' - -export default class Admin extends Model { - external_id?: string - organization_id!: UUID - email!: string - first_name?: string - last_name?: string - image_url?: string - role!: OrganizationRole -} - -export type AdminParams = Omit - -export type AuthAdminParams = Omit diff --git a/services/platform/src/auth/AdminController.ts b/services/platform/src/auth/AdminController.ts deleted file mode 100644 index 248b7fbc..00000000 --- a/services/platform/src/auth/AdminController.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Router from '@koa/router' -import { extractQueryParams } from '../utilities' -import { searchParamsSchema } from '../core/searchParams' -import { createOrUpdateAdmin, getAdmin, pagedAdmins } from './AdminRepository' -import { AuthState } from './AuthMiddleware' -import { Context } from 'koa' -import { getOrganization, organizationRoleMiddleware, requireOrganizationRole } from '../organizations/OrganizationService' -import Admin from './Admin' -import { organizationRoles } from '../organizations/Organization' -import { JSONSchemaType, validate } from '../core/validate' -import { validate as uuidValidate } from 'uuid' -import { UUID } from 'crypto' - -const router = new Router< - AuthState & { modelAdmin?: Admin } ->({ - prefix: '/organizations/admins', -}) - -router.use(async (ctx: Context, next: () => void) => { - ctx.state.organization = await getOrganization(ctx.state.admin.organization_id) - return next() -}) - -router.use(organizationRoleMiddleware('admin')) - -router.get('/', async ctx => { - const organizationId = ctx.state.admin!.organization_id - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedAdmins(organizationId, params) -}) - -router.get('/whoami', async ctx => { - ctx.body = await getAdmin(ctx.state.admin!.id, ctx.state.admin!.organization_id) -}) - -const orgAdminParamsSchema: JSONSchemaType> = { - $id: 'orgAdminParams', - type: 'object', - required: ['role', 'email'], - properties: { - email: { - type: 'string', - format: 'email', - }, - role: { - type: 'string', - enum: organizationRoles, - }, - first_name: { type: 'string', nullable: true }, - last_name: { type: 'string', nullable: true }, - }, -} -router.post('/', async ctx => { - const { role, email, first_name, last_name } = validate(orgAdminParamsSchema, ctx.request.body) - - // Ensure you dont add someone above your own role - requireOrganizationRole(ctx.state.admin!, role) - - ctx.body = await createOrUpdateAdmin({ - organization_id: ctx.state.admin!.organization_id, - email, - role, - first_name, - last_name, - }) -}) - -router.param('adminId', async (value, ctx, next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid admin ID') - return - } - - ctx.state.modelAdmin = await getAdmin(value as UUID, ctx.state.admin!.organization_id) - if (!ctx.state.modelAdmin) { - ctx.throw(404) - return - } - return await next() -}) - -router.get('/:adminId', async ctx => { - ctx.body = ctx.state.modelAdmin -}) - -router.patch('/:adminId', async ctx => { - const { role, email, first_name, last_name } = validate(orgAdminParamsSchema, ctx.request.body) - - // Ensure you dont add someone above your own role - requireOrganizationRole(ctx.state.admin!, role) - - // Update the user with correct details - ctx.body = Admin.updateAndFetch(ctx.state.modelAdmin!.id, { - role, - email, - first_name, - last_name, - }) -}) - -router.delete('/:adminId', async ctx => { - requireOrganizationRole(ctx.state.admin!, ctx.state.modelAdmin!.role) - await Admin.deleteById(ctx.state.modelAdmin!.id) - - ctx.body = true -}) - -export default router diff --git a/services/platform/src/auth/AdminRepository.ts b/services/platform/src/auth/AdminRepository.ts deleted file mode 100644 index 2b55d476..00000000 --- a/services/platform/src/auth/AdminRepository.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { UUID } from 'crypto' -import { PageParams } from '../core/searchParams' -import Admin, { AdminParams } from './Admin' - -export const pagedAdmins = async (organizationId: UUID, params: PageParams) => { - return await Admin.search( - { ...params, fields: ['first_name', 'last_name', 'email'] }, - qb => qb.where('organization_id', organizationId), - ) -} - -export const getAdmin = async (id: UUID, organizationId: UUID): Promise => { - return await Admin.find(id, qb => qb.where('organization_id', organizationId)) -} - -export const getAdminById = async (id: UUID): Promise => { - return await Admin.find(id) -} - -export const getAdminByExternalId = async (id: string): Promise => { - return await Admin.first(qb => qb.where('external_id', id)) -} - -export const getAdminByEmail = async (email: string): Promise => { - return await Admin.first(qb => qb.where('email', email)) -} - -export const createOrUpdateAdmin = async ({ organization_id, ...params }: AdminParams): Promise => { - const admin = await getAdminByEmail(params.email) - - if (admin?.id) { - return Admin.updateAndFetch(admin.id, params) - } else { - return Admin.insertAndFetch({ - ...params, - organization_id, - }) - } -} - -export const deleteAdmin = async (id: UUID): Promise => { - await Admin.delete(qb => qb.where('id', id)) -} diff --git a/services/platform/src/auth/Auth.ts b/services/platform/src/auth/Auth.ts deleted file mode 100644 index 7a9d4949..00000000 --- a/services/platform/src/auth/Auth.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Context } from 'koa' -import AuthProvider from './AuthProvider' -import OpenIDProvider, { OpenIDConfig } from './OpenIDAuthProvider' -import GoogleProvider, { GoogleConfig } from './GoogleAuthProvider' -import CloudProvider, { CloudConfig } from './CloudAuthProvider' -import SAMLProvider, { SAMLConfig } from './SAMLAuthProvider' -import { DriverConfig } from '../config/env' -import BasicAuthProvider, { BasicAuthConfig } from './BasicAuthProvider' -import Organization from '../organizations/Organization' -import App from '../app' -import EmailAuthProvider, { EmailAuthConfig } from './EmailAuthProvider' - -export type AuthProviderName = 'basic' | 'email' | 'saml' | 'openid' | 'google' | 'cloud' - -export type AuthProviderConfig = BasicAuthConfig | EmailAuthConfig | SAMLConfig | OpenIDConfig | GoogleConfig | CloudConfig - -export interface AuthConfig { - driver: AuthProviderName[] - tokenLife: number - jwt: JWTConfig - basic: BasicAuthConfig - email: EmailAuthConfig - saml: SAMLConfig - openid: OpenIDConfig - google: GoogleConfig - cloud: CloudConfig -} - -export interface JWTConfig { - jwksUrl?: string -} - -export { BasicAuthConfig, SAMLConfig, OpenIDConfig } - -export interface AuthTypeConfig extends DriverConfig { - driver: AuthProviderName - name?: string -} - -interface AuthMethod { - driver: AuthProviderName - name: string - publicConfig?: { [key: string]: string } -} - -export const initProvider = (config?: AuthProviderConfig): AuthProvider => { - switch (config?.driver) { - case 'basic': - return new BasicAuthProvider(config) - case 'email': - return new EmailAuthProvider(config) - case 'saml': - return new SAMLProvider(config) - case 'openid': - return new OpenIDProvider(config) - case 'google': - return new GoogleProvider(config) - case 'cloud': - return new CloudProvider(config) - default: - throw new Error('A valid auth driver must be set!') - } -} - -export const authMethods = async (): Promise => { - return mapMethods(App.main.env.auth) -} - -export const checkAuth = (organization?: Organization): boolean => { - return organization != null && organization.auth != null -} - -export const startAuth = async (ctx: Context): Promise => { - const provider = await loadProvider(ctx) - return await provider.start(ctx) -} - -export const validateAuth = async (ctx: Context): Promise => { - const provider = await loadProvider(ctx) - return await provider.validate(ctx) -} - -export const authWebhook = async (ctx: Context): Promise => { - const provider = await loadProvider(ctx) - if (!provider.webhook) { - return ctx.throw(404) - } - - return await provider.webhook(ctx) -} - -const loadProvider = async (ctx: Context): Promise => { - const driver = ctx.params.driver as AuthProviderName - return initProvider(App.main.env.auth[driver]) -} - -const mapMethods = (config: AuthConfig): AuthMethod[] => { - const drivers = config.driver - return drivers.map((driver) => mapMethod(config[driver])) -} - -const mapMethod = ({ driver, name }: AuthTypeConfig): AuthMethod => ({ - driver, - name: name ?? `Continue with ${driver}`, -}) diff --git a/services/platform/src/auth/AuthController.ts b/services/platform/src/auth/AuthController.ts deleted file mode 100644 index 4ffe6ee0..00000000 --- a/services/platform/src/auth/AuthController.ts +++ /dev/null @@ -1,46 +0,0 @@ -import Router from '@koa/router' -import { getOrganizationByEmail } from '../organizations/OrganizationService' -import Organization from '../organizations/Organization' -import { authMethods, authWebhook, checkAuth, startAuth, validateAuth } from './Auth' - -const router = new Router<{ - organization?: Organization -}>({ - prefix: '/auth', -}) - -router.get('/methods', async ctx => { - ctx.body = await authMethods() -}) - -router.post('/check', async ctx => { - const email = ctx.query.email || ctx.request.body.email - const organization = await getOrganizationByEmail(email) - ctx.body = checkAuth(organization) -}) - -router.get('/login/:driver', async ctx => { - ctx.status = 204 - await startAuth(ctx) -}) - -router.post('/login/:driver', async ctx => { - ctx.status = 204 - await startAuth(ctx) -}) - -router.get('/login/:driver/callback', async ctx => { - ctx.status = 204 - await validateAuth(ctx) -}) - -router.post('/login/:driver/callback', async ctx => { - ctx.status = 204 - await validateAuth(ctx) -}) - -router.post('/:driver/webhook', async ctx => { - await authWebhook(ctx) -}) - -export default router diff --git a/services/platform/src/auth/AuthError.ts b/services/platform/src/auth/AuthError.ts deleted file mode 100644 index d3b6726e..00000000 --- a/services/platform/src/auth/AuthError.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ErrorType } from '../core/errors' - -export default { - AuthorizationError: { - message: 'Authorization error.', - code: 1000, - statusCode: 401, - }, - InvalidRefreshToken: { - message: 'The refresh token provided is invalid.', - code: 1001, - }, - InvalidToken: { - message: 'The access token provided is invalid.', - code: 1001, - }, - SAMLValidationError: { - message: 'Unable to parse response from SSO.', - code: 1002, - }, - AdminNotFound: { - message: 'The admin user matching the provided criteria does not exist.', - code: 1003, - }, - InvalidDomain: { - message: 'The provided email does not have access to access this site.', - code: 1004, - }, - InvalidEmail: { - message: 'The email address provided is invalid or not present.', - code: 1005, - }, - OpenIdValidationError: { - message: 'Unable to parse response from OpenID.', - code: 1006, - }, - AccessDenied: { - message: 'Access denied.', - code: 1007, - statusCode: 403, - }, - MissingCredentials: { - message: 'An email and password must be provided to login.', - code: 1008, - statusCode: 400, - }, - InvalidCredentials: { - message: 'The email and password combination provided is invalid.', - code: 1008, - statusCode: 400, - }, -} as Record diff --git a/services/platform/src/auth/AuthMiddleware.ts b/services/platform/src/auth/AuthMiddleware.ts deleted file mode 100644 index 6bb3dcfb..00000000 --- a/services/platform/src/auth/AuthMiddleware.ts +++ /dev/null @@ -1,215 +0,0 @@ -import jwt, { Jwt, JwtHeader, JwtPayload, SigningKeyCallback } from 'jsonwebtoken' -import jwks from 'jwks-rsa' -import { Context } from 'koa' -import App from '../app' -import { RequestError } from '../core/errors' -import Project, { ProjectRole } from '../projects/Project' -import { ProjectApiKey } from '../projects/ProjectApiKey' -import { getProjectApiKey } from '../projects/ProjectService' -import AuthError from './AuthError' -import { getCookiesOAuthToken } from './TokenRepository' -import { OrganizationRole } from '../organizations/Organization' -import { UUID } from 'node:crypto' -import { getAdminByExternalId, getAdminById } from './AdminRepository' -import Admin from './Admin' - -export interface JwtAdmin { - id: UUID - organization_id: UUID - role: OrganizationRole -} - -export interface State { - app: App -} - -type AuthScope = 'admin' | 'public' | 'secret' -export interface AuthState { - scope: AuthScope - admin?: JwtAdmin - key?: ProjectApiKey -} - -export interface ProjectState extends AuthState { - project: Project - projectRole: ProjectRole -} - -export function retrieveAuthToken(ctx: Context): string | undefined { - const tokenSameOrigin = ctx.cookies.get('__session') - const tokenCrossOrigin = ctx.headers.authorization - const tokenOAuth = getCookiesOAuthToken(ctx)?.access_token - return tokenOAuth || tokenSameOrigin || tokenCrossOrigin -} - -const parseAuth = async (ctx: Context) => { - const token = retrieveAuthToken(ctx) - - if (!token) { - throw new RequestError(AuthError.AuthorizationError) - } - - if (isPublicKey(token)) { - return createPublicScope(parseBearer(token)) - } - - if (isSecretKey(token)) { - return createSecretScope(parseBearer(token)) - } - - return await createAdminScope(token) -} - -function parseBearer(token: string) { - return token.replace('Bearer ', '') -} - -function isPublicKey(token: string): boolean { - return token.startsWith('Bearer pk_') -} - -function isSecretKey(token: string): boolean { - return token.startsWith('Bearer sk_') -} - -async function createPublicScope(token: string) { - return { - scope: 'public' as const, - key: await getProjectApiKey(token), - } -} - -async function createSecretScope(token: string) { - return { - scope: 'secret' as const, - key: await getProjectApiKey(token), - } -} - -async function createAdminScope(token: string) { - const payload = await jwtVerify(token) - if (!payload || !payload.sub) { - throw new RequestError(AuthError.InvalidToken) - } - - let admin: Admin | undefined - if (payload.iss && payload.iss !== App.main.env.baseUrl) { - admin = await getAdminByExternalId(payload.sub) - } - - if (!admin) { - admin = await getAdminById(payload.sub as UUID) - } - - if (!admin) { - throw new RequestError(AuthError.InvalidToken) - } - - return { - scope: 'admin' as const, - admin: { - id: admin.id, - organization_id: admin.organization_id, - role: admin.role, - }, - } -} - -export async function authMiddleware(ctx: Context, next: () => void) { - try { - const state = await parseAuth(ctx) - ctx.state = { ...ctx.state, ...state } - } catch (error) { - throw new RequestError(AuthError.AuthorizationError) - } - return next() -} - -export const scopeMiddleware = (scope: string | string[]) => { - const scopes = Array.isArray(scope) ? scope : [scope] - return async function authMiddleware(ctx: Context, next: () => void) { - if (!scopes.includes(ctx.state.scope)) { - throw new RequestError(AuthError.AccessDenied) - } - return next() - } -} - -let jwksClient: jwks.JwksClient | undefined - -export const jwtVerify = async (token: string): Promise => { - const secret = App.main.env.secret - - if (App.main.env.auth.jwt.jwksUrl) { - jwksClient = jwks({ - jwksUri: App.main.env.auth.jwt.jwksUrl, - cache: true, - rateLimit: true, - }) - } - - if (jwksClient) { - const options: jwt.VerifyOptions = { algorithms: ['RS256'] } - - const getKey = (header: JwtHeader, callback: SigningKeyCallback) => { - if (!header.kid) { - return callback(new Error('Missing KID in token header')) - } - jwksClient!.getSigningKey(header.kid, (err, key) => { - if (err) return callback(err) - if (!key) return callback(new Error('No signing key found')) - const signingKey = key.getPublicKey() - callback(null, signingKey) - }) - } - - // Verify the token using the dynamic JWKS public key - return new Promise((resolve, reject) => { - jwt.verify(token, getKey, options, (err, decoded) => { - if (err) { - return reject(new RequestError(AuthError.InvalidToken)) - } - if (!validJWTToken(decoded)) { - return reject(new RequestError(AuthError.InvalidToken)) - } - resolve(decoded as JwtPayload) - }) - }) - } - - return new Promise((resolve, reject) => { - jwt.verify(token, secret, (err, decoded) => { - if (err) { - return reject(new RequestError(AuthError.InvalidToken)) - } - if (!validJWTToken(decoded)) { - return reject(new RequestError(AuthError.InvalidToken)) - } - resolve(decoded as JwtPayload) - }) - }) -} - -function validJWTToken(decoded: string | JwtPayload | Jwt | undefined): boolean { - if (decoded === undefined || typeof decoded === 'string') { - return false - } - - let payload = decoded as JwtPayload - if (decoded.payload) { - payload = decoded.payload - } - - const currentTime = Math.floor(Date.now() / 1000) - if (payload.exp && payload.exp < currentTime) { - return false - } - - if (payload.nbf && payload.nbf > currentTime) { - return false - } - - // TODO: validate the token's authorized party (azp) claim - - return true -} diff --git a/services/platform/src/auth/AuthProvider.ts b/services/platform/src/auth/AuthProvider.ts deleted file mode 100644 index 370dcb89..00000000 --- a/services/platform/src/auth/AuthProvider.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Context } from 'koa' -import App from '../app' -import Admin, { AuthAdminParams } from './Admin' -import { getAdminByEmail } from './AdminRepository' -import { generateAccessToken, OAuthResponse, setCookiesOauthToken } from './TokenRepository' -import Organization from '../organizations/Organization' -import { State } from './AuthMiddleware' -import { createOrganization } from '../organizations/OrganizationService' - -type OrgState = State & { organization?: Organization } -export type AuthContext = Context & { state: OrgState } - -export default abstract class AuthProvider { - abstract start(ctx: AuthContext): Promise - abstract validate(ctx: AuthContext): Promise - webhook?(ctx: AuthContext): Promise - - async loadAuthOrganization(ctx: AuthContext): Promise<{ organization: Organization, isNew: boolean }> { - // If we have an organization or can find one by domain - // we use that to start - const organization = ctx.state.organization - if (organization) return { organization, isNew: false } - - // If there is no organization at all or are in multi-org mode - // and have no org for the user, create one - return { - organization: await createOrganization(), - isNew: true, - } - } - - async login({ ...params }: AuthAdminParams, ctx: AuthContext, redirect?: string): Promise { - // Check for existing, otherwise create one - let admin = await getAdminByEmail(params.email) - if (!admin) { - const { organization, isNew } = await this.loadAuthOrganization(ctx) - admin = await Admin.insertAndFetch({ - ...params, - organization_id: organization.id, - role: isNew ? 'owner' : 'member', - }) - } - - return await this.generateOauth(admin, ctx, redirect) - } - - private async generateOauth(admin: Admin, ctx?: AuthContext, redirect?: string) { - const oauth = await generateAccessToken(admin, ctx) - - if (ctx) { - setCookiesOauthToken(ctx, oauth) - ctx.redirect(redirect || App.main.env.baseUrl) - } - return oauth - } -} diff --git a/services/platform/src/auth/BasicAuthProvider.ts b/services/platform/src/auth/BasicAuthProvider.ts deleted file mode 100644 index ced167cb..00000000 --- a/services/platform/src/auth/BasicAuthProvider.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Context } from 'koa' -import { AuthTypeConfig } from './Auth' -import AuthProvider from './AuthProvider' -import App from '../app' -import { firstQueryParam } from '../utilities' -import { RequestError } from '../core/errors' -import AuthError from './AuthError' - -export interface BasicAuthConfig extends AuthTypeConfig { - driver: 'basic' - email: string - password: string -} - -export default class BasicAuthProvider extends AuthProvider { - private config: BasicAuthConfig - constructor(config: BasicAuthConfig) { - super() - this.config = config - } - - async start(ctx: Context) { - const redirect = firstQueryParam(ctx.request.query.r) - - // Redirect to the login form - ctx.redirect(new URL(`/login/basic?r=${redirect}`, App.main.env.baseUrl).toString()) - } - - async validate(ctx: Context) { - const { email, password } = ctx.request.body - if (!email || !password) throw new RequestError(AuthError.MissingCredentials) - - // Check email and password match - if (email !== this.config.email || password !== this.config.password) { - throw new RequestError(AuthError.InvalidCredentials) - } - - // Process the login - await this.login({ email, first_name: 'Admin' }, ctx) - } -} diff --git a/services/platform/src/auth/CloudAuthProvider.ts b/services/platform/src/auth/CloudAuthProvider.ts deleted file mode 100644 index 98479981..00000000 --- a/services/platform/src/auth/CloudAuthProvider.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { AuthTypeConfig } from './Auth' -import { RequestError } from '../core/errors' -import AuthError from './AuthError' -import { jwtVerify, retrieveAuthToken } from './AuthMiddleware' -import AuthProvider, { AuthContext } from './AuthProvider' -import { createOrUpdateAdmin, deleteAdmin, getAdminByExternalId } from './AdminRepository' -import { createOrganization } from '../organizations/OrganizationService' -import { createClerkClient, ClerkClient, WebhookEvent } from '@clerk/backend' -import { logger } from '../config/logger' -import { Webhook } from 'svix' -import getRawBody from 'raw-body' - -export interface CloudConfig extends AuthTypeConfig { - driver: 'cloud' - secretKey: string - webhookSecret: string -} - -export default class CloudAuthProvider extends AuthProvider { - private client: ClerkClient - private webhookClient?: Webhook - - constructor(config: CloudConfig) { - super() - - this.webhookClient = config.webhookSecret ? new Webhook(config.webhookSecret) : undefined - this.client = createClerkClient({ - secretKey: config.secretKey, - }) - } - - async start(): Promise { - throw new Error('Method not implemented.') - } - - async validate(ctx: AuthContext): Promise { - logger.trace('Validating cloud Auth...') - - const token = retrieveAuthToken(ctx) - if (!token) { - logger.error('No token provided') - throw new RequestError(AuthError.InvalidToken) - } - - const payload = await jwtVerify(token) - if (!payload || !payload.sub) { - logger.error('Invalid JWT payload') - throw new RequestError(AuthError.InvalidToken) - } - - const admin = await getAdminByExternalId(payload.sub) - if (!admin) { - const user = await this.client.users.getUser(payload.sub) - if (!user) { - logger.error(`Clerk user not found: ${payload.sub}`) - throw new RequestError(AuthError.InvalidToken) - } - - const primaryEmailAddress = user.primaryEmailAddress - if (!primaryEmailAddress) { - logger.error(`Clerk user has no email: ${payload.sub}`) - throw new RequestError(AuthError.InvalidEmail) - } - - const organization = await createOrganization() - await createOrUpdateAdmin({ - email: primaryEmailAddress.emailAddress, - external_id: payload.sub, - organization_id: organization.id, - role: 'owner', - }) - } - } - - async webhook(ctx: AuthContext) { - if (!this.webhookClient) { - logger.error('Webhook client not configured') - throw new RequestError(AuthError.AccessDenied) - } - - const svixId = ctx.req.headers['svix-id'] - const svixTimestamp = ctx.req.headers['svix-timestamp'] - const svixSignature = ctx.req.headers['svix-signature'] - - if (!svixId || !svixTimestamp || !svixSignature) { - logger.error('Missing Svix headers') - throw new RequestError(AuthError.AccessDenied) - } - - const payloadString = (await getRawBody(ctx.req)).toString('utf8') - const { type, data } = this.webhookClient.verify(payloadString, { - 'svix-id': svixId as string, - 'svix-timestamp': svixTimestamp as string, - 'svix-signature': svixSignature as string, - }) as WebhookEvent - - switch (type) { - case 'user.created': { - const createdExternalAdmin = await getAdminByExternalId(data.id) - if (createdExternalAdmin) { - return - } - - const primaryEmailAddress = data.email_addresses?.find((email: any) => email.id === data.primary_email_address_id) - if (!primaryEmailAddress) { - logger.error(`Clerk user has no email: ${data.id}`) - throw new RequestError(AuthError.InvalidEmail) - } - - const organization = await createOrganization() - await createOrUpdateAdmin({ - email: primaryEmailAddress?.email_address, - external_id: data.id, - organization_id: organization.id, - role: 'owner', - }) - break - } - case 'user.updated': { - const updatedExternalAdmin = await getAdminByExternalId(data.id) - if (!updatedExternalAdmin) { - return - } - - const primaryEmailAddress = data.email_addresses?.find((email) => email.id === data.primary_email_address_id) - if (!primaryEmailAddress) { - logger.error(`Clerk user has no email: ${data.id}`) - throw new RequestError(AuthError.InvalidEmail) - } - - updatedExternalAdmin.email = primaryEmailAddress.email_address - await createOrUpdateAdmin(updatedExternalAdmin) - break - } - case 'user.deleted': { - if (!data.id) { - return - } - - const deletedExternalAdmin = await getAdminByExternalId(data.id) - if (!deletedExternalAdmin) { - return - } - - await deleteAdmin(deletedExternalAdmin.id) - break - } - } - } -} diff --git a/services/platform/src/auth/EmailAuthProvider.ts b/services/platform/src/auth/EmailAuthProvider.ts deleted file mode 100644 index 8f6200ad..00000000 --- a/services/platform/src/auth/EmailAuthProvider.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Context } from 'koa' -import { AuthTypeConfig } from './Auth' -import AuthProvider from './AuthProvider' -import App from '../app' -import { firstQueryParam } from '../utilities' -import { RequestError } from '../core/errors' -import AuthError from './AuthError' -import { sign } from 'jsonwebtoken' -import { addSeconds } from 'date-fns' -import SMTPEmailProvider, { SMTPDataParams } from '../providers/email/SMPTEmailProvider' -import { jwtVerify } from './AuthMiddleware' - -export interface EmailAuthConfig extends AuthTypeConfig, SMTPDataParams { - driver: 'email' - from: string -} - -export default class EmailAuthProvider extends AuthProvider { - - private config: EmailAuthConfig - private provider: SMTPEmailProvider - constructor(config: EmailAuthConfig) { - super() - this.config = config - this.provider = SMTPEmailProvider.fromJson(config) - this.provider.boot() - } - - async start(ctx: Context) { - - const redirect = firstQueryParam(ctx.request.query.r) - const email = ctx.request.body.email - - if (email) { - await this.send(email, redirect) - } else { - ctx.redirect(new URL(`/login/email?r=${redirect}`, App.main.env.baseUrl).toString()) - } - } - - async validate(ctx: Context) { - const token = firstQueryParam(ctx.request.query.token) - if (!token) throw new RequestError(AuthError.MissingCredentials) - - const { email } = await jwtVerify(token) as { email: string } - await this.login({ - email, - first_name: 'Admin', - }, ctx) - } - - async send(email: string, redirect: string | undefined) { - - // JWT with a fifteen minute expiration - const expiresAt = addSeconds(Date.now(), 15 * 60) - const token = sign({ - email, - exp: Math.floor(expiresAt.getTime() / 1000), - }, App.main.env.secret) - - // Generate the link - const link = new URL('/auth/login/email/callback', App.main.env.apiBaseUrl) - link.searchParams.set('token', token) - if (redirect) link.searchParams.set('r', redirect) - - // Send the message - await this.provider.send({ - to: email, - from: this.config.from, - subject: 'Login to Lunogram', - html: this.generateMessage(link.toString()), - text: `Click the link below to login to Lunogram: ${link}`, - }) - } - - generateMessage(link: string) { - return ` - - - - - -
- - - - - - -
- - Logo - -
- - - - - - -
-

Hello!

-

You asked us to send you a magic link to get you signed in to Lunogram! Hit the button below to continue.

- Sign in to Lunogram -

Note: The link expires after 15 minutes.

-
-
- - - ` - } -} diff --git a/services/platform/src/auth/GoogleAuthProvider.ts b/services/platform/src/auth/GoogleAuthProvider.ts deleted file mode 100644 index 77c0ae18..00000000 --- a/services/platform/src/auth/GoogleAuthProvider.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { AuthTypeConfig } from './Auth' -import AuthProvider, { AuthContext } from './AuthProvider' -import OpenIDAuthProvider from './OpenIDAuthProvider' - -export interface GoogleConfig extends AuthTypeConfig { - driver: 'google' - clientId: string - clientSecret: string - redirectUri: string -} - -export default class GoogleAuthProvider extends AuthProvider { - private provider: OpenIDAuthProvider - constructor(config: GoogleConfig) { - super() - this.provider = new OpenIDAuthProvider({ - ...config, - driver: 'openid', - issuerUrl: 'https://accounts.google.com', - responseTypes: ['id_token'], - }) - } - - async start(ctx: AuthContext): Promise { - return await this.provider.start(ctx) - } - - async validate(ctx: AuthContext): Promise { - return await this.provider.validate(ctx) - } -} diff --git a/services/platform/src/auth/OpenIDAuthProvider.ts b/services/platform/src/auth/OpenIDAuthProvider.ts deleted file mode 100644 index 8b5f0880..00000000 --- a/services/platform/src/auth/OpenIDAuthProvider.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { addSeconds } from 'date-fns' -import { Issuer, generators, BaseClient, IdTokenClaims } from 'openid-client' -import { RequestError } from '../core/errors' -import AuthError from './AuthError' -import { AuthTypeConfig } from './Auth' -import AuthProvider, { AuthContext } from './AuthProvider' -import { firstQueryParam } from '../utilities' -import App from '../app' - -export interface OpenIDConfig extends AuthTypeConfig { - driver: 'openid' - issuerUrl: string - clientId: string - clientSecret: string - redirectUri: string - domain?: string - responseTypes: string[] -} - -export default class OpenIDAuthProvider extends AuthProvider { - private config: OpenIDConfig - private client!: BaseClient - constructor(config: OpenIDConfig) { - super() - this.config = config - - this.getClient() - } - - async start(ctx: AuthContext): Promise { - - const client = await this.getClient() - - const nonce = generators.nonce() - ctx.cookies.set('nonce', nonce, { - secure: ctx.request.secure, - httpOnly: true, - expires: addSeconds(Date.now(), 3600), - signed: true, - }) - - const state = firstQueryParam(ctx.request.query.r) - - ctx.cookies.set('relaystate', state, { - secure: ctx.request.secure, - httpOnly: true, - expires: addSeconds(Date.now(), 3600), - signed: true, - }) - - const organization = ctx.state.organization - if (organization) { - ctx.cookies.set('organization', `${organization.id}`, { - secure: ctx.request.secure, - httpOnly: true, - expires: addSeconds(Date.now(), 3600), - signed: true, - }) - } - - const url = client.authorizationUrl({ - scope: 'openid email profile', - response_mode: 'form_post', - nonce, - redirect_uri: this.config.redirectUri, - state, - }) - - ctx.redirect(url) - } - - async validate(ctx: AuthContext): Promise { - const client = await this.getClient() - - // Unsafe cast, but Koa and library don't play nicely - const params = client.callbackParams(ctx.request as any) - const nonce = ctx.cookies.get('nonce', { signed: true }) - const state = params.state ?? ctx.cookies.get('relaystate', { signed: true }) - - try { - const tokenSet = await client.callback(this.config.redirectUri, params, { nonce, state }) - - const claims = tokenSet.claims() - if (!claims.email) { - throw new RequestError(AuthError.InvalidEmail) - } - - const admin = { - email: claims.email, - first_name: claims.given_name ?? claims.name, - last_name: claims.family_name, - image_url: claims.picture, - } - - await this.login(admin, ctx, state) - - ctx.cookies.set('nonce', null) - ctx.cookies.set('relaystate', null) - ctx.cookies.set('organization', null) - } catch (error: any) { - App.main.error.notify(error) - throw new RequestError(AuthError.OpenIdValidationError) - } - } - - private async getClient(): Promise { - if (this.client) return this.client - - const issuer = await Issuer.discover(this.config.issuerUrl) - - // TODO: Should we validate that we can use the issuer? - this.client = new issuer.Client({ - client_id: this.config.clientId, - client_secret: this.config.clientSecret, - redirect_uris: [this.config.redirectUri], - response_types: this.config.responseTypes ?? ['id_token'], - }) - return this.client - } - - private getDomain(claims: IdTokenClaims): string | undefined { - if (claims.hd && typeof claims.hd === 'string') { - return claims.hd - } - } -} diff --git a/services/platform/src/auth/SAMLAuthProvider.ts b/services/platform/src/auth/SAMLAuthProvider.ts deleted file mode 100644 index 53aa8ee2..00000000 --- a/services/platform/src/auth/SAMLAuthProvider.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Profile, SAML } from '@node-saml/node-saml' -import { SignatureAlgorithm } from '@node-saml/node-saml/lib/types' -import { Context } from 'koa' -import { URL } from 'url' -import { RequestError } from '../core/errors' -import { AuthTypeConfig } from './Auth' -import AuthProvider from './AuthProvider' -import AuthError from './AuthError' -import { firstQueryParam } from '../utilities' -import { addSeconds } from 'date-fns' - -export interface SAMLConfig extends AuthTypeConfig { - driver: 'saml' - callbackUrl: string // our url? - entryPoint: string // SSO url? - issuer: string - cert: string - identifierFormat?: string - signatureAlgorithm?: SignatureAlgorithm - digestAlgorithm?: SignatureAlgorithm - wantAuthnResponseSigned?: boolean -} - -// { -// issuer: 'https://accounts.google.com/o/saml2?idpid=C04a7bn68', -// sessionIndex: '_c6cf1198b7b67a9a4f8500f1ae22b79c', -// nameID: 'canderson@twochris.com', -// nameIDFormat: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', -// nameQualifier: undefined, -// spNameQualifier: undefined, -// firstName: 'Chris', -// lastName: 'Anderson', -// attributes: { firstName: 'Chris', lastName: 'Anderson' }, -// getAssertionXml: [Function (anonymous)], -// getAssertion: [Function (anonymous)], -// getSamlResponseXml: [Function (anonymous)] -// }, - -interface SAMLProfile extends Profile { - first_name?: string - last_name?: string -} - -interface SAMLResponse { - profile: Profile | null - loggedOut: boolean -} - -interface ValidatedSAMLResponse extends SAMLResponse { - profile: SAMLProfile | null -} - -export default class SAMLAuthProvider extends AuthProvider { - - saml: SAML - constructor(config: SAMLConfig) { - super() - this.saml = new SAML(config) - } - - async start(ctx: Context) { - const host = ctx.request.headers?.host - - const { r } = ctx.request.query - const relayState = (Array.isArray(r) ? r[0] : r) || '' - - const url = await this.saml.getAuthorizeUrlAsync(relayState, host, {}) - - const organization = ctx.state.organization - if (organization) { - ctx.cookies.set('organization', `${organization.id}`, { - secure: ctx.request.secure, - httpOnly: true, - expires: addSeconds(Date.now(), 3600), - signed: true, - }) - } - - ctx.redirect(url) - } - - async validate(ctx: Context) { - const result = await this.parseValidation(ctx) - if (!result) throw new RequestError(AuthError.SAMLValidationError) - - const [response, state] = result - - // If there is no profile we take no action - if (!response.profile) throw new RequestError(AuthError.SAMLValidationError) - if (response.loggedOut) { - return - } - - // If we are logging in, grab profile and create tokens - const { first_name, last_name, nameID: email } = response.profile - if (!email) throw new RequestError(AuthError.SAMLValidationError) - - await this.login({ first_name, last_name, email }, ctx, state) - - ctx.cookies.set('organization', null) - } - - private getDomain(email: string): string | undefined { - return email?.split('@')[1] - } - - private async parseValidation(ctx: Context): Promise<[ValidatedSAMLResponse, string?] | undefined> { - const { query, body, href } = ctx.request - if (query?.SAMLResponse || query?.SAMLRequest) { - const originalQuery = new URL(href).href - const { RelayState } = query - return [ - await this.saml.validateRedirectAsync(query, originalQuery), - firstQueryParam(RelayState), - ] - } else if (body?.SAMLResponse) { - return [ - await this.saml.validatePostResponseAsync(body), - body.RelayState, - ] - } else if (body?.SAMLRequest) { - return [ - await this.saml.validatePostRequestAsync(body), - body.RelayState, - ] - } - } -} diff --git a/services/platform/src/auth/TokenRepository.ts b/services/platform/src/auth/TokenRepository.ts deleted file mode 100644 index f81bd4f4..00000000 --- a/services/platform/src/auth/TokenRepository.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { addSeconds } from 'date-fns' -import { Context } from 'koa' -import jwt from 'jsonwebtoken' -import { AccessToken } from './AccessToken' -import App from '../app' -import Admin from './Admin' - -export interface OAuthResponse { - access_token: string - expires_at: Date -} - -export async function cleanupExpiredRevokedTokens(until: Date) { - await AccessToken.delete(qb => qb.where('expires_at', '<=', until)) -} - -export const generateAccessToken = async ({ id }: Admin, ctx?: Context) => { - const expires_at = addSeconds(Date.now(), App.main.env.auth.tokenLife) - const token = jwt.sign({ - sub: id, - iss: App.main.env.baseUrl, - exp: Math.floor(expires_at.getTime() / 1000), - }, App.main.env.secret) - - await AccessToken.insert({ - admin_id: id, - expires_at, - token, - revoked: false, - ip: ctx?.request.ip ?? '', - user_agent: ctx?.request.headers['user-agent'] || '', - }) - - return { - access_token: token, - expires_at, - } -} - -export const getCookiesOAuthToken = (ctx: Context) => { - const cookie = ctx.cookies.get('oauth') - if (cookie) { - return JSON.parse(cookie) as OAuthResponse - } -} - -export const setCookiesOauthToken = (ctx: Context, oauth: OAuthResponse): OAuthResponse => { - ctx.cookies.set('oauth', JSON.stringify(oauth), { - secure: ctx.request.secure, - httpOnly: true, - expires: oauth.expires_at, - }) - - return oauth -} diff --git a/services/platform/src/boot.ts b/services/platform/src/boot.ts deleted file mode 100644 index bc295948..00000000 --- a/services/platform/src/boot.ts +++ /dev/null @@ -1,6 +0,0 @@ -import App from './app' -import env from './config/env' - -export default App.init(env()) - .then(app => app.start()) - .catch(error => console.error(error)) diff --git a/services/platform/src/campaigns/Campaign.ts b/services/platform/src/campaigns/Campaign.ts deleted file mode 100644 index 7aa03333..00000000 --- a/services/platform/src/campaigns/Campaign.ts +++ /dev/null @@ -1,121 +0,0 @@ -import Provider from '../providers/Provider' -import { ChannelType } from '../config/channels' -import Model, { ModelParams, SQLModel } from '../core/Model' -import List from '../lists/List' -import Template from '../render/Template' -import Subscription from '../subscriptions/Subscription' -import { crossTimezoneCopy } from '../utilities' -import Project from '../projects/Project' -import { User } from '../users/User' -import type Journey from '../journey/Journey' -import { UUID } from 'crypto' - -export type CampaignState = 'draft' | 'scheduled' | 'loading' | 'running' | 'finished' | 'aborting' | 'aborted' -export interface CampaignDelivery { - sent: number - total: number - opens: number - clicks: number -} - -export type CampaignProgress = CampaignDelivery & { pending: number } - -export type CampaignType = 'blast' | 'trigger' - -export default class Campaign extends Model { - project_id!: UUID - type!: CampaignType - name!: string - list_ids?: UUID[] - lists?: List[] - exclusion_list_ids?: UUID[] - exclusion_lists?: List[] - channel!: ChannelType - subscription_id!: UUID - subscription?: Subscription - provider_id!: UUID - provider?: Provider - templates!: Template[] - state!: CampaignState - delivery!: CampaignDelivery - tags?: string[] - journeys?: Journey[] - progress?: CampaignPopulationProgress - - send_in_user_timezone?: boolean - send_at?: string | Date | null - - deleted_at?: Date - - static jsonAttributes = ['delivery', 'list_ids', 'exclusion_list_ids'] - - eventName(action: string) { - return `${this.channel}_${action}` - } - - get isAborted() { return this.state === 'aborted' || this.state === 'aborting' } - get isAbortedOrDraft() { - return this.isAborted || this.state === 'draft' - } -} - -export type CampaignPopulationProgress = { - complete: number - total: number -} - -export type SentCampaign = Campaign & { send_at: Date } - -export interface CampaignCreateParams { - name: string; - channel: ChannelType; - provider_id?: UUID; - tags?: string[]; -} - -export type CampaignParams = Omit -export type CampaignUpdateParams = Omit -export type CampaignCreateWithAdminParams = CampaignCreateParams & { admin_id?: UUID } - -export type CampaignSendState = 'pending' | 'sent' | 'throttled' | 'failed' | 'bounced' | 'aborted' -export type CampaignSendReferenceType = 'journey' | 'trigger' -export class CampaignSend extends SQLModel { - campaign_id!: UUID - user_id!: UUID - state!: CampaignSendState - send_at!: string | Date - opened_at!: string | Date - clicks!: number - reference_type?: CampaignSendReferenceType - reference_id?: string - - get hasCompleted() { - return ['aborted', 'sent', 'failed', 'bounced'].includes(this.state) - } - - static create( - campaign: SentCampaign, - project: Pick, - user: Pick, - ): CampaignSendParams { - return { - user_id: user.id, - campaign_id: campaign.id, - state: 'pending', - send_at: campaign.send_in_user_timezone - ? crossTimezoneCopy( - campaign.send_at, - project.timezone, - user.timezone ?? project.timezone, - ) - : campaign.send_at, - } - } -} - -export type CampaignSendParams = Pick - -export interface CampaignJobParams { - id: UUID - project_id: UUID -} diff --git a/services/platform/src/campaigns/CampaignAbortJob.ts b/services/platform/src/campaigns/CampaignAbortJob.ts deleted file mode 100644 index 3734849f..00000000 --- a/services/platform/src/campaigns/CampaignAbortJob.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Job } from '../queue' -import Campaign, { CampaignJobParams } from './Campaign' -import CampaignGenerateListJob from './CampaignGenerateListJob' -import { abortCampaign, getCampaign } from './CampaignService' - -export interface CampaignAbortParams extends CampaignJobParams { - reschedule?: boolean -} - -export default class CampaignAbortJob extends Job { - static $name = 'campaign_abort_job' - - static from({ id, project_id, reschedule }: CampaignAbortParams): CampaignAbortJob { - return new this({ id, project_id, reschedule }).jobId(`cid_${id}_abort`) - } - - static async handler({ id, project_id, reschedule }: CampaignAbortParams) { - const campaign = await getCampaign(id, project_id) - if (!campaign) return - await abortCampaign(campaign) - - const state = reschedule ? 'loading' : 'aborted' - - await Campaign.update(qb => qb.where('id', id), { - state, - }) - - if (state === 'loading' && campaign.type === 'blast') { - await CampaignGenerateListJob.from(campaign).queue() - } - } -} diff --git a/services/platform/src/campaigns/CampaignController.ts b/services/platform/src/campaigns/CampaignController.ts deleted file mode 100644 index 33a09b42..00000000 --- a/services/platform/src/campaigns/CampaignController.ts +++ /dev/null @@ -1,165 +0,0 @@ -import Router from '@koa/router' -import { JSONSchemaType, validate } from '../core/validate' -import Campaign, { CampaignCreateParams, CampaignUpdateParams } from './Campaign' -import { archiveCampaign, createCampaign, deleteCampaign, duplicateCampaign, getCampaign, getCampaignUsers, pagedCampaigns, updateCampaign } from './CampaignService' -import { searchParamsSchema, SearchSchema } from '../core/searchParams' -import { extractQueryParams } from '../utilities' -import { ProjectState } from '../auth/AuthMiddleware' -import { projectRoleMiddleware } from '../projects/ProjectService' -import { Context, Next } from 'koa' -import { validate as uuidValidate } from 'uuid' -import { UUID } from 'crypto' - -const router = new Router({ - prefix: '/campaigns', -}) - -const checkCampaignId = async (value: string, ctx: Context, next: Next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid campaign ID') - return - } - - ctx.state.campaign = await getCampaign(value as UUID, ctx.state.project.id) - if (!ctx.state.campaign) { - ctx.throw(404) - return - } - return await next() -} - -router.use(projectRoleMiddleware('editor')) - -router.get('/', async ctx => { - const searchSchema = SearchSchema('campaignSearchSchema', { - sort: 'created_at', - direction: 'desc', - }) - const params = extractQueryParams(ctx.query, searchSchema) - ctx.body = await pagedCampaigns(params, ctx.state.project.id) -}) - -const campaignCreateParams: JSONSchemaType = { - $id: 'campaignCreate', - type: 'object', - required: ['name', 'channel'], - additionalProperties: false, - properties: { - name: { - type: 'string', - nullable: false, - }, - channel: { - type: 'string', - enum: ['email', 'text', 'push', 'webhook'], - nullable: false, - }, - provider_id: { - type: 'string', - format: 'uuid', - nullable: true, - }, - tags: { - type: 'array', - items: { type: 'string' }, - nullable: true, - }, - }, -} - -router.post('/', async ctx => { - const payload = validate(campaignCreateParams, ctx.request.body) - ctx.body = await createCampaign(ctx.state.project.id, { - ...payload, - admin_id: ctx.state.admin?.id, - }) -}) - -router.param('campaignId', checkCampaignId) - -router.get('/:campaignId', async ctx => { - ctx.body = ctx.state.campaign! -}) - -const campaignUpdateParams: JSONSchemaType> = { - $id: 'campaignUpdate', - type: 'object', - required: [], - properties: { - name: { - type: 'string', - nullable: true, - }, - subscription_id: { - type: 'string', - format: 'uuid', - nullable: true, - }, - provider_id: { - type: 'string', - format: 'uuid', - nullable: true, - }, - state: { - type: 'string', - enum: ['draft', 'running', 'finished'], - nullable: true, - }, - list_ids: { - type: 'array', - items: { type: 'string', format: 'uuid' }, - nullable: true, - }, - exclusion_list_ids: { - type: 'array', - items: { type: 'string', format: 'uuid' }, - nullable: true, - }, - send_in_user_timezone: { - type: 'boolean', - nullable: true, - }, - send_at: { - type: 'string', - format: 'date-time', - nullable: true, - }, - tags: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - }, - additionalProperties: false, -} - -router.patch('/:campaignId', async ctx => { - const payload = validate(campaignUpdateParams, ctx.request.body) - ctx.body = await updateCampaign(ctx.state.campaign!.id, ctx.state.project.id, { - ...payload, - admin_id: ctx.state.admin?.id, - }) -}) - -router.get('/:campaignId/users', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await getCampaignUsers(ctx.state.campaign!.id, params, ctx.state.project.id) -}) - -router.delete('/:campaignId', async ctx => { - const campaign = ctx.state.campaign! - if (campaign.deleted_at) { - await deleteCampaign(campaign, ctx.state.admin?.id) - } else { - await archiveCampaign(campaign, ctx.state.admin?.id) - } - ctx.body = true -}) - -router.post('/:campaignId/duplicate', async ctx => { - ctx.body = await duplicateCampaign(ctx.state.campaign!, ctx.state.admin?.id) -}) - -export default router diff --git a/services/platform/src/campaigns/CampaignEnqueueSendsJob.ts b/services/platform/src/campaigns/CampaignEnqueueSendsJob.ts deleted file mode 100644 index 3a92b08e..00000000 --- a/services/platform/src/campaigns/CampaignEnqueueSendsJob.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Job } from '../queue' -import { campaignSendReadyQuery, failStalledSends, getCampaign, sendCampaignJob } from './CampaignService' -import { CampaignJobParams } from './Campaign' -import { chunk } from '../utilities' -import App from '../app' -import { acquireLock, releaseLock } from '../core/Lock' -import { getProvider } from '../providers/ProviderRepository' -import { UUID } from 'node:crypto' - -export default class CampaignEnqueueSendsJob extends Job { - static $name = 'campaign_enqueue_sends_job' - - static from(data: CampaignJobParams): CampaignEnqueueSendsJob { - return new this(data) - } - - static async handler({ id, project_id }: CampaignJobParams) { - const campaign = await getCampaign(id, project_id) - if (!campaign) return - - const key = `campaign_send_${campaign.id}` - const acquired = await acquireLock({ key, timeout: 300 }) - if (!acquired) return - - // If we are using redis, we can include throttled sends - // because they are deduped based on jobId. Not available in other - // queues - const includeThrottled = App.main.env.queue.driver === 'redis' - - // Only enqueue the maximum that can be sent for the interval - // this job runs (every minute) - const provider = await getProvider(campaign.provider_id) - const ratePerMinute = provider?.ratePer('minute') - - // Anything that is ready to be sent, enqueue for sending - const query = campaignSendReadyQuery(campaign.id, includeThrottled, ratePerMinute) - await chunk<{ user_id: UUID, reference_id?: UUID }>(query, 100, async (items) => { - const jobs = items.map(({ user_id, reference_id }) => sendCampaignJob({ campaign, user: user_id, reference_id })) - await App.main.queue.enqueueBatch(jobs) - }) - - // Look for items that have stalled out and mark them as failed - await failStalledSends(campaign) - - await releaseLock(key) - } -} diff --git a/services/platform/src/campaigns/CampaignError.ts b/services/platform/src/campaigns/CampaignError.ts deleted file mode 100644 index 3994cda4..00000000 --- a/services/platform/src/campaigns/CampaignError.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ErrorSet, ErrorType } from '../core/errors' - -export default { - CampaignProjectNotFound: { - message: 'The project for this campaign does not exist or you do not have access.', - code: 1999, - statusCode: 400, - }, - CampaignDoesNotExist: { - message: 'The requested campaign does not exist or you do not have access.', - code: 2000, - statusCode: 400, - }, - CampaignFinished: { - message: 'The campaign has already finished and cannot be modified.', - code: 2001, - statusCode: 400, - }, - CampaignInvalidProvider: { - message: 'The provider for this campaign has been archived and can no longer be used.', - code: 2002, - statusCode: 400, - }, -} satisfies ErrorSet diff --git a/services/platform/src/campaigns/CampaignGenerateListJob.ts b/services/platform/src/campaigns/CampaignGenerateListJob.ts deleted file mode 100644 index 1cb71b8f..00000000 --- a/services/platform/src/campaigns/CampaignGenerateListJob.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { logger } from '../config/logger' -import { Job } from '../queue' -import { CampaignJobParams, SentCampaign } from './Campaign' -import CampaignEnqueueSendsJob from './CampaignEnqueueSendsJob' -import { getCampaign, populateSendList } from './CampaignService' - -export default class CampaignGenerateListJob extends Job { - static $name = 'campaign_generate_list_job' - - static from({ id, project_id }: CampaignJobParams): CampaignGenerateListJob { - return new this({ id, project_id }).deduplicationKey(`cid_${id}_generate`) - } - - static async handler({ id, project_id }: CampaignJobParams) { - logger.info({ campaign_id: id }, 'campaign:generate:loading') - - const campaign = await getCampaign(id, project_id) as SentCampaign - if (!campaign) return - if (campaign.isAbortedOrDraft) return - - try { - logger.info({ campaignId: id }, 'campaign:generate:populating') - await populateSendList(campaign) - - logger.info({ campaignId: id }, 'campaign:generate:sending') - await CampaignEnqueueSendsJob.from({ - id: campaign.id, - project_id: campaign.project_id, - }).queue() - } catch (error) { - logger.info({ campaignId: id, error }, 'campaign:generate:failed') - throw error - } - } -} diff --git a/services/platform/src/campaigns/CampaignInteractJob.ts b/services/platform/src/campaigns/CampaignInteractJob.ts deleted file mode 100644 index bfcb7b3f..00000000 --- a/services/platform/src/campaigns/CampaignInteractJob.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { UUID } from 'node:crypto' -import App from '../app' -import { Job } from '../queue' -import { unsubscribe } from '../subscriptions/SubscriptionService' -import { CampaignSend } from './Campaign' -import { CacheKeys, getCampaignSend, updateCampaignSend } from './CampaignService' - -interface CampaignIteraction { - user_id: UUID - campaign_id: UUID - reference_id: string - subscription_id?: UUID - type: 'clicked' | 'opened' | 'bounced' | 'complained' | 'failed' - action?: 'unsubscribe' -} - -export default class CampaignInteractJob extends Job { - static $name = 'campaign_interact_job' - - static from(data: CampaignIteraction): CampaignInteractJob { - return new this(data) - } - - static async handler({ campaign_id, user_id, subscription_id, type, action, reference_id }: CampaignIteraction) { - const send = await getCampaignSend(campaign_id, user_id, reference_id) - if (!send) return - - if (type === 'opened' && !send.opened_at) { - await updateCampaignSend(campaign_id, user_id, reference_id, { opened_at: new Date() }) - await App.main.redis.sadd(CacheKeys.pendingStats, campaign_id) - } - - if (type === 'clicked') { - const updates: Partial = { clicks: ++send.clicks } - if (!send.opened_at) { - updates.opened_at = new Date() - } - await updateCampaignSend(campaign_id, user_id, reference_id, updates) - } - - if (type === 'complained' || type === 'bounced') { - await updateCampaignSend(campaign_id, user_id, reference_id, { state: 'bounced' }) - } - - if (subscription_id && action === 'unsubscribe') { - await unsubscribe(user_id, subscription_id) - } - } -} diff --git a/services/platform/src/campaigns/CampaignService.ts b/services/platform/src/campaigns/CampaignService.ts deleted file mode 100644 index 325e931e..00000000 --- a/services/platform/src/campaigns/CampaignService.ts +++ /dev/null @@ -1,524 +0,0 @@ -import PushJob from '../providers/push/PushJob' -import WebhookJob from '../providers/webhook/WebhookJob' -import TextJob from '../providers/text/TextJob' -import EmailJob from '../providers/email/EmailJob' -import { logger } from '../config/logger' -import { User } from '../users/User' -import Campaign, { CampaignCreateParams, CampaignDelivery, CampaignParams, CampaignPopulationProgress, CampaignProgress, CampaignSend, CampaignSendReferenceType, CampaignSendState, CampaignState, SentCampaign } from './Campaign' -import List from '../lists/List' -import { SubscriptionState } from '../subscriptions/Subscription' -import { RequestError } from '../core/errors' -import { PageParams } from '../core/searchParams' -import { allLists } from '../lists/ListService' -import { allTemplates, createTemplate, duplicateTemplate, validateTemplates } from '../render/TemplateService' -import { getSubscription, getUserSubscriptionState } from '../subscriptions/SubscriptionService' -import { chunk, pick, shallowEqual } from '../utilities' -import { getProvider, getDefaultProvider } from '../providers/ProviderRepository' -import { createTagSubquery, getTags, setTags } from '../tags/TagService' -import { getProject } from '../projects/ProjectService' -import CampaignError from './CampaignError' -import CampaignGenerateListJob from './CampaignGenerateListJob' -import { differenceInDays, subDays } from 'date-fns' -import { cacheDel, cacheGet } from '../config/redis' -import App from '../app' -import CampaignAbortJob from './CampaignAbortJob' -import { getJourneysForCampaign } from '../journey/JourneyService' -import { createAuditLog } from '../core/audit/AuditService' -import { WithAdmin } from '../core/audit/Audit' -import { UUID } from 'node:crypto' -import Provider from '../providers/Provider' - -export const CacheKeys = { - pendingStats: 'campaigns:pending_stats', - generate: (campaign: Campaign) => `campaigns:${campaign.id}:generate:users`, - generateReady: (campaign: Campaign) => `campaigns:${campaign.id}:generate:ready`, - populationProgress: (campaign: Campaign) => `campaigns:${campaign.id}:progress`, - populationTotal: (campaign: Campaign) => `campaigns:${campaign.id}:total`, -} - -export const pagedCampaigns = async (params: PageParams, projectId: UUID) => { - const result = await Campaign.search( - { ...params, fields: ['name'] }, - b => { - b.where('project_id', projectId) - .whereNull('deleted_at') - if (params.filter?.type) { - b.where('type', params.filter.type) - } - params.tag?.length && b.whereIn('id', createTagSubquery(Campaign, projectId, params.tag)) - return b - }, - ) - if (result.results?.length) { - const tags = await getTags(Campaign.tableName, result.results.map(c => c.id)) - for (const campaign of result.results) { - campaign.tags = tags.get(campaign.id) - } - } - - return result -} - -export const allCampaigns = async (projectId: UUID): Promise => { - return await Campaign.all(qb => qb.where('project_id', projectId)) -} - -export const getCampaign = async (id: UUID, projectId: UUID): Promise => { - const campaign = await Campaign.find(id, - qb => qb.where('project_id', projectId) - .whereNull('deleted_at'), - ) - - if (!campaign) return - - campaign.provider = await getProvider(campaign.provider_id, projectId) - campaign.templates = await allTemplates(projectId, campaign.id) - campaign.lists = campaign.list_ids ? await allLists(projectId, campaign.list_ids) : [] - campaign.exclusion_lists = campaign.exclusion_list_ids ? await allLists(projectId, campaign.exclusion_list_ids) : [] - campaign.subscription = await getSubscription(campaign.subscription_id, projectId) - campaign.tags = await getTags(Campaign.tableName, [campaign.id]).then(m => m.get(campaign.id)) - - if (campaign.type === 'trigger') campaign.journeys = await getJourneysForCampaign(projectId, campaign.id) - if (campaign.state === 'loading') { - campaign.progress = await campaignPopulationProgress(campaign) - } - - return campaign -} - -export const getCampaignProvider = async (id: UUID, projectId: UUID): Promise => { - const campaign = await Campaign.find(id, - qb => qb.where('project_id', projectId) - .whereNull('deleted_at'), - ) - - if (!campaign) return - return await getProvider(campaign.provider_id, projectId) -} - -export const createCampaign = async (projectId: UUID, { tags, admin_id, ...params }: WithAdmin): Promise => { - const project = await getProject(projectId) - if (!project) { - throw new RequestError(CampaignError.CampaignProjectNotFound) - } - - if (!params.provider_id) { - const defaultProvider = await getDefaultProvider(projectId, params.channel) - if (defaultProvider) { - params.provider_id = defaultProvider.id - } - } - - const delivery = { sent: 0, total: 0, opens: 0, clicks: 0 } - const campaign = await Campaign.insertAndFetch({ - ...params, - state: 'draft', - delivery, - channel: params.channel, - project_id: projectId, - }) - - if (tags?.length) { - await setTags({ - project_id: projectId, - entity: Campaign.tableName, - entity_id: campaign.id, - names: tags, - }) - } - - if (admin_id) { - await createAuditLog({ - project_id: projectId, - admin_id, - event: 'create', - object: campaign, - }) - } - - // NOTE: we always create an initial template for the campaign in the project locale - await createTemplate(projectId, { - campaign_id: campaign.id, - locale: project.locale, - type: params.channel, - data: {}, - }) - - return await getCampaign(campaign.id, projectId) as Campaign -} - -export const updateCampaign = async (id: UUID, projectId: UUID, { tags, admin_id, ...params }: WithAdmin>): Promise => { - - // Ensure finished campaigns are no longer modified - const campaign = await getCampaign(id, projectId) as Campaign - if (campaign.state === 'finished') { - throw new RequestError(CampaignError.CampaignFinished) - } - - // Check that provider is valid - if (params.provider_id) { - const provider = await getProvider(params.provider_id, projectId) - if (provider?.deleted_at) throw new RequestError(CampaignError.CampaignInvalidProvider) - } - - const data: Partial = { ...params } - let send_at: Date | undefined | null = data.send_at ? new Date(data.send_at) : undefined - - const isRescheduling = send_at != null - && campaign.send_at != null - && send_at !== campaign.send_at - - // If we are aborting, reset `send_at` - if (data.state === 'aborted') { - send_at = null - data.state = 'aborting' - } - - // If we are rescheduling, abort sends so they are reset - if (isRescheduling) { - data.state = 'aborting' - } - - // Check templates to make sure we can schedule a send - if (data.state === 'scheduled') { - await validateTemplates(projectId, id) - - // Set to loading if success so scheduling starts - data.state = 'loading' - } - - // If this is a trigger campaign, should always be running - if (data.type === 'trigger') { - data.state = 'running' - } - - const newCampaign = await Campaign.updateAndFetch(id, { - ...data, - send_at, - }) - - if (tags) { - await setTags({ - project_id: projectId, - entity: Campaign.tableName, - entity_id: id, - names: tags, - }) - } - - if (data.state === 'loading' && campaign.type === 'blast') { - await CampaignGenerateListJob.from(campaign).queue() - } - - if (data.state === 'aborting') { - await CampaignAbortJob.from({ ...campaign, reschedule: isRescheduling }).queue() - } - - if (admin_id) { - const event = data.state === 'aborting' - ? 'aborted' - : data.state === 'loading' - ? 'launched' - : 'updated' - await createAuditLog({ - project_id: projectId, - admin_id, - event, - object: newCampaign, - previous: campaign, - }) - } - - return await getCampaign(id, projectId) -} - -export const archiveCampaign = async (campaign: Campaign, adminId?: UUID) => { - await Campaign.archive(campaign.id, qb => qb.where('project_id', campaign.project_id)) - - if (adminId) { - await createAuditLog({ - project_id: campaign.project_id, - admin_id: adminId, - event: 'archive', - previous: campaign, - }) - } - - return getCampaign(campaign.id, campaign.project_id) -} - -export const deleteCampaign = async (campaign: Campaign, adminId?: UUID) => { - const results = await Campaign.deleteById(campaign.id, qb => qb.where('project_id', campaign.project_id)) - if (adminId) { - await createAuditLog({ - project_id: campaign.project_id, - admin_id: adminId, - event: 'delete', - previous: campaign, - }) - } - return results -} - -export const getCampaignUsers = async (id: UUID, params: PageParams, projectId: UUID) => { - return await User.search( - { ...params, fields: ['email', 'phone'], mode: 'exact' }, - b => b.rightJoin('campaign_sends', 'campaign_sends.user_id', 'users.id') - .where('project_id', projectId) - .where('campaign_id', id) - .select('users.*', 'state', 'send_at', 'opened_at', 'clicks'), - ) -} - -interface SendCampaign { - campaign: Campaign - user: User | UUID - exists?: boolean - reference_type?: CampaignSendReferenceType - reference_id?: UUID -} - -export const triggerCampaignSend = async ({ campaign, user, exists, reference_type, reference_id }: SendCampaign & { user: User }) => { - - // Check if the user can receive the campaign and has not unsubscribed - if (!canSendCampaignToUser(campaign, user)) return - - const subscriptionState = await getUserSubscriptionState(user, campaign.subscription_id) - if (subscriptionState === SubscriptionState.unsubscribed) return - - // If the send doesn't already exist, lets create it ahead of scheduling - const reference = { reference_id, reference_type } - if (!exists) { - await CampaignSend.insert({ - campaign_id: campaign.id, - user_id: user.id, - state: 'pending', - send_at: new Date(), - ...reference, - }) - } - - return sendCampaignJob({ - campaign, - user, - ...reference, - }) -} - -export const sendCampaignJob = ({ campaign, user, reference_type, reference_id }: SendCampaign): EmailJob | TextJob | PushJob | WebhookJob => { - const body = { - campaign_id: campaign.id, - user_id: user instanceof User ? user.id : user, - reference_type, - reference_id, - } - - const channels = { - email: EmailJob.from(body), - text: TextJob.from(body), - push: PushJob.from(body), - webhook: WebhookJob.from(body), - } - const job = channels[campaign.channel] - job.deduplicationKey(`sid_${campaign.id}_${body.user_id}_${body.reference_id}`) - return job -} - -interface UpdateSendStateParams { - campaign: Campaign | UUID - user: User | UUID - state?: CampaignSendState - reference_id?: string - response?: any -} - -export const updateSendState = async ({ campaign, user, state = 'sent', reference_id = '0' }: UpdateSendStateParams) => { - const userId = user instanceof User ? user.id : user - const campaignId = campaign instanceof Campaign ? campaign.id : campaign - - // Update send state - const records = await CampaignSend.update( - qb => qb.where('user_id', userId) - .where('campaign_id', campaignId) - .where('reference_id', reference_id), - { state }, - ) - - // If no records were updated then try and create missing record - if (records <= 0) { - const records = await CampaignSend.query() - .insert({ - user_id: userId, - campaign_id: campaignId, - reference_id, - state, - }) - .onConflict(['campaign_id', 'user_id', 'reference_id']) - .merge(['state']) - return Array.isArray(records) ? records[0] : records - } - - return records -} - -const cleanupGenerationCacheKeys = async (campaign: Campaign) => { - const redis = App.main.redis - await cacheDel(redis, CacheKeys.generate(campaign)) - await cacheDel(redis, CacheKeys.populationTotal(campaign)) - await cacheDel(redis, CacheKeys.populationProgress(campaign)) -} - -export const populateSendList = async (campaign: SentCampaign) => { - const project = await getProject(campaign.project_id) - if (!campaign.list_ids || !project) { - throw new RequestError('Unable to send to a campaign that does not have an associated list', 404) - } - - throw Error('Not implemented yet') -} - -export const campaignSendReadyQuery = ( - campaignId: UUID, - includeThrottled = false, - limit?: number, -) => { - const query = CampaignSend.query() - .where('campaign_sends.send_at', '<=', CampaignSend.raw('NOW()')) - .whereIn('campaign_sends.state', includeThrottled ? ['pending', 'throttled'] : ['pending']) - .where('campaign_id', campaignId) - .select('user_id', 'reference_id') - if (limit) query.limit(limit) - return query -} - -export const failStalledSends = async (campaign: Campaign) => { - - const stalledDays = 2 - - // Its not possible to have any stalled records if the campaign send - // was less than the number of days we are checking for - if ( - campaign.send_at - && differenceInDays( - Date.now(), - new Date(campaign.send_at), - ) >= stalledDays - ) return - - const query = CampaignSend.query() - .where('campaign_sends.send_at', '<', subDays(Date.now(), stalledDays)) - .where('campaign_sends.state', 'throttled') - .where('campaign_id', campaign.id) - .select('user_id', 'campaign_id') - await chunk(query, 25, async (items) => { - await CampaignSend.query() - .update({ state: 'failed' }) - .whereIn(['user_id', 'campaign_id'], items) - }, ({ user_id, campaign_id }: CampaignSend) => ([user_id, campaign_id])) -} - -export const abortCampaign = async (campaign: Campaign) => { - await CampaignSend.query() - .where('campaign_id', campaign.id) - .where('state', 'pending') - .update({ state: 'aborted' }) - await cleanupGenerationCacheKeys(campaign) -} - -export const clearCampaign = async (campaign: Campaign) => { - await CampaignSend.query() - .where('campaign_id', campaign.id) - .whereIn('state', ['pending', 'throttled', 'aborted']) - .delete() -} - -export const duplicateCampaign = async (campaign: Campaign, adminId?: UUID) => { - const params: CampaignCreateParams = pick(campaign, ['project_id', 'list_ids', 'exclusion_list_ids', 'provider_id', 'subscription_id', 'channel', 'name', 'type']) - params.name = `Copy of ${params.name}` - const { id: cloneId } = await createCampaign(campaign.project_id, { ...params, admin_id: adminId }) - for (const template of campaign.templates) { - await duplicateTemplate(template, cloneId) - } - - return await getCampaign(cloneId, campaign.project_id) -} - -export const campaignPopulationProgress = async (campaign: Campaign): Promise => { - return { - complete: await cacheGet(App.main.redis, CacheKeys.populationProgress(campaign)) ?? 0, - total: await cacheGet(App.main.redis, CacheKeys.populationTotal(campaign)) ?? 0, - } -} - -export const campaignDeliveryProgress = async (campaignId: UUID): Promise => { - const progress = await CampaignSend.query() - .where('campaign_id', campaignId) - .select(CampaignSend.raw("SUM(CASE WHEN state = 'sent' THEN 1 ELSE 0 END) AS sent, SUM(CASE WHEN state IN ('pending', 'throttled') THEN 1 ELSE 0 END) AS pending, COUNT(*) AS total, SUM(CASE WHEN opened_at IS NOT NULL THEN 1 ELSE 0 END) AS opens, SUM(CASE WHEN clicks > 0 THEN 1 ELSE 0 END) AS clicks")) - .first() - return { - sent: parseInt(progress.sent ?? 0), - pending: parseInt(progress.pending ?? 0), - total: parseInt(progress.total ?? 0), - opens: parseInt(progress.opens ?? 0), - clicks: parseInt(progress.clicks ?? 0), - } -} - -export const updateCampaignProgress = async (campaign: Campaign, stateOverride?: CampaignState): Promise => { - const currentState = (pending: number, delivery: CampaignDelivery) => { - if (campaign.type === 'trigger') return 'running' - if (campaign.state === 'draft') return 'draft' - if (campaign.state === 'loading') return 'loading' - if (pending <= 0) return 'finished' - if (delivery.sent === 0) return 'scheduled' - return 'running' - } - - const { pending, ...delivery } = await campaignDeliveryProgress(campaign.id) - const state = stateOverride ?? currentState(pending, delivery) - - // If nothing has changed, continue otherwise update - if (shallowEqual(campaign.delivery, delivery) && state === campaign.state) return - - if (state !== campaign.state) { - await createAuditLog({ - project_id: campaign.project_id, - event: 'state', - object: { ...campaign, pending, delivery, state }, - previous: campaign, - }) - logger.info({ campaignId: campaign.id, state, pending, delivery }, 'campaign:state:update') - } - - await Campaign.update(qb => qb.where('id', campaign.id).where('project_id', campaign.project_id), { state, delivery }) -} - -export const getCampaignSend = async (campaignId: UUID, userId: UUID, referenceId = '0') => { - return CampaignSend.first(qb => qb - .where('campaign_id', campaignId) - .where('user_id', userId) - .where('reference_id', referenceId), - ) -} - -export const updateCampaignSend = async (campaignId: UUID, userId: UUID, referenceId: string, update: Partial) => { - await CampaignSend.update( - qb => qb - .where('campaign_id', campaignId) - .where('user_id', userId) - .where('reference_id', referenceId), - update, - ) -} - -export const estimatedSendSize = async (campaign: Campaign) => { - const lists: List[] = await List.query().whereIn('id', campaign.list_ids ?? []) - return lists.reduce((acc, list) => (list.users_count ?? 0) + acc, 0) -} - -export const canSendCampaignToUser = (campaign: Campaign, user: Pick) => { - if (campaign.channel === 'email' && !user.email) return false - if (campaign.channel === 'text' && !user.phone) return false - if (campaign.channel === 'push' && !(user.has_push_device || !!user.devices)) return false - return true -} diff --git a/services/platform/src/campaigns/CampaignStateJob.ts b/services/platform/src/campaigns/CampaignStateJob.ts deleted file mode 100644 index efaf8023..00000000 --- a/services/platform/src/campaigns/CampaignStateJob.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { subDays } from 'date-fns' -import { Job } from '../queue' -import Campaign from './Campaign' -import { CacheKeys, updateCampaignProgress } from './CampaignService' -import App from '../app' - -export default class CampaignStateJob extends Job { - static $name = 'campaign_state_job' - - static from(): CampaignStateJob { - return new this().deduplicationKey(this.$name) - } - - static async handler() { - - // Fetch anything that is currently running, has finished - // within the last two days or has activity since last run - const openedCampaignIds = await App.main.redis.smembers(CacheKeys.pendingStats).then(ids => ids.map(parseInt).filter(x => x)) - const campaigns = await Campaign.all(qb => qb - .whereIn('state', ['loading', 'scheduled', 'running']) - .orWhere(function(qb) { - qb.where('state', 'finished') - .where('send_at', '>', subDays(Date.now(), 2)) - }) - .orWhere(function(qb) { - qb.whereIn('id', openedCampaignIds) - .whereNotIn('state', ['draft', 'aborted']) - }), - ) - - for (const campaign of campaigns) { - await updateCampaignProgress(campaign) - } - - if (campaigns.length) { - await App.main.redis.srem(CacheKeys.pendingStats, ...campaigns.map(c => c.id)) - } - } -} diff --git a/services/platform/src/campaigns/ProcessCampaignsJob.ts b/services/platform/src/campaigns/ProcessCampaignsJob.ts deleted file mode 100644 index 604aacee..00000000 --- a/services/platform/src/campaigns/ProcessCampaignsJob.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Job } from '../queue' -import Campaign from './Campaign' -import CampaignGenerateListJob from './CampaignGenerateListJob' -import CampaignEnqueueSendsJob from './CampaignEnqueueSendsJob' - -export default class ProcessCampaignsJob extends Job { - static $name = 'process_campaigns_job' - - static from(): ProcessCampaignsJob { - return new this().deduplicationKey(this.$name) - } - - static async handler() { - const campaigns = await Campaign.query() - .whereIn('state', ['loading', 'scheduled', 'running']) - .whereNotNull('send_at') - .whereNull('deleted_at') - .where('type', 'blast') as Campaign[] - for (const campaign of campaigns) { - - // When in loading state we need to regenerate send list - if (campaign.state === 'loading') { - await CampaignGenerateListJob.from(campaign).queue() - } - - // Start looking through messages that are ready to send - await CampaignEnqueueSendsJob.from(campaign).queue() - } - } -} diff --git a/services/platform/src/campaigns/__tests__/CampaignService.spec.ts b/services/platform/src/campaigns/__tests__/CampaignService.spec.ts deleted file mode 100644 index 3ed883d1..00000000 --- a/services/platform/src/campaigns/__tests__/CampaignService.spec.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { RequestError } from '../../core/errors' -import { addUserToList, createList } from '../../lists/ListService' -import { createSubscription, subscribe } from '../../subscriptions/SubscriptionService' -import { User } from '../../users/User' -import { uuid } from '../../utilities' -import Campaign, { CampaignSend, SentCampaign } from '../Campaign' -import { allCampaigns, createCampaign, getCampaign, populateSendList, estimatedSendSize, triggerCampaignSend } from '../CampaignService' -import { createProvider } from '../../providers/ProviderRepository' -import { createTestProject } from '../../projects/__tests__/ProjectTestHelpers' -import ListStatsJob from '../../lists/ListStatsJob' -import { createUser } from '../../users/UserRepository' -import EmailJob from '../../providers/email/EmailJob' - -afterEach(() => { - jest.clearAllMocks() -}) - -describe('CampaignService', () => { - - interface CampaignRefs { - project_id: UUID - provider_id: UUID - subscription_id: UUID - } - - const createCampaignDependencies = async (): Promise => { - const project = await createTestProject() - const subscription = await createSubscription(project.id, { - name: uuid(), - channel: 'email', - is_public: true, - }) - const provider = await createProvider(project.id, { - type: 'smtp', - group: 'email', - data: {}, - name: uuid(), - is_default: false, - rate_limit: 10, - rate_interval: 'second', - }) - return { - project_id: project.id, - provider_id: provider.id, - subscription_id: subscription.id, - } - } - - const createTestCampaign = async (params?: CampaignRefs, extras?: Partial) => { - params = params || await createCampaignDependencies() - - const campaign = await createCampaign(params.project_id, { - name: uuid(), - type: 'blast', - channel: 'email', - ...params, - ...extras, - }) - - return campaign - } - - const createEmptyUser = async (project_id: UUID): Promise => { - return createUser(project_id, { - external_id: uuid(), - email: `${uuid()}@test.com`, - data: {}, - }) - } - - describe('allCampaigns', () => { - test('return a list of campaigns', async () => { - - const params = await createCampaignDependencies() - - for (let i = 0; i < 20; i++) { - await createTestCampaign(params) - } - - const campaigns = await allCampaigns(params.project_id) - - expect(campaigns.length).toEqual(20) - expect(campaigns[0].provider_id).toEqual(params.provider_id) - expect(campaigns[0].subscription_id).toEqual(params.subscription_id) - }) - - test('campaigns in other projects wont come back', async () => { - - const params1 = await createCampaignDependencies() - const params2 = await createCampaignDependencies() - - for (let i = 0; i < 10; i++) { - await createTestCampaign(params1) - } - - for (let i = 0; i < 10; i++) { - await createTestCampaign(params2) - } - - const campaigns = await allCampaigns(params1.project_id) - - expect(campaigns.length).toEqual(10) - expect(campaigns[0].provider_id).toEqual(params1.provider_id) - expect(campaigns[0].subscription_id).toEqual(params1.subscription_id) - }) - }) - - describe('getCampaign', () => { - test('return a single campaign', async () => { - const response = await createTestCampaign() - - const campaign = await getCampaign(response.id, response.project_id) - - expect(campaign?.id).toEqual(response.id) - }) - - test('a single campaign in a different project shouldnt return', async () => { - const response = await createTestCampaign() - const badParams = await createCampaignDependencies() - - const campaign = await getCampaign(response.id, badParams.project_id) - - expect(campaign?.id).toBeUndefined() - }) - }) - - describe('createCampaign', () => { - test('create a single campaign', async () => { - const params = await createCampaignDependencies() - const name = uuid() - const campaign = await createCampaign(params.project_id, { - ...params, - channel: 'email', - type: 'blast', - name, - }) - - expect(campaign.name).toEqual(name) - expect(campaign.subscription_id).toEqual(params.subscription_id) - expect(campaign.project_id).toEqual(params.project_id) - expect(campaign.provider_id).toEqual(params.provider_id) - }) - - test('fail to create a campaign with a bad subscription', async () => { - const params = await createCampaignDependencies() - const name = uuid() - const promise = createCampaign(params.project_id, { - channel: 'email', - type: 'blast', - subscription_id: 0, - provider_id: params.provider_id, - name, - }) - await expect(promise).rejects.toThrowError(RequestError) - }) - }) - - describe('sendList', () => { - test('enqueue sends for a list of people', async () => { - const params = await createCampaignDependencies() - const list = await createList(params.project_id, { - name: uuid(), - type: 'static', - is_visible: true, - }) - const campaign = await createTestCampaign(params, { - list_ids: [list.id], - send_at: new Date(), - }) as SentCampaign - - for (let i = 0; i < 20; i++) { - const user = await createEmptyUser(params.project_id) - await addUserToList(user, list) - await subscribe(user.id, params.subscription_id) - } - - await populateSendList(campaign) - - const sends = await CampaignSend.all(qb => qb.where('campaign_id', campaign.id)) - - const updatedCampaign = await Campaign.find(campaign.id) - - expect(sends.length).toEqual(20) - expect(updatedCampaign?.state).toEqual('scheduled') - }) - - test('users outside of list arent sent the campaign', async () => { - - const params = await createCampaignDependencies() - const list = await createList(params.project_id, { - name: uuid(), - type: 'static', - is_visible: true, - }) - const list2 = await createList(params.project_id, { - name: uuid(), - type: 'static', - is_visible: true, - }) - const campaign = await createTestCampaign(params, { - list_ids: [list.id], - send_at: new Date(), - }) as SentCampaign - - const inclusiveIds: number[] = [] - for (let i = 0; i < 20; i++) { - const user = await createEmptyUser(params.project_id) - await addUserToList(user, list) - await subscribe(user.id, params.subscription_id) - inclusiveIds.push(user.id) - } - - for (let i = 0; i < 20; i++) { - const user = await createEmptyUser(params.project_id) - await addUserToList(user, list2) - await subscribe(user.id, params.subscription_id) - } - - await populateSendList(campaign) - - const sends = await CampaignSend.all(qb => qb.where('campaign_id', campaign.id)) - const updatedCampaign = await Campaign.find(campaign.id) - - expect(sends.length).toEqual(20) - expect(updatedCampaign?.state).toEqual('scheduled') - }) - }) - - describe('estimatedSendSize', () => { - - test('send size is equal to combination of all lists', async () => { - const params = await createCampaignDependencies() - const list1 = await createList(params.project_id, { - name: uuid(), - type: 'static', - is_visible: true, - }) - const list2 = await createList(params.project_id, { - name: uuid(), - type: 'static', - is_visible: true, - }) - - const campaign = await createTestCampaign(params, { - list_ids: [list1.id, list2.id], - send_at: new Date(), - }) as SentCampaign - - for (let i = 0; i < 20; i++) { - const user = await createEmptyUser(params.project_id) - await addUserToList(user, list1) - await addUserToList(user, list2) - await subscribe(user.id, params.subscription_id) - } - - await ListStatsJob.handler({ listId: list1.id, projectId: params.project_id }) - await ListStatsJob.handler({ listId: list2.id, projectId: params.project_id }) - - const sendSize = await estimatedSendSize(campaign) - expect(sendSize).toEqual(40) - }) - }) - - describe('triggerCampaignSend', () => { - test('trigger successful', async () => { - const params = await createCampaignDependencies() - const campaign = await createTestCampaign(params) as SentCampaign - - const user = await createEmptyUser(params.project_id) - await subscribe(user.id, params.subscription_id) - - const response = await triggerCampaignSend({ campaign, user, exists: false }) - - expect(response).toBeDefined() - expect(response).toBeInstanceOf(EmailJob) - }) - - test('trigger failure because no email', async () => { - const params = await createCampaignDependencies() - const campaign = await createTestCampaign(params) as SentCampaign - - const user = await createUser(campaign.project_id, { - external_id: uuid(), - data: {}, - }) - await subscribe(user.id, params.subscription_id) - - const response = await triggerCampaignSend({ campaign, user, exists: false }) - - expect(response).toBeUndefined() - }) - }) -}) diff --git a/services/platform/src/client/Client.ts b/services/platform/src/client/Client.ts deleted file mode 100644 index 3f7915fb..00000000 --- a/services/platform/src/client/Client.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { RequireAtLeastOne } from '../core/Types' -import type { User } from '../users/User' - -export type ClientIdentityKeys = { - anonymous_id: string - external_id: string -} - -export type ClientIdentity = RequireAtLeastOne - -export type ClientAliasParams = ClientIdentity & { - previous_id?: string -} - -export type ClientIdentifyParams = Partial> & ClientIdentity - -export type ClientDeleteParams = Pick - -export type ClientIdentifyUser = Pick & Partial> - -export type ClientPatchUsersRequest = ClientIdentifyUser[] - -export type ClientDeleteUsersRequest = string[] - -export type ClientPostEvent = { - name: string - data?: Record - user?: ClientIdentifyParams - created_at?: Date -} & ClientIdentity - -export type ClientPostEventsRequest = ClientPostEvent[] - -export interface SegmentContext { - app?: { - build: string - name: string - namespace: string - version: string - } - ip?: number - os: { - name: string - version: string - } - locale: string - timezone?: string -} - -// https://segment.com/docs/connections/spec/common/ -export type SegmentPostEvent = { - event: string - anonymousId: string - userId: string - previousId?: string - context: Record & SegmentContext - properties: Record - traits?: Record - type: 'track' | 'alias' | 'identify' | 'device' | 'unsubscribe' - timestamp: string -} & ( - { - type: 'track', - properties: Record - } - | { - type: 'identify' | 'alias' - traits: Record - } - | { - type: 'device' - properties: Record - } - | { - type: 'unsubscribe', - properties: Record - } -) - -export type SegmentPostEventsRequest = SegmentPostEvent[] diff --git a/services/platform/src/client/ClientController.ts b/services/platform/src/client/ClientController.ts deleted file mode 100644 index 0a7bacee..00000000 --- a/services/platform/src/client/ClientController.ts +++ /dev/null @@ -1,315 +0,0 @@ -import Router from '@koa/router' -import App from '../app' -import { ProjectState } from '../auth/AuthMiddleware' -import { JSONSchemaType, validate } from '../core/validate' -import { getNotifications, readNotification } from '../notifications/NotificationService' -import { projectMiddleware } from '../projects/ProjectController' -import { DeviceParams } from '../users/Device' -import UserAliasJob from '../users/UserAliasJob' -import UserDeviceJob from '../users/UserDeviceJob' -import UserPatchJob from '../users/UserPatchJob' -import { getUserFromClientId } from '../users/UserRepository' -import { ClientDeleteParams, ClientIdentifyParams, ClientIdentityKeys, ClientPostEventsRequest } from './Client' -import EventPostJob from './EventPostJob' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' -import { requireProjectRole } from '../projects/ProjectService' -import UserDeleteJob from '../users/UserDeleteJob' - -const router = new Router() -router.use(projectMiddleware) - -/** - * Alias User - * Used by client libraries to associate an anonymous user - * to one as identified by their system - */ -const aliasParams: JSONSchemaType = { - $id: 'aliasParams', - type: 'object', - required: ['external_id', 'anonymous_id'], - properties: { - anonymous_id: { - type: 'string', - }, - external_id: { - type: 'string', - }, - }, -} -router.post('/alias', async ctx => { - const alias = validate(aliasParams, ctx.request.body) - await UserAliasJob.from({ - project_id: ctx.state.project.id, - ...alias, - }).queue() - ctx.status = 204 - ctx.body = '' -}) - -/** - * Identify User - * Used by client libraries to identify and populate a single user - * using a provider external ID - */ -const identifyParams: JSONSchemaType = { - $id: 'identifyParams', - type: 'object', - required: [], - properties: { - anonymous_id: { - type: 'string', - nullable: true, - }, - external_id: { - type: 'string', - nullable: true, - }, - email: { - type: 'string', - nullable: true, - }, - phone: { - type: 'string', - nullable: true, - }, - timezone: { - type: 'string', - format: 'timezone', - nullable: true, - errorMessage: { - format: 'The timezone value must be in the IANA format.', - }, - }, - locale: { - type: 'string', - nullable: true, - }, - data: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - }, - anyOf: [ - { - required: ['anonymous_id'], - }, - { - required: ['external_id'], - }, - ], - additionalProperties: false, -} as any -router.post('/identify', async ctx => { - const user = validate(identifyParams, ctx.request.body) - await UserPatchJob.from({ - project_id: ctx.state.project.id, - user, - }).queue() - - ctx.status = 204 - ctx.body = '' -}) - -const deleteParams: JSONSchemaType = { - $id: 'deleteParams', - type: 'object', - required: ['external_id'], - properties: { - external_id: { - type: 'string', - }, - }, - additionalProperties: false, -} as any -router.delete('/identify', async ctx => { - requireProjectRole(ctx, 'editor') - const params = validate(deleteParams, ctx.query) - - await UserDeleteJob.from({ - project_id: ctx.state.project.id, - external_id: params.external_id, - }).queue() - - ctx.status = 202 - ctx.body = '' -}) - -/** - * Register Device - * Used by client libraries to register devices and their respective - * tokens for push notifications. - */ -const deviceParams: JSONSchemaType = { - $id: 'deviceParams', - type: 'object', - required: ['device_id', 'os', 'model', 'app_build', 'app_version'], - properties: { - anonymous_id: { - type: 'string', - nullable: true, - }, - external_id: { - type: 'string', - nullable: true, - }, - device_id: { - type: 'string', - }, - token: { - type: 'string', - nullable: true, - }, - os: { - type: 'string', - }, - os_version: { - type: 'string', - }, - model: { - type: 'string', - }, - app_build: { - type: 'string', - }, - app_version: { - type: 'string', - }, - }, - anyOf: [ - { - required: ['anonymous_id'], - }, - { - required: ['external_id'], - }, - ], -} as any -router.post('/devices', async ctx => { - const device = validate(deviceParams, ctx.request.body) - await UserDeviceJob.from({ - project_id: ctx.state.project.id, - ...device, - }).queue() - - ctx.status = 204 - ctx.body = '' -}) - -/** - * Post Event - * Used by client libraries to trigger an event that can be used - * to execute a step in a journey or update a virtual list. - */ -const postEventsRequest: JSONSchemaType = { - $id: 'postEvents', - type: 'array', - items: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - }, - anonymous_id: { - type: 'string', - nullable: true, - }, - external_id: { - type: 'string', - nullable: true, - }, - data: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - user: { - type: 'object', - nullable: true, - properties: { - email: { - type: 'string', - nullable: true, - }, - phone: { - type: 'string', - nullable: true, - }, - timezone: { - type: 'string', - nullable: true, - }, - locale: { - type: 'string', - nullable: true, - }, - data: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - }, - }, - }, - anyOf: [ - { - required: ['anonymous_id'], - }, - { - required: ['external_id'], - }, - ], - }, - minItems: 1, -} as any -router.post('/events', async ctx => { - const events = validate(postEventsRequest, ctx.request.body) - - const jobs = events.map(event => EventPostJob.from({ - project_id: ctx.state.project.id, - event, - })) - await App.main.queue.enqueueBatch(jobs) - - ctx.status = 204 - ctx.body = '' -}) - -router.get('/notifications', async ctx => { - const cursor = ctx.request.query.cursor as string | undefined - const projectId = ctx.state.project.id - const identity = { - external_id: ctx.request.headers['x-external-id'] as string, - anonymous_id: ctx.request.headers['x-anonymous-id'] as string, - } - const user = await getUserFromClientId(projectId, identity) - if (!user) { - ctx.status = 404 - return - } - ctx.body = await getNotifications( - user, - cursor, - ) -}) - -router.put('/notifications/:id', async ctx => { - const projectId = ctx.state.project.id - const user = await getUserFromClientId(projectId, ctx.request.body) - if (user) { - if (!uuidValidate(ctx.params.id)) { - ctx.throw(400, 'Invalid notification ID') - return - } - - await readNotification( - user, - ctx.params.id as UUID, - ) - } - ctx.status = 204 -}) - -export default router diff --git a/services/platform/src/client/EventPostJob.ts b/services/platform/src/client/EventPostJob.ts deleted file mode 100644 index 6b2992b7..00000000 --- a/services/platform/src/client/EventPostJob.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { getUser, getUserFromClientId } from '../users/UserRepository' -import { ClientIdentity, ClientPostEvent } from './Client' -import { Job } from '../queue' -import { createEvent } from '../users/UserEventRepository' -import { enterJourneysFromEvent } from '../journey/JourneyService' -import { UserPatchJob } from '../jobs' -import { User } from '../users/User' -import { UUID } from 'crypto' - -interface EventPostTrigger { - project_id: UUID - user_id?: UUID - event: ClientPostEvent - forward?: boolean -} - -export default class EventPostJob extends Job { - static $name = 'event_post' - - options = { - delay: 0, - attempts: 2, - } - - static from(data: EventPostTrigger): EventPostJob { - return new this(data) - } - - static async handler({ project_id, user_id, event: clientEvent, forward = false }: EventPostTrigger) { - const { anonymous_id, external_id } = clientEvent - const identity = { external_id, anonymous_id } as ClientIdentity - let user = user_id - ? await getUser(user_id, project_id) - : await getUserFromClientId(project_id, identity) - - // If no user exists, create one if we have enough information - if (!user || clientEvent.user) { - user = await UserPatchJob.from({ - project_id, - user: { ...(clientEvent.user ?? {}), ...identity }, - }).handle() - } - - // Create event for given user - const event = await createEvent(user, { - name: clientEvent.name, - data: clientEvent.data || {}, - }, forward) - - // Enter any journey entrances associated with this event - await enterJourneysFromEvent(event, user) - - return { user, event } - } -} diff --git a/services/platform/src/client/SegmentController.ts b/services/platform/src/client/SegmentController.ts deleted file mode 100644 index 869980c6..00000000 --- a/services/platform/src/client/SegmentController.ts +++ /dev/null @@ -1,146 +0,0 @@ -import Router from '@koa/router' -import App from '../app' -import EventPostJob from './EventPostJob' -import { JSONSchemaType, validate } from '../core/validate' -import { SegmentPostEventsRequest } from './Client' -import { ProjectState } from '../auth/AuthMiddleware' -import { projectMiddleware } from '../projects/ProjectController' -import UserPatchJob from '../users/UserPatchJob' -import { Job } from '../queue' -import { parseLocale } from '../utilities' -import UserAliasJob from '../users/UserAliasJob' -import UserDeviceJob from '../users/UserDeviceJob' -import UnsubscribeJob from '../subscriptions/UnsubscribeJob' - -const router = new Router() -router.use(projectMiddleware) - -const segmentEventsRequest: JSONSchemaType = { - $id: 'segmentPostEvents', - type: 'array', - items: { - type: 'object', - required: ['type'], - properties: { - type: { type: 'string' }, - event: { - type: 'string', - nullable: true, - }, - anonymousId: { - type: 'string', - nullable: true, - }, - userId: { - type: 'string', - format: 'uuid', - nullable: true, - }, - previousId: { - type: 'string', - format: 'uuid', - nullable: true, - }, - properties: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - traits: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - context: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - timestamp: { type: 'string' }, - }, - anyOf: [ - { - required: ['anonymousId'], - }, - { - required: ['userId'], - }, - ], - }, - minItems: 1, - maxItems: 2000, -} as any -router.post('/segment', async ctx => { - const events = validate(segmentEventsRequest, ctx.request.body) - - let chunks: Job[] = [] - - for (const event of events) { - const identity = { - anonymous_id: event.anonymousId, - external_id: event.userId, - } - if (event.type === 'alias') { - - chunks.push(UserAliasJob.from({ - project_id: ctx.state.project.id, - previous_id: event.previousId, - ...identity, - })) - } else if (event.type === 'identify') { - - chunks.push(UserPatchJob.from({ - project_id: ctx.state.project.id, - user: { - ...identity, - email: event.traits?.email, - phone: event.traits?.phone, - timezone: event.context.timezone, - locale: event.context.locale && parseLocale(event.context.locale), - data: event.traits, - }, - })) - } else if (event.type === 'track') { - - chunks.push(EventPostJob.from({ - project_id: ctx.state.project.id, - event: { - ...identity, - name: event.event, - data: { ...event.properties, ...event.context }, - created_at: new Date(event.timestamp), - }, - })) - } else if (event.type === 'device') { - - chunks.push(UserDeviceJob.from({ - project_id: ctx.state.project.id, - ...identity, - ...event.properties as any, - })) - } else if (event.type === 'unsubscribe') { - - chunks.push(UnsubscribeJob.from({ - ...identity, - ...event.properties as any, - })) - } - - // Based on queue max batch size, process in largest chunks - // possible - if (chunks.length > App.main.queue.batchSize) { - await App.main.queue.enqueueBatch(chunks) - chunks = [] - } - } - - // Insert any remaining items - if (chunks.length > 0) { - await App.main.queue.enqueueBatch(chunks) - } - - ctx.status = 204 - ctx.body = '' -}) - -export default router diff --git a/services/platform/src/client/__tests__/ClientController.spec.ts b/services/platform/src/client/__tests__/ClientController.spec.ts deleted file mode 100644 index 5ed4dd15..00000000 --- a/services/platform/src/client/__tests__/ClientController.spec.ts +++ /dev/null @@ -1,114 +0,0 @@ -import supertest from 'supertest' -import Api from '../../api' -import App from '../../app' -import { createProjectApiKey } from '../../projects/ProjectService' -import { uuid } from '../../utilities' -import UserAliasJob from '../../users/UserAliasJob' -import UserPatchJob from '../../users/UserPatchJob' -import UserDeviceJob from '../../users/UserDeviceJob' -import EventPostJob from '../EventPostJob' -import { createTestProject } from '../../projects/__tests__/ProjectTestHelpers' - -afterEach(() => { - jest.clearAllMocks() -}) - -const setup = async () => { - const api = new Api(App.main) - - const project = await createTestProject() - const apiKey = await createProjectApiKey(project.id, { - scope: 'public', - name: uuid(), - role: 'support', - }) - return (method, path) => supertest(api.callback())[method](path) - .set('Authorization', `Bearer ${apiKey.value}`) -} - -describe('POST /alias', () => { - test('queues up alias request', async () => { - - const request = await setup() - const spy = jest.spyOn(App.main.queue, 'enqueue') - const response = await request('post', '/api/client/alias') - .send({ - external_id: uuid(), - anonymous_id: uuid(), - }) - expect(response.status).toBe(204) - expect(spy).toHaveBeenCalledTimes(1) - expect(spy.mock.calls[0][0]).toBeInstanceOf(UserAliasJob) - }) -}) - -describe('POST /identify', () => { - test('queues up identify', async () => { - - const request = await setup() - const spy = jest.spyOn(App.main.queue, 'enqueue') - const response = await request('post', '/api/client/identify') - .send({ - external_id: uuid(), - anonymous_id: uuid(), - email: `${uuid()}@test.com}`, - data: { - number: 1, - }, - }) - expect(response.status).toBe(204) - expect(spy).toHaveBeenCalledTimes(1) - expect(spy.mock.calls[0][0]).toBeInstanceOf(UserPatchJob) - }) -}) - -describe('POST /devices', () => { - test('queues up devices', async () => { - - const request = await setup() - const spy = jest.spyOn(App.main.queue, 'enqueue') - const response = await request('post', '/api/client/devices') - .send({ - external_id: uuid(), - anonymous_id: uuid(), - device_id: uuid(), - token: uuid(), - os: 'ios', - model: 'iPhone', - app_build: '1', - app_version: '1.0.0', - }) - expect(response.status).toBe(204) - expect(spy).toHaveBeenCalledTimes(1) - expect(spy.mock.calls[0][0]).toBeInstanceOf(UserDeviceJob) - }) -}) - -describe('POST /events', () => { - test('queues up events', async () => { - - const request = await setup() - const spy = jest.spyOn(App.main.queue, 'enqueueBatch') - const response = await request('post', '/api/client/events') - .send([{ - name: 'Entered', - external_id: uuid(), - anonymous_id: uuid(), - data: { - value: 1, - }, - }, { - name: 'Exited', - external_id: uuid(), - anonymous_id: uuid(), - data: { - value: 1, - }, - }]) - const jobs = spy.mock.calls[0][0] - expect(response.status).toBe(204) - expect(spy).toHaveBeenCalledTimes(1) - expect(jobs[0]).toBeInstanceOf(EventPostJob) - expect(jobs[0].data.event.name).toBe('Entered') - }) -}) diff --git a/services/platform/src/config/channels.ts b/services/platform/src/config/channels.ts deleted file mode 100644 index e244fa60..00000000 --- a/services/platform/src/config/channels.ts +++ /dev/null @@ -1,7 +0,0 @@ -import EmailChannel from '../providers/email/EmailChannel' -import TextChannel from '../providers/text/TextChannel' -import WebhookChannel from '../providers/webhook/WebhookChannel' -import PushChannel from '../providers/push/PushChannel' - -export type Channel = EmailChannel | TextChannel | PushChannel | WebhookChannel -export type ChannelType = 'email' | 'push' | 'text' | 'webhook' diff --git a/services/platform/src/config/controllers.ts b/services/platform/src/config/controllers.ts deleted file mode 100644 index b57a0d2c..00000000 --- a/services/platform/src/config/controllers.ts +++ /dev/null @@ -1,135 +0,0 @@ -import Router from '@koa/router' -import ProjectController, { ProjectSubrouter, projectMiddleware } from '../projects/ProjectController' -import ClientController from '../client/ClientController' -import SegmentController from '../client/SegmentController' -import CampaignController from '../campaigns/CampaignController' -import ListController from '../lists/ListController' -import SubscriptionController, { publicRouter as PublicSubscriptionController } from '../subscriptions/SubscriptionController' -import JourneyController from '../journey/JourneyController' -import ImageController from '../storage/ImageController' -import AuthController from '../auth/AuthController' -import { adminRouter as AdminProviderController, publicRouter as PublicProviderController } from '../providers/ProviderController' -import LinkController from '../render/LinkController' -import TemplateController from '../render/TemplateController' -import UserController from '../users/UserController' -import ProfileController from '../profile/ProfileController' -import TagController from '../tags/TagController' -import { authMiddleware, scopeMiddleware } from '../auth/AuthMiddleware' -import ProjectAdminController from '../projects/ProjectAdminController' -import ProjectApiKeyController from '../projects/ProjectApiKeyController' -import ProjectLocaleController from '../projects/ProjectLocaleController' -import AdminController from '../auth/AdminController' -import OrganizationController from '../organizations/OrganizationController' -import { organizationMiddleware } from '../organizations/OrganizationMiddleware' -import ResourceController from '../render/ResourceController' - -export const register = (parent: Router, ...routers: Router[]) => { - for (const router of routers) { - parent.use(router.routes(), router.allowedMethods()) - } - return parent -} - -export type SubRouter = Router & { global?: boolean } - -export default () => { - const routers: Record = { - admin: adminRouter(), - client: clientRouter(), - public: publicRouter(), - } - - return routers -} - -/** - * Admin Router - * All endpoints for use with admin UI control plane - * @returns Router - */ -export const adminRouter = () => { - const admin = new Router({ prefix: '/admin' }) - admin.use(authMiddleware) - admin.use(organizationMiddleware) - admin.use(scopeMiddleware(['admin', 'secret'])) - return register(admin, - ProjectController, - projectRouter('/projects/:project'), - ProfileController, - AdminController, - OrganizationController, - ) -} - -/** - * Project Router - * A subrouter to the admin router which wraps project specific endpoints - * inside of a project scope - * @returns Router - */ -export const projectRouter = (prefix?: string) => { - const router = new Router({ prefix }) - router.use(projectMiddleware) - return register(router, - ProjectSubrouter, - CampaignController, - ListController, - SubscriptionController, - JourneyController, - ImageController, - TemplateController, - AdminProviderController, - ProjectAdminController, - ProjectApiKeyController, - ProjectLocaleController, - UserController, - TagController, - ResourceController, - ) -} - -/** - * Client Router - * All endpoints that can be accessed using client level authentication. - * For use by third parties. - * @returns Router - */ -export const clientRouter = () => { - - // Public client routes - const router = new Router({ prefix: '/client' }) - router.use(authMiddleware) - register(router, ClientController) - register(router, SegmentController) - - // Secret client routes - router.use(scopeMiddleware('secret')) - register(router, projectRouter()) - - return router -} - -/** - * Public Router - * All endpoints that need to be accessed with absolutely no auth - * at all. Primarily contains auth endpoints and unsubscribe endpoints. - * @returns Router - */ -export const publicRouter = () => { - const router = new Router() - router.use(organizationMiddleware) - - router.get('/health', async (ctx) => { - ctx.body = { - status: 'ok', - environment: process.env.NODE_ENV, - time: new Date(), - } - }) - return register(router, - AuthController, - PublicSubscriptionController, - PublicProviderController, - LinkController, - ) -} diff --git a/services/platform/src/config/database.ts b/services/platform/src/config/database.ts deleted file mode 100644 index 3dcbec4e..00000000 --- a/services/platform/src/config/database.ts +++ /dev/null @@ -1,55 +0,0 @@ -import knex, { Knex as Database } from 'knex' -import { removeKey } from '../utilities' -import { logger } from './logger' - -export { Database } - -export interface DatabaseConfig { - host: string - port: number - user: string - password: string - database?: string - migrationPaths: string[] -} - -export type Query = (builder: Database.QueryBuilder) => Database.QueryBuilder - -knex.QueryBuilder.extend('when', function( - condition: boolean, - fnif: Query, - fnelse?: Query, -) { - return condition ? fnif(this) : (fnelse ? fnelse(this) : this) -}) - -const connect = (config: DatabaseConfig, withDB = true) => { - let connection = removeKey('migrationPaths', config) - if (!withDB) { - connection = removeKey('database', connection) - } - return knex({ - client: 'pg', - connection: { - ...connection, - typeCast(field: any, next: any) { - if (field.type === 'TINY' && field.length === 1) { - return field.string() === '1' - } - return next() - }, - }, - asyncStackTraces: true, - }) -} - -export default async (config: DatabaseConfig) => { - - // Attempt to connect & migrate - try { - return connect(config) - } catch (error: any) { - logger.error(error, 'database error') - throw error - } -} diff --git a/services/platform/src/config/env.ts b/services/platform/src/config/env.ts deleted file mode 100644 index e31777ef..00000000 --- a/services/platform/src/config/env.ts +++ /dev/null @@ -1,216 +0,0 @@ -import * as dotenv from 'dotenv' -import { logger } from './logger' -import type { StorageConfig } from '../storage/Storage' -import type { QueueConfig } from '../queue/Queue' -import type { DatabaseConfig } from './database' -import type { AuthConfig, AuthProviderName } from '../auth/Auth' -import type { ErrorConfig } from '../error/ErrorHandler' -import { RedisConfig } from './redis' -import { isValidUrl } from '../utilities' - -export type Runner = 'api' | 'worker' -export interface Env { - environment: 'development' | 'production' - runners: Runner[] - config: { - logCompiledMessage: boolean - } - db: DatabaseConfig - queue: QueueConfig - storage: StorageConfig - baseUrl: string - apiBaseUrl: string - port: number - secret: string - auth: AuthConfig - logger: { - level: string - prettyPrint: boolean - error: ErrorConfig - } - redis: RedisConfig - webhooks: WebhookConfig -} - -export interface WebhookConfig { - bootstrap?: WebhookServiceConfig - send?: WebhookServiceConfig - journeyTemplate?: WebhookServiceConfig -} - -export interface WebhookServiceConfig { - url: string - timeoutMs: number -} - -export interface DriverConfig { - driver: string -} - -type DriverLoaders = Record T> -const driver = (driver: string | undefined, loaders: DriverLoaders>) => { - const driverKey = driver ?? 'logger' - const loadedDriver = loaders[driverKey] ? loaders[driverKey]() : {} - return { ...loadedDriver, driver: driverKey } as T -} - -// 24 hours -const defaultTokenLife = 24 * 60 * 60 - -const isKeyEmpty = (value: string | undefined) => value === undefined || value === '' - -const envBool = (value: string | undefined, defaultValue: boolean) => isKeyEmpty(value) ? defaultValue : value === 'true' - -const envInt = (value: string | undefined, defaultValue: number) => isKeyEmpty(value) ? defaultValue : parseInt(value!) - -type EnvType = 'production' | 'test' -export default (type?: EnvType): Env => { - dotenv.config({ path: `.env${type === 'test' ? '.test' : ''}` }) - - const port = envInt(process.env.PORT, 3000) - const baseUrl = process.env.BASE_URL ?? `http://localhost:${port}` - const apiBaseUrl = process.env.API_BASE_URL ?? `${baseUrl}/api` - - // Validate required env vars - if (!isValidUrl(baseUrl)) { - logger.error(`lunogram:env Please ensure BASE_URL is a valid non relative URL. Current value is "${baseUrl}"`) - } - - return { - environment: (process.env.ENVIRONMENT as 'development' | 'production') ?? 'development', - runners: (process.env.RUNNER ?? 'api,worker').split(',') as Runner[], - config: { - logCompiledMessage: envBool(process.env.LOG_COMPILED_MESSAGE, false), - }, - db: { - host: process.env.DB_HOST!, - user: process.env.DB_USERNAME!, - password: process.env.DB_PASSWORD!, - port: envInt(process.env.DB_PORT, 5432), - database: process.env.DB_DATABASE!, - migrationPaths: process.env.DB_MIGRATION_PATHS?.split(',') ?? [], - }, - redis: { - host: process.env.REDIS_HOST!, - port: envInt(process.env.REDIS_PORT, 6379), - username: process.env.REDIS_USERNAME, - password: process.env.REDIS_PASSWORD, - tls: process.env.REDIS_TLS === 'true', - }, - queue: driver(process.env.QUEUE_DRIVER, { - redis: () => ({ - host: process.env.REDIS_HOST!, - port: envInt(process.env.REDIS_PORT, 6379), - tls: process.env.REDIS_TLS === 'true', - concurrency: envInt(process.env.REDIS_CONCURRENCY, 10), - }), - }), - storage: driver(process.env.STORAGE_DRIVER ?? 'local', { - s3: () => ({ - baseUrl: process.env.STORAGE_BASE_URL, - bucket: process.env.STORAGE_S3_BUCKET ?? process.env.AWS_S3_BUCKET!, - region: process.env.AWS_REGION ?? 'us-east-1', - endpoint: process.env.STORAGE_S3_ENDPOINT, - forcePathStyle: process.env.STORAGE_S3_FORCE_PATH_STYLE !== 'false', - credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY_ID!, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, - }, - }), - local: () => ({ - baseUrl: process.env.STORAGE_BASE_URL, - }), - }), - baseUrl, - apiBaseUrl, - port, - secret: process.env.APP_SECRET!, - auth: { - driver: (process.env.AUTH_DRIVER?.split(',') ?? []) as AuthProviderName[], - tokenLife: defaultTokenLife, - jwt: { - jwksUrl: process.env.AUTH_JWKS_URL, - }, - basic: { - driver: 'basic', - name: process.env.AUTH_BASIC_NAME!, - email: process.env.AUTH_BASIC_EMAIL!, - password: process.env.AUTH_BASIC_PASSWORD!, - }, - email: { - driver: 'email', - from: process.env.AUTH_EMAIL_FROM!, - host: process.env.AUTH_EMAIL_SMTP_HOST!, - port: parseInt(process.env.AUTH_EMAIL_SMTP_PORT!), - secure: process.env.AUTH_EMAIL_SMTP_SECURE === 'true', - auth: { - user: process.env.AUTH_EMAIL_SMTP_USERNAME!, - pass: process.env.AUTH_EMAIL_SMTP_PASSWORD!, - }, - }, - saml: { - driver: 'saml', - name: process.env.AUTH_SAML_NAME!, - callbackUrl: `${apiBaseUrl}/auth/login/saml/callback`, - entryPoint: process.env.AUTH_SAML_ENTRY_POINT_URL!, - issuer: process.env.AUTH_SAML_ISSUER!, - cert: process.env.AUTH_SAML_CERT!, - wantAuthnResponseSigned: process.env.AUTH_SAML_IS_AUTHN_SIGNED === 'true', - }, - openid: { - driver: 'openid', - name: process.env.AUTH_OPENID_NAME!, - issuerUrl: process.env.AUTH_OPENID_ISSUER_URL!, - clientId: process.env.AUTH_OPENID_CLIENT_ID!, - clientSecret: process.env.AUTH_OPENID_CLIENT_SECRET!, - redirectUri: `${apiBaseUrl}/auth/login/openid/callback`, - domain: process.env.AUTH_OPENID_DOMAIN!, - responseTypes: process.env.AUTH_OPENID_RESPONSE_TYPES?.split(',') ?? ['id_token'], - }, - google: { - driver: 'google', - name: process.env.AUTH_GOOGLE_NAME!, - clientId: process.env.AUTH_GOOGLE_CLIENT_ID!, - clientSecret: process.env.AUTH_GOOGLE_CLIENT_SECRET!, - redirectUri: `${apiBaseUrl}/auth/login/google/callback`, - }, - cloud: { - driver: 'cloud', - secretKey: process.env.AUTH_CLERK_SECRET_KEY!, - webhookSecret: process.env.AUTH_CLERK_WEBHOOK_SECRET!, - }, - }, - logger: { - level: process.env.LOG_LEVEL || 'warn', - prettyPrint: process.env.LOG_PRETTY_PRINT === 'true', - error: driver(process.env.ERROR_DRIVER, { - bugsnag: () => ({ - apiKey: process.env.ERROR_BUGSNAG_API_KEY, - }), - sentry: () => ({ - dsn: process.env.ERROR_SENTRY_DSN, - }), - }), - }, - webhooks: { - bootstrap: process.env.BOOTSTRAP_WEBHOOK_URL - ? { - url: process.env.BOOTSTRAP_WEBHOOK_URL, - timeoutMs: envInt(process.env.BOOTSTRAP_WEBHOOK_TIMEOUT_MS, 5000), - } - : undefined, - send: process.env.SEND_WEBHOOK_URL - ? { - url: process.env.SEND_WEBHOOK_URL, - timeoutMs: envInt(process.env.SEND_WEBHOOK_TIMEOUT_MS, 5000), - } - : undefined, - journeyTemplate: process.env.JOURNEY_TEMPLATE_WEBHOOK_URL - ? { - url: process.env.JOURNEY_TEMPLATE_WEBHOOK_URL, - timeoutMs: envInt(process.env.JOURNEY_TEMPLATE_WEBHOOK_TIMEOUT_MS, 5000), - } - : undefined, - }, - } -} diff --git a/services/platform/src/config/logger.ts b/services/platform/src/config/logger.ts deleted file mode 100644 index 549c7cad..00000000 --- a/services/platform/src/config/logger.ts +++ /dev/null @@ -1,18 +0,0 @@ -import pino from 'pino' -import pretty from 'pino-pretty' -import ErrorHandler, { ErrorConfig } from '../error/ErrorHandler' - -export type LoggerConfig = { - level: string - prettyPrint: boolean - error: ErrorConfig -} - -export const logger = pino({ - level: process.env.LOG_LEVEL || 'info', -}, process.env.LOG_PRETTY_PRINT ? pretty({ colorize: true }) : undefined) - -export default async (config: LoggerConfig) => { - logger.level = config.level - return new ErrorHandler(config.error) -} diff --git a/services/platform/src/config/queue.ts b/services/platform/src/config/queue.ts deleted file mode 100644 index e521623f..00000000 --- a/services/platform/src/config/queue.ts +++ /dev/null @@ -1,66 +0,0 @@ -import Queue from '../queue' -import EmailJob from '../providers/email/EmailJob' -import EventPostJob from '../client/EventPostJob' -import TextJob from '../providers/text/TextJob' -import UserDeleteJob from '../users/UserDeleteJob' -import UserPatchJob from '../users/UserPatchJob' -import WebhookJob from '../providers/webhook/WebhookJob' -import { QueueConfig } from '../queue/Queue' -// Journey jobs disabled - journeys migrated to Nexus service -// import JourneyDelayJob from '../journey/JourneyDelayJob' -// import JourneyProcessJob from '../journey/JourneyProcessJob' -import ListStatsJob from '../lists/ListStatsJob' -import ProcessListsJob from '../lists/ProcessListsJob' -import ProcessCampaignsJob from '../campaigns/ProcessCampaignsJob' -import CampaignEnqueueSendJob from '../campaigns/CampaignEnqueueSendsJob' -import CampaignStateJob from '../campaigns/CampaignStateJob' -import CampaignGenerateListJob from '../campaigns/CampaignGenerateListJob' -import CampaignInteractJob from '../campaigns/CampaignInteractJob' -import PushJob from '../providers/push/PushJob' -import UserAliasJob from '../users/UserAliasJob' -import UserDeviceJob from '../users/UserDeviceJob' -// import JourneyStatsJob from '../journey/JourneyStatsJob' -// import UpdateJourneysJob from '../journey/UpdateJourneysJob' -// import ScheduledEntranceJob from '../journey/ScheduledEntranceJob' -// import ScheduledEntranceOrchestratorJob from '../journey/ScheduledEntranceOrchestratorJob' -import CampaignAbortJob from '../campaigns/CampaignAbortJob' -import UnsubscribeJob from '../subscriptions/UnsubscribeJob' - -export const jobs = [ - CampaignAbortJob, - CampaignGenerateListJob, - CampaignEnqueueSendJob, - CampaignInteractJob, - CampaignStateJob, - EmailJob, - EventPostJob, - // Journey jobs disabled - journeys migrated to Nexus service - // JourneyDelayJob, - // JourneyProcessJob, - // JourneyStatsJob, - ListStatsJob, - ProcessListsJob, - ProcessCampaignsJob, - PushJob, - // ScheduledEntranceJob, - // ScheduledEntranceOrchestratorJob, - TextJob, - UnsubscribeJob, - // UpdateJourneysJob, - UserAliasJob, - UserDeleteJob, - UserDeviceJob, - UserPatchJob, - // UserSchemaSyncJob, - WebhookJob, -] - -export const loadJobs = (queue: Queue) => { - for (const job of jobs) { - queue.register(job) - } -} - -export default (config: QueueConfig) => { - return new Queue(config) -} diff --git a/services/platform/src/config/rateLimit.ts b/services/platform/src/config/rateLimit.ts deleted file mode 100644 index 32767a27..00000000 --- a/services/platform/src/config/rateLimit.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { DefaultRedis, Redis, RedisConfig } from './redis' - -const slidingRateLimiterLuaScript = ` - local key = KEYS[1] - local window = tonumber(ARGV[1]) - local points = tonumber(ARGV[2]) - local limit = tonumber(ARGV[3]) - - local current_time = redis.call('TIME') - local trim_time = tonumber(current_time[1]) - window - redis.call('ZREMRANGEBYSCORE', key, 0, trim_time) - local request_count = redis.call('ZCARD', key) - local exp = redis.call('TTL', key) - - -- If we haven't exceeded the limit, lets add value - if request_count < limit then - - -- Add the current time to the sorted set as many times as points - for i = 1,points - do - redis.call('ZADD', key, current_time[1], current_time[1] .. current_time[2] .. i) - end - - -- Set the expiration of the set to the window size - redis.call('EXPIRE', key, window) - - request_count = request_count + points - return {request_count, 0, window} - end - return {request_count, 1, exp} -` - -interface RateLimitRedis extends Redis { - slidingRateLimiter(key: string, window: number, points: number, limit: number): Promise<[consumed: number, exceeded: number, exp: number]> -} - -export interface RateLimitOptions { - limit?: number - points?: number - msDuration?: number -} - -export interface RateLimitResponse { - exceeded: boolean - pointsRemaining: number - pointsUsed: number - expires: number -} - -export default (config: RedisConfig) => { - return new RateLimiter(config) -} - -export class RateLimiter { - client: RateLimitRedis - constructor(config: RedisConfig) { - this.client = DefaultRedis(config) as RateLimitRedis - this.client.defineCommand('slidingRateLimiter', { - numberOfKeys: 1, - lua: slidingRateLimiterLuaScript, - }) - } - - async consume(key: string, { limit = 10, points = 1, msDuration = 1000 }: RateLimitOptions): Promise { - // NOTE: the limit could be set to 0, which means unlimited (Journey Balancer Step) - if (limit === 0) { - return { - exceeded: false, - pointsRemaining: 0, - pointsUsed: 0, - expires: 0, - } - } - - const window = Math.floor(msDuration / 1000) - const [consumed, exceeded, expires] = await this.client.slidingRateLimiter(key, window, points, limit) - return { - exceeded: exceeded === 1, - pointsRemaining: Math.max(0, limit - consumed), - pointsUsed: consumed, - expires, - } - } - - async get(key: string) { - const response = await this.client - .multi() - .get(key) - .pttl(key) - .exec() - if (!response) return undefined - return { - pointsUsed: parseInt(response[0][1] as string, 10), - msRemaining: response[1][1], - } - } - - async close() { - this.client.disconnect() - } -} diff --git a/services/platform/src/config/redis.ts b/services/platform/src/config/redis.ts deleted file mode 100644 index 600efb15..00000000 --- a/services/platform/src/config/redis.ts +++ /dev/null @@ -1,124 +0,0 @@ -import IORedis, { Redis } from 'ioredis' - -export interface RedisConfig { - host: string - port: number - username?: string - password?: string - tls: boolean -} - -export const DefaultRedis = ({ port, host, username, password, tls }: RedisConfig, extraOptions = {}): Redis => { - return new IORedis({ - port, - host, - ...username && { username }, - ...password && { password }, - tls: tls - ? { rejectUnauthorized: false } - : undefined, - ...extraOptions, - }) -} - -export const cacheGet = async (redis: Redis, key: string): Promise => { - const value = await redis.get(key) - if (!value) return undefined - return JSON.parse(value) as T -} - -export const cacheSet = async (redis: Redis, key: string, value: T, ttl?: number) => { - await redis.set(key, JSON.stringify(value)) - if (ttl) { - await redis.expire(key, ttl) - } -} - -export const cacheDel = async (redis: Redis, key: string) => { - return await redis.del(key) -} - -export const cacheIncr = async (redis: Redis, key: string, incr = 1, ttl?: number) => { - const val = await redis.incrby(key, incr) - if (ttl) { - await redis.expire(key, ttl) - } - return val -} - -export const cacheDecr = async (redis: Redis, key: string, ttl?: number) => { - const val = await redis.decr(key) - if (ttl) { - await redis.expire(key, ttl) - } - return val -} - -export type DataPair = { - key: string - value: string -} -export const cacheBatchHash = async ( - redis: Redis, - hashKey: string, - pairs: DataPair[], -): Promise => { - const pipeline = redis.pipeline() - - const fieldsAndValues: string[] = [] - for (const { key, value } of pairs) { - fieldsAndValues.push(key, value) - } - - pipeline.hset(hashKey, ...fieldsAndValues) - pipeline.expire(hashKey, 60 * 60 * 24) // Set TTL to 24 hours - - await pipeline.exec() -} - -export type HashScanCallback = (pairs: DataPair[]) => Promise | void -export const cacheBatchReadHashAndDelete = async ( - redis: Redis, - hashKey: string, - callback: HashScanCallback, - scanCount = 2500, -): Promise => { - let cursor = '0' - - do { - const [nextCursor, result] = await redis.hscan(hashKey, cursor, 'COUNT', scanCount) - cursor = nextCursor - - const pairs: DataPair[] = [] - for (let i = 0; i < result.length; i += 2) { - pairs.push({ - key: result[i], - value: result[i + 1], - }) - } - - if (pairs.length > 0) { - const pipeline = redis.pipeline() - - await callback(pairs) - for (const pair of pairs) { - pipeline.hdel(hashKey, pair.key) - } - - await pipeline.exec() - } - } while (cursor !== '0') - - await redis.del(hashKey) -} - -export const cacheBatchLength = async (redis: Redis, hashKey: string): Promise => { - return await redis.hlen(hashKey) -} - -export const cacheHashExists = async (redis: Redis, hashKey: string): Promise => { - const exists = await redis.exists(hashKey) - return exists !== 0 -} - -export { Redis } diff --git a/services/platform/src/config/scheduler.ts b/services/platform/src/config/scheduler.ts deleted file mode 100644 index e2dcdb38..00000000 --- a/services/platform/src/config/scheduler.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { cleanupExpiredRevokedTokens } from '../auth/TokenRepository' -import { subDays } from 'date-fns' -import nodeScheduler from 'node-schedule' -import App from '../app' -import ProcessCampaignsJob from '../campaigns/ProcessCampaignsJob' -// import JourneyDelayJob from '../journey/JourneyDelayJob' -import ProcessListsJob from '../lists/ProcessListsJob' -import CampaignStateJob from '../campaigns/CampaignStateJob' -// import UpdateJourneysJob from '../journey/UpdateJourneysJob' -// import ScheduledEntranceOrchestratorJob from '../journey/ScheduledEntranceOrchestratorJob' -import { acquireLock } from '../core/Lock' - -export default (app: App) => { - const scheduler = new Scheduler(app) - scheduler.schedule({ - rule: '* * * * *', - callback: () => { - // Journey jobs disabled - journeys migrated to Nexus service - // JourneyDelayJob.enqueueActive(app) - app.queue.enqueue(ProcessCampaignsJob.from()) - app.queue.enqueue(CampaignStateJob.from()) - // app.queue.enqueue(ScheduledEntranceOrchestratorJob.from()) - }, - lockLength: 120, - }) - scheduler.schedule({ - rule: '0 * * * *', - callback: () => { - cleanupExpiredRevokedTokens(subDays(new Date(), 1)) - // app.queue.enqueue(UserSchemaSyncJob.from({ - // delta: subHours(new Date(), 1), - // })) - // Journey jobs disabled - journeys migrated to Nexus service - // app.queue.enqueue(UpdateJourneysJob.from()) - }, - }) - scheduler.schedule({ - rule: '0 0,12 * * *', - callback: () => { - app.queue.enqueue(ProcessListsJob.from()) - }, - }) - return scheduler -} - -interface Schedule { - rule: string - name?: string - callback: () => void - lockLength?: number -} - -export class Scheduler { - app: App - constructor(app: App) { - this.app = app - } - - async schedule({ rule, name, callback, lockLength = 3600 }: Schedule) { - nodeScheduler.scheduleJob(rule, async () => { - const lock = await acquireLock({ - key: name ?? rule, - owner: this.app.uuid, - timeout: lockLength, - }) - if (lock) { - callback() - } - }) - } - - async close() { - return await nodeScheduler.gracefulShutdown() - } -} diff --git a/services/platform/src/config/stats.ts b/services/platform/src/config/stats.ts deleted file mode 100644 index 5361eadd..00000000 --- a/services/platform/src/config/stats.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Redis } from 'ioredis' -import { DefaultRedis, RedisConfig } from './redis' - -export default (config: RedisConfig) => { - return new Stats(config) -} - -export class Stats { - client: Redis - ttl: number - - constructor(config: RedisConfig, ttl = 60 * 60 * 4) { - this.client = DefaultRedis(config) - this.ttl = ttl - } - - async increment(prefix: string | string[], value = 1): Promise { - const prefixes = Array.isArray(prefix) ? prefix : [prefix] - const time = this.getTime(Date.now()) - const multi = this.client.multi() - for (const prefix of prefixes) { - const key = `stats:${prefix}:${time}` - multi.incrby(key, value) - multi.expire(key, this.ttl) - } - await multi.exec() - } - - async list(prefix: string) { - const multi = this.client.multi() - const minutes = this.ttl / 60 - const time = this.getTime() - - const keys: number[] = [] - for (let i = 0; i <= minutes; i++) { - const timestamp = time - i * 60 - const key = `stats:${prefix}:${timestamp}` - multi.get(key) - keys.push(timestamp) - } - - const results = (await multi.exec()) ?? [] - return results.map(([_, value]: any, index) => ({ - date: keys[index] * 1000, - count: parseInt(value ?? 0), - })) - } - - private getTime(timestamp: number = Date.now()): number { - const seconds = Math.floor(timestamp / 1000) - return Math.floor(seconds / 60) * 60 - } -} diff --git a/services/platform/src/config/storage.ts b/services/platform/src/config/storage.ts deleted file mode 100644 index dc9d3972..00000000 --- a/services/platform/src/config/storage.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Storage, { StorageConfig } from '../storage/Storage' - -export default (config: StorageConfig) => { - return new Storage(config) -} diff --git a/services/platform/src/core/Lock.ts b/services/platform/src/core/Lock.ts deleted file mode 100644 index 54c052d0..00000000 --- a/services/platform/src/core/Lock.ts +++ /dev/null @@ -1,52 +0,0 @@ -import App from '../app' -import { logger } from '../config/logger' -import { uuid } from '../utilities' - -interface LockParams { - key: string - owner?: string - timeout?: number -} - -export const acquireLock = async ({ - key, - owner, - timeout = 60, -}: LockParams) => { - try { - const result = await App.main.redis.set( - `lock:${key}`, - owner ?? uuid(), - 'EX', - timeout, - 'NX', - ) - - // Because of the NX condition, value will only be set - // if it hasn't been set already (original owner) - if (result === null) { - - // Since we know there already is a lock, lets see if - // it is this instance that owns it - if (owner) { - const value = await App.main.redis.get(`lock:${key}`) - return value === owner - } - return false - } - return true - } catch (err) { - logger.warn({ err, key, timeout }, 'lock:error') - return false - } -} - -export const releaseLock = async (key: string) => { - await App.main.redis.del(`lock:${key}`) -} - -export class LockError extends Error { - constructor() { - super('LockError') - } -} diff --git a/services/platform/src/core/Model.ts b/services/platform/src/core/Model.ts deleted file mode 100644 index 2426c6d8..00000000 --- a/services/platform/src/core/Model.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Database } from 'config/database' -import App from '../app' -import { SQLModel } from './models/SQLModel' -import { UUID } from 'crypto' - -export interface SearchResult { - results: T[] - nextCursor?: string - prevCursor?: string - limit: number -} - -export * from './models/RawModel' -export * from './models/SQLModel' - -export default class Model extends SQLModel { - id!: UUID - - static async findMap( - this: T, - ids: UUID[], - db: Database = App.main.db, - ) { - const m = new Map>() - if (!ids.length) return m - const records = await this.all(q => q.whereIn('id', ids), db) - for (const record of records) { - m.set(record.id, record) - } - return m - } -} - -export type ModelParams = 'id' | 'created_at' | 'updated_at' | 'parseJson' | 'project_id' | 'toJSON' | '$tableName' diff --git a/services/platform/src/core/Types.ts b/services/platform/src/core/Types.ts deleted file mode 100644 index 7fe84bfc..00000000 --- a/services/platform/src/core/Types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type RequireAtLeastOne = - Pick> - & { - [K in Keys]-?: Required> & Partial>> - }[Keys] diff --git a/services/platform/src/core/audit/Audit.ts b/services/platform/src/core/audit/Audit.ts deleted file mode 100644 index c595dc86..00000000 --- a/services/platform/src/core/audit/Audit.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UUID } from 'crypto' -import Model from '../Model' - -export default class Audit extends Model { - project_id!: UUID - admin_id?: UUID - event!: string - object!: Record - object_changes!: Record - item_id!: UUID - item_type!: string - - static jsonAttributes = ['object', 'object_changes'] -} - -export interface Auditable { - id: UUID - $tableName: string -} - -export type WithAdmin = T & { - admin_id?: UUID -} diff --git a/services/platform/src/core/audit/AuditService.ts b/services/platform/src/core/audit/AuditService.ts deleted file mode 100644 index 8099374e..00000000 --- a/services/platform/src/core/audit/AuditService.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { RequireAtLeastOne } from '../Types' -import { deepDiff } from '../../utilities' -import Audit, { Auditable } from './Audit' -import { UUID } from 'node:crypto' - -type AuditParams = { - project_id: UUID - event: string - item_id: UUID - item_type: string -} - -type AuditCreateParams = RequireAtLeastOne<{ - project_id: UUID - event: string - admin_id?: UUID -} & ({ - object?: Auditable - previous?: Record -} | { - object?: Record - previous?: Auditable -}), 'object' | 'previous'> - -export const createAuditLog = async (data: AuditCreateParams) => { - return await Audit.insert({ - project_id: data.project_id, - event: data.event, - admin_id: data.admin_id, - object: data.object, - object_changes: deepDiff(data.object ?? {}, data.previous ?? {}), - item_id: data.object?.id ?? data.previous?.id, - item_type: data.object?.$tableName ?? data.previous?.$tableName, - }) -} - -export const getAuditLogs = async ({ - project_id, - event, - item_id, - item_type, -}: AuditParams) => { - return Audit.all(q => - q.where('project_id', project_id) - .where('event', event) - .where('item_id', item_id) - .where('item_type', item_type) - .orderBy('created_at', 'desc'), - ) -} - -export const getLastAuditLog = async ({ - project_id, - event, - item_id, - item_type, -}: AuditParams) => { - return Audit.first(q => - q.where('project_id', project_id) - .where('event', event) - .where('item_id', item_id) - .where('item_type', item_type) - .orderBy('created_at', 'desc'), - ) -} diff --git a/services/platform/src/core/aws.ts b/services/platform/src/core/aws.ts deleted file mode 100644 index cc494e2d..00000000 --- a/services/platform/src/core/aws.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface AWSConfig { - region: string - credentials: AWSCredentials -} - -export interface AWSCredentials { - accessKeyId: string - secretAccessKey: string -} diff --git a/services/platform/src/core/errors.ts b/services/platform/src/core/errors.ts deleted file mode 100644 index 66773f7f..00000000 --- a/services/platform/src/core/errors.ts +++ /dev/null @@ -1,43 +0,0 @@ -export type ErrorType = { - message: string - code: number - statusCode?: number -} - -export type ErrorSet = Record - -export class InternalError extends Error { - - readonly errorCode?: number - readonly statusCode?: number - constructor(error: ErrorType) - constructor(message: string, statusCode?: number, errorCode?: number) - constructor( - message: string | ErrorType, - statusCode?: number, - errorCode?: number, - ) { - if (typeof message === 'string') { - super(message) - this.statusCode = statusCode - this.errorCode = errorCode - } else { - super(message.message) - this.statusCode = message.statusCode - this.errorCode = message.code - } - } - - toJSON() { - const body: { [key: string]: any } = { - status: 'error', - error: this.message || '', - } - if (this.errorCode) { - body.code = this.errorCode - } - return body - } -} - -export class RequestError extends InternalError { } diff --git a/services/platform/src/core/models/RawModel.ts b/services/platform/src/core/models/RawModel.ts deleted file mode 100644 index d0654bc4..00000000 --- a/services/platform/src/core/models/RawModel.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { pluralize, snakeCase } from '../../utilities' - -export class RawModel { - get $tableName() { - return (this.constructor as typeof RawModel).tableName - } - - static jsonAttributes: string[] = [] - static virtualAttributes: string[] = [] - - static toJson(this: T, model: any) { - const json: any = {} - const keys = [...Object.keys(model), ...this.virtualAttributes] - for (const key of keys) { - json[snakeCase(key)] = model[key] - } - return json - } - - static fromJson(this: T, json: Partial>): InstanceType { - const model = new this() - - // Remove any value that could conflict with a virtual key - for (const attribute of this.virtualAttributes) { - delete (json as any)[attribute] - } - - // Parse values into the model - model.parseJson(json) - return model as InstanceType - } - - parseJson(json: any) { - Object.assign(this, json) - } - - toJSON() { - return (this.constructor as any).toJson(this) - } - - // Format JSON before inserting into DB - static formatJson(json: any): Record { - - // remove any virtual attributes that have been set - for (const attribute of this.virtualAttributes) { - delete (json as any)[attribute] - } - - return json - } - - static get tableName(): string { - return pluralize(snakeCase(this.name)) - } -} diff --git a/services/platform/src/core/models/SQLModel.ts b/services/platform/src/core/models/SQLModel.ts deleted file mode 100644 index 9ce729f7..00000000 --- a/services/platform/src/core/models/SQLModel.ts +++ /dev/null @@ -1,301 +0,0 @@ -import { formatISO } from 'date-fns' -import App from '../../app' -import { Database, Query } from '../../config/database' -import { SearchResult } from '../Model' -import { RawModel } from './RawModel' -import { PageQueryParams } from '../searchParams' -import { UUID } from 'node:crypto' - -export type Transaction = Database.Transaction - -export const raw = (raw: string, ...bindings: Database.RawBinding[]) => { - return App.main.db.raw(raw, ...bindings) -} - -export const ref = (ref: string, db: Database = App.main.db) => { - return db.ref(ref) -} - -export class SQLModel extends RawModel { - - created_at: Date = new Date() - updated_at!: Date - - static formatDb(json: any): Record { - - const obj = { ...json } - - // All models have an updated timestamp, trigger value - obj.updated_at = new Date() - - // Take JSON attributes and stringify before insertion - for (const attribute of this.jsonAttributes) { - obj[attribute] = obj[attribute] == null - ? undefined - : JSON.stringify(obj[attribute]) - } - - return this.formatJson(obj) - } - - static query(this: T, db: Database = App.main.db): Database.QueryBuilder> { - return this.table(db) - } - - static async first( - this: T, - query: Query = (qb) => qb, - db: Database = App.main.db, - ): Promise | undefined> { - const record = await this.build(query, db).first() - if (!record) return undefined - return this.fromJson(record) - } - - static async find( - this: T, - id: UUID, - query: Query = (qb) => qb, - db: Database = App.main.db, - ): Promise | undefined> { - if (!id) return undefined - const record = await this.build(query, db) - .where(`${this.tableName}.id`, id) - .first() - if (!record) return undefined - return this.fromJson(record) - } - - static async all( - this: T, - query: Query = qb => qb, - db: Database = App.main.db, - ): Promise[]> { - const records = await this.build(query, db) - return records.map((item: any) => this.fromJson(item)) - } - - static async count( - this: T, - query: Query = qb => qb, - column?: string, - db: Database = App.main.db, - ): Promise { - return await query(this.table(db)) - .clone() - .clearSelect() - .count(column ? `${column} AS C` : `${this.tableName}.id as C`) - .then(r => r[0].C || 0) - } - - static async exists( - this: T, - query: Query = qb => qb, - db: Database = App.main.db, - ): Promise { - const count = await this.count(qb => query(qb).limit(1), '*', db) - return count > 0 - } - - static async search( - this: T, - params: PageQueryParams, - query: Query = qb => qb, - db: Database = App.main.db, - postProcessor: (item: InstanceType) => InstanceType = item => item, - ): Promise>> { - const { - cursor, - page = 'next', - limit, - sort, - direction = 'asc', - mode = 'partial', - fields = [], - q, - id, - } = params - - // Based on if we are moving forward or backward we need to - // change how the cursor `where` clause works - const cursorDir = page === 'next' - ? direction === 'asc' ? '>' : '<' - : direction === 'asc' ? '<=' : '>=' - - const data = await this.build(query, db) - .limit((limit + 1)) // Get one extra to check for more - .clear('order') // QB cannot contain order - .when(!!sort, qb => - // If sort is provided, order by that first, then by id - // for consistency - qb.orderBy(sort!, direction) - .orderBy(`${this.tableName}.id`, direction), - ) - .when(!!cursor, qb => { - // To allow for sorting, `since` may contain either just - // a last token or a last token and the last value of - // the column you are sorting by - const [sinceId, sortSince] = cursor!.split(',') - if (sortSince) { - qb.whereRaw(`(??, \`${this.tableName}\`.\`id\`) ${cursorDir} (?, ?)`, [sort, sortSince!, sinceId]) - } else { - qb.where(`${this.tableName}.id`, cursorDir, sinceId) - } - return qb - }) - .when(!!q, qb => { - // Filter results by search query in either - // exact or partial mode - const filter = mode === 'exact' - ? params.q - : '%' + params.q + '%' - return qb.where(function() { - fields.reduce((chain, field) => { - if (typeof field === 'string') { - return chain.orWhereILike(field, filter) - } - return chain - }, this) - }) - }) - .when(!!id?.length, qb => qb.whereIn('id', id!)) - - const makeCursor = (result: any, sort?: string) => { - if (!sort || sort === 'id' || sort === `${this.tableName}.id`) return `${result.id}` - let sortCursor = result[sort] - if (sortCursor instanceof Date) { - sortCursor = formatISO(sortCursor) - } - return `${result.id},${sortCursor}` - } - - // Slice off the extra result so that the true limit is provided - const results = data.slice(0, limit) - const resultCount = results.length - const hasMore = resultCount < data.length - - // End result is either first or last result depending on direction - const endResult = page === 'next' ? results[resultCount - 1] : results[0] - - // If there are more items fetched than after slicing we know - // there are more pages - const endCursor = endResult && hasMore - ? makeCursor(endResult, sort) - : undefined - const startCursor = cursor - - // Return the results, cursors (they flip based on direction) and limit - return { - results: results.map((item: any) => postProcessor(this.fromJson(item))), - nextCursor: page === 'next' ? endCursor : startCursor, - prevCursor: page === 'next' ? startCursor : endCursor, - limit, - } - } - - static async insert(this: T, data: Partial>, db?: Database): Promise - static async insert(this: T, data: Partial>[], db?: Database): Promise - static async insert( - this: T, - data: Partial> | Partial>[] = {}, - db: Database = App.main.db, - ): Promise { - const formattedData = Array.isArray(data) ? data.map(o => this.formatDb(o)) : this.formatDb(data) - const [value] = await this.table(db).insert(formattedData).returning('id') - if (Array.isArray(data)) return value.map((v: any) => v.id) - return value.id - } - - static async insertAndFetch( - this: T, - data: Partial> = {}, - db: Database = App.main.db, - ): Promise> { - const id = await this.insert(data, db) - const model = await this.find(id, b => b, db) as InstanceType - this.emit('created', model) - return model - } - - static async update( - this: T, - query: Query, - data: Partial> = {}, - db: Database = App.main.db, - ): Promise { - const formattedData = this.formatDb(data) - return await query(this.table(db)).update(formattedData) - } - - static async updateAndFetch( - this: T, - id: UUID, - data: Partial> = {}, - db: Database = App.main.db, - ): Promise> { - const formattedData = this.formatDb(data) - await this.table(db).where('id', id).update(formattedData) - const model = await this.find(id, b => b, db) as InstanceType - this.emit('updated', model) - return model - } - - static async archive( - this: T, - id: UUID, - query: Query = qb => qb, - fields: Partial> = {}, - db: Database = App.main.db, - ): Promise> { - await query(this.table(db)) - .where('id', id) - .update({ ...fields, deleted_at: new Date() }) - const model = await this.find(id, b => b, db) as InstanceType - this.emit('archived', id) - return model - } - - static async delete( - this: T, - query: Query, - db: Database = App.main.db, - ): Promise { - return await query(this.table(db)).delete() - } - - static async deleteById( - this: T, - id: UUID, - query: Query = qb => qb, - db: Database = App.main.db, - ): Promise { - const model = await this.find(id, query, db) as InstanceType - const count = await query(this.table(db)) - .where('id', id) - .delete() - this.emit('deleted', model) - return count > 0 - } - - static table(db: Database = App.main.db): Database.QueryBuilder { - return db(this.tableName) - } - - static raw = raw - - static build( - query: Query, - db: Database = App.main.db, - ): Database.QueryBuilder> { - const builder = query(this.table(db)) as any - const hasSelects = builder._statements.find((item: any) => item.grouping === 'columns') - if (!hasSelects) { - builder.select(`${this.tableName}.*`) - } - return builder - } - - static emit(event: string, payload: any) { - App.main.events.emit(`model:${this.tableName}:${event}`, payload) - } -} diff --git a/services/platform/src/core/searchParams.ts b/services/platform/src/core/searchParams.ts deleted file mode 100644 index 42541f6b..00000000 --- a/services/platform/src/core/searchParams.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { JSONSchemaType } from 'ajv' -import { RawModel } from './Model' -import { UUID } from 'crypto' - -export interface PageParams { - limit: number - sort?: string - direction?: string - cursor?: string - page?: 'prev' | 'next' - q?: string - filter?: Record - tag?: string[] - id?: UUID[] -} - -export interface PageQueryParams extends PageParams { - fields?: Array | string> - mode?: 'exact' | 'partial' -} - -export const SearchSchema = (id: string, defaults?: Partial): JSONSchemaType => { - return { - $id: id, - type: 'object', - required: ['limit'], - properties: { - cursor: { - type: 'string', - nullable: true, - }, - page: { - type: 'string', - enum: ['prev', 'next'], - nullable: true, - }, - limit: { - type: 'integer', - default: defaults?.limit ?? 25, - minimum: -1, // -1 for all - }, - q: { - type: 'string', - nullable: true, - }, - filter: { - nullable: true, - type: 'object', - }, - sort: { - type: 'string', - default: defaults?.sort, - nullable: true, - }, - direction: { - type: 'string', - nullable: true, - default: defaults?.direction, - enum: ['asc', 'desc'], - }, - tag: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - id: { - type: 'array', - items: { - type: 'string', - format: 'uuid', - minimum: 1, - }, - nullable: true, - }, - }, - } -} - -export const searchParamsSchema: JSONSchemaType = SearchSchema('searchParams') diff --git a/services/platform/src/core/validate.ts b/services/platform/src/core/validate.ts deleted file mode 100644 index b3047aa7..00000000 --- a/services/platform/src/core/validate.ts +++ /dev/null @@ -1,59 +0,0 @@ -import Ajv, { ErrorObject, JSONSchemaType } from 'ajv' -import addFormats from 'ajv-formats' -import addErrors from 'ajv-errors' -import { capitalizeFirstLetter, isValidIANATimezone } from '../utilities' -import { RequestError } from './errors' - -type IsValidSchema = [boolean, Error | undefined] - -const validator = new Ajv({ allErrors: true }) -addFormats(validator) -addErrors(validator) -validator.addFormat('timezone', { - type: 'string', - validate: (timezone: string) => { - return isValidIANATimezone(timezone) - }, -}) - -export { JSONSchemaType, IsValidSchema, validator } - -export function validate(schema: JSONSchemaType, data: any): T { - const validate = validator.getSchema(schema.$id!) - || validator.compile(schema) - if (validate(data)) { - return data - } - throw new RequestError(parseError(validate.errors), 422) -} - -export const isValid = (schema: any, data: any): IsValidSchema => { - const validate = validator.compile(schema) - const isValid = validate(data) - if (isValid) return [isValid, undefined] - - const error = parseError(validate.errors) - return [isValid, new RequestError(error, 422)] -} - -export const parseError = (errors: ErrorObject[] | null | undefined = []) => { - - const readablePath = (path: string) => { - const parts = path.split('/') - if (parts[0] === '') parts.shift() - if (parts[0] === 'data') parts.shift() - return parts.join(' ').trim() - } - - if (errors === null || errors.length <= 0) return 'There was an unknown error validating your request.' - const error = errors[0] - if (error.keyword === 'type') { - const path = readablePath(error.instancePath) - return `The value of \`${path}\` must be a ${error.params.type}.` - } - if (error.keyword === 'format') { - const path = readablePath(error.instancePath) - return `The value of \`${path}\` ${error.message}.` - } - return capitalizeFirstLetter(error.message ?? '') -} diff --git a/services/platform/src/error/BugSnagProvider.ts b/services/platform/src/error/BugSnagProvider.ts deleted file mode 100644 index 0148034c..00000000 --- a/services/platform/src/error/BugSnagProvider.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ErrorHandlerTypeConfig } from './ErrorHandler' -import ErrorHandlingProvider from './ErrorHandlerProvider' -import Koa from 'koa' -import Bugsnag from '@bugsnag/js' -import BugsnagPluginKoa from '@bugsnag/plugin-koa' - -export interface BugSnagConfig extends ErrorHandlerTypeConfig { - driver: 'bugsnag' - apiKey: string -} - -export default class BugSnagProvider implements ErrorHandlingProvider { - constructor(config: BugSnagConfig) { - Bugsnag.start({ - apiKey: config.apiKey, - logger: null, - enabledReleaseStages: ['staging', 'production'], - plugins: [BugsnagPluginKoa], - }) - } - - attach(api: Koa) { - const middleware = Bugsnag.getPlugin('koa') - if (middleware) { - api.use(middleware.requestHandler) - api.on('error', (err, ctx) => { - if (ctx.state.admin) ctx.bugsnag.setUser(ctx.state.admin.id.toString()) - middleware.errorHandler(err, ctx) - }) - } - } - - notify(error: Error, context?: Record) { - Bugsnag.notify(error, (event) => { - context && event.addMetadata('context', context) - }) - } -} diff --git a/services/platform/src/error/ErrorHandler.ts b/services/platform/src/error/ErrorHandler.ts deleted file mode 100644 index ea2ff119..00000000 --- a/services/platform/src/error/ErrorHandler.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { DriverConfig } from '../config/env' -import { logger } from '../config/logger' -import Koa from 'koa' -import BugSnagProvider, { BugSnagConfig } from './BugSnagProvider' -import ErrorHandlerProvider, { ErrorHandlerProviderName } from './ErrorHandlerProvider' -import SentryProvider, { SentryConfig } from './SentryProvider' -import LoggerErrorProvider, { LoggerErrorConfig } from './LoggerProvider' - -export type ErrorConfig = BugSnagConfig | SentryConfig | LoggerErrorConfig - -export interface ErrorHandlerTypeConfig extends DriverConfig { - driver: ErrorHandlerProviderName -} - -export class ContextError extends Error { - context?: Record -} - -export default class ErrorHandler { - provider?: ErrorHandlerProvider - constructor(config: ErrorConfig) { - if (config?.driver === 'bugsnag') { - this.provider = new BugSnagProvider(config) - } else if (config?.driver === 'sentry') { - this.provider = new SentryProvider(config) - } else { - this.provider = new LoggerErrorProvider() - } - } - - attach(api: Koa) { - this.provider?.attach(api) - } - - notify(error: Error, context?: Record) { - this.provider?.notify( - error, - error instanceof ContextError - ? { ...context, ...error.context } - : context, - ) - if (!this.provider) logger.error(error) - } -} diff --git a/services/platform/src/error/ErrorHandlerProvider.ts b/services/platform/src/error/ErrorHandlerProvider.ts deleted file mode 100644 index d30b5fcb..00000000 --- a/services/platform/src/error/ErrorHandlerProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Koa from 'koa' - -export type ErrorHandlerProviderName = 'bugsnag' | 'sentry' | 'logger' - -export default interface ErrorHandlerProvider { - attach(api: Koa): void - notify(error: Error, context?: Record): void -} diff --git a/services/platform/src/error/LoggerProvider.ts b/services/platform/src/error/LoggerProvider.ts deleted file mode 100644 index 37e493d1..00000000 --- a/services/platform/src/error/LoggerProvider.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ErrorHandlerTypeConfig } from './ErrorHandler' -import ErrorHandlingProvider from './ErrorHandlerProvider' -import { logger } from '../config/logger' - -export interface LoggerErrorConfig extends ErrorHandlerTypeConfig { - driver: 'logger' -} - -export default class LoggerErrorProvider implements ErrorHandlingProvider { - - attach() { /** */ } - - notify(error: Error, context?: Record) { - logger.error({ - error, - context, - }, error.message) - } -} diff --git a/services/platform/src/error/SentryProvider.ts b/services/platform/src/error/SentryProvider.ts deleted file mode 100644 index b58a48a4..00000000 --- a/services/platform/src/error/SentryProvider.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as Sentry from '@sentry/node' -import Koa from 'koa' -import { ErrorHandlerTypeConfig } from './ErrorHandler' -import ErrorHandlingProvider from './ErrorHandlerProvider' - -export interface SentryConfig extends ErrorHandlerTypeConfig { - driver: 'sentry' - dsn: string -} - -export default class SentryProvider implements ErrorHandlingProvider { - constructor(config: SentryConfig) { - Sentry.init({ dsn: config.dsn }) - } - - attach(api: Koa) { - api.on('error', (err, ctx) => { - Sentry.withScope((scope) => { - if (ctx.state.admin) scope.setUser({ id: ctx.state.admin.id.toString() }) - scope.addEventProcessor((event) => { - return Sentry.addRequestDataToEvent(event, ctx.request) - }) - Sentry.captureException(err) - }) - }) - } - - notify(error: Error, context?: Record) { - Sentry.captureException(error, { - extra: context, - }) - } -} diff --git a/services/platform/src/index.ts b/services/platform/src/index.ts deleted file mode 100644 index 7b1cf1ec..00000000 --- a/services/platform/src/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { default as Api } from './api' -export { default as App } from './app' -export { default as env } from './config/env' -export { default as Logger } from './config/logger' -export { default as Model } from './core/Model' -export { default as Worker } from './worker' -export { default as Job } from './queue/Job' -export { default as Admin } from './auth/Admin' -export { default as Campaign } from './campaigns/Campaign' -export { default as Organization } from './organizations/Organization' -export * as jobs from './jobs' -export * as OrganizationService from './organizations/OrganizationService' -export * as Utilities from './utilities' diff --git a/services/platform/src/jobs.ts b/services/platform/src/jobs.ts deleted file mode 100644 index 252b97a9..00000000 --- a/services/platform/src/jobs.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as EventPostJob } from './client/EventPostJob' -export { default as UserAliasJob } from './users/UserAliasJob' -export { default as UserPatchJob } from './users/UserPatchJob' diff --git a/services/platform/src/journey/Journey.ts b/services/platform/src/journey/Journey.ts deleted file mode 100644 index 7f7bf495..00000000 --- a/services/platform/src/journey/Journey.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { UUID } from 'node:crypto' -import Model, { ModelParams } from '../core/Model' -import { User } from '../users/User' -import { setJourneyStepMap } from './JourneyRepository' -import { JourneyStepMapParams } from './JourneyStep' - -type JourneyStatus = 'draft' | 'live' | 'off' - -export default class Journey extends Model { - name!: string - project_id!: UUID - parent_id?: UUID - draft_id?: UUID - description?: string - status!: JourneyStatus - deleted_at?: Date - tags?: string[] - stats?: Record - stats_at?: Date - - static jsonAttributes = ['stats'] - - static async create(project_id: UUID, name: string, stepMap: JourneyStepMapParams) { - const journey = await this.insertAndFetch({ - project_id, - name, - status: 'live', - }) - const { steps, children } = await setJourneyStepMap(journey, stepMap) - return { journey, steps, children } - } -} - -export type JourneyParams = Omit & { template_id?: string } -export type UpdateJourneyParams = Omit - -export interface JourneyEntranceTriggerParams { - entrance_id: UUID - user: Pick & { external_id: string, device_token?: string } - event?: Record -} diff --git a/services/platform/src/journey/JourneyController.ts b/services/platform/src/journey/JourneyController.ts deleted file mode 100644 index 037afaf3..00000000 --- a/services/platform/src/journey/JourneyController.ts +++ /dev/null @@ -1,293 +0,0 @@ -import Router, { ParamMiddleware } from '@koa/router' -import { projectRoleMiddleware } from '../projects/ProjectService' -import { ProjectState } from '../auth/AuthMiddleware' -import { searchParamsSchema } from '../core/searchParams' -import { JSONSchemaType, validate } from '../core/validate' -import { extractQueryParams } from '../utilities' -import Journey, { JourneyEntranceTriggerParams, JourneyParams } from './Journey' -import { createJourney, getJourney, pagedJourneys, setJourneyStepMap, updateJourney, pagedEntrancesByJourney, getEntranceLog, pagedUsersByStep, archiveJourney, deleteJourney, exitUserFromJourney, publishJourney, skipDelayStep, getJourneyStepMapForUI } from './JourneyRepository' -import { JourneyStep, JourneyStepMapParams, journeyStepTypes } from './JourneyStep' -import JourneyUserStep from './JourneyUserStep' -import { User } from '../users/User' -import { RequestError } from '../core/errors' -import JourneyError from './JourneyError' -import { getUserFromContext } from '../users/UserRepository' -import { duplicateJourney, triggerEntrance } from './JourneyService' -import { validate as uuidValidate } from 'uuid' -import { UUID } from 'crypto' - -const router = new Router< - ProjectState & { journey?: Journey } ->({ - prefix: '/journeys', -}) - -router.use(projectRoleMiddleware('editor')) - -router.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedJourneys(params, ctx.state.project.id) -}) - -const journeyParams: JSONSchemaType = { - $id: 'journeyParams', - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - }, - description: { - type: 'string', - nullable: true, - }, - tags: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - template_id: { - type: 'string', - nullable: true, - }, - status: { - type: 'string', - enum: ['off', 'draft', 'live'], - }, - }, - additionalProperties: false, -} - -router.post('/', async ctx => { - const payload = validate(journeyParams, ctx.request.body) - ctx.body = await createJourney(ctx.state.project.id, payload) -}) - -router.get('/entrances/:entranceId', async ctx => { - const entrance = await JourneyUserStep.first(q => q - .join('journeys', 'journey_user_step.journey_id', '=', 'journeys.id') - .where('journeys.project_id', ctx.state.project.id) - .where('journey_user_step.id', ctx.params.entranceId) - .whereNull('journey_user_step.entrance_id'), - ) - if (!entrance) { - return ctx.throw(404) - } - const [user, journey, userSteps] = await Promise.all([ - User.find(entrance.user_id), - Journey.find(entrance.journey_id), - getEntranceLog(entrance.id), - ]) - ctx.body = { journey, user, userSteps } -}) - -const checkJourneyId: ParamMiddleware = async (value, ctx, next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid journey ID') - return - } - - ctx.state.journey = await getJourney(value as UUID, ctx.state.project.id) - if (!ctx.state.journey) { - throw new RequestError(JourneyError.JourneyDoesNotExist) - } - return await next() -} - -router.param('journeyId', checkJourneyId) - -router.get('/:journeyId', async ctx => { - ctx.body = ctx.state.journey -}) - -router.patch('/:journeyId', async ctx => { - ctx.body = await updateJourney(ctx.state.journey!.id, validate(journeyParams, ctx.request.body)) -}) - -router.delete('/:journeyId', async ctx => { - const { id, project_id, deleted_at } = ctx.state.journey! - if (deleted_at) { - await deleteJourney(id, project_id) - } else { - await archiveJourney(id, project_id) - } - - ctx.body = true -}) - -const journeyStepsParamsSchema: JSONSchemaType = { - $id: 'journeyStepsParams', - type: 'object', - required: [], - additionalProperties: { - type: 'object', - required: ['type', 'x', 'y'], - properties: { - type: { - type: 'string', - enum: Object.keys(journeyStepTypes), - }, - name: { - type: 'string', - nullable: true, - }, - data: { - type: 'object', // TODO: Could validate further based on sub types - nullable: true, - additionalProperties: true, - }, - data_key: { - type: 'string', - nullable: true, - }, - x: { - type: 'number', - }, - y: { - type: 'number', - }, - children: { - type: 'array', - nullable: true, - items: { - type: 'object', - required: ['external_id'], - properties: { - external_id: { - type: 'string', - }, - path: { - type: 'string', - nullable: true, - }, - data: { - type: 'object', // TODO: this is also specific to the parent node's type - nullable: true, - additionalProperties: true, - }, - }, - }, - }, - }, - additionalProperties: false, - }, -} - -router.get('/:journeyId/steps', async ctx => { - ctx.body = await getJourneyStepMapForUI(ctx.state.journey!) -}) - -router.put('/:journeyId/steps', async ctx => { - await setJourneyStepMap(ctx.state.journey!, validate(journeyStepsParamsSchema, ctx.request.body)) - ctx.body = await getJourneyStepMapForUI(ctx.state.journey!) -}) - -router.post('/:journeyId/duplicate', async ctx => { - ctx.body = await duplicateJourney(ctx.state.journey!) -}) - -router.post('/:journeyId/version', async ctx => { - ctx.body = await duplicateJourney(ctx.state.journey!, true) -}) - -router.post( - '/:journeyId/publish', - projectRoleMiddleware('publisher'), - async ctx => { - ctx.body = await publishJourney(ctx.state.journey!) - }, -) - -router.get('/:journeyId/entrances', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedEntrancesByJourney(ctx.state.journey!.id, params) -}) - -router.delete('/:journeyId/entrances/:entranceId/users/:userId', async ctx => { - const user = await getUserFromContext(ctx) - if (!user) return ctx.throw(404) - - if (!uuidValidate(ctx.params.entranceId)) { - ctx.throw(400, 'Invalid entrance ID') - return - } - - const results = await exitUserFromJourney(user.id, ctx.params.entranceId as UUID, ctx.state.journey!.id) - ctx.body = { exits: results } -}) - -router.get('/:journeyId/steps/:stepId/users', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - const step = await JourneyStep.first(q => q - .where('journey_id', ctx.state.journey!.id) - .where('id', ctx.params.stepId), - ) - if (!step) return ctx.throw(404) - ctx.body = await pagedUsersByStep(step.id, params) -}) - -router.delete('/:journeyId/users/:userId/step/:stepId', async ctx => { - const user = await getUserFromContext(ctx) - if (!user) return ctx.throw(404) - const results = await JourneyUserStep.update( - q => q.where('id', ctx.params.stepId) - .where('user_id', user.id) - .whereNull('ended_at') - .where('journey_id', ctx.state.journey!.id), - { ended_at: new Date(), delay_until: null, type: 'completed' }, - ) - ctx.body = { exits: results } -}) - -router.post('/:journeyId/users/:userId/steps/:stepId/resume', async ctx => { - if (!uuidValidate(ctx.params.stepId)) { - ctx.throw(400, 'Invalid step ID') - return - } - - ctx.body = await skipDelayStep(ctx.params.stepId as UUID) -}) - -const journeyTriggerParams: JSONSchemaType = { - $id: 'journeyEntranceTriggerParams', - type: 'object', - required: ['entrance_id', 'user'], - properties: { - entrance_id: { - type: 'string', - format: 'uuid', - }, - user: { - type: 'object', - required: ['external_id'], - properties: { - external_id: { type: 'string' }, - email: { type: 'string', nullable: true }, - phone: { type: 'string', nullable: true }, - device_token: { type: 'string', nullable: true }, - timezone: { type: 'string', nullable: true }, - locale: { type: 'string', nullable: true }, - }, - additionalProperties: true, - }, - event: { - type: 'object', - additionalProperties: true, - nullable: true, - }, - }, - additionalProperties: false, -} - -// Manually trigger a journey entrance -router.post('/:journeyId/trigger', async ctx => { - const journey = ctx.state.journey! - const payload = validate(journeyTriggerParams, ctx.request.body) - - await triggerEntrance(journey, payload) - ctx.body = { success: true } -}) - -export default router diff --git a/services/platform/src/journey/JourneyDelayJob.ts b/services/platform/src/journey/JourneyDelayJob.ts deleted file mode 100644 index 7dfd3d66..00000000 --- a/services/platform/src/journey/JourneyDelayJob.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Job } from '../queue' -import App from '../app' -import { chunk } from '../utilities' -import JourneyUserStep from './JourneyUserStep' -import Journey from './Journey' -import JourneyProcessJob from './JourneyProcessJob' -import { UUID } from 'node:crypto' - -interface JourneyDelayJobParams { - journey_id: UUID -} - -export default class JourneyDelayJob extends Job { - static $name = 'journey_delay_job' - - static async enqueueActive(app: App) { - const query = Journey.query(app.db) - .select('id') - .whereNot('status', 'off') - .whereNull('deleted_at') - await chunk<{ id: UUID }>(query, app.queue.batchSize, async journeys => { - app.queue.enqueueBatch(journeys.map(({ id }) => JourneyDelayJob.from(id))) - }) - } - - static from(journey_id: UUID) { - return new JourneyDelayJob({ journey_id }) - } - - static async handler({ journey_id }: JourneyDelayJobParams) { - if (!journey_id) return - - const { queue } = App.main - - const updated = await JourneyUserStep - .query() - .where('journey_id', journey_id) - .where('type', 'delay') - .where('delay_until', '<=', 'NOW()') - .returning(['id']) - - if (updated.length === 0) return - - await queue.enqueueBatch(updated.map(({ id }) => JourneyProcessJob.from({ entrance_id: id }))) - } -} diff --git a/services/platform/src/journey/JourneyError.ts b/services/platform/src/journey/JourneyError.ts deleted file mode 100644 index 5aa0d664..00000000 --- a/services/platform/src/journey/JourneyError.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ErrorType } from '../core/errors' - -export default { - JourneyDoesNotExist: { - message: 'The requested journey does not exist or you do not have access.', - code: 9000, - statusCode: 400, - }, - JourneyStepDoesNotExist: { - message: 'The request journey step is invalid', - code: 9001, - statusCode: 400, - }, -} as Record diff --git a/services/platform/src/journey/JourneyProcessJob.ts b/services/platform/src/journey/JourneyProcessJob.ts deleted file mode 100644 index 8517b7ec..00000000 --- a/services/platform/src/journey/JourneyProcessJob.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { UUID } from 'node:crypto' -import { Job } from '../queue' -import Journey from './Journey' -import { JourneyState } from './JourneyState' -import JourneyUserStep from './JourneyUserStep' - -interface JourneyProcessParams { - entrance_id: UUID -} - -export default class JourneyProcessJob extends Job { - static $name = 'journey_process_job' - - static from(params: JourneyProcessParams): JourneyProcessJob { - return new this(params) - } - - static async handler({ entrance_id }: JourneyProcessParams) { - const entrance = await JourneyUserStep.find(entrance_id) - if (!entrance) return - - // Make sure journey is still active - const exists = await Journey.exists( - qb => qb.where('id', entrance.journey_id) - .whereNot('status', 'off') - .whereNull('deleted_at'), - ) - - if (!exists) return - - await JourneyState.resume(entrance) - } -} diff --git a/services/platform/src/journey/JourneyRepository.ts b/services/platform/src/journey/JourneyRepository.ts deleted file mode 100644 index 0b577367..00000000 --- a/services/platform/src/journey/JourneyRepository.ts +++ /dev/null @@ -1,424 +0,0 @@ -import App from '../app' -import { Database } from '../config/database' -import { RequestError } from '../core/errors' -import { PageParams } from '../core/searchParams' -import Journey, { JourneyParams, UpdateJourneyParams } from './Journey' -import { JourneyStep, JourneyEntrance, JourneyStepMap, toJourneyStepMap, JourneyStepChild, journeyStepTypes, JourneyStepMapParams } from './JourneyStep' -import JourneyUserStep from './JourneyUserStep' -import { createTagSubquery, getTags, setTags } from '../tags/TagService' -import { User } from '../users/User' -import { getProject } from '../projects/ProjectService' -import { duplicateJourney } from './JourneyService' -import { subSeconds } from 'date-fns' -import { JourneyState } from './JourneyState' -import { UUID } from 'node:crypto' -import { logger } from '../config/logger' - -export const pagedJourneys = async (params: PageParams, projectId: UUID) => { - const result = await Journey.search( - { ...params, fields: ['name'] }, - qb => { - qb.where({ project_id: projectId }) - .whereNull('deleted_at') - .whereNull('parent_id') - if (params.tag?.length) qb.whereIn('id', createTagSubquery(Journey, projectId, params.tag)) - return qb - }, - ) - if (result.results?.length) { - const tags = await getTags(Journey.tableName, result.results.map(j => j.id)) - for (const journey of result.results) { - journey.tags = tags.get(journey.id) ?? [] - } - } - return result -} - -export const allJourneys = async (projectId: UUID): Promise => { - return await Journey.all(qb => qb - .where('project_id', projectId) - .whereNull('parent_id') - .whereNull('deleted_at'), - ) -} - -export const createJourney = async (projectId: UUID, { tags, template_id, ...params }: JourneyParams): Promise => { - return App.main.db.transaction(async trx => { - const journey = await Journey.insertAndFetch({ - ...params, - status: 'draft', - project_id: projectId, - }, trx) - - if (template_id && !App.main.env.webhooks.journeyTemplate) { - logger.warn('Journey template requested but webhook journey template is disabled') - } - - if (template_id && App.main.env.webhooks.journeyTemplate) { - const template = await fetchJourneyTemplate(template_id) - await setJourneyStepMap(journey, template, trx) - } else { - // Auto-create entrance step - await JourneyEntrance.create(journey.id, undefined, trx) - } - - if (tags?.length) { - await setTags({ - project_id: projectId, - entity: Journey.tableName, - entity_id: journey.id, - names: tags, - }, trx) - } - - return journey - }) -} - -export async function fetchJourneyTemplate( - template_id: string, -): Promise { - if (!App.main.env.webhooks.journeyTemplate) { - throw new Error('No template webhook configured') - } - - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), App.main.env.webhooks.journeyTemplate.timeoutMs) - - try { - const url = new URL(App.main.env.webhooks.journeyTemplate.url) - url.searchParams.set('template_id', template_id) - const res = await fetch(url, { - method: 'GET', - headers: { - Accept: 'application/json', - }, - signal: controller.signal, - }) - - clearTimeout(timeoutId) - if (!res.ok) throw new Error(`Webhook error: ${res.statusText}`) - return res.json() - } catch (error) { - clearTimeout(timeoutId) - throw error - } -} - -export const getJourney = async (id: UUID, projectId: UUID): Promise => { - const journey = await Journey.find(id, qb => qb.where('project_id', projectId)) - if (!journey) throw new RequestError('Journey not found', 404) - journey.tags = await getTags(Journey.tableName, [journey.id]).then(m => m.get(journey.id)) ?? [] - journey.draft_id = await getDraftJourneyId(journey.id, projectId) - return journey -} - -export const updateJourney = async (id: UUID, { tags, ...params }: UpdateJourneyParams, db = App.main.db): Promise => { - const journey = await db.transaction(async trx => { - const journey = await Journey.updateAndFetch(id, params, trx) - if (tags) { - await setTags({ - project_id: journey.project_id, - entity: Journey.tableName, - entity_id: journey.id, - names: tags, - }, trx) - } - return journey - }) - - return await getJourney(id, journey.project_id) -} - -export const deleteJourney = async (id: UUID, projectId: UUID): Promise => { - await Journey.deleteById(id, qb => qb.where('project_id', projectId)) -} - -export const archiveJourney = async (id: UUID, projectId: UUID): Promise => { - await Journey.archive(id, qb => qb.where('project_id', projectId), { status: 'off', deleted_at: new Date() }) - await Journey.update(qb => qb.where('parent_id', id).where('project_id', projectId), { deleted_at: new Date() }) -} - -export const publishJourney = async (journey: Journey): Promise => { - // If we are dealing with a draft, utilize it otherwise create - // a new draft for state management - const parent = journey.parent_id - ? await getJourney(journey.parent_id, journey.project_id) - : await duplicateJourney(journey, true) - - // Set the parent step map to match the draft journey - const steps = await getJourneyStepMap(journey.id) - await setJourneyStepMap(parent, steps) - - await Journey.update(qb => qb.whereIn('id', [journey.id, parent.id]), { - status: 'live', - }) -} - -export const getDraftJourneyId = async (journeyId: UUID, projectId: UUID): Promise => { - const journey = await Journey.first(qb => qb.where('parent_id', journeyId) - .where('project_id', projectId) - .where('status', 'draft') - .orderBy('id', 'desc'), - ) - return journey?.id -} - -export const getJourneySteps = async (journeyId: UUID, db?: Database): Promise => { - return await JourneyStep.all(qb => qb.where('journey_id', journeyId), db) -} - -export const getJourneyStepChildren = async (journeyId: UUID, db?: Database): Promise => { - return await JourneyStepChild.all( - q => q - .whereIn('step_id', JourneyStep.query(db).select('id').where('journey_id', journeyId)) - .orderBy('priority', 'asc') - .orderBy('id', 'asc'), - db, - ) -} - -export const getJourneyStepMapForUI = async (journey: Journey) => { - const map = await getJourneyStepMap(journey.id) - for (const key of Object.keys(map)) { - const step = map[key] - const type = journeyStepTypes[step.type] - map[key] = await type.hydrate(step, journey) - } - return map -} - -export const getJourneyStepMap = async (journeyId: UUID) => { - const [steps, children] = await Promise.all([ - getJourneySteps(journeyId), - getJourneyStepChildren(journeyId), - ]) - return toJourneyStepMap(steps, children) -} - -export const setJourneyStepMap = async (journey: Journey, stepMap: JourneyStepMap, trx?: Database.Transaction) => { - const handler = async (trx: Database.Transaction) => { - const [steps, children] = await Promise.all([ - getJourneySteps(journey.id, trx), - getJourneyStepChildren(journey.id, trx), - ]) - - const now = new Date() - const project = await getProject(journey.project_id) - - // Create or update steps - for (const [external_id, { type, x = 0, y = 0, data = {}, data_key, name = '' }] of Object.entries(stepMap)) { - let step = steps.find(s => s.external_id === external_id) - if (!step) { - steps.push(step = new JourneyStep()) - } - let next_scheduled_at: null | Date = null - if (type === JourneyEntrance.type && data.trigger === 'schedule') { - if (step.data?.schedule !== data.schedule) { - next_scheduled_at = JourneyEntrance.fromJson({ data }).nextDate(project?.timezone ?? 'UTC', now) - } else { - next_scheduled_at = step.next_scheduled_at - } - } - const fields = { data, data_key, name, next_scheduled_at, x, y } - step.parseJson(step.id - ? await JourneyStep.updateAndFetch(step.id, fields, trx) - : await JourneyStep.insertAndFetch({ - ...fields, - external_id, - journey_id: journey.id, - type, - }, trx), - ) - } - - // Delete removed or unused steps - const deleteSteps: UUID[] = [] - let i = 0 - while (i < steps.length) { - const step = steps[i] - if (!stepMap[step.external_id]) { - deleteSteps.push(step.id) - steps.splice(i, 1) - continue - } - i++ - } - if (deleteSteps.length) { - await JourneyStep.delete(q => q.whereIn('id', deleteSteps), trx) - } - - const deleteChildSteps: UUID[] = [] - for (const step of steps) { - const list = stepMap[step.external_id]?.children ?? [] - const childIds: UUID[] = [] - - let ci = 0 - for (const { external_id, path, data = {} } of list) { - const child = steps.find(s => s.external_id === external_id) - if (!child) continue - const idx = children.findIndex(sc => sc.step_id === step.id && sc.child_id === child.id) - let stepChild: JourneyStepChild - if (idx === -1) { - children.push(stepChild = await JourneyStepChild.insertAndFetch({ - step_id: step.id, - child_id: child.id, - data, - path, - priority: ci, - }, trx)) - } else { - stepChild = children[idx] - children[idx] = await JourneyStepChild.updateAndFetch(stepChild.id, { - data, - path, - priority: ci, - }, trx) - } - childIds.push(stepChild.child_id) - ci++ - } - - i = 0 - while (i < children.length) { - const stepChild = children[i] - if (stepChild.step_id === step.id && !childIds.includes(stepChild.child_id)) { - deleteChildSteps.push(stepChild.id) - children.splice(i, 1) - continue - } - i++ - } - } - if (deleteChildSteps.length) { - await JourneyStepChild.delete(q => q.whereIn('id', deleteChildSteps), trx) - } - - return { steps, children } - } - - if (trx) { - return handler(trx) - } - - return App.main.db.transaction(handler) -} - -export const getEntranceSubsequentSteps = async (entranceId: UUID) => { - return JourneyUserStep.all(q => q - .where('entrance_id', entranceId) - .orderBy('created_at', 'asc'), - ) -} - -export const pagedEntrancesByJourney = async (journeyId: UUID, params: PageParams) => { - const r = await JourneyUserStep.search(params, q => q - .where('journey_id', journeyId) - .whereNull('entrance_id'), - ) - if (r.results?.length) { - const users = await User.findMap(r.results.map(s => s.user_id)) - return { - ...r, - results: r.results.map(s => ({ - id: s.id, - user: users.get(s.user_id), - created_at: s.created_at, - updated_at: s.updated_at, - ended_at: s.ended_at, - })), - } - } - return r -} - -export const pagedEntrancesByUser = async (userId: UUID, params: PageParams) => { - const r = await JourneyUserStep.search(params, q => q - .where('user_id', userId) - .whereNull('entrance_id'), - ) - if (r.results?.length) { - const journeys = await Journey.findMap(r.results.map(s => s.journey_id)) - return { - ...r, - results: r.results.map(s => ({ - id: s.id, - entrance_id: s.id, - journey: journeys.get(s.journey_id), - created_at: s.created_at, - updated_at: s.updated_at, - ended_at: s.ended_at, - })), - } - } - return r -} - -export const pagedUsersByStep = async (stepId: UUID, params: PageParams) => { - const r = await JourneyUserStep.search(params, q => q - .where('step_id', stepId) - .orderBy('id', 'desc'), - ) - if (r.results?.length) { - const users = await User.findMap(r.results.map(s => s.user_id)) - return { - ...r, - results: r.results.map(s => ({ - id: s.id, - user: users.get(s.user_id), - type: s.type, - delay_until: s.delay_until, - created_at: s.created_at, - updated_at: s.updated_at, - ended_at: s.ended_at, - })), - } - } - return r -} - -export const getEntranceLog = async (entranceId: UUID) => { - const userSteps = await JourneyUserStep.all(q => q - .where(function() { - return this.where('id', entranceId).orWhere('entrance_id', entranceId) - }) - .orderBy('id', 'asc'), - ) - if (!userSteps.length) return userSteps - const steps = await JourneyStep.findMap(userSteps.map(s => s.step_id)) - for (const userStep of userSteps) { - userStep.step = steps.get(userStep.step_id) - } - return userSteps -} - -export const getJourneyUserStepByExternalId = async (journeyId: UUID, userId: UUID, externalId: string, db?: Database): Promise => { - return await JourneyUserStep.first( - qb => qb.leftJoin('journey_steps', 'journey_steps.id', 'journey_user_step.step_id') - .where('journey_user_step.journey_id', journeyId) - .where('journey_steps.external_id', externalId) - .where('journey_user_step.user_id', userId) - .select('journey_user_step.*'), - db, - ) -} - -export const exitUserFromJourney = async (userId: UUID, entranceId: UUID, journeyId: UUID) => { - await JourneyUserStep.update( - q => q.where('user_id', userId) - .where('id', entranceId) - .whereNull('ended_at') - .where('journey_id', journeyId), - { ended_at: new Date(), delay_until: null, type: 'completed' }, - ) -} - -export const skipDelayStep = async (userStepId: UUID) => { - const step = await JourneyUserStep.find(userStepId) - if (!step || !step.entrance_id) return - await JourneyUserStep.update( - q => q.where('id', step.id), - { delay_until: subSeconds(Date.now(), 1) }, - ) - await JourneyState.resume(step.entrance_id) -} diff --git a/services/platform/src/journey/JourneyService.ts b/services/platform/src/journey/JourneyService.ts deleted file mode 100644 index 26d61c81..00000000 --- a/services/platform/src/journey/JourneyService.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { User } from '../users/User' -import { getEntranceSubsequentSteps, getJourney, getJourneyStepMap, getJourneySteps, setJourneyStepMap } from './JourneyRepository' -import { JourneyAction, JourneyEntrance, JourneyStep, JourneyStepMap } from './JourneyStep' -import JourneyUserStep from './JourneyUserStep' -import { UserEvent } from '../users/UserEvent' -import App from '../app' -import { Rule, RuleTree } from '../rules/Rule' -import { check } from '../rules/RuleEngine' -import JourneyProcessJob from './JourneyProcessJob' -import Journey, { JourneyEntranceTriggerParams } from './Journey' -import JourneyError from './JourneyError' -import { RequestError } from '../core/errors' -import EventPostJob from '../client/EventPostJob' -import { pick, uuid } from '../utilities' -import { UUID } from 'node:crypto' - -export const enterJourneysFromEvent = async (event: UserEvent, user?: User) => { - - // Look up all entrances in live journeys - const entrances = await JourneyEntrance.all(q => q - .join('journeys', 'journey_steps.journey_id', '=', 'journeys.id') - .where('journeys.project_id', event.project_id) - - // Exclude journeys that are not live or the root journey - .where('journeys.status', 'live') - .whereNull('journeys.parent_id') - .whereNull('journeys.deleted_at') - - // Filter down the step type to be an entrance - .where('journey_steps.type', JourneyEntrance.type) - .whereJsonPath('journey_steps.data', '$.trigger', '=', 'event') - .whereJsonPath('journey_steps.data', '$.event_name', '=', event.name), - ) - - if (!entrances.length) return - - if (!user) { - user = await User.find(event.user_id) - } - - const input = { - user: user!.flatten(), - events: [event!.flatten()], - journey: {}, - } - - const entranceIds: UUID[] = [] - for (const entrance of entrances) { - - // If a rule is specified, check it before pushing user into journey - if (entrance.rule) { - const rule: RuleTree = { - ...entrance.rule as Rule, - group: 'event', - path: '$.name', - value: event.name, // ensure that the expected event name is here - } - if (!check(input, rule)) { - continue - } - } - - // Skip if user has any entrances (active or ended) - // into this journey and multiple are not allowed - if (!entrance.multiple) { - const hasAny = await JourneyUserStep.exists(q => q - .where('user_id', event.user_id) - .where('step_id', entrance.id), - ) - if (hasAny) continue - } else if (!entrance.concurrent) { - const hasActive = await JourneyUserStep.exists(q => q - .where('step_id', entrance.id) - .where('user_id', event.user_id) - .whereNull('ended_at'), - ) - if (hasActive) continue - } - - // Create new entrance - entranceIds.push(await JourneyUserStep.insert({ - journey_id: entrance.journey_id, - step_id: entrance.id, - user_id: event.user_id, - type: 'completed', - data: { - event: event.flatten(), - }, - })) - } - - if (entranceIds.length) { - await App.main.queue.enqueueBatch(entranceIds.map(entrance_id => JourneyProcessJob.from({ entrance_id }))) - } -} - -export const loadUserStepDataMap = async (referenceId: UUID) => { - let step = await JourneyUserStep.find(referenceId) - if (!step) return {} - if (step.entrance_id) step = await JourneyUserStep.find(step.entrance_id) - const [steps, userSteps] = await Promise.all([ - getJourneySteps(step!.journey_id), - getEntranceSubsequentSteps(step!.id), - ]) - return JourneyUserStep.getDataMap(steps, [step!, ...userSteps]) -} - -export const triggerEntrance = async (journey: Journey, payload: JourneyEntranceTriggerParams) => { - // Look up target entrance step - const step = await JourneyStep.first(qb => qb - .where('journey_id', journey.id) - .where('id', payload.entrance_id)) - - // Make sure target step is actually an entrance - if (!step || step.type !== JourneyEntrance.type) { - throw new RequestError(JourneyError.JourneyStepDoesNotExist) - } - - // Extract top-level vs custom properties user fields - const { external_id, email, phone, device_token, locale, timezone, ...data } = payload.user - - // Create the user synchronously if new - const { user, event } = await EventPostJob.from({ - project_id: journey.project_id, - event: { - name: 'journey_trigger', - external_id: payload.user.external_id, - data: { - ...payload.event, - journey: { - id: journey.id, - name: journey.name, - entrance_id: payload.entrance_id, - }, - }, - user: { external_id, email, phone, data, locale, timezone }, - }, - }).handle<{ user: User, event: UserEvent }>() - - // Create new entrance - const entrance_id = await JourneyUserStep.insert({ - journey_id: journey.id, - user_id: user.id, - step_id: step.id, - type: 'completed', - data: { - event: event?.flatten(), - }, - }) - - // Trigger async processing - await JourneyProcessJob.from({ entrance_id }).queue() -} - -export const getJourneysForCampaign = async (projectId: UUID, campaignId: UUID) => { - const journeys = await Journey.all(q => q - .where('project_id', projectId) - .leftJoin('journey_steps', 'journeys.id', '=', 'journey_steps.journey_id') - .where('journey_steps.type', JourneyAction.type) - .whereJsonPath('journey_steps.data', '$.campaign_id', '=', campaignId), - ) - return Object.values(journeys.reduce((acc, curr) => { - const id = curr.parent_id ?? curr.id - if (!acc[id] || !curr.parent_id) { - acc[id] = curr - } - return acc - }, {} as Record)) -} - -export const duplicateJourney = async (journey: Journey, asChild = false) => { - const params: Partial = pick(journey, ['project_id', 'name', 'description']) - const newJourney = await Journey.insertAndFetch({ - ...params, - name: asChild ? params.name : `Copy of ${params.name}`, - status: 'draft', - parent_id: asChild ? journey.parent_id ?? journey.id : undefined, - }) - - // If there is a parent record, the child steps must match - // UUIDs otherwise remap them for the separate duplicate journey - const steps = await getJourneyStepMap(journey.id) - if (asChild) { - await setJourneyStepMap(newJourney, steps) - } else { - const newSteps: JourneyStepMap = {} - const stepKeys = Object.keys(steps) - const uuidMap = stepKeys.reduce((acc, curr) => { - acc[curr] = uuid() - return acc - }, {} as Record) - for (const key of stepKeys) { - const step = steps[key] - newSteps[uuidMap[key]] = { - ...step, - children: step.children?.map(({ external_id, ...rest }) => ({ external_id: uuidMap[external_id], ...rest })), - } - } - await setJourneyStepMap(newJourney, newSteps) - } - - return await getJourney(newJourney.id, journey.project_id) -} diff --git a/services/platform/src/journey/JourneyState.ts b/services/platform/src/journey/JourneyState.ts deleted file mode 100644 index 2a36a88e..00000000 --- a/services/platform/src/journey/JourneyState.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { UUID } from 'node:crypto' -import App from '../app' -import { acquireLock, releaseLock } from '../core/Lock' -import { getProject } from '../projects/ProjectService' -import Job from '../queue/Job' -import { Rule } from '../rules/Rule' -import { User } from '../users/User' -import { getUserEventsForRules } from '../users/UserRepository' -import { shallowEqual } from '../utilities' -import { getEntranceSubsequentSteps, getJourneyStepChildren, getJourneySteps } from './JourneyRepository' -import { JourneyStep, JourneyStepChild, journeyStepTypes } from './JourneyStep' -import JourneyUserStep from './JourneyUserStep' -import { logger } from '../config/logger' - -type JobOrJobFunc = Job | ((state: JourneyState) => Promise) - -export class JourneyState { - - /** - * Resumes journey sequence/cycle processing for a given entrance (user can have multiple entrances, be in the journey multiple times) - * @param entrance entrance user step - * @param user target user to run journey for - * @returns promise that resolves when processing ends - */ - public static async resume(entrance: UUID | JourneyUserStep, user?: User) { - if (typeof entrance === 'string') { - entrance = (await JourneyUserStep.find(entrance))! - } - if (!entrance) { - return - } - if (entrance.entrance_id) { - entrance = (await JourneyUserStep.find(entrance.entrance_id))! - if (!entrance || entrance.entrance_id) { - return - } - } - - logger.debug('resuming journey', { entrance_id: entrance.id }) - - if (entrance.ended_at) { - logger.debug('attempt to resume ended journey', { entrance_id: entrance.id }) - return - } - - // Find user - if (!user) { - user = await User.find(entrance.user_id) - } - if (!user) { - return - } - - // User-entrance mismatch - if (entrance.user_id !== user.id) { - return - } - - const key = `journey:entrance:${entrance.id}` - - const acquired = await acquireLock({ key }) - if (!acquired) { - return - } - - // Load all journey dependencies - const [steps, children, userSteps] = await Promise.all([ - getJourneySteps(entrance.journey_id) - .then(steps => steps.map(s => journeyStepTypes[s.type]?.fromJson(s))), - getJourneyStepChildren(entrance.journey_id), - getEntranceSubsequentSteps(entrance.id), - ]) - - const state = new this(entrance, steps, children, [entrance, ...userSteps], user) - - await state.run() - - await releaseLock(key) - - return state - } - - private _timezone?: string - - // Batch enqueue jobs after processing - private _jobs: JobOrJobFunc[] = [] - - constructor( - public readonly entrance: JourneyUserStep, - public readonly steps: JourneyStep[], - public readonly children: JourneyStepChild[], - public readonly userSteps: JourneyUserStep[], - public readonly user: User, - ) { } - - private async run() { - let currentStep = this.userSteps[this.userSteps.length - 1] - let step = this.steps.find(s => s.id === currentStep.step_id) - - while (step) { - // NOTE: we have to check if we advanced to a new step. A pending JourneyUserStep - // is created the type of the step will be updated once processed. - if (currentStep.step_id !== step.id) { - this.userSteps.push(currentStep = JourneyUserStep.fromJson({ - journey_id: this.entrance.journey_id, - entrance_id: this.entrance.id, - user_id: this.user.id, - step_id: step.id, - })) - } - - // continue on if this step is completed - if (currentStep.type === 'completed') { - step = await this.next(step) - continue - } - - const copy = { ...currentStep } - - // delegate to step type - try { - await step.process(this, currentStep) - } catch (err) { - currentStep.type = 'error' - } - - // persist and update the user step - if (currentStep.id) { - // only update the step is something has changed - if (!shallowEqual(copy, currentStep)) { - currentStep.parseJson(await JourneyUserStep.updateAndFetch(currentStep.id, currentStep)) - } - } else { - currentStep.parseJson(await JourneyUserStep.insertAndFetch(currentStep)) - } - - // Stop processing if latest isn't completed - if (currentStep.type !== 'completed') { - // Exit journey completely if a catastrophic error - // has occurred to avoid unpredictable behavior - if (currentStep.type === 'error') { - await this.end() - } - break - } - } - - if (this._jobs.length) { - const jobs: Job[] = [] - for (let j of this._jobs) { - if (typeof j === 'function') { - const i = await j(this) - if (!i) continue - j = i - } - jobs.push(j) - } - await App.main.queue.enqueueBatch(jobs) - } - } - - private async next(step: JourneyStep) { - const nextId = await step.next(this) - if (!nextId) { - await this.end() - return - } - - const next = this.steps.find(s => s.id === nextId) - if (!next) { - await this.end() - return - } - - // NOTE: we want to end circular reference within this entrance - const revisited = this.userSteps.find( - s => s.step_id === next.id, - ) - - // TODO: the problem with returning a revisited - if (revisited && revisited.type === 'completed') { - await this.end() - return - } - - return next - } - - private async end() { - await JourneyUserStep.update(q => q.where('id', this.entrance.id), { - ended_at: new Date(), - }) - } - - public childrenOf(stepId: UUID) { - return this.children.filter(sc => sc.step_id === stepId) - } - - public job(job: JobOrJobFunc) { - this._jobs.push(job) - } - - public async events(rule: Rule) { - // TODO: Find a way to not have to pull in all events, better discern - return await getUserEventsForRules(this.user.id, rule) - } - - public async timezone() { - if (!this._timezone) { - this._timezone = this.user.timezone - } - if (!this._timezone) { - this._timezone = (await getProject(this.user.project_id))!.timezone - } - return this._timezone! - } - - public stepData() { - return JourneyUserStep.getDataMap(this.steps, this.userSteps) - } -} diff --git a/services/platform/src/journey/JourneyStatsJob.ts b/services/platform/src/journey/JourneyStatsJob.ts deleted file mode 100644 index 49d85cbb..00000000 --- a/services/platform/src/journey/JourneyStatsJob.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { UUID } from 'node:crypto' -import { Job } from '../queue' -import Journey from './Journey' -import { JourneyStep } from './JourneyStep' -import JourneyUserStep from './JourneyUserStep' - -interface JourneyStatsParams { - journey_id: UUID -} - -export default class JourneyStatsJob extends Job { - static $name = 'journey_stats_job' - - static from(journey_id: UUID) { - return new this({ journey_id }) - } - - static async handler({ journey_id }: JourneyStatsParams) { - const stats_at = new Date() - - const [steps, counts] = await Promise.all([ - JourneyStep.query() - .select('id') - .where('journey_id', journey_id), - JourneyUserStep.query() - .select('step_id') - .sum({ - entrance: JourneyUserStep.raw('case when entrance_id is null then 1 else 0 end'), - ended: JourneyUserStep.raw('case when entrance_id is null and ended_at is not null then 1 else 0 end'), - completed: JourneyUserStep.raw('case when type = ? then 1 else 0 end', ['completed']), - error: JourneyUserStep.raw('case when type = ? then 1 else 0 end', ['error']), - delay: JourneyUserStep.raw('case when type = ? then 1 else 0 end', ['delay']), - action: JourneyUserStep.raw('case when type = ? then 1 else 0 end', ['action']), - }) - .where('journey_id', journey_id) - .groupBy('step_id') as Promise>, - ]) - - // knex returns the sums as strings for some reason - counts.forEach(o => Object.entries(o).forEach(([stat, count]) => { - if (stat !== 'step_id') { - (o as any)[stat] = Number(count) - } - })) - - await Journey.update(q => q.where('id', journey_id), { - stats: counts.reduce((a, { step_id, ...rest }) => { - for (const [stat, count] of Object.entries(rest)) { - a[stat] = (a[stat] ?? 0) + count - } - return a - }, { - entrance: 0, - ended: 0, - completed: 0, - error: 0, - delay: 0, - action: 0, - } as Record), - stats_at, - }) - - for (const step of steps) { - const { step_id, ...stats } = counts.find(c => c.step_id === step.id) ?? {} - await JourneyStep.update(q => q.where('id', step.id), { - stats, - stats_at, - }) - } - } - -} diff --git a/services/platform/src/journey/JourneyStep.ts b/services/platform/src/journey/JourneyStep.ts deleted file mode 100644 index f33fd349..00000000 --- a/services/platform/src/journey/JourneyStep.ts +++ /dev/null @@ -1,685 +0,0 @@ -import { add, addDays, addHours, addMinutes, getDay, isEqual, isFuture, isPast, parse } from 'date-fns' -import Model from '../core/Model' -import { getCampaign, getCampaignSend, triggerCampaignSend } from '../campaigns/CampaignService' -import { crossTimezoneCopy, pick, random, snakeCase, uuid } from '../utilities' -import { Database } from '../config/database' -import { compileTemplate } from '../render' -import { logger } from '../config/logger' -import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz' -import { Rule } from '../rules/Rule' -import { check } from '../rules/RuleEngine' -import App from '../app' -import { rrulestr } from 'rrule' -import { JourneyState } from './JourneyState' -import { EventPostJob, UserPatchJob } from '../jobs' -import { exitUserFromJourney, getJourneyUserStepByExternalId } from './JourneyRepository' -import JourneyUserStep from './JourneyUserStep' -import Journey from './Journey' -import { UUID } from 'node:crypto' - -export class JourneyStepChild extends Model { - - step_id!: UUID - child_id!: UUID - data?: Record - path?: string - priority!: number - - static tableName = 'journey_step_child' - static jsonAttributes: string[] = ['data'] - -} - -export class JourneyStep extends Model { - type!: string - journey_id!: UUID - name?: string - data?: Record - external_id!: string - data_key?: string // make data stored in user steps available in templates - stats?: Record - stats_at?: Date - next_scheduled_at: Date | null = null - - // UI variables - x = 0 - y = 0 - - static tableName = 'journey_steps' - static jsonAttributes = ['data', 'stats'] - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static async getStats(steps: JourneyStep[]): Promise<{ [external_id: string]: any }> { - return {} - } - - static get type() { return snakeCase(this.name) } - - get dataKey(): string { - return this.data_key ?? this.id.toString() - } - - async process(state: JourneyState, userStep: JourneyUserStep): Promise { - userStep.type = 'completed' - } - - async next(state: JourneyState): Promise { - return state.childrenOf(this.id)[0]?.child_id - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static async hydrate(step: JourneyStepMapItem, journey: Journey): Promise { - return Promise.resolve(step) - } -} - -export class JourneyEntrance extends JourneyStep { - static type = 'entrance' - - trigger: 'none' | 'event' | 'schedule' = 'none' - - // event driven - event_name!: string - rule?: Rule - multiple = false // multiple entries allowed - concurrent = false - - // schedule driven - list_id!: UUID - schedule?: string - - parseJson(json: any) { - super.parseJson(json) - this.trigger = json?.data?.trigger ?? 'none' - - this.event_name = json?.data?.event_name - this.rule = json?.data?.rule - this.multiple = json?.data?.multiple - this.concurrent = json?.data?.concurrent - - this.list_id = json?.data?.list_id - this.schedule = json?.data?.schedule - } - - nextDate(timezone: string, after = this.next_scheduled_at): Date | null { - - if (this.trigger !== 'schedule' || !after) return null - - if (this.schedule) { - try { - const rule = rrulestr(this.schedule, { tzid: timezone }) - - // If there is no frequency, only run once - if (!rule.options.freq) { - if (isEqual(rule.options.dtstart, after)) { - return null - } - return rule.options.dtstart - } - - return rrulestr(this.schedule, { tzid: timezone }).after(after) - } catch (err) { - App.main.error.notify(err as Error, { - entranceId: this.id, - }) - } - } - return null - } - - static async create(journeyId: UUID, listId?: UUID, db?: Database): Promise { - return await JourneyEntrance.insertAndFetch({ - type: this.type, - external_id: uuid(), - journey_id: journeyId, - data: { - list_id: listId, - }, - x: 0, - y: 0, - }, db) - } - - static async hydrate(step: JourneyStep, journey: Journey) { - if (!step.data) return step - if (step.data.trigger !== 'none') return step - - const references = await Journey.all( - qb => qb - .where('journey_steps.type', 'link') - .whereJsonPath('journey_steps.data', '$.target_id', '=', journey.id) - .where('journeys.status', 'live') - .whereNull('journeys.deleted_at') - .whereNull('journeys.parent_id') - .leftJoin('journey_steps', 'journey_steps.journey_id', '=', 'journeys.id') - .select('journeys.name', 'journeys.id'), - ) - step.data.references = references.map(item => pick(item, ['id', 'name'])) - return step - } -} - -export class JourneyExit extends JourneyStep { - static type = 'exit' - - entrance_uuid!: string - event_name!: string - rule?: Rule - - parseJson(json: any) { - super.parseJson(json) - - this.entrance_uuid = json?.data?.entrance_uuid - this.event_name = json?.data?.event_name - this.rule = json?.data?.rule - } - - async process(state: JourneyState, userStep: JourneyUserStep): Promise { - const entrance = await getJourneyUserStepByExternalId(this.journey_id, userStep.user_id, this.entrance_uuid) - if (entrance) await exitUserFromJourney(userStep.user_id, entrance.id, this.journey_id) - - super.process(state, userStep) - } - - static async create(journeyId: UUID, db?: Database): Promise { - return await JourneyExit.insertAndFetch({ - external_id: uuid(), - journey_id: journeyId, - x: 0, - y: 0, - }, db) - } -} - -type JourneyDelayFormat = 'duration' | 'time' | 'date' -export class JourneyDelay extends JourneyStep { - static type = 'delay' - - format: JourneyDelayFormat = 'duration' - minutes = 0 - hours = 0 - days = 0 - time?: string - date?: string - exclusion_days?: number[] // 0 = Sunday, 6 = Saturday - - parseJson(json: any) { - super.parseJson(json) - - this.format = json?.data?.format - this.minutes = json?.data?.minutes - this.hours = json?.data?.hours - this.days = json?.data?.days - this.time = json?.data?.time - this.date = json?.data?.date - this.exclusion_days = json?.data?.exclusion_days - } - - async process(state: JourneyState, userStep: JourneyUserStep) { - - // If no delay has been set yet, calculate one - if (!userStep.delay_until) { - userStep.delay_until = await this.offset(state) - userStep.type = 'delay' - return - } - - // If delay has passed, change to completed - if (!isFuture(userStep.delay_until)) { - userStep.type = 'completed' - } - } - - private async offset(state: JourneyState): Promise { - - const timezone = await state.timezone() - const baseDate = new Date() - const time = this.time?.trim() - const date = this.date?.trim() - - if (this.format === 'duration') { - return add(baseDate, { - days: this.days, - hours: this.hours, - minutes: this.minutes, - }) - } else if (this.format === 'time' && time) { - let localDate = utcToZonedTime(baseDate, timezone) - const parsedDate = parse(time, 'HH:mm', baseDate) - localDate.setMinutes(parsedDate.getMinutes()) - localDate.setHours(parsedDate.getHours()) - localDate.setSeconds(0) - - if (this.exclusion_days?.length) { - localDate = this.nextNotExcludedDay(localDate) - } - - const nextDate = zonedTimeToUtc(localDate, timezone) - - // In case things are delayed, allow for up to 30 minutes - // to pass before moving event to next day - const dateWithOffset = add(nextDate, { minutes: 30 }) - if (isPast(dateWithOffset)) { - return add(nextDate, { days: 1 }) - } - return nextDate - } else if (this.format === 'date' && date) { - try { - const compiledDate = compileTemplate(date)({ - user: state.user.flatten(), - journey: state.stepData(), - }) - const localDate = crossTimezoneCopy(new Date(compiledDate), 'UTC', timezone) - if (localDate < baseDate) return baseDate - return localDate - } catch (error) { - logger.error({ error, date, timezone }, 'journey:delay:parse:error') - throw error - } - } - - return baseDate - } - - private nextNotExcludedDay(date: Date): Date { - for (let i = 0; i < 7; i++) { - if (this.exclusion_days?.includes(getDay(date))) { - date = addDays(date, 1) - } else { - return date - } - } - return date - } -} - -export class JourneyAction extends JourneyStep { - static type = 'action' - - campaign_id!: UUID - - parseJson(json: any) { - super.parseJson(json) - this.campaign_id = json?.data?.campaign_id - } - - async process(state: JourneyState, userStep: JourneyUserStep): Promise { - const campaign = await getCampaign(this.campaign_id, state.user.project_id) - - if (!campaign) { - userStep.type = 'error' - return - } - - if (userStep.type === 'action') { - const send = await getCampaignSend(campaign.id, state.user.id, `${userStep.id}`) - if (send?.state === 'failed') { - userStep.type = 'error' - } - if (send?.state === 'sent') { - userStep.type = 'completed' - } - return - } - - userStep.type = 'action' - - // defer job construction so that we have the journey_user_step.id value - state.job(async () => { - const campaignSend = await getCampaignSend(campaign.id, state.user.id, `${userStep.id}`) - - const send = triggerCampaignSend({ - campaign, - user: state.user, - exists: !!campaignSend, - reference_id: `${userStep.id}`, - reference_type: 'journey', - }) - - if (!send) { - userStep.type = 'error' - } - - return send - }) - } -} - -export class JourneyGate extends JourneyStep { - static type = 'gate' - - rule!: Rule - - parseJson(json: any) { - super.parseJson(json) - this.rule = json?.data?.rule - } - - async next(state: JourneyState) { - - if (!this.rule) return - - const children = state.childrenOf(this.id) - const passed = children.find(c => c.path === 'yes') - const failed = children.find(c => c.path === 'no') - - if (!passed && !failed) return - - const events = await state.events(this.rule) - - const params = { - user: state.user.flatten(), - events: events.map(e => e.flatten()), - journey: state.stepData(), - } - - return check(params, this.rule) - ? passed?.child_id - : failed?.child_id - } -} - -/** - * Randomly distribute users to different branches - */ -export class JourneyExperiment extends JourneyStep { - static type = 'experiment' - - async next(state: JourneyState) { - - let children = state.childrenOf(this.id) - if (!children.length) return undefined - - children = children.reduce((a, c) => { - const proportion = c.data?.ratio - if (typeof proportion === 'number' && !isNaN(proportion) && proportion > 0) { - for (let i = 0; i < proportion; i++) { - a.push(c) - } - } - return a - }, []) - - // exit if no children paths have any proportions - if (!children.length) return undefined - - return random(children).child_id - } -} - -/** - * Add user to another journey - */ -export class JourneyLink extends JourneyStep { - static type = 'link' - - target_id!: UUID - delay: '1 minute' | '15 minutes' | '1 hour' | '1 day' = '1 day' - - parseJson(json: any) { - super.parseJson(json) - this.target_id = json.data?.target_id - this.delay = json.data?.delay ?? '1 day' - } - - async process(state: JourneyState, userStep: JourneyUserStep): Promise { - - let step = state.steps.find(s => s.id === this.target_id) - let delay_until = new Date() - - if (this.delay === '1 minute') { - delay_until = addMinutes(delay_until, 1) - } else if (this.delay === '15 minutes') { - delay_until = addMinutes(delay_until, 15) - } else if (this.delay === '1 hour') { - delay_until = addHours(delay_until, 1) - } else { - delay_until = addDays(delay_until, 1) - } - - if (!step) { - step = await JourneyStep.first(q => q - .join('journeys', 'journey_id', '=', 'journeys.id') - .where('journeys.id', this.target_id) - .where('journeys.project_id', state.user.project_id) - .where('journeys.status', 'live') - .whereNull('journeys.deleted_at') - .where('type', 'entrance'), - ) - } - - // error if invalid entrance step target - if (!step) { - userStep.type = 'error' - return - } - - // create an entrance in this/another journey, delay job will pick it up - await JourneyUserStep.insert({ - journey_id: step.journey_id, - step_id: step.id, - user_id: state.user.id, - type: 'delay', - delay_until, - }) - - // mark this step as completed - userStep.type = 'completed' - } -} - -export class JourneySticky extends JourneyStep { - static type = 'sticky' -} - -export class JourneyBalancer extends JourneyStep { - static type = 'balancer' - - rate_limit!: number - rate_interval!: 'second' | 'minute' | 'hour' | 'day' - - parseJson(json: any) { - super.parseJson(json) - this.rate_limit = json.data?.rate_limit - this.rate_interval = json.data?.rate_interval - } - - async process(state: JourneyState, userStep: JourneyUserStep) { - const children = state.childrenOf(this.id) - if (!children.length) { - userStep.type = 'completed' - return - } - - const child = random(children) - userStep.data = { ...userStep.data, id: child.child_id } - - const limit = App.main.rateLimiter - const { exceeded, expires } = await limit.consume(`journey_balancer:${child.child_id}`, { - limit: this.rate_limit, - msDuration: this.interval(), - }) - if (exceeded) { - userStep.type = 'delay' - userStep.delay_until = add(new Date(), { seconds: expires }) - return - } - userStep.type = 'completed' - } - - async next(state: JourneyState) { - const data: any = state.stepData()[this.id] - return data?.id as UUID - } - - interval() { - const intervals = { - second: 1000, - minute: 60 * 1000, - hour: 60 * 60 * 1000, - day: 24 * 60 * 60 * 1000, - } - return intervals[this.rate_interval] - } -} - -export class JourneyUpdate extends JourneyStep { - static type = 'update' - - template!: string - - parseJson(json: any) { - super.parseJson(json) - this.template = json.data?.template - } - - async process(state: JourneyState, userStep: JourneyUserStep): Promise { - - if (this.template.trim()) { - let value: any - try { - value = JSON.parse(compileTemplate(this.template)({ - user: state.user.flatten(), - journey: state.stepData(), - })) - if (typeof value === 'object') { - state.user.data = { - ...state.user.data, - ...value, - } - await UserPatchJob.from({ - project_id: state.user.project_id, - user: { - external_id: state.user.external_id, - data: value, - }, - }).queue() - } - } catch (err: any) { - logger.warn({ - error: err.message, - }, 'journey:user:error') - userStep.type = 'error' - return - } - } - - userStep.type = 'completed' - } -} - -export class JourneyEvent extends JourneyStep { - static type = 'event' - - event_name!: string - template!: string - - parseJson(json: any) { - super.parseJson(json) - this.event_name = json.data?.event_name - this.template = json.data?.template - } - - async process(state: JourneyState, userStep: JourneyUserStep): Promise { - - const template = this.template.trim() - if (!template) return - - let value: any - try { - const jsonValue = JSON.parse(compileTemplate(this.template)({ - user: state.user.flatten(), - journey: state.stepData(), - })) - value = typeof value === 'object' ? jsonValue : {} - } catch { - value = {} - } - - await EventPostJob.from({ - project_id: state.user.project_id, - event: { - name: this.event_name, - external_id: state.user.external_id, - anonymous_id: state.user.anonymous_id, - data: value, - }, - }).queue() - - userStep.type = 'completed' - } -} - -export const journeyStepTypes = [ - JourneyEntrance, - JourneyExit, - JourneyDelay, - JourneyAction, - JourneyGate, - JourneyExperiment, - JourneyLink, - JourneyUpdate, - JourneyBalancer, - JourneyEvent, - JourneySticky, -].reduce>((a, c) => { - a[c.type] = c - return a -}, {}) - -export interface JourneyStepMapItem { - type: string - name?: string - data?: Record - data_key?: string - x: number - y: number - children?: Array<{ - external_id: string - path?: string - data?: Record - }> -} - -export type JourneyStepMap = Record - stats_at?: Date - next_scheduled_at?: Date - id?: UUID -}> - -export type JourneyStepMapParams = Record - -// This is async in case we ever want to fetch stats here -export async function toJourneyStepMap(steps: JourneyStep[], children: JourneyStepChild[]) { - const editData: JourneyStepMap = {} - - for (const step of steps) { - editData[step.external_id] = { - type: step.type, - name: step.name ?? '', - data: step.data ?? {}, - data_key: step.data_key, - x: step.x ?? 0, - y: step.y ?? 0, - children: children.reduce((a, { step_id, child_id, path, data }) => { - if (step_id === step.id) { - const child = steps.find(s => s.id === child_id) - if (child) { - a!.push({ - external_id: child.external_id, - path, - data, - }) - } - } - return a - }, []), - stats: step.stats, - next_scheduled_at: step.next_scheduled_at ?? undefined, - id: step.id, - } - } - - return editData -} diff --git a/services/platform/src/journey/JourneyUserStep.ts b/services/platform/src/journey/JourneyUserStep.ts deleted file mode 100644 index 31454159..00000000 --- a/services/platform/src/journey/JourneyUserStep.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AnyJson } from 'rules/Rule' -import Model from '../core/Model' -import { type JourneyStep } from './JourneyStep' -import { UUID } from 'node:crypto' - -export default class JourneyUserStep extends Model { - user_id!: UUID - type!: string - journey_id!: UUID - step_id!: UUID - delay_until?: Date | null - entrance_id?: UUID - ended_at?: Date - data?: Record | null - ref?: string - - step?: JourneyStep - - static tableName = 'journey_user_step' - - static jsonAttributes = ['data'] - static virtualAttributes = ['step'] - - static getDataMap(steps: JourneyStep[], userSteps: JourneyUserStep[]) { - return userSteps.reduceRight>((a, { data, step_id }) => { - const step = steps.find(s => s.id === step_id) - if (data && step && !a[step.dataKey]) { - a[step.dataKey] = data - } - return a - }, {}) - } -} diff --git a/services/platform/src/journey/ScheduledEntranceJob.ts b/services/platform/src/journey/ScheduledEntranceJob.ts deleted file mode 100644 index 68f0ab92..00000000 --- a/services/platform/src/journey/ScheduledEntranceJob.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Job } from '../queue' -import { JourneyEntrance } from './JourneyStep' -import Journey from './Journey' -import List from '../lists/List' -import Project from '../projects/Project' -import { UUID } from 'crypto' - -interface ScheduledEntranceTrigger { - entranceId: UUID -} - -export default class ScheduledEntranceJob extends Job { - - static $name = 'scheduled_entrance_job' - - static from(params: ScheduledEntranceTrigger) { - return new ScheduledEntranceJob(params).deduplicationKey(`${this.$name}_${params.entranceId}`) - } - - static async handler({ entranceId }: ScheduledEntranceTrigger) { - - const entrance = await JourneyEntrance.find(entranceId) - if (!entrance || entrance.type !== JourneyEntrance.type || !entrance.list_id) { - return - } - - const [journey, list] = await Promise.all([ - Journey.find(entrance.journey_id), - List.find(entrance.list_id), - ]) - if (!list || list.project_id !== journey?.project_id) return - - const project = await Project.find(journey.project_id) - - // TODO: schedule entrance job! - console.log(project, journey, entrance, list) - // const query = getRuleQuery(list.project_id, list.rule) - // await processUsers({ - // query, - // cacheKey: `journeys:${journey.id}:entrance:${entrance.id}:users`, - // itemMap: (user) => ({ - // key: user.id, - // value: `${user.id}`, - // }), - // callback: async (pairs) => { - // try { - // const ref = uuid() - // const items = pairs.map(({ key }) => ({ - // user_id: key as UUID, - // type: 'completed', - // journey_id: entrance.journey_id, - // step_id: entrance.id, - // ref, - // })) - // await JourneyUserStep.insert(items) - - // const steps = await JourneyUserStep.all(qb => qb.select('id') - // .where('ref', ref), - // ) - - // await App.main.queue.enqueueBatch(steps.map(({ id }) => JourneyProcessJob.from({ entrance_id: id }))) - // } catch (error) { - // logger.error({ error, journey: journey.id }, 'campaign:generate:progress:error') - // } - // }, - // afterCallback: async () => { - // await JourneyStep.update(q => q.where('id', entrance.id), { - // next_scheduled_at: entrance.nextDate(project?.timezone ?? 'UTC'), - // }) - // }, - // }) - } -} diff --git a/services/platform/src/journey/ScheduledEntranceOrchestratorJob.ts b/services/platform/src/journey/ScheduledEntranceOrchestratorJob.ts deleted file mode 100644 index a8459385..00000000 --- a/services/platform/src/journey/ScheduledEntranceOrchestratorJob.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { UUID } from 'crypto' -import App from '../app' -import { Job } from '../queue' -import { JourneyEntrance } from './JourneyStep' -import ScheduledEntranceJob from './ScheduledEntranceJob' - -export default class ScheduledEntranceOrchestratorJob extends Job { - - static $name = 'scheduled_entrance_orchestration_job' - - static async handler() { - - // Look up all scheduler entrances - const entrances = await JourneyEntrance.all(q => q - .join('journeys', 'journey_steps.journey_id', '=', 'journeys.id') - - // Exclude journeys that are not live or the root journey - .where('journeys.status', 'live') - .whereNull('journeys.parent_id') - .whereNull('journeys.deleted_at') - - // Filter down the step type to be an entrance - .where('journey_steps.type', JourneyEntrance.type) - .whereJsonPath('journey_steps.data', '$.trigger', '=', 'schedule') - .whereJsonPath('journey_steps.data', '$.multiple', '=', true) - .whereNotNull('journey_steps.next_scheduled_at') - .where('journey_steps.next_scheduled_at', '<=', new Date()) - .select('journey_steps.*', 'journeys.project_id'), - ) as Array - - if (!entrances.length) return - - const jobs: Job[] = [] - for (const entrance of entrances) { - if (entrance.list_id) { - jobs.push(ScheduledEntranceJob.from({ - entranceId: entrance.id, - })) - } - } - - if (jobs.length) { - await App.main.queue.enqueueBatch(jobs) - } - } -} diff --git a/services/platform/src/journey/UpdateJourneysJob.ts b/services/platform/src/journey/UpdateJourneysJob.ts deleted file mode 100644 index 88beb6ac..00000000 --- a/services/platform/src/journey/UpdateJourneysJob.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { chunk } from '../utilities' -import { Job } from '../queue' -import Journey from './Journey' -import App from '../app' -import JourneyStatsJob from './JourneyStatsJob' - -export default class UpdateJourneysJob extends Job { - static $name = 'update_journeys_job' - - static async handler() { - - const { db, queue } = App.main - - await chunk(Journey.query(db), queue.batchSize, async journeys => { - queue.enqueueBatch(journeys.map(({ id }) => JourneyStatsJob.from(id))) - }) - } -} diff --git a/services/platform/src/journey/__tests__/JourneyService.spec.ts b/services/platform/src/journey/__tests__/JourneyService.spec.ts deleted file mode 100644 index dbb0fa83..00000000 --- a/services/platform/src/journey/__tests__/JourneyService.spec.ts +++ /dev/null @@ -1,340 +0,0 @@ -import { addDays } from 'date-fns' -import { RuleTree } from '../../rules/Rule' -import { User } from '../../users/User' -import { UserEvent } from '../../users/UserEvent' -import Journey from '../Journey' -import { setupProject, setupTestJourney } from './helpers' -import { enterJourneysFromEvent } from '../JourneyService' -import { JourneyStep, JourneyStepMapParams } from '../JourneyStep' -import JourneyUserStep from '../JourneyUserStep' -import { make } from '../../rules/RuleEngine' -import { uuid } from '../../utilities' -import { JourneyState } from '../JourneyState' -import { UUID } from 'node:crypto' - -describe('JourneyService', () => { - - const baseStep = { - x: 0, - y: 0, - data: {}, - } - - const entrance = (list_id: UUID, childId: string) => { - return { - ...baseStep, - type: 'entrance', - data: { - list_id, - }, - data_key: 'entrance', - children: [ - { - external_id: childId, - }, - ], - } - } - - const gate = (rule: RuleTree, yes?: string, no?: string) => { - const children: JourneyStepMapParams[string]['children'] = [] - if (yes) { - children.push({ external_id: yes, path: 'yes' }) - } - if (no) { - children.push({ external_id: no, path: 'no' }) - } - return { - ...baseStep, - type: 'gate', - data: { - rule, - }, - children, - } - } - - const delay = (hours: number, childId: string) => { - return { - ...baseStep, - type: 'delay', - data: { - format: 'duration', - hours, - }, - children: [ - { - external_id: childId, - }, - ], - } - } - - const updateStep = (template: string, childId: string) => ({ - ...baseStep, - type: 'update', - data: { - template, - }, - children: [ - { - external_id: childId, - }, - ], - }) - - const linkStep = (target_id: UUID, childId: string) => ({ - ...baseStep, - type: 'link', - data: { - target_id, - delay: '1 minute', - }, - children: [ - { - external_id: childId, - }, - ], - }) - - const expectStepPath = (state: JourneyState, expectedPath: string[]) => { - const resultPath = state.userSteps.map(us => state.steps.find(s => us.step_id === s.id)?.external_id ?? '??').join('->') - expect(resultPath).toEqual(expectedPath.join('->')) - } - - const enterAtStep = async (user: User, steps: JourneyStep[], external_id: string, data?: Record) => { - const step = steps.find(s => s.external_id === external_id)! - return await JourneyUserStep.insertAndFetch({ - journey_id: step.journey_id, - step_id: step.id, - user_id: user.id, - type: 'completed', - data, - }) - } - - test('Steps - Entrance - Event-Based', async () => { - - const { steps, user } = await setupTestJourney({ - data: {}, - stepMap: { - e: { - ...baseStep, - type: 'entrance', - data: { - trigger: 'event', - event_name: 'purchased gourd', - }, - }, - }, - }) - - const event = await UserEvent.fromJson({ - project_id: user.project_id, - user_id: user.id, - name: 'purchased gourd', - data: { - color: 'yellow', - }, - }) - - await enterJourneysFromEvent(event, user) - - const entrances = await JourneyUserStep.all(q => q.where('user_id', user.id)) - - expect(entrances.map(e => e.step_id)).toContain(steps.find(s => s.external_id === 'e')!.id) - - }) - - test('Steps - Delay', async () => { - - const { steps, user } = await setupTestJourney({ - data: {}, - stepMap: { - e: entrance(0, 'd1'), - d1: delay(1, 'd2'), - d2: delay(1, ''), - }, - }) - - const entered = await enterAtStep(user, steps, 'e') - - let state = (await JourneyState.resume(entered, user))! - - // user stops at delay - expectStepPath(state, ['e', 'd1']) - - const delayStep = state.userSteps[state!.userSteps.length - 1] - - // move delay into past - await JourneyUserStep.update(q => q.where('id', delayStep.id), { - delay_until: addDays(delayStep.delay_until!, -2), - }) - - state = (await JourneyState.resume(entered, user))! - - expectStepPath(state, ['e', 'd1', 'd2']) - - }) - - test('Steps - Gates', async () => { - - const parentId = uuid() - - const { steps, user } = await setupTestJourney({ - data: { - state: 'AL', - }, - stepMap: { - e: entrance(0, 'g1'), - - // match if user's State is Alabama - g1: gate({ - uuid: uuid(), - group: 'user', - type: 'string', - path: 'state', - operator: '=', - value: 'AL', - }, 'g2', 'd1'), - - // match if users favorite guitar brand is Fender - g2: gate({ - uuid: parentId, - group: 'event', - type: 'wrapper', - path: '$.name', - operator: '=', - value: 'purchased_guitar', - children: [ - { - uuid: uuid(), - parent_uuid: parentId, - group: 'event', - type: 'string', - path: '$.brand', - operator: '=', - value: 'Fender', - }, - ], - }, 'd2', 'd3'), - - d1: delay(0, ''), - d2: delay(0, ''), - d3: delay(0, ''), - }, - }) - - const entered = await enterAtStep(user, steps, 'e') - - const state = await JourneyState.resume(entered, user) - - expectStepPath(state!, ['e', 'g1', 'g2', 'd3']) - }) - - test('Steps - Update', async () => { - - const { steps, user } = await setupTestJourney({ - data: { - field1: 1, - }, - stepMap: { - e: entrance(0, 'u'), - u: updateStep(` - { - "field2": "{{journey.entrance.event.favorite_color}}" - } - `, ''), - }, - }) - - const entered = await enterAtStep(user, steps, 'e', { - event: { - name: 'decided_favorite_color', - favorite_color: 'green', - }, - }) - - const state = (await JourneyState.resume(entered, user))! - - expectStepPath(state, ['e', 'u']) - expect(user.data.field1).toBe(1) - expect(user.data.field2).toBe('green') - - }) - - test('Steps - Entrance', async () => { - - const { project } = await setupProject() - - const journey2 = await Journey.create(project.id, 'Second', { - e: entrance(0, 'd'), - d: delay(0, ''), - }) - - const journey1 = await Journey.create(project.id, 'First', { - e: entrance(0, 'l'), - l: linkStep(journey2.journey.id, ''), - }) - - const user = await User.insertAndFetch({ - project_id: project.id, - external_id: 'abcd', - data: {}, - }) - - let e = await enterAtStep(user, journey1.steps, 'e') - - let state = (await JourneyState.resume(e))! - - expectStepPath(state, ['e', 'l']) - - e = (await JourneyUserStep.first(q => q - .where('user_id', user.id) - .where('journey_id', journey2.journey.id) - .whereNull('entrance_id'), - ))! - - expect(e).not.toBeUndefined() - - state = (await JourneyState.resume(e))! - - expectStepPath(state, ['e', 'd']) - - }) - - test('JourneyState - prevent infinite loop', async () => { - - const { project } = await setupProject() - - const rule = make({ - type: 'boolean', - group: 'user', - path: 'some_field', - operator: '=', - value: 'true', - }) - - const { steps } = await Journey.create(project.id, 'infinite loop journey', { - e: entrance(0, 'g1'), - g1: gate(rule, 'g2', 'g3'), - g2: gate(rule, 'g1', 'g3'), - g3: gate(rule), - }) - - const user = await User.insertAndFetch({ - project_id: project.id, - external_id: 'xyz', - data: { - some_field: true, - }, - }) - - const entranceStep = await enterAtStep(user, steps, 'e') - - const state = (await JourneyState.resume(entranceStep, user))! - - expectStepPath(state, ['e', 'g1', 'g2']) - - }) -}) diff --git a/services/platform/src/journey/__tests__/JourneyStep.spec.ts b/services/platform/src/journey/__tests__/JourneyStep.spec.ts deleted file mode 100644 index 991e6c5c..00000000 --- a/services/platform/src/journey/__tests__/JourneyStep.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import addMinutes from 'date-fns/addMinutes' -import { JourneyDelay } from '../JourneyStep' -import JourneyUserStep from '../JourneyUserStep' -import { setupTestJourney } from './helpers' -import { JourneyState } from '../JourneyState' - -describe('JourneyStep', () => { - describe('Delay', () => { - test('duration delay of 2 minute', async () => { - const { journey, user } = await setupTestJourney({ data: {}, stepMap: {} }) - - const delay = new JourneyDelay() - delay.minutes = 1 - delay.format = 'duration' - - const step = JourneyUserStep.fromJson({ - journey_id: journey.id, - entrance_id: 0, - user_id: user.id, - type: 'pending', - }) - const state = new JourneyState({} as any, [], [], [], user) - await delay.process(state, step) - - expect(step.type).toEqual('delay') - expect(step.delay_until).not.toBeNull() - expect(step.delay_until?.getTime()).toBeGreaterThan(Date.now()) - }) - - test('handlebars renders properly', async () => { - const { journey, user } = await setupTestJourney({ data: {}, stepMap: {} }) - - const delay = new JourneyDelay() - delay.date = '{{ addDate "now" 1 "hour" }}' - delay.format = 'date' - - const step = JourneyUserStep.fromJson({ - journey_id: journey.id, - entrance_id: 0, - user_id: user.id, - type: 'pending', - }) - const state = new JourneyState({} as any, [], [], [], user) - await delay.process(state, step) - - const referenceDate = addMinutes(new Date(), 59) - - expect(step.type).toEqual('delay') - expect(step.delay_until).not.toBeNull() - expect(step.delay_until?.getTime()).toBeGreaterThan(referenceDate.getTime()) - }) - }) -}) diff --git a/services/platform/src/journey/__tests__/ScheduledEntranceJob.spec.ts b/services/platform/src/journey/__tests__/ScheduledEntranceJob.spec.ts deleted file mode 100644 index 2b9e3d0c..00000000 --- a/services/platform/src/journey/__tests__/ScheduledEntranceJob.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import Project from '../../projects/Project' -import Journey from '../Journey' -import { JourneyEntrance } from '../JourneyStep' -import JourneyUserStep from '../JourneyUserStep' -import { Frequency, RRule } from 'rrule' -import { addDays } from 'date-fns' -import { User } from '../../users/User' -import ScheduledEntranceJob from '../ScheduledEntranceJob' -import { addUserToList, createList } from '../../lists/ListService' - -describe('ScheduledEntranceJob', () => { - - test('enters all users from list into journey', async () => { - - const project = await Project.insertAndFetch({ - name: 'scheduler test ' + Date.now(), - }) - - const list = await createList(project.id, { - name: 'scheduler list', - type: 'static', - is_visible: true, - }) - - const users = await Promise.all(Array.from({ length: 3 }).map((_, i) => User.insertAndFetch({ - project_id: project.id, - external_id: `u${i}`, - }))) - - for (const user of users) { - await addUserToList(user, list) - } - - const now = new Date() - - const { journey, steps } = await Journey.create(project.id, 'scheduler test', { - e: { - x: 0, - y: 0, - type: JourneyEntrance.type, - data: { - trigger: 'schedule', - list_id: list.id, - schedule: new RRule({ - dtstart: addDays(now, -1), - freq: Frequency.DAILY, - interval: 1, - }).toString(), - }, - }, - }) - - const e = steps.find(s => s.external_id === 'e')! - - await ScheduledEntranceJob.handler({ entranceId: e.id }) - - const count = await JourneyUserStep.count(q => q.where('journey_id', journey.id)) - - expect(count).toBe(3) // now users 1-3 should be added - - }) - -}) diff --git a/services/platform/src/journey/__tests__/helpers.ts b/services/platform/src/journey/__tests__/helpers.ts deleted file mode 100644 index ab73c5e3..00000000 --- a/services/platform/src/journey/__tests__/helpers.ts +++ /dev/null @@ -1,49 +0,0 @@ -import Organization from '../../organizations/Organization' -import Project from '../../projects/Project' -import { User } from '../../users/User' -import { UserEvent } from '../../users/UserEvent' -import Journey from '../Journey' -import { JourneyStepMap } from '../JourneyStep' - -export const setupProject = async () => { - const org = await Organization.insertAndFetch({}) - const project = await Project.insertAndFetch({ - organization_id: org.id, - name: `Project ${Date.now()}`, - }) - return { org, project } -} - -interface SetupJourneyParams { - data: Record - events?: Array<{ - name: string - data: Record - }> - stepMap: JourneyStepMap -} - -export const setupTestJourney = async ({ data, events, stepMap }: SetupJourneyParams) => { - - const { project } = await setupProject() - - const { journey, steps } = await Journey.create(project.id, 'Test Journey', stepMap) - - const user = await User.insertAndFetch({ - project_id: project.id, - external_id: Date.now().toString(), - data, - timezone: 'America/Chicago', - }) - - if (events?.length) { - await UserEvent.insert(events.map(({ name, data }) => ({ - project_id: project.id, - user_id: user.id, - name, - data, - }))) - } - - return { journey, project, steps, user } -} diff --git a/services/platform/src/lists/List.ts b/services/platform/src/lists/List.ts deleted file mode 100644 index deeec14a..00000000 --- a/services/platform/src/lists/List.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { UUID } from 'crypto' -import Model from '../core/Model' -import { RuleTree } from '../rules/Rule' - -export type ListState = 'draft' | 'ready' | 'loading' -type ListType = 'static' | 'dynamic' - -export default class List extends Model { - project_id!: UUID - name!: string - type!: ListType - state!: ListState - rule_id?: UUID - rule!: RuleTree - version!: number - users_count?: number - tags?: string[] - is_visible!: boolean - refreshed_at?: Date | null - deleted_at?: Date - progress?: ListProgress - - static jsonAttributes = ['rule'] -} - -export type ListProgress = { - complete: number - total: number -} - -export type ListUpdateParams = Pick & { rule: RuleTree, published?: boolean } -export type ListCreateParams = Pick & { rule?: RuleTree } -export type ListVersion = Pick diff --git a/services/platform/src/lists/ListController.ts b/services/platform/src/lists/ListController.ts deleted file mode 100644 index 9cf003f7..00000000 --- a/services/platform/src/lists/ListController.ts +++ /dev/null @@ -1,232 +0,0 @@ -import Router from '@koa/router' -import { JSONSchemaType, validate } from '../core/validate' -import { extractQueryParams } from '../utilities' -import List, { ListCreateParams, ListUpdateParams } from './List' -import { archiveList, createList, deleteList, duplicateList, getList, getListUsers, importUsersToList, pagedLists, updateList } from './ListService' -import { SearchSchema } from '../core/searchParams' -import { ProjectState } from '../auth/AuthMiddleware' -import parse from '../storage/FileStream' -import { projectRoleMiddleware } from '../projects/ProjectService' -import ListStatsJob from './ListStatsJob' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' - -const router = new Router< - ProjectState & { list?: List } ->({ - prefix: '/lists', -}) - -router.use(projectRoleMiddleware('editor')) - -router.get('/', async ctx => { - const searchSchema = SearchSchema('listUserSearchSchema', { - sort: 'updated_at', - direction: 'desc', - }) - const params = extractQueryParams(ctx.query, searchSchema) - ctx.body = await pagedLists(params, ctx.state.project.id) -}) - -const ruleDefinition = (nullable = false) => ({ - type: 'object', - required: ['uuid', 'type', 'group', 'path', 'operator'], - properties: { - id: { - type: 'string', - format: 'uuid', - nullable: true, - }, - uuid: { type: 'string', format: 'uuid' }, - root_uuid: { - type: 'string', - format: 'uuid', - nullable: true, - }, - parent_uuid: { - type: 'string', - format: 'uuid', - nullable: true, - }, - type: { type: 'string', enum: ['wrapper', 'string', 'number', 'boolean', 'date', 'array'] }, - group: { type: 'string', enum: ['user', 'event', 'parent'] }, - path: { type: 'string' }, - operator: { type: 'string' }, - value: { - type: ['string', 'number', 'boolean'], - nullable: true, - }, - frequency: { - type: 'object', - required: ['period', 'operator', 'count'], - properties: { - period: { type: 'object' }, - operator: { type: 'string', enum: ['=', '<', '<=', '>', '>='] }, - count: { type: 'number' }, - }, - }, - children: { - type: 'array', - nullable: true, - minItems: 0, - items: ({ - $ref: '#/definitions/rule', - } as any), - }, - }, - additionalProperties: false, - nullable, -}) - -const listParams: JSONSchemaType = { - $id: 'listParams', - definitions: { - rule: ruleDefinition() as any, - }, - anyOf: [{ - type: 'object', - required: ['name', 'type', 'rule'], - properties: { - name: { - type: 'string', - }, - type: { - type: 'string', - enum: ['dynamic'], - }, - rule: ({ $ref: '#/definitions/rule' } as any), - tags: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - is_visible: { - type: 'boolean', - nullable: true, - }, - }, - additionalProperties: false, - }, - { - type: 'object', - required: ['name', 'type'], - properties: { - name: { - type: 'string', - }, - type: { - type: 'string', - enum: ['static'], - }, - tags: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - is_visible: { - type: 'boolean', - nullable: true, - }, - }, - additionalProperties: false, - }] as any, -} - -router.post('/', async ctx => { - const payload = validate(listParams, ctx.request.body) - ctx.body = await createList(ctx.state.project.id, payload) -}) - -router.param('listId', async (value, ctx, next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid list ID') - return - } - - ctx.state.list = await getList(value as UUID, ctx.state.project.id) - if (!ctx.state.list) { - ctx.throw(404) - return - } - return await next() -}) - -router.get('/:listId', async ctx => { - ctx.body = ctx.state.list -}) - -const listUpdateParams: JSONSchemaType = { - $id: 'listUpdateParams', - definitions: { - rule: ruleDefinition(true) as any, - }, - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - }, - rule: ({ $ref: '#/definitions/rule' } as any), - tags: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - published: { - type: 'boolean', - nullable: true, - }, - }, - additionalProperties: false, -} -router.patch('/:listId', async ctx => { - const payload = validate(listUpdateParams, ctx.request.body) - ctx.body = await updateList(ctx.state.list!, payload) -}) - -router.delete('/:listId', async ctx => { - const { id, project_id, deleted_at } = ctx.state.list! - if (deleted_at) { - await deleteList(id, project_id) - } else { - await archiveList(id, project_id) - } - ctx.body = true -}) - -router.post('/:listId/duplicate', async ctx => { - ctx.body = await duplicateList(ctx.state.list!) -}) - -router.get('/:listId/users', async ctx => { - const searchSchema = SearchSchema('listUserSearchSchema', { - sort: 'user_list.id', - direction: 'desc', - }) - const params = extractQueryParams(ctx.query, searchSchema) - ctx.body = await getListUsers(ctx.state.list!, params, ctx.state.project.id) -}) - -router.post('/:listId/users', async ctx => { - const stream = await parse(ctx) - - await importUsersToList(ctx.state.list!, stream) - - ctx.status = 204 -}) - -router.post('/:listId/recount', async ctx => { - await ListStatsJob.from( - ctx.state.list!.id, - ctx.state.project.id, - ).queue() - ctx.status = 204 -}) - -export default router diff --git a/services/platform/src/lists/ListService.ts b/services/platform/src/lists/ListService.ts deleted file mode 100644 index d42a16da..00000000 --- a/services/platform/src/lists/ListService.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { User } from '../users/User' -import { getRuleQuery, make } from '../rules/RuleEngine' -import List, { ListCreateParams, ListUpdateParams, ListVersion } from './List' -import { PageParams } from '../core/searchParams' -import { importUsers } from '../users/UserImport' -import { FileStream } from '../storage/FileStream' -import { createTagSubquery, getTags, setTags } from '../tags/TagService' -import { pick } from '../utilities' -import { fetchAndCompileRule } from '../rules/RuleService' -import { createEvent } from '../users/UserEventRepository' -import { UUID } from 'crypto' - -export const pagedLists = async (params: PageParams, projectId: UUID) => { - const result = await List.search( - { ...params, fields: ['name'] }, - b => { - b = b.where('project_id', projectId) - .whereNull('deleted_at') - .where('is_visible', true) - params.tag?.length && b.whereIn('id', createTagSubquery(List, projectId, params.tag)) - return b - }, - ) - if (result.results?.length) { - const tags = await getTags(List.tableName, result.results.map(l => l.id)) - for (const list of result.results) { - list.tags = tags.get(list.id) - } - } - return result -} - -export const allLists = async (projectId: UUID, listIds?: UUID[]) => { - const lists = await List.all(qb => { - qb.where('project_id', projectId) - if (listIds) { - qb.whereIn('id', listIds) - } - return qb - }) - - if (lists.length) { - const tags = await getTags(List.tableName, lists.map(l => l.id)) - for (const list of lists) { - list.tags = tags.get(list.id) - } - } - - return lists -} - -export const getList = async (id: UUID, projectId: UUID) => { - const list = await List.find(id, qb => qb.where('project_id', projectId)) - if (list) { - list.tags = await getTags(List.tableName, [list.id]).then(m => m.get(list.id)) - if (list.rule_id && !list.rule) list.rule = await fetchAndCompileRule(list.rule_id) - } - - return list -} - -export const getListUsers = async (list: List, params: PageParams, projectId: UUID) => { - const limit = params.limit ?? 25 - const offset = parseInt(params.cursor ?? '0') ?? 0 - const subquery = getRuleQuery(projectId, list.rule) - const query = ` - SELECT DISTINCT id FROM (${subquery}) - ORDER BY id DESC - LIMIT ? - OFFSET ? - ` - - const result = await User.raw(query, [limit, offset]) - const rows = result.rows as { id: UUID }[] - - const users = await User.all(query => query.whereIn('id', rows.map(r => r.id))) - return { - results: users, - limit, - prevCursor: offset > 0 ? `${Math.max(0, offset - limit)}` : undefined, - nextCursor: rows.length < limit ? undefined : `${offset + limit}`, - } -} - -export const createList = async (projectId: UUID, { tags, name, type, rule }: ListCreateParams): Promise => { - let list = await List.insertAndFetch({ - name, - type, - state: type === 'dynamic' ? 'draft' : 'ready', - users_count: 0, - project_id: projectId, - rule, - }) - - if (type === 'static') { - list = await List.updateAndFetch(list.id, { - rule: staticListRule(list), - }) - } - - if (tags?.length) { - await setTags({ - project_id: projectId, - entity: List.tableName, - entity_id: list.id, - names: tags, - }) - } - - return list -} - -export const updateList = async (list: List, { tags, published, ...params }: ListUpdateParams): Promise => { - list = await List.updateAndFetch(list.id, { - ...params, - state: list.state === 'draft' - ? published - ? 'ready' - : 'draft' - : list.state, - users_count: await listUserCount({ - project_id: list.project_id, - rule: params.rule ?? list.rule, - }), - }) - - if (tags) { - await setTags({ - project_id: list.project_id, - entity: List.tableName, - entity_id: list.id, - names: tags, - }) - } - - return await getList(list.id, list.project_id) -} - -export const archiveList = async (id: UUID, projectId: UUID) => { - await List.archive(id, qb => qb.where('project_id', projectId)) - return getList(id, projectId) -} - -export const deleteList = async (id: UUID, projectId: UUID) => { - return await List.deleteById(id, qb => qb.where('project_id', projectId)) -} - -export const staticListRule = (list: List) => { - return make({ - type: 'wrapper', - operator: 'and', - group: 'parent', - children: [make({ - path: '$.name', - value: 'user_imported_to_list', - type: 'wrapper', - group: 'event', - operator: 'and', - children: [ - make({ - path: '$.list_id', - type: 'number', - group: 'event', - value: list.id, - }), - make({ - path: '$.version', - type: 'number', - group: 'event', - value: list.version, - }), - ], - })], - }) -} - -export const importUsersToList = async (list: List, stream: FileStream) => { - await updateListState(list.id, { state: 'loading' }) - - try { - await importUsers({ - project_id: list.project_id, - list_id: list!.id, - stream, - }) - } finally { - await updateListState(list.id, { state: 'ready' }) - } - - await updateListState(list.id, { state: 'ready' }) -} - -export const addUserToList = async (user: User, list: ListVersion) => { - await createEvent(user, { - name: 'user_imported_to_list', - data: { - list_id: list.id, - version: list.version, - }, - }, false) -} - -export const listUserCount = async (list: Pick): Promise => { - const subquery = getRuleQuery(list.project_id, list.rule) - const result = await User.query() - .count('* as count') - .from(User.query().fromRaw(`(${subquery})`).as('sub')) - .first() - - return result.count ?? 0 -} - -export const updateListState = async (id: UUID, params: Partial>) => { - return await List.updateAndFetch(id, params) -} - -export const duplicateList = async (list: List) => { - const params: Partial = pick(list, ['project_id', 'name', 'type', 'rule_id', 'rule', 'is_visible']) - params.name = `Copy of ${params.name}` - params.state = 'draft' - return await List.insertAndFetch(params) -} diff --git a/services/platform/src/lists/ListStatsJob.ts b/services/platform/src/lists/ListStatsJob.ts deleted file mode 100644 index 7062bf43..00000000 --- a/services/platform/src/lists/ListStatsJob.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { UUID } from 'crypto' -import { Job } from '../queue' -import List from './List' -import { getList, listUserCount } from './ListService' - -interface ListStatsParams { - listId: UUID - projectId: UUID -} - -export default class ListStatsJob extends Job { - static $name = 'list_stats_job' - - static from( - listId: UUID, - projectId: UUID, - ): ListStatsJob { - return new this({ listId, projectId }).deduplicationKey(`${this.$name}_${listId}`) - } - - static async handler({ listId, projectId }: ListStatsParams) { - - const list = await getList(listId, projectId) - if (!list) return - - // Update the list with the new totals - await List.query() - .update({ users_count: await listUserCount(list) }) - .where('id', listId) - } -} diff --git a/services/platform/src/lists/ProcessListsJob.ts b/services/platform/src/lists/ProcessListsJob.ts deleted file mode 100644 index 4dc65c33..00000000 --- a/services/platform/src/lists/ProcessListsJob.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Job } from '../queue' -import List from './List' -import ListStatsJob from './ListStatsJob' - -export default class ProcessListsJob extends Job { - static $name = 'process_lists_job' - - static from(): ProcessListsJob { - return new this().deduplicationKey(this.$name) - } - - static async handler() { - - const lists = await List.all(qb => qb.whereNot('state', 'loading').whereNull('deleted_at')) - for (const list of lists) { - - // Update stats on all lists - await ListStatsJob.from(list.id, list.project_id).queue() - } - } -} diff --git a/services/platform/src/lists/__tests__/ListService.spec.ts b/services/platform/src/lists/__tests__/ListService.spec.ts deleted file mode 100644 index 6fc279ad..00000000 --- a/services/platform/src/lists/__tests__/ListService.spec.ts +++ /dev/null @@ -1,127 +0,0 @@ -import Project from '../../projects/Project' -import { RuleTree } from '../../rules/Rule' -import { User } from '../../users/User' -import { UserEvent } from '../../users/UserEvent' -import { createUser } from '../../users/UserRepository' -import { random, randomInt, uuid } from '../../utilities' -import { createList, listUserCount } from '../ListService' - -afterEach(() => { - jest.clearAllMocks() -}) - -describe('ListService', () => { - - const makeRule = async () => { - const project = await Project.insertAndFetch({ - name: 'Dynamic List Project', - }) - - const ruleUuid = uuid() - const eventUuid = uuid() - - const rule: RuleTree = { - uuid: ruleUuid, - group: 'parent', - type: 'wrapper', - operator: 'or', - path: '', - children: [ - { - uuid: uuid(), - parent_uuid: ruleUuid, - root_uuid: ruleUuid, - group: 'user', - type: 'string', - operator: '=', - path: '$.first_name', - value: 'chris', - }, - { - uuid: eventUuid, - parent_uuid: ruleUuid, - root_uuid: ruleUuid, - group: 'event', - type: 'wrapper', - operator: 'and', - path: '$.name', - value: 'purchased', - children: [ - { - uuid: uuid(), - parent_uuid: eventUuid, - root_uuid: ruleUuid, - group: 'event', - type: 'string', - operator: '=', - path: '$.food', - value: 'cake', - }, - ], - }, - ], - } - - return { rule, project } - } - - describe('list generation', () => { - test('populate dynamic list', async () => { - const eventNames = ['purchased', 'completed', 'viewed', 'launched'] - const { rule, project } = await makeRule() - - const list = await createList(project.id, { - name: 'Dynamic List', - type: 'dynamic', - is_visible: true, - rule, - }) - - const expectedUserCount = 200 - let expectedMatchCount = 0 - - for (let i = 0; i < expectedUserCount; i++) { - const shouldMatch = (i + 1) % 20 === 0 - if (shouldMatch) expectedMatchCount++ - - const user = await createUser(project.id, { - external_id: `test-${i}`, - data: { - first_name: shouldMatch ? 'chris' : i % 10 === 0 ? 'claire' : undefined, - favoriteNumber: i, - }, - }) - - const events: Partial[] = Array.from({ length: randomInt(3, 50) }).map((_, i) => ({ - project_id: project.id, - user_id: user.id, - name: random(eventNames), - data: { - something: i, - }, - })) - - if (i === 15) { - events.push({ - project_id: project.id, - user_id: user.id, - name: 'purchased', - data: { - food: 'cake', - }, - }) - expectedMatchCount++ - } - - // create events - await UserEvent.clickhouse().insert(events) - } - - const userCount = await User.count(q => q.where('project_id', project.id)) - const matchCount = await listUserCount(list) - - expect(userCount).toBe(expectedUserCount) - expect(matchCount).toBe(expectedMatchCount) - }) - }) -}) diff --git a/services/platform/src/lists/__tests__/ListStatsJob.spec.ts b/services/platform/src/lists/__tests__/ListStatsJob.spec.ts deleted file mode 100644 index 73e48a82..00000000 --- a/services/platform/src/lists/__tests__/ListStatsJob.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { addUserToList, createList } from '../../lists/ListService' -import { User } from '../../users/User' -import { uuid } from '../../utilities' -import ListStatsJob from '../ListStatsJob' -import List from '../List' -import { createTestProject } from '../../projects/__tests__/ProjectTestHelpers' - -afterEach(() => { - jest.clearAllMocks() -}) - -describe('ListStatsJob', () => { - - test('initial count gets complete total', async () => { - const project = await createTestProject() - const list = await createList(project.id, { - name: uuid(), - is_visible: true, - type: 'static', - }) - - const user = await User.insertAndFetch({ project_id: project.id }) - const user2 = await User.insertAndFetch({ project_id: project.id }) - - await addUserToList(user, list) - await addUserToList(user2, list) - - await ListStatsJob.handler({ listId: list.id, projectId: project.id }) - - const refreshedList = await List.find(list.id) - expect(refreshedList?.users_count).toEqual(2) - }) - - test('subsequent count gets new complete total', async () => { - const project = await createTestProject() - const list = await createList(project.id, { - name: uuid(), - is_visible: true, - type: 'static', - }) - - const user = await User.insertAndFetch({ project_id: project.id }) - const user2 = await User.insertAndFetch({ project_id: project.id }) - const user3 = await User.insertAndFetch({ project_id: project.id }) - const user4 = await User.insertAndFetch({ project_id: project.id }) - - await addUserToList(user, list) - await addUserToList(user2, list) - - await ListStatsJob.handler({ listId: list.id, projectId: project.id }) - - await addUserToList(user3, list) - await addUserToList(user4, list) - - await ListStatsJob.handler({ listId: list.id, projectId: project.id }) - - const refreshedList = await List.find(list.id) - expect(refreshedList?.users_count).toEqual(4) - }) -}) diff --git a/services/platform/src/notifications/Notification.ts b/services/platform/src/notifications/Notification.ts deleted file mode 100644 index 78febc46..00000000 --- a/services/platform/src/notifications/Notification.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { UUID } from 'crypto' -import Model from '../core/Model' - -export type NotificationType = 'banner' | 'alert' | 'html' - -export interface BaseNotification { - title: string - body: string - custom: Record -} - -type BannerNotification = BaseNotification & { type: 'banner' } - -interface StyledNotification extends BaseNotification { - html: string - read_on_show?: boolean -} - -interface AlertNotification extends StyledNotification { - type: 'alert' - image?: string -} - -interface HtmlNotification extends StyledNotification { - type: 'html' -} - -export type NotificationContent = BannerNotification | AlertNotification | HtmlNotification - -export default class Notification extends Model { - project_id!: UUID - user_id!: UUID - content_type!: NotificationType - content!: NotificationContent - read_at?: Date - expires_at?: Date - - static jsonAttributes = ['content'] -} diff --git a/services/platform/src/notifications/NotificationService.ts b/services/platform/src/notifications/NotificationService.ts deleted file mode 100644 index b1e0cecb..00000000 --- a/services/platform/src/notifications/NotificationService.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { UUID } from 'crypto' -import { User } from '../users/User' -import Notification, { NotificationContent } from './Notification' - -export const getNotifications = async (user: User, cursor?: string) => { - return Notification.search({ limit: 25, cursor }, qb => - qb.where('project_id', user.project_id) - .where('user_id', user.id) - .whereNull('read_at') - .where(q => q.whereNull('expires_at').orWhere('expires_at', '>', new Date())), - ) -} - -export const readNotification = async (user: User, id: UUID) => { - await Notification.update( - qb => - qb.where('id', id) - .where('project_id', user.project_id) - .where('user_id', user.id), - { read_at: new Date() }, - ) -} - -export const createNotification = async (user: User, content: NotificationContent): Promise => { - return await Notification.insertAndFetch({ - project_id: user.project_id, - user_id: user.id, - content_type: content.type, - content, - }) -} diff --git a/services/platform/src/organizations/Organization.ts b/services/platform/src/organizations/Organization.ts deleted file mode 100644 index cc2421ff..00000000 --- a/services/platform/src/organizations/Organization.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { UUID } from 'crypto' -import { AuthProviderConfig } from '../auth/Auth' -import Model, { ModelParams } from '../core/Model' - -export interface TrackingOptions { - linkWrap: boolean, - deeplinkMirrorUrl: string | undefined, -} - -export const organizationRoles = [ - 'member', - 'admin', - 'owner', -] as const - -export type OrganizationRole = (typeof organizationRoles)[number] - -export default class Organization extends Model { - username!: string - domain?: string - auth!: AuthProviderConfig - notification_provider_id?: UUID - tracking_deeplink_mirror_url?: string - - static jsonAttributes = ['auth'] -} - -export type OrganizationParams = Omit diff --git a/services/platform/src/organizations/OrganizationController.ts b/services/platform/src/organizations/OrganizationController.ts deleted file mode 100644 index aeeeeddd..00000000 --- a/services/platform/src/organizations/OrganizationController.ts +++ /dev/null @@ -1,59 +0,0 @@ -import Router from '@koa/router' -import { JSONSchemaType, validate } from '../core/validate' -import { Context } from 'koa' -import { JwtAdmin } from '../auth/AuthMiddleware' -import { deleteOrganization, getOrganization, organizationIntegrations, organizationRoleMiddleware, requireOrganizationRole, updateOrganization } from './OrganizationService' -import Organization, { OrganizationParams } from './Organization' - -const router = new Router<{ - admin: JwtAdmin - organization: Organization -}>({ - prefix: '/organizations', -}) - -router.use(async (ctx: Context, next: () => void) => { - ctx.state.organization = await getOrganization(ctx.state.admin.organization_id) - return next() -}) - -router.get('/', async ctx => { - ctx.body = ctx.state.organization -}) - -router.use(organizationRoleMiddleware('admin')) - -router.get('/integrations', async ctx => { - ctx.body = await organizationIntegrations(ctx.state.organization) -}) - -const organizationUpdateParams: JSONSchemaType = { - $id: 'organizationUpdate', - type: 'object', - required: ['username'], - properties: { - username: { type: 'string' }, - domain: { - type: 'string', - nullable: true, - }, - tracking_deeplink_mirror_url: { - type: 'string', - nullable: true, - }, - }, - additionalProperties: false, -} -router.patch('/:id', async ctx => { - requireOrganizationRole(ctx.state.admin!, 'owner') - const payload = validate(organizationUpdateParams, ctx.request.body) - ctx.body = await updateOrganization(ctx.state.organization, payload) -}) - -router.delete('/', async ctx => { - requireOrganizationRole(ctx.state.admin!, 'owner') - await deleteOrganization(ctx.state.organization) - ctx.body = true -}) - -export default router diff --git a/services/platform/src/organizations/OrganizationMiddleware.ts b/services/platform/src/organizations/OrganizationMiddleware.ts deleted file mode 100644 index 70b127ab..00000000 --- a/services/platform/src/organizations/OrganizationMiddleware.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Context } from 'koa' -import { getOrganization } from './OrganizationService' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' - -export const organizationMiddleware = async (ctx: Context, next: () => void) => { - const organizationId = ctx.cookies.get('organization', { signed: true }) as UUID | undefined - if (!organizationId) { - return next() - } - - if (!uuidValidate(organizationId)) { - ctx.throw(400, 'Invalid organization ID') - return - } - - ctx.state.organization = await getOrganization(organizationId) - return next() -} diff --git a/services/platform/src/organizations/OrganizationService.ts b/services/platform/src/organizations/OrganizationService.ts deleted file mode 100644 index d5437233..00000000 --- a/services/platform/src/organizations/OrganizationService.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { RequestError } from '../core/errors' -import Admin from '../auth/Admin' -import Provider from '../providers/Provider' -import Organization, { OrganizationRole, organizationRoles } from './Organization' -import { JwtAdmin } from '../auth/AuthMiddleware' -import { Next, ParameterizedContext } from 'koa' -import { UUID } from 'crypto' - -export const getOrganization = async (id: UUID) => { - return await Organization.find(id) -} - -export const getOrganizationByEmail = async (email: string) => { - const admin = await Admin.first(qb => qb.where('email', email)) - if (!admin) return undefined - return await getOrganization(admin.organization_id) -} - -export const createOrganization = async (): Promise => { - return await Organization.insertAndFetch() -} - -export const updateOrganization = async (organization: Organization, params: Partial) => { - return await Organization.updateAndFetch(organization.id, params) -} - -export const organizationIntegrations = async (organization: Organization) => { - return await Provider.all( - qb => qb.leftJoin('projects', 'projects.id', 'providers.project_id') - .where('projects.organization_id', organization.id), - ) -} - -export const deleteOrganization = async (organization: Organization) => { - await Organization.deleteById(organization.id) -} - -export const requireOrganizationRole = (admin: Admin | JwtAdmin, minRole: OrganizationRole) => { - if (organizationRoles.indexOf(admin.role) < organizationRoles.indexOf(minRole)) { - throw new RequestError(`Minimum organization role ${minRole} is required`, 403) - } -} - -export const organizationRoleMiddleware = (minRole: OrganizationRole) => async (ctx: ParameterizedContext<{ admin?: Admin | JwtAdmin }>, next: Next) => { - requireOrganizationRole(ctx.state.admin!, minRole) - return next() -} diff --git a/services/platform/src/profile/ProfileController.ts b/services/platform/src/profile/ProfileController.ts deleted file mode 100644 index acf94365..00000000 --- a/services/platform/src/profile/ProfileController.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Router from '@koa/router' -import Admin from '../auth/Admin' -import { AuthState } from '../auth/AuthMiddleware' - -const router = new Router({ - prefix: '/profile', -}) - -router.get('/', async ctx => { - ctx.body = await Admin.find(ctx.state.admin!.id) -}) - -export default router diff --git a/services/platform/src/projects/Locale.ts b/services/platform/src/projects/Locale.ts deleted file mode 100644 index 1b3cd789..00000000 --- a/services/platform/src/projects/Locale.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { UUID } from 'crypto' -import Model, { ModelParams } from '../core/Model' - -export default class Locale extends Model { - project_id!: UUID - key!: string - label!: string -} - -export type LocaleParams = Omit diff --git a/services/platform/src/projects/Project.ts b/services/platform/src/projects/Project.ts deleted file mode 100644 index 4b43aae6..00000000 --- a/services/platform/src/projects/Project.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { UUID } from 'crypto' -import Model, { ModelParams } from '../core/Model' - -export default class Project extends Model { - organization_id!: UUID - name!: string - description?: string - deleted_at?: Date - locale!: string - timezone!: string - text_opt_out_message?: string - text_help_message?: string - link_wrap_email?: boolean - link_wrap_push?: boolean - campaigns_count?: number - journeys_count?: number - users_count?: number - lists_count?: number - tools?: string[] -} - -export type ProjectParams = Omit - -export const projectRoles = [ - 'support', - 'editor', - 'publisher', - 'admin', -] as const - -export type ProjectRole = (typeof projectRoles)[number] diff --git a/services/platform/src/projects/ProjectAdminController.ts b/services/platform/src/projects/ProjectAdminController.ts deleted file mode 100644 index 8ced58f9..00000000 --- a/services/platform/src/projects/ProjectAdminController.ts +++ /dev/null @@ -1,106 +0,0 @@ -import Router from '@koa/router' -import { extractQueryParams } from '../utilities' -import { searchParamsSchema } from '../core/searchParams' -import { ProjectState } from '../auth/AuthMiddleware' -import { addAdminToProject, getProjectAdmin, pagedProjectAdmins, removeAdminFromProject } from './ProjectAdminRepository' -import { JSONSchemaType } from 'ajv' -import Admin from '../auth/Admin' -import { validate } from '../core/validate' -import { projectRoleMiddleware } from './ProjectService' -import { ProjectAdminParams } from './ProjectAdmins' -import { projectRoles } from './Project' -import { RequestError } from '../core/errors' -import { createOrUpdateAdmin } from '../auth/AdminRepository' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' - -const router = new Router< - ProjectState & { admin?: Admin } ->({ - prefix: '/admins', -}) - -router.use(projectRoleMiddleware('admin')) - -router.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedProjectAdmins(params, ctx.state.project.id) -}) - -const projectCreateAdminParamsSchema: JSONSchemaType = { - $id: 'projectCreateAdminParams', - type: 'object', - required: ['role', 'email'], - properties: { - email: { - type: 'string', - format: 'email', - }, - role: { - type: 'string', - enum: projectRoles, - }, - }, -} - -router.post('/', async ctx => { - const organizationId = ctx.state.project.organization_id - const { role, email } = validate(projectCreateAdminParamsSchema, ctx.request.body) - const admin = await createOrUpdateAdmin({ - organization_id: organizationId, - email, - role: 'member', - }) - if (ctx.state.admin!.id === admin.id) throw new RequestError('You cannot add yourself to a project') - await addAdminToProject(ctx.state.project.id, admin.id, role) - ctx.body = await getProjectAdmin(ctx.state.project.id, admin.id) -}) - -const projectAdminParamsSchema: JSONSchemaType = { - $id: 'projectAdminParams', - type: 'object', - required: ['role'], - properties: { - role: { - type: 'string', - enum: projectRoles, - }, - }, -} - -router.put('/:adminId', async ctx => { - if (!uuidValidate(ctx.params.adminId)) { - ctx.throw(400, 'Invalid admin ID') - return - } - - const admin = await Admin.find(ctx.params.adminId as UUID) - if (!admin) throw new RequestError('Invalid admin ID', 404) - const { role } = validate(projectAdminParamsSchema, ctx.request.body) - if (ctx.state.admin!.id === admin.id) throw new RequestError('You cannot add yourself to a project') - await addAdminToProject(ctx.state.project.id, admin.id, role) - ctx.body = await getProjectAdmin(ctx.state.project.id, admin.id) -}) - -router.get('/:adminId', async ctx => { - if (!uuidValidate(ctx.params.adminId)) { - ctx.throw(400, 'Invalid admin ID') - return - } - - const projectAdmin = await getProjectAdmin(ctx.state.project.id, ctx.params.adminId as UUID) - if (!projectAdmin) return ctx.throw(404) - ctx.body = projectAdmin -}) - -router.delete('/:adminId', async ctx => { - if (!uuidValidate(ctx.params.adminId)) { - ctx.throw(400, 'Invalid admin ID') - return - } - - await removeAdminFromProject(ctx.state.project.id, ctx.params.adminId as UUID) - ctx.body = true -}) - -export default router diff --git a/services/platform/src/projects/ProjectAdminRepository.ts b/services/platform/src/projects/ProjectAdminRepository.ts deleted file mode 100644 index a06e971c..00000000 --- a/services/platform/src/projects/ProjectAdminRepository.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Database } from 'config/database' -import { PageParams } from '../core/searchParams' -import { ProjectRole } from './Project' -import { ProjectAdmin } from './ProjectAdmins' -import { UUID } from 'node:crypto' - -const adminSelectFields = ['admins.first_name', 'admins.last_name', 'admins.email'] -const projectAdminFields = [`${ProjectAdmin.tableName}.*`, ...adminSelectFields] - -const baseProjectAdminQuery = (builder: Database.QueryBuilder, projectId: UUID) => { - return builder - .select(projectAdminFields) - .join('admins', 'admin_id', '=', 'admins.id') - .where('project_id', projectId) - .whereNull(`${ProjectAdmin.tableName}.deleted_at`) -} - -export const pagedProjectAdmins = async (params: PageParams, projectId: UUID) => { - return await ProjectAdmin.search( - { ...params, fields: adminSelectFields }, - q => baseProjectAdminQuery(q, projectId), - ) -} - -export const getProjectAdmin = async (projectId: UUID, adminId: UUID) => { - return await ProjectAdmin.first(q => baseProjectAdminQuery(q.where('admin_id', adminId), projectId)) -} - -export const addAdminToProject = async (projectId: UUID, adminId: UUID, role: ProjectRole) => { - const admin = await getProjectAdmin(projectId, adminId) - if (admin) { - return await ProjectAdmin.update( - qb => qb.where('project_id', projectId) - .where('admin_id', adminId), - { role }, - ) - } - return await ProjectAdmin.insert({ - admin_id: adminId, - project_id: projectId, - role, - }) -} - -export const removeAdminFromProject = async (projectId: UUID, adminId: UUID) => { - return await ProjectAdmin.update( - qb => qb.where('admin_id', adminId).where('project_id', projectId), - { deleted_at: new Date() }, - ) -} diff --git a/services/platform/src/projects/ProjectAdmins.ts b/services/platform/src/projects/ProjectAdmins.ts deleted file mode 100644 index 7be5a369..00000000 --- a/services/platform/src/projects/ProjectAdmins.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { UUID } from 'node:crypto' -import Model from '../core/Model' -import { ProjectRole } from './Project' - -export class ProjectAdmin extends Model { - project_id!: UUID - admin_id?: UUID - role!: ProjectRole - deleted_at?: Date -} - -export type ProjectAdminParams = Pick diff --git a/services/platform/src/projects/ProjectApiKey.ts b/services/platform/src/projects/ProjectApiKey.ts deleted file mode 100644 index 48a3701f..00000000 --- a/services/platform/src/projects/ProjectApiKey.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { UUID } from 'crypto' -import Model from '../core/Model' -import { ProjectRole } from './Project' - -export class ProjectApiKey extends Model { - project_id!: UUID - value!: string - name!: string - scope!: 'public' | 'secret' - role!: ProjectRole - description?: string - deleted_at?: Date -} - -export type ProjectApiKeyParams = Pick diff --git a/services/platform/src/projects/ProjectApiKeyController.ts b/services/platform/src/projects/ProjectApiKeyController.ts deleted file mode 100644 index d5fe6e7b..00000000 --- a/services/platform/src/projects/ProjectApiKeyController.ts +++ /dev/null @@ -1,84 +0,0 @@ -import Router from '@koa/router' -import { JSONSchemaType } from 'ajv' -import { ProjectState } from '../auth/AuthMiddleware' -import { searchParamsSchema } from '../core/searchParams' -import { validate } from '../core/validate' -import { extractQueryParams } from '../utilities' -import { projectRoles } from './Project' -import { ProjectApiKey, ProjectApiKeyParams } from './ProjectApiKey' -import { createProjectApiKey, pagedApiKeys, projectRoleMiddleware, revokeProjectApiKey, updateProjectApiKey } from './ProjectService' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' - -const router = new Router< - ProjectState & { apiKey?: ProjectApiKey } ->({ - prefix: '/keys', -}) - -router.use(projectRoleMiddleware('admin')) - -router.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedApiKeys(params, ctx.state.project.id) -}) - -const projectKeyParams: JSONSchemaType = { - $id: 'projectKeyCreate', - type: 'object', - required: ['name'], - properties: { - scope: { - type: 'string', - enum: ['public', 'secret'], - }, - name: { - type: 'string', - }, - description: { - type: 'string', - nullable: true, - }, - role: { - type: 'string', - enum: projectRoles, - }, - }, - additionalProperties: false, -} -router.post('/', async ctx => { - const payload = validate(projectKeyParams, ctx.request.body) - ctx.body = await createProjectApiKey(ctx.state.project.id, payload) -}) - -router.param('keyId', async (value, ctx, next) => { - const apiKey = await ProjectApiKey.first(q => q - .whereNull('deleted_at') - .where('project_id', ctx.state.project.id) - .where('id', value), - ) - if (!apiKey) { - return ctx.throw(404) - } - ctx.state.apiKey = apiKey - return next() -}) - -router.get('/:keyId', async ctx => { - ctx.body = ctx.state.apiKey! -}) - -router.patch('/:keyId', async ctx => { - ctx.body = await updateProjectApiKey(ctx.state.apiKey!.id, validate(projectKeyParams, ctx.request.body)) -}) - -router.delete('/:keyId', async ctx => { - if (!uuidValidate(ctx.params.keyId)) { - ctx.throw(400, 'Invalid API key ID') - return - } - - ctx.body = await revokeProjectApiKey(ctx.params.keyId as UUID) -}) - -export default router diff --git a/services/platform/src/projects/ProjectController.ts b/services/platform/src/projects/ProjectController.ts deleted file mode 100644 index 201edb27..00000000 --- a/services/platform/src/projects/ProjectController.ts +++ /dev/null @@ -1,230 +0,0 @@ -import Router from '@koa/router' -import { ParameterizedContext } from 'koa' -import { AuthState, ProjectState } from '../auth/AuthMiddleware' -import { RequestError } from '../core/errors' -import { searchParamsSchema } from '../core/searchParams' -import { JSONSchemaType, validate } from '../core/validate' -import { requireOrganizationRole } from '../organizations/OrganizationService' -import { hasProvider } from '../providers/ProviderService' -import { RulePathVisibility } from '../rules/ProjectRulePath' -import { extractQueryParams } from '../utilities' -import { ProjectParams } from './Project' -import { getProjectAdmin } from './ProjectAdminRepository' -import { ProjectError } from './ProjectError' -import { getRulePaths, pagedUserRulePaths, updateRulePath } from './ProjectRulePathRepository' -import { allProjects, createProject, getProject, pagedProjects, requireProjectRole, updateProject } from './ProjectService' -import { validate as uuidValidate } from 'uuid' -import { UUID } from 'crypto' - -export async function projectMiddleware(ctx: ParameterizedContext, next: () => void) { - if (ctx.state.scope !== 'admin' && !ctx.state.key) { - throw new RequestError(ProjectError.ProjectDoesNotExist) - } - - if (ctx.state.scope === 'admin' && !ctx.params.project) { - throw new RequestError(ProjectError.ProjectDoesNotExist) - } - - const projectId = ctx.state.scope === 'admin' - ? ctx.params.project - : ctx.state.key!.project_id - - const project = await getProject(projectId) - - if (!project) { - throw new RequestError(ProjectError.ProjectDoesNotExist) - } - - ctx.state.project = project - - if (ctx.state.scope === 'admin') { - // admins and owners automatically get full access - if (project.organization_id === ctx.state.admin!.organization_id && ctx.state.admin?.role !== 'member') { - ctx.state.projectRole = 'admin' - } else { - const projectAdmin = await getProjectAdmin(project.id, ctx.state.admin!.id) - if (!projectAdmin) { - throw new RequestError(ProjectError.ProjectAccessDenied) - } - ctx.state.projectRole = projectAdmin.role ?? 'support' - } - } else { - ctx.state.projectRole = ctx.state.key!.role ?? 'support' - } - - return next() -} - -const router = new Router({ prefix: '/projects' }) - -router.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - const { id, organization_id } = ctx.state.admin! - ctx.body = await pagedProjects(params, id, organization_id) -}) - -router.get('/all', async ctx => { - const { id, organization_id } = ctx.state.admin! - ctx.body = await allProjects(id, organization_id) -}) - -const projectCreateParams: JSONSchemaType = { - $id: 'projectCreate', - type: 'object', - required: ['name', 'timezone', 'locale'], - properties: { - name: { type: 'string' }, - description: { - type: 'string', - nullable: true, - }, - locale: { type: 'string' }, - timezone: { type: 'string' }, - text_opt_out_message: { - type: 'string', - nullable: true, - }, - text_help_message: { - type: 'string', - nullable: true, - }, - link_wrap_email: { - type: 'boolean', - nullable: true, - }, - link_wrap_push: { - type: 'boolean', - nullable: true, - }, - tools: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - }, - additionalProperties: false, -} - -router.post('/', async ctx => { - requireOrganizationRole(ctx.state.admin!, 'admin') - const payload = validate(projectCreateParams, ctx.request.body) - if (!ctx.state.admin) throw new RequestError(ProjectError.ProjectAccessDenied) - const project = await createProject(ctx.state.admin, payload) - ctx.body = { - ...project, - has_provider: await hasProvider(project.id), - } -}) - -export default router - -const subrouter = new Router() - -subrouter.get('/', async ctx => { - ctx.body = { - ...ctx.state.project, - role: ctx.state.projectRole, - has_provider: await hasProvider(ctx.state.project.id), - } -}) - -const projectUpdateParams: JSONSchemaType> = { - $id: 'projectUpdate', - type: 'object', - properties: { - name: { - type: 'string', - nullable: true, - }, - description: { - type: 'string', - nullable: true, - }, - locale: { - type: 'string', - nullable: true, - }, - timezone: { - type: 'string', - nullable: true, - }, - text_opt_out_message: { - type: 'string', - nullable: true, - }, - text_help_message: { - type: 'string', - nullable: true, - }, - link_wrap_email: { - type: 'boolean', - nullable: true, - }, - link_wrap_push: { - type: 'boolean', - nullable: true, - }, - tools: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - }, - additionalProperties: false, -} - -subrouter.patch('/', async ctx => { - requireProjectRole(ctx, 'admin') - const { admin, project } = ctx.state - const payload = validate(projectUpdateParams, ctx.request.body) - ctx.body = { - ...await updateProject(project.id, admin!.id, payload), - role: ctx.state.projectRole, - has_provider: await hasProvider(ctx.state.project.id), - } -}) - -subrouter.get('/data/paths', async ctx => { - const visibilities: RulePathVisibility[] = ctx.state.projectRole === 'admin' - ? ['public', 'classified'] - : ['public'] - ctx.body = await getRulePaths(ctx.state.project.id, visibilities) -}) - -subrouter.get('/data/paths/users', async ctx => { - requireProjectRole(ctx, 'admin') - const search = extractQueryParams(ctx.query, searchParamsSchema) - const visibilities: RulePathVisibility[] = ctx.state.projectRole === 'admin' - ? ['public', 'classified', 'hidden'] - : ['public'] - ctx.body = await pagedUserRulePaths({ - search, - projectId: ctx.state.project.id, - visibilities, - }) -}) - -subrouter.put('/data/paths/users/:pathId', async ctx => { - requireProjectRole(ctx, 'admin') - - if (!uuidValidate(ctx.params.pathId)) { - ctx.throw(400, 'Invalid path ID') - return - } - - ctx.body = await updateRulePath(ctx.params.pathId as UUID, ctx.request.body.visibility) -}) - -// subrouter.post('/data/paths/sync', async ctx => { -// App.main.queue.enqueue(UserSchemaSyncJob.from({ -// project_id: ctx.state.project.id, -// // no delta, rebuild the whole thing -// })) -// ctx.status = 204 -// }) - -export { subrouter as ProjectSubrouter } diff --git a/services/platform/src/projects/ProjectError.ts b/services/platform/src/projects/ProjectError.ts deleted file mode 100644 index bf1dde9d..00000000 --- a/services/platform/src/projects/ProjectError.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ErrorType } from '../core/errors' - -export const ProjectError = { - ProjectDoesNotExist: { - message: 'The requested project does not exist.', - code: 6000, - statusCode: 404, - }, - ProjectAccessDenied: { - message: 'You do not have permission to access this project.', - code: 6001, - statusCode: 403, - }, -} satisfies Record diff --git a/services/platform/src/projects/ProjectLocaleController.ts b/services/platform/src/projects/ProjectLocaleController.ts deleted file mode 100644 index 7f728060..00000000 --- a/services/platform/src/projects/ProjectLocaleController.ts +++ /dev/null @@ -1,53 +0,0 @@ -import Router from '@koa/router' -import { ProjectState } from '../auth/AuthMiddleware' -import { JSONSchemaType } from 'ajv' -import { createLocale, deleteLocale, getLocale, pagedLocales, projectRoleMiddleware } from './ProjectService' -import { extractQueryParams } from '../utilities' -import { searchParamsSchema } from '../core/searchParams' -import { LocaleParams } from './Locale' -import { validate } from '../core/validate' -import { validate as uuidValidate } from 'uuid' -import { UUID } from 'crypto' - -const router = new Router< - ProjectState & { locale?: Locale } ->({ - prefix: '/locales', -}) - -router.use(projectRoleMiddleware('editor')) - -router.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedLocales(params, ctx.state.project.id) -}) - -const localeParams: JSONSchemaType = { - $id: 'localeCreate', - type: 'object', - required: ['key', 'label'], - properties: { - key: { type: 'string' }, - label: { type: 'string' }, - }, - additionalProperties: false, -} -router.post('/', async ctx => { - const payload = validate(localeParams, ctx.request.body) - ctx.body = await createLocale(ctx.state.project.id, payload) -}) - -router.get('/:keyId', async ctx => { - ctx.body = await getLocale(ctx.state.project.id, ctx.params.keyId) -}) - -router.delete('/:keyId', async ctx => { - if (!uuidValidate(ctx.params.keyId)) { - ctx.throw(400, 'Invalid locale ID') - return - } - - ctx.body = await deleteLocale(ctx.state.project.id, ctx.params.keyId as UUID) -}) - -export default router diff --git a/services/platform/src/projects/ProjectRulePathRepository.ts b/services/platform/src/projects/ProjectRulePathRepository.ts deleted file mode 100644 index f6132b9a..00000000 --- a/services/platform/src/projects/ProjectRulePathRepository.ts +++ /dev/null @@ -1,133 +0,0 @@ -import jsonpath from 'jsonpath' -import { PageParams } from '../core/searchParams' -import { GetProjectRulePath, ProjectRulePath, RulePathVisibility } from '../rules/ProjectRulePath' -import { KeyedSet } from '../utilities' -import { userPathForQuery } from '../rules/RuleHelpers' -import { UUID } from 'node:crypto' - -type PagedRulePathParams = { - search: PageParams, - projectId: UUID, - visibilities: RulePathVisibility[] -} -export const pagedUserRulePaths = async ({ search, projectId, visibilities }: PagedRulePathParams) => { - return await ProjectRulePath.search( - search, - q => q.where('project_id', projectId) - .whereIn('visibility', visibilities) - .where('type', 'user'), - ) -} - -export const pagedEventRulePaths = async ({ search, projectId, visibilities }: PagedRulePathParams) => { - return await ProjectRulePath.search( - search, - q => q.where('project_id', projectId) - .whereIn('visibility', visibilities) - .where('type', 'event') - .groupBy('name') - .select('name'), - ) -} - -export const updateRulePath = async (id: UUID, visibility: RulePathVisibility) => { - return await ProjectRulePath.update(qb => qb.where('id', id), { visibility }) -} - -type RulePaths = { - userPaths: KeyedSet, - eventPaths: { [name: string]: KeyedSet } -} -export const getRulePaths = async ( - projectId: UUID, - visibilities: RulePathVisibility[] = ['public'], -): Promise => { - const rulePaths = await ProjectRulePath.all(q => q - .where('project_id', projectId) - .whereIn('visibility', visibilities) - .select('path', 'type', 'name', 'data_type', 'visibility'), - ) - - return rulePaths.reduce((a, rulePath) => { - const { path, type, name, data_type } = rulePath - if (type === 'event' && name) { - if (!a.eventPaths[name]) { - const set = new KeyedSet(item => item.path) - set.add({ path, type, name, data_type }) - a.eventPaths[name] = set - } else { - a.eventPaths[name].add({ path, type, name, data_type }) - } - } else { - a.userPaths.add({ path, type, name, data_type }) - } - return a - }, { - userPaths: new KeyedSet(item => item.path), - eventPaths: {}, - } as RulePaths) -} - -export const filterObjectForRulePaths = async >(obj: T, projectId: UUID, visibilities: RulePathVisibility[] = ['public']) => { - const rulePaths = await ProjectRulePath.all(q => q - .where('project_id', projectId) - .whereNotIn('visibility', visibilities) - .select('path', 'type', 'name', 'data_type', 'visibility'), - ) - - return removeByJsonPaths(obj, rulePaths.map(rp => rp.path)) -} - -type PathToken = string | number -type PathTask = { - parentPath: PathToken[] - key: PathToken -} -const removeByJsonPaths = >(obj: T, paths: string[]): T => { - const list = paths.map(p => userPathForQuery(p)) - const tasks: PathTask[] = [] - - // Collect concrete matches up front so indices don't shift during deletion - for (const p of list) { - const nodes = jsonpath.nodes(obj as unknown as object, p) as Array<{ path: PathToken[] }> - for (const { path } of nodes) { - if (!path || path.length <= 1) continue - tasks.push({ - parentPath: path.slice(0, -1), - key: path[path.length - 1], - }) - } - } - - // For items under the same parent array, delete higher indices first. - // Otherwise, delete shallower parents first. - const parentKey = (x: PathTask) => x.parentPath.join('|') - tasks.sort((a, b) => { - const aP = parentKey(a) - const bP = parentKey(b) - if (aP === bP && typeof a.key === 'number' && typeof b.key === 'number') { - return b.key - a.key - } - return a.parentPath.length - b.parentPath.length - }) - - // Perform deletions - for (const t of tasks) { - let parent: any = obj - // Walk from '$' to the parent container - for (let i = 1; i < t.parentPath.length; i++) { - if (parent == null) break - parent = parent[t.parentPath[i] as any] - } - if (parent == null) continue - - if (Array.isArray(parent) && typeof t.key === 'number') { - const idx = t.key - if (idx >= 0 && idx < parent.length) parent.splice(idx, 1) - } else { - if (Object.prototype.hasOwnProperty.call(parent, t.key)) delete parent[t.key as any] - } - } - - return obj -} diff --git a/services/platform/src/projects/ProjectService.ts b/services/platform/src/projects/ProjectService.ts deleted file mode 100644 index 79b4ae92..00000000 --- a/services/platform/src/projects/ProjectService.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { JwtAdmin, ProjectState } from '../auth/AuthMiddleware' -import { Next, ParameterizedContext } from 'koa' -import { RequestError } from '../core/errors' -import { PageParams } from '../core/searchParams' -import { createSubscription } from '../subscriptions/SubscriptionService' -import { uuid } from '../utilities' -import Project, { ProjectParams, ProjectRole, projectRoles } from './Project' -import { ProjectAdmin } from './ProjectAdmins' -import { ProjectApiKey, ProjectApiKeyParams } from './ProjectApiKey' -import { getAdmin } from '../auth/AdminRepository' -import Locale, { LocaleParams } from './Locale' -import { UUID } from 'crypto' -import { createProvider } from '../providers/ProviderRepository' -import App from '../app' -import { BootstrapResponse } from '../../oapi/webhooks' -import { ProviderGroup, RateInterval } from '../providers/Provider' -import { logger } from '../config/logger' - -export const adminProjectIds = async (adminId: UUID) => { - const records = await ProjectAdmin.all(qb => qb.where('admin_id', adminId)) - return records.map(item => item.project_id) -} - -export const pagedProjects = async (params: PageParams, adminId: UUID, organizationId: UUID) => { - const admin = await getAdmin(adminId, organizationId) - const projectIds = await adminProjectIds(adminId) - return await Project.search({ ...params, fields: ['name'] }, qb => - qb.where(qb => - qb.where('organization_id', admin!.organization_id) - .orWhereIn('projects.id', projectIds), - ), - ) -} - -export const allProjects = async (adminId: UUID, organizationId: UUID) => { - const admin = await getAdmin(adminId, organizationId) - if (!admin) return [] - const projectIds = await adminProjectIds(adminId) - return await Project.all(qb => { - qb.whereIn('projects.id', projectIds) - if (admin.role !== 'member') { - qb.orWhere('organization_id', admin.organization_id) - } - return qb - }) -} - -export const getProject = async (id: UUID, adminId?: UUID) => { - const project = await Project.first( - qb => { - qb.where('projects.id', id).select('projects.*') - .select( - Project.raw( - '(SELECT COUNT(*) FROM campaigns WHERE campaigns.project_id = projects.id) AS campaigns_count', - ), - Project.raw( - '(SELECT COUNT(*) FROM journeys WHERE journeys.project_id = projects.id) AS journeys_count', - ), - Project.raw( - '(SELECT COUNT(*) FROM users WHERE users.project_id = projects.id) AS users_count', - ), - Project.raw( - '(SELECT COUNT(*) FROM lists WHERE lists.project_id = projects.id) AS lists_count', - ), - ) - if (adminId != null) { - qb.leftJoin('project_admins', 'project_admins.project_id', 'projects.id') - .where('admin_id', adminId) - .select('role') - } - return qb - }) - - if (!project) { - return null - } - - return { - ...project, - campaigns_count: Number(project?.campaigns_count ?? 0), - journeys_count: Number(project?.journeys_count ?? 0), - users_count: Number(project?.users_count ?? 0), - lists_count: Number(project?.lists_count ?? 0), - } as Project -} - -export const createProject = async (admin: JwtAdmin, params: ProjectParams): Promise => { - const projectId = await Project.insert({ - ...params, - organization_id: admin.organization_id, - }) - - // Add the user creating the project to it - await ProjectAdmin.insert({ - project_id: projectId, - admin_id: admin.id, - role: 'admin', - }) - - // Create initial locale for project - const languages = new Intl.DisplayNames([params.locale], { type: 'language' }) - await Locale.insert({ - project_id: projectId, - key: params.locale, - label: languages.of(params.locale), - }) - - // Create a single subscription for each type - await createSubscription(projectId, { name: 'Default Email', channel: 'email', is_public: true }) - await createSubscription(projectId, { name: 'Default SMS', channel: 'text', is_public: true }) - await createSubscription(projectId, { name: 'Default Push', channel: 'push', is_public: true }) - await createSubscription(projectId, { name: 'Default Webhook', channel: 'webhook', is_public: false }) - - const project = await getProject(projectId, admin.id) - await bootstrapProject(project!) - - return project! -} - -export const bootstrapProject = async (project: Project): Promise => { - if (!App.main.env.webhooks.bootstrap) { - return - } - - logger.info({ projectId: project.id }, 'Bootstrapping project') - const { providers } = await fetchProvidersBootstrapConfig(project.organization_id, project.id) - if (!providers || providers.length === 0) { - logger.info({ projectId: project.id }, 'No providers to bootstrap') - return - } - - for (const provider of providers) { - logger.info({ projectId: project.id, type: provider.type }, 'Setting up provider') - await createProvider(project.id, { - type: provider.type, - name: provider.name, - data: provider.data || {}, - group: provider.group as ProviderGroup, - rate_interval: provider.rate_interval as RateInterval, - rate_limit: Number(provider.rate_limit ?? 0), - is_default: provider.is_default || false, - external_id: provider.external_id ?? undefined, - }) - } - -} - -export async function fetchProvidersBootstrapConfig( - organizationId: UUID, - projectId: UUID, -): Promise { - if (!App.main.env.webhooks.bootstrap) { - throw new Error('No bootstrap webhook configured') - } - - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), App.main.env.webhooks.bootstrap.timeoutMs) - - try { - const res = await fetch(App.main.env.webhooks.bootstrap.url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - project_id: projectId, - organization_id: organizationId, - }), - signal: controller.signal, - }) - - clearTimeout(timeoutId) - if (!res.ok) throw new Error(`Webhook error: ${res.statusText}`) - return res.json() - } catch (error) { - clearTimeout(timeoutId) - throw error - } -} - -export const updateProject = async (id: UUID, adminId: UUID, params: Partial) => { - await Project.update(qb => qb.where('id', id), params) - return await getProject(id, adminId) -} - -export const pagedApiKeys = async (params: PageParams, projectId: UUID) => { - return await ProjectApiKey.search( - { ...params, fields: ['name', 'description'] }, - qb => qb.where('project_id', projectId).whereNull('deleted_at'), - ) -} - -export const getProjectApiKey = async (key: string) => { - return ProjectApiKey.first(qb => qb.where('value', key).whereNull('deleted_at')) -} - -export const createProjectApiKey = async (projectId: UUID, params: ProjectApiKeyParams) => { - return await ProjectApiKey.insertAndFetch({ - ...params, - value: generateApiKey(params.scope), - project_id: projectId, - }) -} - -export const updateProjectApiKey = async (id: UUID, params: ProjectApiKeyParams) => { - return await ProjectApiKey.updateAndFetch(id, params) -} - -export const revokeProjectApiKey = async (id: UUID) => { - return await ProjectApiKey.archive(id) -} - -export const generateApiKey = (scope: 'public' | 'secret') => { - const key = uuid().replace('-', '') - const prefix = scope === 'public' ? 'pk' : 'sk' - return `${prefix}_${key}` -} - -export const requireProjectRole = (ctx: ParameterizedContext, minRole: ProjectRole) => { - if (projectRoles.indexOf(minRole) > projectRoles.indexOf(ctx.state.projectRole)) { - throw new RequestError(`Minimum project role ${minRole} is required`, 403) - } -} - -export const projectRoleMiddleware = (minRole: ProjectRole) => async (ctx: ParameterizedContext, next: Next) => { - requireProjectRole(ctx, minRole) - return next() -} - -export const pagedLocales = async (params: PageParams, projectId: UUID) => { - return await Locale.search( - { ...params, fields: ['label'] }, - qb => qb.where('project_id', projectId), - ) -} - -export const createLocale = async (projectId: UUID, params: LocaleParams) => { - return await Locale.insertAndFetch({ - ...params, - project_id: projectId, - }) -} - -export const getLocale = async (projectId: UUID, key: string) => { - return await Locale.first(qb => - qb.where('project_id', projectId) - .where('key', key), - ) -} - -export const deleteLocale = async (projectId: UUID, id: UUID) => { - return await Locale.deleteById(id, qb => qb.where('project_id', projectId)) -} diff --git a/services/platform/src/projects/__tests__/ProjectTestHelpers.ts b/services/platform/src/projects/__tests__/ProjectTestHelpers.ts deleted file mode 100644 index 43dd635d..00000000 --- a/services/platform/src/projects/__tests__/ProjectTestHelpers.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Admin from '../../auth/Admin' -import { uuid } from '../../utilities' -import { createProject } from '../ProjectService' - -export const createTestProject = async () => { - const admin = await Admin.insertAndFetch({ - first_name: uuid(), - last_name: uuid(), - email: `${uuid()}@test.com`, - }) - return await createProject(admin, { - name: uuid(), - timezone: 'utc', - locale: 'en', - }) -} diff --git a/services/platform/src/providers/LoggerProvider.ts b/services/platform/src/providers/LoggerProvider.ts deleted file mode 100644 index b4ca391e..00000000 --- a/services/platform/src/providers/LoggerProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Provider from '../providers/Provider' -import type { DriverConfig } from '../config/env' - -export type LoggerProviderName = 'logger' -export class LoggerProvider extends Provider { } -export interface LoggerConfig extends DriverConfig { - driver: LoggerProviderName -} diff --git a/services/platform/src/providers/MessageTrigger.ts b/services/platform/src/providers/MessageTrigger.ts deleted file mode 100644 index 59dfbcd6..00000000 --- a/services/platform/src/providers/MessageTrigger.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { UUID } from 'node:crypto' - -export interface MessageTrigger { - campaign_id: UUID - user_id: UUID - event_id?: UUID - reference_type?: string - reference_id?: UUID -} diff --git a/services/platform/src/providers/MessageTriggerService.ts b/services/platform/src/providers/MessageTriggerService.ts deleted file mode 100644 index 7231a3ae..00000000 --- a/services/platform/src/providers/MessageTriggerService.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { UUID } from 'crypto' -import App from '../app' -import Campaign from '../campaigns/Campaign' -import { getCampaignSend, updateSendState } from '../campaigns/CampaignService' -import { Channel } from '../config/channels' -import { RateLimitResponse } from '../config/rateLimit' -import { acquireLock } from '../core/Lock' -import JourneyProcessJob from '../journey/JourneyProcessJob' -import { loadUserStepDataMap } from '../journey/JourneyService' -import JourneyUserStep from '../journey/JourneyUserStep' -import Project from '../projects/Project' -import { EncodedJob } from '../queue' -import { RenderContext } from '../render' -import Template, { TemplateType } from '../render/Template' -import { templatesInUserLocale } from '../render/TemplateService' -import { SubscriptionState } from '../subscriptions/Subscription' -import { getUserSubscriptionState } from '../subscriptions/SubscriptionService' -import { User } from '../users/User' -import { createEvent } from '../users/UserEventRepository' -import { random, randomInt } from '../utilities' -import { MessageTrigger } from './MessageTrigger' - -interface MessageTriggerHydrated { - user: User - journey: Record // step.data_key -> user step data - campaign: Campaign - template: T - project: Project - context: RenderContext -} - -export async function loadSendJob({ campaign_id, user_id, reference_type, reference_id }: MessageTrigger): Promise | undefined> { - const user = await User.find(user_id) - if (!user) throw new Error('User not found') - - const project = await Project.find(user.project_id) - const send = await getCampaignSend(campaign_id, user_id, reference_id) - - // If user or project is deleted, abort and discard job - if (!user || !project) return - - // If there is a send and it's in an aborted state or has already - // sent, abort this job to prevent duplicate sends - if (send && send.hasCompleted) return - - // Fetch campaign - const campaign = await Campaign.find(campaign_id) - if (!campaign) return - - // Check to see if user has already unsubscribed or not - const subscriptionState = await getUserSubscriptionState(user.id, campaign.subscription_id) - if (subscriptionState === SubscriptionState.unsubscribed) { - await updateSendState({ - campaign, - user, - reference_id, - state: 'aborted', - }) - return - } - - // Get all templates - const templates = await Template.all( - qb => qb.where('campaign_id', campaign_id), - ) - - // Determine what template to send to the user based on the following - const template = random( - templatesInUserLocale(templates, project, user), - ) - - // If campaign or template dont exist, log and abort - if (!template || !campaign) { - await updateSendState({ - campaign, - user, - reference_id, - state: 'failed', - }) - return - } - - // Create context object from campaign details - const context = { - campaign_id: campaign.id, - campaign_name: campaign.name, - campaign_type: campaign.type, - template_id: template.id, - template_locale: template.locale, - channel: campaign.channel, - subscription_id: campaign.subscription_id, - reference_type, - reference_id, - } - - // Provide data captured from linked journey steps - const journey: Record = reference_id && reference_type === 'journey' - ? await loadUserStepDataMap(reference_id) - : {} - - // Create the hydrated message object - const response = { - campaign, - context, - journey, - template: (await template.map()) as T, - project, - user, - } - - // Check that the template is valid and capable of being sent - const [isValid, error] = (await template.map()).validate() - if (!isValid) { - await failSend(response, error, () => false) - return - } - - return response -} - -export const messageLock = (campaign: Campaign, user: User) => `lunogram:send:${campaign.id}:${user.id}` - -export const prepareSend = async ( - channel: Channel, - message: MessageTriggerHydrated, - raw: EncodedJob, - rateLimitPoints = 1, -): Promise => { - const { campaign, user } = message - - // Check current send rate, if exceeded then requeue job - // at a time in the future - const rateCheck = await throttleSend(channel, rateLimitPoints) - if (rateCheck?.exceeded) { - - // Mark state as throttled so it is not continuously added - // to the queue - await updateSendState({ - campaign, - user, - reference_id: message.context.reference_id, - state: 'throttled', - }) - - // Schedule the resend for a jittered number of seconds later - const delay = 1000 + randomInt(0, 5000) - await App.main.queue.delay(raw, delay) - return false - } - - // Create a lock for this process to make sure it doesn't run twice - const acquired = await acquireLock({ key: messageLock(campaign, user) }) - if (!acquired) return false - - return true -} - -export const throttleSend = async (channel: Channel, points = 1): Promise => { - const provider = channel.provider - - // If no rate limit, just break - if (!provider.rate_limit) return - - // Otherwise consume points and check rate - return await App.main.rateLimiter.consume( - `ratelimit-${provider.id}`, - { - limit: provider.rate_limit, - points, - msDuration: provider.interval, - }, - ) -} - -export const failSend = async ({ campaign, user, context }: MessageTriggerHydrated, error?: Error, shouldNotify = (_: any) => true) => { - - // Update send record - await updateSendState({ - campaign, - user, - reference_id: context.reference_id, - state: 'failed', - }) - - // Create an event on the failure - await createEvent(user, { - name: campaign.eventName('failed'), - data: { ...context, error }, - }, true, ({ result, ...data }) => data) - - // If this send is part of a journey, notify the journey - if (context.reference_id && context.reference_type === 'journey') { - await notifyJourney(context.reference_id) - } - - // Notify of the error if it's a critical one - if (error && shouldNotify(error)) { - App.main.error.notify(error, { - ...context, - user_id: user.id, - }) - } -} - -export const finalizeSend = async (data: MessageTriggerHydrated, result: any) => { - const { campaign, user, context } = data - - // Update send record - await updateSendState({ - campaign, - user, - reference_id: context.reference_id, - }) - - // Create an event on the user about the send - await createEvent(user, { - name: campaign.eventName('sent'), - data: { ...context, result }, - }, true, ({ result, ...data }) => data) - - // If this send is part of a journey, notify the journey - if (context.reference_id && context.reference_type === 'journey') { - await notifyJourney(context.reference_id, campaign.channel === 'webhook' ? result : undefined) - } -} - -export const notifyJourney = async (referenceId: UUID, response?: any) => { - // Save response into user step - if (response) { - await JourneyUserStep.update(q => q.where('id', referenceId), { - data: response, - }) - } - - // Trigger processing of this journey entrance - await JourneyProcessJob.from({ entrance_id: referenceId }).queue() -} diff --git a/services/platform/src/providers/Provider.ts b/services/platform/src/providers/Provider.ts deleted file mode 100644 index 9b06d96a..00000000 --- a/services/platform/src/providers/Provider.ts +++ /dev/null @@ -1,148 +0,0 @@ -import Router from '@koa/router' -import Model, { ModelParams } from '../core/Model' -import { JSONSchemaType } from '../core/validate' -import type App from '../app' -import { Context } from 'koa' -import { UUID } from 'crypto' - -export type ProviderGroup = 'email' | 'text' | 'push' | 'webhook' | 'analytics' -export interface ProviderMeta { - name: string - description?: string - url?: string - icon?: string - type: string - group: string | ProviderGroup - schema?: any -} - -export interface ProviderOptions { - filter?: (ctx: Context) => boolean -} - -export interface ProviderSetupMeta { - name: string - value: string | number -} - -export function ProviderSchema<_ extends ExternalProviderParams, D>(id: string, data: JSONSchemaType): any { - return { - $id: id, - type: 'object', - required: ['data'], - properties: { - name: { - type: 'string', - nullable: true, - }, - is_default: { - type: 'boolean', - nullable: true, - }, - data, - rate_limit: { - type: 'number', - description: 'The per interval maximum send rate.', - nullable: true, - }, - rate_interval: { - type: 'string', - nullable: true, - }, - }, - additionalProperties: false, - } as any -} - -export type RateInterval = 'second' | 'minute' | 'hour' | 'day' - -export default class Provider extends Model { - type!: string - name!: string - project_id!: UUID - group!: ProviderGroup - data!: Record - is_default!: boolean - rate_limit!: number - rate_interval!: RateInterval - setup!: ProviderSetupMeta[] - deleted_at?: Date - external_id?: string - - static jsonAttributes = ['data'] - - static isDevelopment = false - static namespace = this.name - static meta: Omit = { - name: '', - description: '', - url: '', - } - - static get cacheKey() { - return { - internal(id: UUID) { - return `providers:id:${id}` - }, - default(projectId: UUID, group: string) { - return `providers:project:${projectId}:${group}` - }, - } - } - - parseJson(json: any): void { - super.parseJson(json) - - Object.assign(this, this.data) - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - loadSetup(app: App): ProviderSetupMeta[] { return [] } - - static schema: any = ProviderSchema('providerParams', { - type: 'object', - nullable: true, - additionalProperties: true, - } as any) - - static controllers(): Partial { - return {} - } - - static get group(): ProviderGroup { - throw new Error('Group not defined.') - } - - static get options(): ProviderOptions { return {} } - - get interval() { - const intervals = { - second: 1000, - minute: 60 * 1000, - hour: 60 * 60 * 1000, - day: 24 * 60 * 60 * 1000, - } - return intervals[this.rate_interval || 'second'] - } - - ratePer(period: RateInterval) { - const intervals = { - second: 1, - minute: 60, - hour: 60 * 60, - day: 24 * 60 * 60, - } - return this.rate_limit * intervals[period] - } -} - -export type ProviderMap = (record: any) => T - -export type ProviderParams = Omit - -export type ExternalProviderParams = Omit - -export interface ProviderControllers { - admin: Router - public?: Router -} diff --git a/services/platform/src/providers/ProviderController.ts b/services/platform/src/providers/ProviderController.ts deleted file mode 100644 index 4c32c0e2..00000000 --- a/services/platform/src/providers/ProviderController.ts +++ /dev/null @@ -1,89 +0,0 @@ -import Router from '@koa/router' -import { ProjectState } from '../auth/AuthMiddleware' -import { searchParamsSchema } from '../core/searchParams' -import { extractQueryParams } from '../utilities' -import { analyticsProviders } from './analytics' -import { emailProviders } from './email' -import Provider from './Provider' -import { getProvider } from './ProviderRepository' -import { allProviders, archiveProvider, loadController, pagedProviders } from './ProviderService' -import { pushProviders } from './push' -import { textProviders } from './text' -import { webhookProviders } from './webhook' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' -import App from '../app' - -const adminRouter = new Router({ - prefix: '/providers', -}) - -const publicRouter = new Router({ - prefix: '/providers/:providersId', -}) -publicRouter.param('providersId', async (value, ctx, next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid provider ID') - return - } - - ctx.state.provider = await getProvider(value as UUID) - if (!ctx.state.provider) { - ctx.throw(404) - return - } - return await next() -}) - -const providers: (typeof Provider)[] = [ - ...textProviders, - ...emailProviders, - ...pushProviders, - ...webhookProviders, - ...analyticsProviders, -] - -const routers = { admin: adminRouter, public: publicRouter } -for (const provider of providers) { - loadController(routers, provider) -} - -export const addProvider = (typeMap: Record, provider: typeof Provider) => { - if (!typeMap[provider.namespace]) { - typeMap[provider.namespace] = provider - } - providers.push(provider) - loadController(routers, provider) -} - -adminRouter.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedProviders(params, ctx.state.project.id) -}) - -adminRouter.get('/all', async ctx => { - ctx.body = await allProviders(ctx.state.project.id) -}) - -adminRouter.get('/meta', async ctx => { - const isDevelopment = App.main.env.environment === 'development' - ctx.body = providers - .filter(provider => (!provider.isDevelopment || isDevelopment) && (provider.options.filter?.(ctx) ?? true)) - .map(provider => ({ - ...provider.meta, - group: provider.group, - type: provider.namespace, - schema: provider.schema, - })) -}) - -adminRouter.delete('/:id', async ctx => { - if (!uuidValidate(ctx.params.id)) { - ctx.throw(400, 'Invalid provider ID') - return - } - - ctx.body = await archiveProvider(ctx.params.id as UUID, ctx.state.project.id) -}) - -export { adminRouter, publicRouter, providers } diff --git a/services/platform/src/providers/ProviderRepository.ts b/services/platform/src/providers/ProviderRepository.ts deleted file mode 100644 index 6eab0d6d..00000000 --- a/services/platform/src/providers/ProviderRepository.ts +++ /dev/null @@ -1,98 +0,0 @@ -import Provider, { ProviderMap, ProviderParams, ExternalProviderParams } from './Provider' -import { ChannelType } from 'config/channels' -import { UUID } from 'crypto' -import App from '../app' - -export const getProvider = async (id: UUID, projectId?: UUID) => { - return await Provider.find(id, qb => projectId ? qb.where('project_id', projectId) : qb) -} - -export const getDefaultProvider = async (projectId: UUID, channel: ChannelType) => { - return await Provider.table() - .where('project_id', projectId) - .where('group', channel) - .where('is_default', true) - .first() -} - -export const loadProvider = async (id: UUID, mapper: ProviderMap, projectId?: UUID, app = App.main) => { - // Check if value is cached in memory - const cache = app.get(Provider.cacheKey.internal(id)) - if (cache) return cache - - // If not, fetch from DB - const record = await Provider.find(id, qb => projectId ? qb.where('project_id', projectId) : qb, app.db) - if (!record) return - - // Map to appropriate type, cache and return - const mappedValue = mapper(record) - mappedValue.setup = mappedValue.loadSetup(app) - cacheProvider(mappedValue) - return mappedValue -} - -export const loadDefaultProvider = async (group: string, projectId: UUID, mapper: ProviderMap, app = App.main) => { - // Check if value is cached in memory - const cache = app.get(Provider.cacheKey.default(projectId, group)) - if (cache) return cache - - // If not, fetch from DB - const record = await Provider.table() - .where('project_id', projectId) - .where('group', group) - .where('is_default', true) - .first() - if (!record) return - - // Map to appropriate type, cache and return - const mappedValue = mapper(record) - cacheProvider(mappedValue) - return mappedValue -} - -export const createProvider = async (projectId: UUID, params: ProviderParams) => { - params.is_default = params.data.is_default ?? false - - const provider = await Provider.insertAndFetch({ - ...params, - project_id: projectId, - }) - - await setDefault(provider) - - return provider -} - -export const updateProvider = async (id: UUID, params: ExternalProviderParams, app = App.main) => { - params.is_default = params.data.is_default ?? false - - await Provider.update( - qb => qb.where('id', id).whereNull('external_id'), - params, - ) - - const provider = await getProvider(id) - if (!provider) throw new Error('Provider not found') - - app.remove(Provider.cacheKey.internal(provider.id)) - app.remove(Provider.cacheKey.default(provider.project_id, provider.group)) - - await setDefault(provider) - return provider -} - -export const cacheProvider = (provider: Provider, app = App.main) => { - app.set(Provider.cacheKey.internal(provider.id), provider) - if (provider.is_default) { - app.set(Provider.cacheKey.default(provider.project_id, provider.group), provider) - } -} - -const setDefault = async ({ id, group, project_id }: Pick, isDefault = false) => { - return await Provider.update( - qb => qb.where('project_id', project_id) - .where('group', group) - .whereNot('id', id), - { is_default: isDefault }, - ) -} diff --git a/services/platform/src/providers/ProviderService.ts b/services/platform/src/providers/ProviderService.ts deleted file mode 100644 index 7e8234a2..00000000 --- a/services/platform/src/providers/ProviderService.ts +++ /dev/null @@ -1,99 +0,0 @@ -import Router from '@koa/router' -import { ProjectState } from '../auth/AuthMiddleware' -import { PageParams } from '../core/searchParams' -import { JSONSchemaType, validate } from '../core/validate' -import Provider, { ProviderControllers, ProviderGroup, ProviderMeta, ProviderParams } from './Provider' -import { createProvider, getProvider, loadProvider, updateProvider } from './ProviderRepository' -import App from '../app' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' - -export const allProviders = async (projectId: UUID) => { - return await Provider.all(qb => qb.where('project_id', projectId).whereNull('deleted_at')) -} - -export const hasProvider = async (projectId: UUID) => { - return await Provider.exists(qb => qb.where('project_id', projectId)) -} - -export const pagedProviders = async (params: PageParams, projectId: UUID) => { - return await Provider.search( - { ...params, fields: ['name', 'group'] }, - b => b.where('project_id', projectId).whereNull('deleted_at'), - App.main.db, - (item) => { - item.setup = item.loadSetup(App.main) - return item - }, - ) -} - -export const archiveProvider = async (id: UUID, projectId: UUID) => { - await Provider.archive(id, qb => qb.where('project_id', projectId)) - return getProvider(id, projectId) -} - -export const loadController = (routers: ProviderControllers, provider: typeof Provider): ProviderMeta => { - const { admin: adminRouter, public: publicRouter } = provider.controllers() - if (routers.admin && adminRouter) { - routers.admin.use( - adminRouter.routes(), - adminRouter.allowedMethods(), - ) - } - if (routers.public && publicRouter) { - routers.public.use( - publicRouter.routes(), - publicRouter.allowedMethods(), - ) - } - return { - ...provider.meta, - group: provider.group, - type: provider.namespace, - schema: provider.schema, - } -} - -export const createController = (group: ProviderGroup, type: typeof Provider): Router => { - const router = new Router< - ProjectState & { provider?: Provider } - >({ - prefix: `/${group}/${type.namespace}`, - }) - - router.post('/', async ctx => { - const payload = validate(type.schema as JSONSchemaType, ctx.request.body) - - ctx.body = await createProvider(ctx.state.project.id, { ...payload, type: type.namespace, group }) - }) - - router.param('providerId', async (value, ctx, next) => { - const map = (record: any) => { - return type.fromJson(record) - } - - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid provider ID') - return - } - - ctx.state.provider = await loadProvider(value as UUID, map, ctx.state.project.id) - if (!ctx.state.provider) { - ctx.throw(404) - return - } - return await next() - }) - - router.get('/:providerId', async ctx => { - ctx.body = ctx.state.provider - }) - - router.patch('/:providerId', async ctx => { - const payload = validate(type.schema as JSONSchemaType, ctx.request.body) - ctx.body = updateProvider(ctx.state.provider!.id, payload) - }) - - return router -} diff --git a/services/platform/src/providers/analytics/Analytics.ts b/services/platform/src/providers/analytics/Analytics.ts deleted file mode 100644 index 61092a1d..00000000 --- a/services/platform/src/providers/analytics/Analytics.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DriverConfig } from '../../config/env' -import { AnalyticsProvider, AnalyticsProviderName, AnalyticsUserEvent } from './AnalyticsProvider' - -export interface AnalyticsTypeConfig extends DriverConfig { - driver: AnalyticsProviderName -} - -export default class Analytics { - readonly provider?: AnalyticsProvider - constructor(provider?: AnalyticsProvider) { - this.provider = provider - } - - async track(event: AnalyticsUserEvent) { - await this.provider?.track(event) - } -} diff --git a/services/platform/src/providers/analytics/AnalyticsProvider.ts b/services/platform/src/providers/analytics/AnalyticsProvider.ts deleted file mode 100644 index b05a8e8b..00000000 --- a/services/platform/src/providers/analytics/AnalyticsProvider.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { camelcase, titleize } from '../../render/Helpers/String' -import { UserEventParams } from '../../users/UserEvent' -import { snakeCase } from '../../utilities' -import Provider, { ProviderGroup } from '../Provider' - -export type AnalyticsProviderName = 'segment' | 'mixpanel' | 'posthog' - -export type AnalyticsUserEvent = UserEventParams & { - external_id: string - anonymous_id?: string -} - -export type Convention = 'snake_case' | 'camel_case' | 'title_case' - -export abstract class AnalyticsProvider extends Provider { - abstract track(event: AnalyticsUserEvent): Promise - - static group = 'analytics' as ProviderGroup - - tranformEventName(event: string, convention: Convention) { - switch (convention) { - case 'camel_case': return camelcase(event) - case 'snake_case': return snakeCase(event) - case 'title_case': return titleize(event) - } - } -} diff --git a/services/platform/src/providers/analytics/MixpanelProvider.ts b/services/platform/src/providers/analytics/MixpanelProvider.ts deleted file mode 100644 index a8fdba87..00000000 --- a/services/platform/src/providers/analytics/MixpanelProvider.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { AnalyticsProvider, AnalyticsUserEvent } from './AnalyticsProvider' -import { createController } from '../ProviderService' -import { logger } from '../../config/logger' - -type Convention = 'snake_case' | 'camel_case' | 'title_case' - -interface MixpanelDataParams { - project_token: string - region?: string - is_default: boolean - event_name_convention: Convention -} - -interface MixpanelProviderParams extends ProviderParams { - data: MixpanelDataParams -} - -export default class MixpanelAnalyticsProvider extends AnalyticsProvider { - project_token!: string - region?: string - event_name_convention: Convention = 'snake_case' - - static namespace = 'mixpanel' - static meta = { - name: 'Mixpanel', - url: 'https://mixpanel.com', - icon: 'https://lunogram.com/providers/mixpanel.svg', - } - - static schema = ProviderSchema('mixpanelAnalyticsProviderParams', { - type: 'object', - required: ['project_token', 'is_default'], - properties: { - project_token: { type: 'string' }, - region: { type: 'string', nullable: true, enum: ['api', 'api-eu'] }, - is_default: { type: 'boolean' }, - event_name_convention: { type: 'string', enum: ['snake_case', 'camel_case', 'title_case'] }, - }, - }) - - async track(event: AnalyticsUserEvent) { - - const response = await fetch(`https://${this.region}.mixpanel.com/import`, { - method: 'POST', - headers: { - Authorization: `Basic ${btoa(this.project_token + ':')}`, - Accept: 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'lunogram/v1 (+https://github.com/lunogram/platform)', - }, - body: JSON.stringify([{ - event: this.tranformEventName(event.name, this.event_name_convention), - properties: { - ...event.data, - distinct_id: event.external_id, - }, - }]), - }) - - if (!response.ok) { - const responseBody = await response.json() - logger.error('Mixpanel error', responseBody) - } - } - - static controllers(): ProviderControllers { - return { admin: createController('analytics', this) } - } -} diff --git a/services/platform/src/providers/analytics/PosthogProvider.ts b/services/platform/src/providers/analytics/PosthogProvider.ts deleted file mode 100644 index 8e43dc34..00000000 --- a/services/platform/src/providers/analytics/PosthogProvider.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { PostHog } from 'posthog-node' -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { AnalyticsProvider, AnalyticsUserEvent, Convention } from './AnalyticsProvider' -import { createController } from '../ProviderService' - -interface PostHogDataParams { - api_key: string - host?: string - is_default: boolean - event_name_convention: Convention -} - -interface PostHogProviderParams extends ProviderParams { - data: PostHogDataParams -} - -export default class PostHogAnalyticsProvider extends AnalyticsProvider { - api_key!: string - host?: string - event_name_convention: Convention = 'snake_case' - - static namespace = 'posthog' - static meta = { - name: 'PostHog', - url: 'https://posthog.com', - icon: 'https://lunogram.com/providers/posthog.svg', - } - - static schema = ProviderSchema('postHogAnalyticsProviderParams', { - type: 'object', - required: ['api_key', 'is_default'], - properties: { - api_key: { type: 'string' }, - host: { type: 'string', nullable: true }, - is_default: { type: 'boolean' }, - event_name_convention: { type: 'string', enum: ['snake_case', 'camel_case', 'title_case'] }, - }, - }) - - client!: PostHog - - async track(event: AnalyticsUserEvent) { - - // If PostHog has not been initialized yet, start it - if (!this.client) { - this.client = new PostHog(this.api_key, { - host: this.host, - }) - } - - this.client.capture({ - distinctId: event.external_id, - event: this.tranformEventName(event.name, this.event_name_convention), - properties: event.data, - }) - } - - static controllers(): ProviderControllers { - return { admin: createController('analytics', this) } - } -} diff --git a/services/platform/src/providers/analytics/SegmentProvider.ts b/services/platform/src/providers/analytics/SegmentProvider.ts deleted file mode 100644 index b3437c49..00000000 --- a/services/platform/src/providers/analytics/SegmentProvider.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Analytics as Segment } from '@segment/analytics-node' -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { AnalyticsProvider, AnalyticsUserEvent, Convention } from './AnalyticsProvider' -import { createController } from '../ProviderService' - -interface SegmentDataParams { - write_key: string - is_default: boolean - event_name_convention: Convention -} - -interface SegmentProviderParams extends ProviderParams { - data: SegmentDataParams -} - -export default class SegmentAnalyticsProvider extends AnalyticsProvider { - write_key!: string - event_name_convention: Convention = 'snake_case' - - static namespace = 'segment' - static meta = { - name: 'Segment', - url: 'https://segment.com', - icon: 'https://lunogram.com/providers/segment.svg', - } - - static schema = ProviderSchema('segmentAnalyticsProviderParams', { - type: 'object', - required: ['write_key'], - properties: { - write_key: { type: 'string' }, - is_default: { type: 'boolean' }, - event_name_convention: { type: 'string', enum: ['snake_case', 'camel_case', 'title_case'] }, - }, - }) - - segment!: Segment - - async track(event: AnalyticsUserEvent) { - - // If Segment has not been initialized yet, start it - if (!this.segment) { - this.segment = new Segment({ writeKey: this.write_key }) - } - - this.segment.track({ - userId: event.external_id, - anonymousId: event.anonymous_id, - event: this.tranformEventName(event.name, this.event_name_convention), - properties: event.data, - }) - } - - static controllers(): ProviderControllers { - return { admin: createController('analytics', this) } - } -} diff --git a/services/platform/src/providers/analytics/index.ts b/services/platform/src/providers/analytics/index.ts deleted file mode 100644 index 92c5045a..00000000 --- a/services/platform/src/providers/analytics/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UUID } from 'crypto' -import { loadDefaultProvider } from '../ProviderRepository' -import Analytics from './Analytics' -import { AnalyticsProvider, AnalyticsProviderName } from './AnalyticsProvider' -import MixpanelAnalyticsProvider from './MixpanelProvider' -import PostHogAnalyticsProvider from './PosthogProvider' -import SegmentAnalyticsProvider from './SegmentProvider' - -type AnalyticsProviderDerived = { new(): AnalyticsProvider } & typeof AnalyticsProvider -export const typeMap: Record = { - segment: SegmentAnalyticsProvider, - posthog: PostHogAnalyticsProvider, - mixpanel: MixpanelAnalyticsProvider, -} - -export const providerMap = (record: { type: AnalyticsProviderName }): AnalyticsProvider => { - if (!typeMap[record.type]) throw new Error(`Unknown analytics provider type: ${record.type}`) - return typeMap[record.type].fromJson(record) -} - -export const loadAnalytics = async (projectId: UUID): Promise => { - const provider = await loadDefaultProvider('analytics', projectId, providerMap) - return new Analytics(provider) -} - -export const analyticsProviders = Object.values(typeMap) diff --git a/services/platform/src/providers/email/Email.ts b/services/platform/src/providers/email/Email.ts deleted file mode 100644 index 729cb4aa..00000000 --- a/services/platform/src/providers/email/Email.ts +++ /dev/null @@ -1,14 +0,0 @@ -export type NamedEmail = { name: string, address: string } - -export interface Email { - to: string - from: string | NamedEmail - cc?: string - bcc?: string - reply_to?: string - subject: string - text: string - html: string - headers?: Record - list?: { unsubscribe: string } -} diff --git a/services/platform/src/providers/email/EmailChannel.ts b/services/platform/src/providers/email/EmailChannel.ts deleted file mode 100644 index 13c07187..00000000 --- a/services/platform/src/providers/email/EmailChannel.ts +++ /dev/null @@ -1,61 +0,0 @@ -import App from '../../app' -import { Variables } from '../../render' -import { EmailTemplate } from '../../render/Template' -import { unsubscribeEmailLink } from '../../subscriptions/SubscriptionService' -import { pick } from '../../utilities' -import { Email } from './Email' -import EmailProvider from './EmailProvider' - -export default class EmailChannel { - readonly provider: EmailProvider - constructor(provider?: EmailProvider) { - if (provider) { - this.provider = provider - this.provider.boot?.() - } else { - throw new Error('A valid mailer must be defined!') - } - } - - async send(template: EmailTemplate, variables: Variables) { - if (!variables.user.email) throw new Error('Unable to send a message to a user with no email.') - - // TODO: Explore caching the Handlebars template - // before passing in variables for better performance - const compiled = template.compile(variables) - const email: Email = { - ...compiled, - to: variables.user.email, - headers: { - 'X-Campaign-Id': variables.context.campaign_id, - 'X-Subscription-Id': variables.context.subscription_id, - }, - list: { - unsubscribe: unsubscribeEmailLink({ - userId: variables.user.id, - campaignId: variables.context.campaign_id, - referenceId: variables.context.reference_id, - }), - }, - } - const result = await this.provider.send(email) - return { - ...pick(result, [ - 'messageId', - 'messageSize', - 'messageTime', - 'envelope', - 'accepted', - 'rejected', - 'pending', - 'response', - ]), - message: App.main.env.config.logCompiledMessage ? compiled : undefined, - } - } - - async verify(): Promise { - await this.provider.verify() - return true - } -} diff --git a/services/platform/src/providers/email/EmailError.ts b/services/platform/src/providers/email/EmailError.ts deleted file mode 100644 index 8d0fe68c..00000000 --- a/services/platform/src/providers/email/EmailError.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ContextError } from '../../error/ErrorHandler' - -export class RateLimitEmailError extends ContextError { } diff --git a/services/platform/src/providers/email/EmailJob.ts b/services/platform/src/providers/email/EmailJob.ts deleted file mode 100644 index 73719961..00000000 --- a/services/platform/src/providers/email/EmailJob.ts +++ /dev/null @@ -1,56 +0,0 @@ -import Job, { RetryError } from '../../queue/Job' -import { MessageTrigger } from '../MessageTrigger' -import { updateSendState } from '../../campaigns/CampaignService' -import { loadEmailChannel } from './index' -import { failSend, finalizeSend, loadSendJob, messageLock, prepareSend } from '../MessageTriggerService' -import { EmailTemplate } from '../../render/Template' -import { EncodedJob } from '../../queue' -import App from '../../app' -import { releaseLock } from '../../core/Lock' -import { RateLimitEmailError } from './EmailError' - -export default class EmailJob extends Job { - static $name = 'email' - - static from(data: MessageTrigger): EmailJob { - return new this(data) - } - - static async handler(trigger: MessageTrigger, raw: EncodedJob) { - const data = await loadSendJob(trigger) - if (!data) return - - const { campaign, template, user, project } = data - - // Load email channel so its ready to send - const channel = await loadEmailChannel(campaign.provider_id, project.id) - if (!channel) { - await updateSendState({ - campaign, - user, - reference_id: trigger.reference_id, - state: 'aborted', - }) - App.main.error.notify(new Error('Unabled to send when there is no channel available.')) - return - } - - // Check current send rate and if the send is locked - const isReady = await prepareSend(channel, data, raw) - if (!isReady) return - - try { - const result = await channel.send(template, data) - await finalizeSend(data, result) - } catch (error: any) { - - // If its a rate limit error, lets re-add to the queue to retry later - if (error instanceof RateLimitEmailError) { - throw new RetryError() - } - await failSend(data, error) - } finally { - await releaseLock(messageLock(campaign, user)) - } - } -} diff --git a/services/platform/src/providers/email/EmailProvider.ts b/services/platform/src/providers/email/EmailProvider.ts deleted file mode 100644 index bad519d8..00000000 --- a/services/platform/src/providers/email/EmailProvider.ts +++ /dev/null @@ -1,71 +0,0 @@ -import nodemailer from 'nodemailer' -import { LoggerProviderName } from '../LoggerProvider' -import Provider, { ExternalProviderParams, ProviderGroup, ProviderSchema } from '../Provider' -import { Email } from './Email' -import { RateLimitEmailError } from './EmailError' -import { logger } from '../../config/logger' -import { JSONSchemaType } from 'ajv' - -export type EmailProviderName = 'ses' | 'smtp' | 'mailgun' | 'sendgrid' | LoggerProviderName - -export interface EmailProviderParams { - default_from?: string - default_from_name?: string - default_reply_to?: string -} - -export function EmailProviderSchema<_ extends ExternalProviderParams, D>( - id: string, - data: JSONSchemaType, -): any { - const extendedData: JSONSchemaType = { - ...data, - properties: { - ...data.properties, - default_from: { - type: 'string', - description: 'Default "From" email address used if not overridden.', - nullable: true, - }, - default_from_name: { - type: 'string', - description: 'Default display name used in emails.', - nullable: true, - }, - default_reply_to: { - type: 'string', - description: 'Default reply-to email address.', - nullable: true, - }, - }, - } as JSONSchemaType - - return ProviderSchema(id, extendedData) -} - -export default abstract class EmailProvider extends Provider { - unsubscribe?: string - transport?: nodemailer.Transporter - boot?(): void - - static group = 'email' as ProviderGroup - - async send(message: Email): Promise { - try { - logger.debug({ provider: this.name, to: message.to, subject: message.subject }, 'sending email') - return await this.transport?.sendMail(message) - } catch (error: any) { - const isThrottle = error.code === 'Throttling' - || error.name === 'ThrottlingException' - || (error.message && error.message.includes('Throttling')) - || (error.cause && error.cause.name === 'ThrottlingException') - if (isThrottle) throw new RateLimitEmailError(error.message) - throw error - } - } - - async verify(): Promise { - await this.transport?.verify() - return true - } -} diff --git a/services/platform/src/providers/email/LoggerEmailProvider.ts b/services/platform/src/providers/email/LoggerEmailProvider.ts deleted file mode 100644 index e671130d..00000000 --- a/services/platform/src/providers/email/LoggerEmailProvider.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { logger } from '../../config/logger' -import { randomInt, sleep, uuid } from '../../utilities' -import { ExternalProviderParams, ProviderControllers } from '../Provider' -import { createController } from '../ProviderService' -import { Email } from './Email' -import EmailProvider, { EmailProviderSchema } from './EmailProvider' - -export default class LoggerEmailProvider extends EmailProvider { - addLatency?: boolean - - static isDevelopment = true - - static namespace = 'logger' - static meta = { - name: 'Logger', - icon: 'https://lunogram.com/providers/logger.svg', - } - - static schema = EmailProviderSchema('loggerEmailProviderParams', { - type: 'object', - }) - - async send(message: Email): Promise { - // Allow for having random latency to aid in performance testing - if (this.addLatency) await sleep(randomInt()) - - logger.info(message, 'provider:email:logger') - - return { - messageId: uuid(), - messageSize: 0, - messageTime: Date.now(), - envelope: {}, - accepted: [message.to], - rejected: [], - pending: [], - response: 'Message sent to logger', - } - } - - async verify(): Promise { - return true - } - - static controllers(): ProviderControllers { - return { admin: createController('email', this) } - } -} diff --git a/services/platform/src/providers/email/MailgunEmailProvider.ts b/services/platform/src/providers/email/MailgunEmailProvider.ts deleted file mode 100644 index 21c469c2..00000000 --- a/services/platform/src/providers/email/MailgunEmailProvider.ts +++ /dev/null @@ -1,122 +0,0 @@ -import nodemailer from 'nodemailer' -import crypto from 'crypto' -import mg from 'nodemailer-mailgun-transport' -import EmailProvider, { EmailProviderSchema } from './EmailProvider' -import Router = require('@koa/router') -import Provider, { ExternalProviderParams, ProviderControllers, ProviderSetupMeta } from '../Provider' -import { createController } from '../ProviderService' -import { getUserFromEmail } from '../../users/UserRepository' -import { RequestError } from '../../core/errors' -import { getCampaign } from '../../campaigns/CampaignService' -import { trackMessageEvent } from '../../render/LinkService' -import App from '../../app' - -interface MailgunDataParams { - api_key: string - domain: string - region: string - webhook_signing_key?: string -} - -type MailgunEmailProviderParams = Pick - -export default class MailgunEmailProvider extends EmailProvider { - api_key!: string - domain!: string - region!: string - webhook_signing_key?: string - - static namespace = 'mailgun' - static meta = { - name: 'Mailgun', - url: 'https://mailgun.com', - icon: 'https://lunogram.com/providers/mailgun.svg', - paths: { - 'Feedback URL': `/${this.namespace}`, - }, - } - - static schema = EmailProviderSchema('mailgunProviderParams', { - type: 'object', - required: ['api_key', 'domain', 'region'], - properties: { - api_key: { - type: 'string', - title: 'API Key', - }, - region: { - type: 'string', - title: 'Region', - description: 'Select the region your Mailgun domain is registered in.', - enum: ['US', 'EU'], - }, - domain: { type: 'string' }, - webhook_signing_key: { - type: 'string', - nullable: true, - }, - }, - additionalProperties: false, - }) - - loadSetup(app: App): ProviderSetupMeta[] { - return [{ - name: 'Webhook URL', - value: new URL(`/providers/${this.id}/${(this.constructor as any).namespace}`, app.env.apiBaseUrl).toString(), - }] - } - - boot() { - const host = this.region === 'US' ? 'api.mailgun.net' : 'api.eu.mailgun.net' - const auth = { - auth: { - api_key: this.api_key, - domain: this.domain, - }, - host, - } - this.transport = nodemailer.createTransport(mg(auth)) - } - - static controllers(): ProviderControllers { - const admin = createController('email', this) - - const router = new Router<{ provider: Provider }>() - router.post(`/${this.namespace}`, async ctx => { - - const provider = ctx.state.provider - - // Check message signature - const signingKey = provider.data.webhook_signing_key - if (signingKey) { - const { timestamp, token, signature } = ctx.request.body - const hash = crypto.createHmac('sha256', signingKey) - .update(timestamp.concat(token)) - .digest('hex') - if (hash !== signature) throw new RequestError('Invalid request.') - } - - ctx.status = 204 - - const { recipient: email, event, message: { headers } } = ctx.request.body['event-data'] - - // If event is not a bounce or complaint, break - if (!['failed', 'complained'].includes(event)) return - const type = event === 'failed' ? 'bounced' : 'complained' - - // Get values from webhook to identify user and campaign - const campaignId = headers['X-Campaign-Id'] - if (!email || !campaignId) return - - const projectId = provider.project_id - const user = await getUserFromEmail(projectId, email) - const campaign = await getCampaign(campaignId, projectId) - if (!user || !campaign) return - - // Create an event and process the unsubscribe - await trackMessageEvent({ user, campaign }, type, 'unsubscribe') - }) - - return { admin, public: router } - } -} diff --git a/services/platform/src/providers/email/SESEmailProvider.ts b/services/platform/src/providers/email/SESEmailProvider.ts deleted file mode 100644 index db9fef21..00000000 --- a/services/platform/src/providers/email/SESEmailProvider.ts +++ /dev/null @@ -1,146 +0,0 @@ -import nodemailer from 'nodemailer' -import aws = require('@aws-sdk/client-ses') -import { AWSConfig } from '../../core/aws' -import EmailProvider, { EmailProviderSchema } from './EmailProvider' -import Router = require('@koa/router') -import Provider, { ExternalProviderParams, ProviderSetupMeta, ProviderControllers } from '../Provider' -import { createController } from '../ProviderService' -import { secondsAgo } from '../../utilities' -import { getUserFromEmail } from '../../users/UserRepository' -import { RequestError } from '../../core/errors' -import { getCampaign } from '../../campaigns/CampaignService' -import { trackMessageEvent } from '../../render/LinkService' -import type App from '../../app' -import { UUID } from 'node:crypto' - -interface SESDataParams { - config: AWSConfig -} - -type SESEmailProviderParams = Pick - -export default class SESEmailProvider extends EmailProvider { - config!: AWSConfig - - static namespace = 'ses' - static meta = { - name: 'Amazon SES', - url: 'https://aws.amazon.com/ses', - icon: 'https://lunogram.com/providers/ses.svg', - paths: { - 'Feedback URL': `/${this.namespace}`, - }, - } - - static schema = EmailProviderSchema('sesProviderParams', { - type: 'object', - required: ['config'], - properties: { - config: { - type: 'object', - required: ['region', 'credentials'], - properties: { - region: { type: 'string' }, - credentials: { - type: 'object', - required: ['accessKeyId', 'secretAccessKey'], - properties: { - accessKeyId: { - type: 'string', - title: 'Access Key ID', - }, - secretAccessKey: { - type: 'string', - title: 'Secret Access Key', - }, - }, - }, - }, - }, - }, - additionalProperties: false, - }) - - loadSetup(app: App): ProviderSetupMeta[] { - return [{ - name: 'Feedback URL', - value: new URL(`/providers/${this.id}/${(this.constructor as any).namespace}`, app.env.apiBaseUrl).toString(), - }] - } - - boot() { - const ses = new aws.SES({ - region: this.config.region, - credentials: this.config.credentials, - }) - - this.transport = nodemailer.createTransport({ - SES: { - ses, aws, - }, - }) - } - - static controllers(): ProviderControllers { - - const admin = createController('email', this) - - const router = new Router<{ provider: Provider }>() - router.post(`/${this.namespace}`, async ctx => { - const body = ctx.get('Content-Type').includes('plain') - ? JSON.parse(ctx.request.body) - : ctx.request.body - - const { Type, Message, SubscribeURL, Timestamp } = body - const timestamp = Date.parse(Timestamp) - if (!Type || secondsAgo(timestamp) > 300) throw new RequestError('Unsupported SES Body') - - ctx.status = 204 - - // If we are getting an SNS topic confirmation, ping back - if (Type === 'SubscriptionConfirmation' && SubscribeURL) { - await fetch(SubscribeURL) - } else if (Type === 'Notification' && Message) { - await this.rejection(ctx.state.provider.project_id, Message) - } - }) - - return { admin, public: router } - } - - static async rejection(projectId: UUID, message: string) { - const getHeader = ( - headers: Array<{ name: string, value: string }>, - key: string, - ) => (headers ?? []).find((item) => item.name.toLowerCase() === key.toLowerCase())?.value - - const json = JSON.parse(message) as Record - const { mail: { destination, headers } } = json - const eventType = json.eventType ?? json.notificationType - const email: string | undefined = destination[0] - const subscriptionId = getHeader(headers, 'X-Subscription-Id') - const campaignId = getHeader(headers, 'X-Campaign-Id') as UUID - - if (!email || !subscriptionId || !campaignId) return - - const user = await getUserFromEmail(projectId, email) - if (!user) return - - const campaign = await getCampaign(campaignId, projectId) - - let type: 'bounced' | 'complained' | 'failed' = 'failed' - let context: any - let action: 'unsubscribe' | undefined - if (eventType === 'Bounce') { - type = 'bounced' - context = json.bounce - action = json.bounce.bounceType !== 'Transient' ? 'unsubscribe' : undefined - } - if (eventType === 'Complaint') { - type = 'complained' - context = json.complaint - action = 'unsubscribe' - } - await trackMessageEvent({ user, campaign }, type, action, context) - } -} diff --git a/services/platform/src/providers/email/SMPTEmailProvider.ts b/services/platform/src/providers/email/SMPTEmailProvider.ts deleted file mode 100644 index 816f8529..00000000 --- a/services/platform/src/providers/email/SMPTEmailProvider.ts +++ /dev/null @@ -1,60 +0,0 @@ -import nodemailer from 'nodemailer' -import { ExternalProviderParams, ProviderControllers } from '../Provider' -import { createController } from '../ProviderService' -import EmailProvider, { EmailProviderSchema } from './EmailProvider' - -export interface SMTPDataParams { - host: string - port: number - secure: boolean - auth: { user: string, pass: string } -} - -type SMTPEmailProviderParams = Pick - -export default class SMTPEmailProvider extends EmailProvider { - host!: string - port!: number - secure!: boolean - auth!: { user: string, pass: string } - - declare data: SMTPDataParams - - static namespace = 'smtp' - static meta = { - name: 'SMTP', - icon: 'https://lunogram.com/providers/smtp.svg', - } - - static schema = EmailProviderSchema('smtpProviderParams', { - type: 'object', - required: ['host', 'port', 'secure', 'auth'], - properties: { - host: { type: 'string' }, - port: { type: 'number' }, - secure: { type: 'boolean' }, - auth: { - type: 'object', - required: ['user', 'pass'], - properties: { - user: { type: 'string' }, - pass: { type: 'string' }, - }, - }, - }, - additionalProperties: false, - }) - - boot() { - this.transport = nodemailer.createTransport({ - host: this.host, - port: this.port, - secure: this.secure, - auth: this.auth, - }) - } - - static controllers(): ProviderControllers { - return { admin: createController('email', this) } - } -} diff --git a/services/platform/src/providers/email/SendGridEmailProvider.ts b/services/platform/src/providers/email/SendGridEmailProvider.ts deleted file mode 100644 index 2b6d851e..00000000 --- a/services/platform/src/providers/email/SendGridEmailProvider.ts +++ /dev/null @@ -1,104 +0,0 @@ -import nodemailer from 'nodemailer' -import mg from 'nodemailer-sendgrid' -import EmailProvider, { EmailProviderSchema } from './EmailProvider' -import Router = require('@koa/router') -import Provider, { ExternalProviderParams, ProviderControllers, ProviderSetupMeta } from '../Provider' -import { createController } from '../ProviderService' -import { getUserFromEmail } from '../../users/UserRepository' -import { getCampaign } from '../../campaigns/CampaignService' -import { trackMessageEvent } from '../../render/LinkService' -import App from '../../app' -import { Email } from './Email' -import { UUID } from 'node:crypto' - -interface SendGridDataParams { - api_key: string -} - -type SendGridEmailProviderParams = Pick - -interface SendGridEvent { - email: string - event: string - 'X-Campaign-Id': string -} - -export default class SendGridEmailProvider extends EmailProvider { - api_key!: string - - static namespace = 'sendgrid' - static meta = { - name: 'SendGrid', - url: 'https://sendgrid.com', - icon: 'https://lunogram.com/providers/sendgrid.svg', - paths: { - 'Webhook URL': `/${this.namespace}`, - }, - } - - static schema = EmailProviderSchema('SendGridProviderParams', { - type: 'object', - required: ['api_key'], - properties: { - api_key: { - type: 'string', - title: 'API Key', - }, - }, - additionalProperties: false, - }) - - loadSetup(app: App): ProviderSetupMeta[] { - return [{ - name: 'Webhook URL', - value: new URL(`/providers/${this.id}/${(this.constructor as any).namespace}`, app.env.apiBaseUrl).toString(), - }] - } - - boot() { - this.transport = nodemailer.createTransport(mg({ - apiKey: this.api_key, - })) - } - - async send(message: Email): Promise { - return super.send({ - ...message, - custom_args: message.headers, - unique_args: message.headers, - } as Email) - } - - static controllers(): ProviderControllers { - const admin = createController('email', this) - - const router = new Router<{ provider: Provider }>() - router.post(`/${this.namespace}`, async ctx => { - ctx.status = 204 - - const provider = ctx.state.provider - const events = ctx.request.body as SendGridEvent[] - for (const event of events) { - if (!['dropped', 'bounce', 'spamreport'].includes(event.event)) continue - - const type = event.event === 'dropped' || event.event === 'bounce' - ? 'bounced' - : 'complained' - - // Get values from webhook to identify user and campaign - const campaignId = event['X-Campaign-Id'] as UUID - if (!event.email || !campaignId) return - - const projectId = provider.project_id - const user = await getUserFromEmail(projectId, event.email) - const campaign = await getCampaign(campaignId, projectId) - if (!user || !campaign) return - - // Create an event and process the unsubscribe - await trackMessageEvent({ user, campaign }, type, 'unsubscribe') - } - }) - - return { admin, public: router } - } -} diff --git a/services/platform/src/providers/email/WebhookEmailProvider.ts b/services/platform/src/providers/email/WebhookEmailProvider.ts deleted file mode 100644 index babc78e3..00000000 --- a/services/platform/src/providers/email/WebhookEmailProvider.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { createController } from '../ProviderService' -import { ProviderControllers } from '../Provider' -import { Email } from './Email' -import EmailProvider from './EmailProvider' -import { uuid } from '../../utilities' -import App from '../../app' -import { sendMessage } from '../external/webhook' -import { logger } from '../../config/logger' - -export default class WebhookEmailProvider extends EmailProvider { - async send(message: Email): Promise { - if (!App.main.env.webhooks.send) { - logger.warn('Webhook sending is disabled, not sending email') - return - } - - if (!this.external_id) { - throw new Error('No external ID set for webhook email provider') - } - - await sendMessage(this.external_id, { - type: 'email' as const, - from: typeof message.from === 'string' - ? message.from - : { name: message.from.name, email: message.from.address }, - to: message.to, - subject: message.subject, - text: message.text, - html: message.html, - headers: message.headers, - }) - - return { - messageId: uuid(), - messageSize: 0, - messageTime: Date.now(), - envelope: {}, - accepted: [message.to], - rejected: [], - pending: [], - response: 'Message sent to external', - } - } - - static controllers(): ProviderControllers { - return { admin: createController('webhook', this) } - } -} diff --git a/services/platform/src/providers/email/index.ts b/services/platform/src/providers/email/index.ts deleted file mode 100644 index 2c6dc372..00000000 --- a/services/platform/src/providers/email/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { UUID } from 'crypto' -import { loadProvider } from '../ProviderRepository' -import EmailChannel from './EmailChannel' -import EmailProvider, { EmailProviderName } from './EmailProvider' -import LoggerEmailProvider from './LoggerEmailProvider' -import MailgunEmailProvider from './MailgunEmailProvider' -import WebhookEmailProvider from './WebhookEmailProvider' -import SESEmailProvider from './SESEmailProvider' -import SMTPEmailProvider from './SMPTEmailProvider' -import SendGridEmailProvider from './SendGridEmailProvider' - -type EmailProviderDerived = { new(): EmailProvider } & typeof EmailProvider -export const typeMap: Record = { - mailgun: MailgunEmailProvider, - sendgrid: SendGridEmailProvider, - ses: SESEmailProvider, - smtp: SMTPEmailProvider, - logger: LoggerEmailProvider, - webhook: WebhookEmailProvider, -} - -export const providerMap = (record: { type: EmailProviderName }): EmailProvider => { - if (!typeMap[record.type]) throw new Error(`Unknown email provider type: ${record.type}`) - return typeMap[record.type].fromJson(record) -} - -export const loadEmailChannel = async (providerId: UUID, projectId: UUID): Promise => { - const provider = await loadProvider(providerId, providerMap, projectId) - if (!provider) return - return new EmailChannel(provider) -} - -export const emailProviders = Object.values(typeMap) diff --git a/services/platform/src/providers/external/webhook.ts b/services/platform/src/providers/external/webhook.ts deleted file mode 100644 index db7f1adb..00000000 --- a/services/platform/src/providers/external/webhook.ts +++ /dev/null @@ -1,34 +0,0 @@ -import App from '../../app' -import { SendRequest } from '../../../oapi/webhooks' - -export async function sendMessage( - externalId: string, - message: SendRequest, -): Promise { - if (!App.main.env.webhooks.send) { - throw new Error('No send webhook configured') - } - - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), App.main.env.webhooks.send.timeoutMs) - - try { - const url = new URL(App.main.env.webhooks.send.url) - url.searchParams.set('external_id', externalId) - - const res = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(message), - signal: controller.signal, - }) - - clearTimeout(timeoutId) - if (!res.ok) throw new Error(`Webhook error: ${res.statusText}`) - } catch (error) { - clearTimeout(timeoutId) - throw error - } -} diff --git a/services/platform/src/providers/push/LocalPushProvider.ts b/services/platform/src/providers/push/LocalPushProvider.ts deleted file mode 100644 index ed5c41b2..00000000 --- a/services/platform/src/providers/push/LocalPushProvider.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { PushProvider } from './PushProvider' -import PushNotifications from 'node-pushnotifications' -import { Push, PushResponse } from './Push' -import PushError from './PushError' -import { ExternalProviderParams, ProviderControllers, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' - -interface APNParams { - token: { - key: string - keyId: string - teamId: string - } - production: boolean - bundleId: string -} - -interface FCMParams { - appName: string - serviceAccountKey: { - projectId: string - privateKey: string - clientEmail: string - } -} - -interface PushDataParams { - apn?: APNParams - fcm?: FCMParams -} - -interface PushProviderParams extends ExternalProviderParams { - data: PushDataParams -} - -export default class LocalPushProvider extends PushProvider { - apn?: APNParams - fcm?: FCMParams - - transport!: PushNotifications - - static namespace = 'local' - static meta = { - name: 'APN & Firebase', - icon: 'https://lunogram.com/providers/notification.svg', - } - - static schema = ProviderSchema('localPushProviderParams', { - type: 'object', - properties: { - apn: { - type: 'object', - nullable: true, - required: ['production', 'token'], - title: 'APN', - description: 'Settings for Apple Push Notifications to send messages to iOS devices.', - properties: { - production: { - type: 'boolean', - description: 'Leave unchecked if you are wanting to send to sandbox devices only.', - }, - token: { - type: 'object', - required: ['key', 'keyId', 'teamId'], - properties: { - key: { - type: 'string', - minLength: 80, - }, - keyId: { - type: 'string', - title: 'Key ID', - }, - teamId: { - type: 'string', - title: 'Team ID', - }, - }, - }, - bundleId: { - type: 'string', - title: 'Bundle ID', - }, - }, - }, - fcm: { - type: 'object', - nullable: true, - required: ['appName', 'serviceAccountKey'], - title: 'FCM', - description: 'Settings for Firebase Cloud Messaging to send messages to Android devices.', - properties: { - appName: { - type: 'string', - title: 'App Name', - }, - serviceAccountKey: { - type: 'object', - required: ['projectId', 'privateKey', 'clientEmail'], - properties: { - projectId: { - type: 'string', - title: 'Project ID', - }, - privateKey: { - type: 'string', - title: 'Private Key', - minLength: 80, - }, - clientEmail: { - type: 'string', - title: 'Client Email', - }, - }, - }, - }, - }, - }, - additionalProperties: false, - }) - - boot() { - this.transport = new PushNotifications({ - apn: this.apn, - fcm: { - appName: this.fcm?.appName, - serviceAccountKey: { - projectId: this.fcm?.serviceAccountKey.projectId, - privateKey: this.fcm?.serviceAccountKey.privateKey?.replace(/\\n/g, '\n'), - clientEmail: this.fcm?.serviceAccountKey.clientEmail, - }, - }, - } as unknown as PushNotifications.Settings) // Types are not up to date - } - - async send(push: Push): Promise { - const { tokens, title, body, custom } = push - const response = await this.transport.send(typeof tokens === 'string' ? [tokens] : tokens, { - title, - topic: this.apn?.bundleId, - body, - custom, - }) - - const invalidTokens = [] - let firstError: { error: Error, message: string | undefined } | undefined - let successCount = 0 - for (const method of response) { - successCount += method.success - if (method.failure <= 0) continue - for (const push of method.message) { - if (push.error) { - invalidTokens.push(push.regId) - if (!firstError && push.error) { - firstError = { - error: push.error, - message: push.errorMsg, - } - } - } - } - } - - if (firstError && successCount <= 0) { - throw new PushError('local', response[0].message[0].errorMsg, invalidTokens) - } else { - return { - push, - success: true, - response: response[0].message[0].messageId, - invalidTokens, - count: tokens.length - invalidTokens.length, - } - } - } - - static controllers(): ProviderControllers { - return { admin: createController('push', this) } - } -} diff --git a/services/platform/src/providers/push/LoggerPushProvider.ts b/services/platform/src/providers/push/LoggerPushProvider.ts deleted file mode 100644 index 2b16c021..00000000 --- a/services/platform/src/providers/push/LoggerPushProvider.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { logger } from '../../config/logger' -import { randomInt, sleep } from '../../utilities' -import { ExternalProviderParams, ProviderControllers, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' -import { Push, PushResponse } from './Push' -import { PushProvider } from './PushProvider' -export default class LoggerPushProvider extends PushProvider { - addLatency?: boolean - - static isDevelopment = true - - static namespace = 'logger' - static meta = { - name: 'Logger', - icon: 'https://lunogram.com/providers/logger.svg', - } - - static schema = ProviderSchema('loggerPushProviderParams', { - type: 'object', - }) - - async send(push: Push): Promise { - - // Allow for having random latency to aid in performance testing - if (this.addLatency) await sleep(randomInt()) - - logger.info(push, 'provider:push:logger') - return { - push, - success: true, - response: '', - invalidTokens: [], - count: push.tokens.length, - } - } - - static controllers(): ProviderControllers { - return { admin: createController('push', this) } - } -} diff --git a/services/platform/src/providers/push/Push.ts b/services/platform/src/providers/push/Push.ts deleted file mode 100644 index f6b3a34a..00000000 --- a/services/platform/src/providers/push/Push.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseNotification } from '../../notifications/Notification' - -export interface BasePush extends BaseNotification { - silent: boolean -} - -export interface Push extends BasePush { - tokens: string | string[] -} - -export interface PushResponse { - push: Push - success: boolean - response?: string - invalidTokens: string[] - count: number -} diff --git a/services/platform/src/providers/push/PushChannel.ts b/services/platform/src/providers/push/PushChannel.ts deleted file mode 100644 index 4ac557ae..00000000 --- a/services/platform/src/providers/push/PushChannel.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { PushTemplate } from '../../render/Template' -import { Variables } from '../../render' -import { PushProvider } from './PushProvider' -import { PushResponse } from './Push' -import { PushDevice } from '../../users/Device' - -export default class PushChannel { - readonly provider: PushProvider - constructor(provider?: PushProvider) { - if (provider) { - this.provider = provider - this.provider.boot?.() - } else { - throw new Error('A valid push notification provider must be defined!') - } - } - - async send(template: PushTemplate, devices: PushDevice[], variables: Variables): Promise { - - // Find tokens from active devices with push enabled - const tokens = devices.map(device => device.token) - - const push = { - tokens, - ...template.compile(variables), - } - - // If no tokens, don't send - if (tokens?.length <= 0) { - return { - push, - success: false, - response: 'No active devices with push enabled found.', - invalidTokens: [], - count: 0, - } - } - - return await this.provider.send(push) - } -} diff --git a/services/platform/src/providers/push/PushError.ts b/services/platform/src/providers/push/PushError.ts deleted file mode 100644 index 374b925d..00000000 --- a/services/platform/src/providers/push/PushError.ts +++ /dev/null @@ -1,8 +0,0 @@ -export default class PushError extends Error { - invalidTokens: string[] - constructor(provider: string, message: string | undefined, invalidTokens: string[]) { - super(`Push Error: ${provider}: ${message}`) - this.invalidTokens = invalidTokens - Error.captureStackTrace(this, PushError) - } -} diff --git a/services/platform/src/providers/push/PushJob.ts b/services/platform/src/providers/push/PushJob.ts deleted file mode 100644 index ae9c0e7f..00000000 --- a/services/platform/src/providers/push/PushJob.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { loadPushChannel } from '.' -import { updateSendState } from '../../campaigns/CampaignService' -import { releaseLock } from '../../core/Lock' -import { EventPostJob } from '../../jobs' -import { EncodedJob, Job } from '../../queue' -import { PushTemplate } from '../../render/Template' -import { getPushDevicesForUser } from '../../users/DeviceRepository' -import { disableNotifications } from '../../users/UserRepository' -import { MessageTrigger } from '../MessageTrigger' -import { failSend, finalizeSend, loadSendJob, messageLock, prepareSend } from '../MessageTriggerService' -import PushError from './PushError' - -export default class PushJob extends Job { - static $name = 'push' - - static from(data: MessageTrigger): PushJob { - return new this(data) - } - - static async handler(trigger: MessageTrigger, raw: EncodedJob) { - const data = await loadSendJob(trigger) - if (!data) return - - const { campaign, template, user, project, context } = data - const devices = await getPushDevicesForUser(project.id, user.id) - - // Load email channel so its ready to send - const channel = await loadPushChannel(campaign.provider_id, project.id) - if (!channel) { - await updateSendState({ - campaign, - user, - reference_id: trigger.reference_id, - state: 'aborted', - }) - return - } - - // Check current send rate and if the send is locked - const isReady = await prepareSend(channel, data, raw) - if (!isReady) return - - try { - // Send the push and update the send record - const result = await channel.send(template, devices, data) - await finalizeSend(data, result) - - // A user may have multiple devices some of which - // may have failed even though the push was - // successful. We need to check for those and - // disable them - if (result.invalidTokens.length) await disableNotifications(user, result.invalidTokens) - } catch (error: any) { - await failSend(data, error, (error: any) => !(error instanceof PushError)) - - if (error instanceof PushError) { - - // If the push is unable to send, find invalidated tokens - // and disable those devices - await disableNotifications(user, error.invalidTokens) - - // Create an event about the disabling - await EventPostJob.from({ - project_id: project.id, - user_id: user.id, - event: { - name: 'notifications_disabled', - external_id: user.external_id, - data: { - ...context, - tokens: error.invalidTokens, - }, - }, - }).queue() - } - } finally { - await releaseLock(messageLock(campaign, user)) - } - } -} diff --git a/services/platform/src/providers/push/PushProvider.ts b/services/platform/src/providers/push/PushProvider.ts deleted file mode 100644 index 851058ca..00000000 --- a/services/platform/src/providers/push/PushProvider.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Provider, { ProviderGroup } from '../Provider' -import { Push, PushResponse } from './Push' - -export type PushProviderName = 'local' | 'logger' - -export abstract class PushProvider extends Provider { - boot?(): void - abstract send(message: Push): Promise - - static group = 'push' as ProviderGroup -} diff --git a/services/platform/src/providers/push/WebhookPushProvider.ts b/services/platform/src/providers/push/WebhookPushProvider.ts deleted file mode 100644 index 1dfa37a6..00000000 --- a/services/platform/src/providers/push/WebhookPushProvider.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ProviderControllers } from '../Provider' -import { createController } from '../ProviderService' -import { Push, PushResponse } from './Push' -import { PushProvider } from './PushProvider' -import App from '../../app' -import { sendMessage } from '../external/webhook' -import { logger } from '../../config/logger' - -export default class WebhookPushProvider extends PushProvider { - async send(push: Push): Promise { - if (!App.main.env.webhooks.send) { - logger.warn('Webhook sending is disabled, not sending push notification') - return { success: false, response: 'Webhook sending is disabled', invalidTokens: [], count: 0, push } - } - - if (!this.external_id) { - throw new Error('No external ID set for webhook push provider') - } - - await sendMessage(this.external_id, { - type: 'push' as const, - tokens: push.tokens, - title: push.title, - body: push.body, - custom: push.custom, - }) - - return { - push, - success: true, - response: '', - invalidTokens: [], - count: push.tokens.length, - } - } - - static controllers(): ProviderControllers { - return { admin: createController('push', this) } - } -} diff --git a/services/platform/src/providers/push/index.ts b/services/platform/src/providers/push/index.ts deleted file mode 100644 index 3870ac3e..00000000 --- a/services/platform/src/providers/push/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { UUID } from 'crypto' -import { loadProvider } from '../ProviderRepository' -import LocalPushProvider from './LocalPushProvider' -import WebhookPushProvider from './WebhookPushProvider' -import LoggerPushProvider from './LoggerPushProvider' -import PushChannel from './PushChannel' -import { PushProvider, PushProviderName } from './PushProvider' - -type PushProviderDerived = { new(): PushProvider } & typeof PushProvider -export const typeMap: Record = { - local: LocalPushProvider, - webhook: WebhookPushProvider, - logger: LoggerPushProvider, -} - -export const providerMap = (record: { type: PushProviderName }): PushProvider => { - if (!typeMap[record.type]) throw new Error(`Unknown push provider type: ${record.type}`) - return typeMap[record.type].fromJson(record) -} - -export const loadPushChannel = async (providerId: UUID, projectId: UUID): Promise => { - const provider = await loadProvider(providerId, providerMap, projectId) - if (!provider) return - return new PushChannel(provider) -} - -export const pushProviders = Object.values(typeMap) diff --git a/services/platform/src/providers/text/HttpSMSProvider.ts b/services/platform/src/providers/text/HttpSMSProvider.ts deleted file mode 100644 index 60af15ee..00000000 --- a/services/platform/src/providers/text/HttpSMSProvider.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import TextError from './TextError' -import { TextProvider } from './TextProvider' -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' - -interface HttpSMSDataParams { - api_key: string - phone_number: string -} - -interface HttpSMSProviderParams extends ProviderParams { - data: HttpSMSDataParams -} - -export default class HttpSMSTextProvider extends TextProvider { - api_key!: string - phone_number!: string - - static namespace = 'httpsms' - static meta = { - name: 'httpSMS', - url: 'https://httpsms.com', - icon: 'https://lunogram.com/providers/httpsms.svg', - } - - static schema = ProviderSchema('httpSMSTextProviderParams', { - type: 'object', - required: ['api_key', 'phone_number'], - properties: { - api_key: { - type: 'string', - title: 'API Key', - }, - phone_number: { type: 'string' }, - }, - }) - - async send(message: TextMessage): Promise { - const { to, text: content } = message - const { api_key, phone_number: from } = this - const response = await fetch('https://api.httpsms.com/v1/messages/send', { - method: 'POST', - headers: { - 'x-api-key': api_key, - Accept: 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'lunogram/v1 (+https://github.com/lunogram/platform)', - }, - body: JSON.stringify({ - from, - to, - content, - }), - }) - - if (response.ok) { - const responseBody = await response.json() - return { - message, - success: true, - response: responseBody.data, - } - } else { - throw new TextError(this.type, this.phone_number, `Request failed with status ${response.status}`) - } - } - - // https://docs.httpsms.com/webhooks/events - parseInbound(inbound: any): InboundTextMessage | undefined { - return { - to: inbound.data.owner, - from: inbound.data.contact, - text: inbound.data.content || '', - } - } - - static controllers(): ProviderControllers { - const admin = createController('text', this) - return { admin, public: this.inbound(this.namespace) } - } -} diff --git a/services/platform/src/providers/text/LoggerTextProvider.ts b/services/platform/src/providers/text/LoggerTextProvider.ts deleted file mode 100644 index 91ef9a31..00000000 --- a/services/platform/src/providers/text/LoggerTextProvider.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { logger } from '../../config/logger' -import { randomInt, sleep } from '../../utilities' -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import { TextProvider } from './TextProvider' - -export default class LoggerTextProvider extends TextProvider { - addLatency?: boolean - - static isDevelopment = true - - static namespace = 'logger' - static meta = { - name: 'Logger', - icon: 'https://lunogram.com/providers/logger.svg', - } - - static schema = ProviderSchema('loggerTextProviderParams', { - type: 'object', - }) - - async send(message: TextMessage): Promise { - - // Allow for having random latency to aid in performance testing - if (this.addLatency) await sleep(randomInt()) - - logger.info(message, 'provider:text:logger') - return { - message, - success: true, - response: '', - } - } - - parseInbound(inbound: any): InboundTextMessage { - return { - to: inbound.to, - from: inbound.from, - text: inbound.text, - } - } - - static controllers(): ProviderControllers { - return { admin: createController('text', this) } - } -} diff --git a/services/platform/src/providers/text/NexmoTextProvider.ts b/services/platform/src/providers/text/NexmoTextProvider.ts deleted file mode 100644 index 8ebe90ee..00000000 --- a/services/platform/src/providers/text/NexmoTextProvider.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import TextError from './TextError' -import { TextProvider } from './TextProvider' -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' - -interface NexmoDataParams { - api_key: string - api_secret: string - phone_number: string -} - -interface NexmoProviderParams extends ProviderParams { - data: NexmoDataParams -} - -export default class NexmoTextProvider extends TextProvider { - api_key!: string - api_secret!: string - phone_number!: string - - static namespace = 'nexmo' - static meta = { - name: 'Nexmo', - url: 'https://nexmo.com', - icon: 'https://lunogram.com/providers/vonage.svg', - } - - static schema = ProviderSchema('nexmoTextProviderParams', { - type: 'object', - required: ['api_key', 'api_secret', 'phone_number'], - properties: { - api_key: { - type: 'string', - title: 'API Key', - }, - api_secret: { - type: 'string', - title: 'API Secret', - }, - phone_number: { type: 'string' }, - }, - }) - - async send(message: TextMessage): Promise { - const { to, text } = message - const { api_key, api_secret, phone_number: from } = this - const response = await fetch('https://rest.nexmo.com/sms/json', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'User-Agent': 'lunogram/v1 (+https://github.com/lunogram/platform)', - }, - body: JSON.stringify({ - api_key, - api_secret, - from, - to, - text, - }), - }) - - if (response.ok) { - const responseBody = await response.json() - const responseMessage = responseBody.messages[0] - - // Nexmo always returns 200 even for error - if (responseMessage.status !== '0') { - throw new TextError(this.type, this.phone_number, `Request failed with status: ${responseMessage.status}, error: ${responseMessage['error-text']}`) - } else { - return { - message, - success: true, - response: responseMessage['message-id'], - } - } - } else { - throw new TextError(this.type, this.phone_number, `Request failed with status ${response.status}`) - } - } - - // https://developer.vonage.com/messaging/sms/guides/inbound-sms - parseInbound(inbound: any): InboundTextMessage | undefined { - return { - to: inbound.to, - from: inbound.msisdn, - text: inbound.text || '', - } - } - - static controllers(): ProviderControllers { - const admin = createController('text', this) - return { admin, public: this.inbound(this.namespace) } - } -} diff --git a/services/platform/src/providers/text/PlivoTextProvider.ts b/services/platform/src/providers/text/PlivoTextProvider.ts deleted file mode 100644 index 76160b9a..00000000 --- a/services/platform/src/providers/text/PlivoTextProvider.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { ExternalProviderParams, ProviderControllers, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' -import TextError from './TextError' -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import { TextProvider } from './TextProvider' - -interface PlivoDataParams { - auth_id: string - auth_token: string - phone_number: string -} - -interface PlivoProviderParams extends ExternalProviderParams { - data: PlivoDataParams -} - -export default class PlivoTextProvider extends TextProvider { - auth_id!: string - auth_token!: string - phone_number!: string - - static namespace = 'plivo' - static meta = { - name: 'Plivo', - url: 'https://plivo.com', - icon: 'https://lunogram.com/providers/plivo.svg', - } - - static schema = ProviderSchema('plivoTextProviderParams', { - type: 'object', - required: ['auth_id', 'auth_token', 'phone_number'], - properties: { - auth_id: { - type: 'string', - title: 'Auth ID', - }, - auth_token: { type: 'string' }, - phone_number: { type: 'string' }, - }, - }) - - get apiKey(): string { - return Buffer.from(`${this.auth_id}:${this.auth_token}`).toString('base64') - } - - async send(message: TextMessage): Promise { - const { to, text } = message - const response = await fetch(`https://api.plivo.com/v1/Account/${this.auth_id}/Message/`, { - method: 'POST', - headers: { - Authorization: `Basic ${this.apiKey}`, - 'Content-Type': 'application/json', - 'User-Agent': 'lunogram/v1 (+https://github.com/lunogram/platform)', - }, - body: JSON.stringify({ - src: this.phone_number, - dst: to, - text, - }), - }) - - if (response.ok) { - const responseBody = await response.json() - return { - message, - success: true, - response: responseBody.message_uuid[0], - } - } else { - const error = response.status === 401 - ? await response.text() - : (await response.json()).error - throw new TextError(this.type, this.phone_number, error) - } - } - - // https://www.plivo.com/docs/sms/use-cases/receive-sms/node - parseInbound(inbound: any): InboundTextMessage | undefined { - return { - to: inbound.To, - from: inbound.From, - text: inbound.Text, - } - } - - static controllers(): ProviderControllers { - const admin = createController('text', this) - return { admin, public: this.inbound(this.namespace) } - } -} diff --git a/services/platform/src/providers/text/TelnyxTextProvider.ts b/services/platform/src/providers/text/TelnyxTextProvider.ts deleted file mode 100644 index 8e272664..00000000 --- a/services/platform/src/providers/text/TelnyxTextProvider.ts +++ /dev/null @@ -1,107 +0,0 @@ -import App from '../../app' -import { ExternalProviderParams, ProviderControllers, ProviderSchema, ProviderSetupMeta } from '../Provider' -import { createController } from '../ProviderService' -import TextError, { UndeliverableTextError, UnsubscribeTextError } from './TextError' -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import { TextProvider } from './TextProvider' - -/** - * https://developers.telnyx.com/api/messaging/send-message - */ - -interface TelnyxDataParams { - api_key: string - phone_number: string -} - -interface TelnyxProviderParams extends ExternalProviderParams { - data: TelnyxDataParams -} - -export default class TelnyxTextProvider extends TextProvider { - api_key!: string - phone_number!: string - - static namespace = 'telnyx' - static meta = { - name: 'Telnyx', - description: '', - url: 'https://telnyx.com', - icon: 'https://lunogram.com/providers/telnyx.svg', - } - - static schema = ProviderSchema('telnyxTextProviderParams', { - type: 'object', - required: ['api_key', 'phone_number'], - properties: { - api_key: { - type: 'string', - title: 'API Key', - }, - phone_number: { type: 'string' }, - }, - }) - - loadSetup(app: App): ProviderSetupMeta[] { - return [{ - name: 'Inbound URL', - value: `${app.env.apiBaseUrl}/providers/${this.id}/${(this.constructor as any).namespace}/inbound`, - }] - } - - async send(message: TextMessage): Promise { - const { to, text } = message - const { phone_number: from } = this - - const response = await fetch('https://api.telnyx.com/v2/messages', { - method: 'POST', - headers: { - Authorization: `Bearer ${this.api_key}`, - 'Content-Type': 'application/json', - 'User-Agent': 'lunogram/v1 (+https://github.com/lunogram/platform)', - }, - body: JSON.stringify({ - from, - to, - text, - }), - }) - - const responseBody = await response.json() - if (response.ok) { - return { - message, - success: true, - response: responseBody.id, - } - } else { - - // https://support.telnyx.com/en/articles/6505121-telnyx-messaging-error-codes - const error = responseBody.errors?.[0] - if (error?.code === '40300') { - // Unable to send because recipient has unsubscribed - throw new UnsubscribeTextError(this.type, to, error.title) - } else if (error?.code === '40008' || error?.code === '40301') { - // Unable to send because region is not enabled - throw new UndeliverableTextError(this.type, to, error.title) - } - throw new TextError(this.type, to, error?.title, responseBody) - } - } - - // https://www.twilio.com/docs/messaging/guides/webhook-request - parseInbound(inbound: any): InboundTextMessage | undefined { - if (inbound.data.event_type !== 'message.received') return - const payload = inbound.data.payload - return { - to: payload.to, - from: payload.from.phone_number, - text: payload.text || '', - } - } - - static controllers(): ProviderControllers { - const admin = createController('text', this) - return { admin, public: this.inbound(this.namespace) } - } -} diff --git a/services/platform/src/providers/text/TextChannel.ts b/services/platform/src/providers/text/TextChannel.ts deleted file mode 100644 index 41806267..00000000 --- a/services/platform/src/providers/text/TextChannel.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { CompiledText, TextTemplate } from '../../render/Template' -import { Variables } from '../../render' -import { TextProvider } from './TextProvider' -import { InboundTextMessage, TextResponse } from './TextMessage' -import { UserEvent } from '../../users/UserEvent' -import { UnsubscribeTextError } from './TextError' -import { unsubscribe } from '../../subscriptions/SubscriptionService' - -const TEXT_SEGMENT_LENGTH = 160 - -export default class TextChannel { - readonly provider: TextProvider - constructor(provider?: TextProvider) { - if (provider) { - this.provider = provider - } else { - throw new Error('A valid text message driver must be defined!') - } - } - - async send(template: TextTemplate, variables: Variables): Promise { - if (!variables.user.phone) throw new Error('Unable to send a text message to a user with no phone number.') - const message = await this.build(template, variables) - try { - return await this.provider.send({ - to: variables.user.phone, - ...message, - }) - } catch (error: any) { - - // If for some reason we are getting an unsubscribe error - // force unsubscribe the user from this subscription type - if (error instanceof UnsubscribeTextError) { - await unsubscribe(variables.user.id, variables.context.subscription_id) - } - throw error - } - } - - async build(template: TextTemplate, variables: Variables): Promise { - - // Compile the text template - const compiled = template.compile(variables) - - // Check to see if its the first users message, if so include - // the opt out message - if (!variables.user.id) return compiled - - const hasReceivedOptOut = await UserEvent.exists(qb => qb.where({ - project_id: variables.project.id, - user_id: variables.user.id, - name: 'text_sent', - })) - - if (!hasReceivedOptOut && variables.project.text_opt_out_message) { - compiled.text += `\n${variables.project.text_opt_out_message}` - } - - return compiled - } - - async segments(template: TextTemplate, variables: Variables): Promise { - const { text } = await this.build(template, variables) - return Math.ceil(text.length / TEXT_SEGMENT_LENGTH) - } - - parseInbound(body: any): InboundTextMessage | undefined { - return this.provider.parseInbound(body) - } -} diff --git a/services/platform/src/providers/text/TextError.ts b/services/platform/src/providers/text/TextError.ts deleted file mode 100644 index 884bb6ca..00000000 --- a/services/platform/src/providers/text/TextError.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ContextError } from '../../error/ErrorHandler' - -export default class TextError extends ContextError { - phone: string - constructor(type: string, phone: string, message: string, context: any = {}) { - super(`Text Error: ${message}`) - this.phone = phone - this.context = { phone, type, ...context } - Error.captureStackTrace(this, TextError) - } -} - -export class UnsubscribeTextError extends TextError { } - -export class UndeliverableTextError extends TextError { } - -export class RateLimitTextError extends TextError { } diff --git a/services/platform/src/providers/text/TextJob.ts b/services/platform/src/providers/text/TextJob.ts deleted file mode 100644 index efdd730c..00000000 --- a/services/platform/src/providers/text/TextJob.ts +++ /dev/null @@ -1,53 +0,0 @@ -import Job, { EncodedJob } from '../../queue/Job' -import { TextTemplate } from '../../render/Template' -import { MessageTrigger } from '../MessageTrigger' -import { updateSendState } from '../../campaigns/CampaignService' -import { failSend, finalizeSend, loadSendJob, messageLock, prepareSend } from '../MessageTriggerService' -import { loadTextChannel } from '.' -import App from '../../app' -import { UndeliverableTextError, UnsubscribeTextError } from './TextError' -import { releaseLock } from '../../core/Lock' - -export default class TextJob extends Job { - static $name = 'text' - - static from(data: MessageTrigger): TextJob { - return new this(data) - } - - static async handler(trigger: MessageTrigger, raw: EncodedJob) { - - const data = await loadSendJob(trigger) - if (!data) return - - const { campaign, template, user, project } = data - - // Send and render text - const channel = await loadTextChannel(campaign.provider_id, project.id) - if (!channel) { - await updateSendState({ - campaign, - user, - reference_id: trigger.reference_id, - state: 'aborted', - }) - App.main.error.notify(new Error('Unabled to send when there is no channel available.')) - return - } - - // Check current send rate and if the send is locked - // Increment rate limitter by number of segments - const segments = await channel.segments(template, data) - const isReady = await prepareSend(channel, data, raw, segments) - if (!isReady) return - - try { - const result = await channel.send(template, data) - await finalizeSend(data, result) - } catch (error: any) { - await failSend(data, error, (error: any) => !(error instanceof UnsubscribeTextError || error instanceof UndeliverableTextError)) - } finally { - await releaseLock(messageLock(campaign, user)) - } - } -} diff --git a/services/platform/src/providers/text/TextMessage.ts b/services/platform/src/providers/text/TextMessage.ts deleted file mode 100644 index 2ac6ee80..00000000 --- a/services/platform/src/providers/text/TextMessage.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface TextMessage { - to: string - text: string -} - -export interface InboundTextMessage extends TextMessage { - from: string -} - -export interface TextResponse { - message: TextMessage - success: boolean - response: string -} diff --git a/services/platform/src/providers/text/TextProvider.ts b/services/platform/src/providers/text/TextProvider.ts deleted file mode 100644 index d0062ad4..00000000 --- a/services/platform/src/providers/text/TextProvider.ts +++ /dev/null @@ -1,83 +0,0 @@ -import Router from '@koa/router' -import { loadTextChannel } from '.' -import { toggleChannelSubscriptions } from '../../subscriptions/SubscriptionService' -import Provider, { ProviderGroup } from '../Provider' -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import { Context } from 'koa' -import { getUserFromPhone } from '../../users/UserRepository' -import { getProject } from '../../projects/ProjectService' -import { EventPostJob } from '../../jobs' -import { SubscriptionState } from '../../subscriptions/Subscription' - -export type TextProviderName = 'nexmo' | 'plivo' | 'twilio' | 'logger' - -export abstract class TextProvider extends Provider { - abstract send(message: TextMessage): Promise - abstract parseInbound(inbound: any): InboundTextMessage | undefined - - static get group() { return 'text' as ProviderGroup } - - static inbound(namespace: string) { - const router = new Router<{ provider: Provider }>() - - const inbound = async (ctx: Context) => { - const provider = ctx.state.provider - - // Load in the required components to properly parse the message - const channel = await loadTextChannel(provider.id) - const project = await getProject(provider.project_id) - const message = channel?.provider.parseInbound(ctx.request.body) - if (!channel || !project) ctx.throw(404) - - // If undefined message, we can't parse the body but don't want to - // keep getting the request - if (!message) { - ctx.status = 204 - return - } - - // Find the user from the inbound text message - const user = await getUserFromPhone(provider.project_id, message.from) - if (!user) ctx.throw(404) - - // If we've made it this far, always respond with success so webhooks - // don't double trigger - ctx.status = 204 - - // If the message includes the word STOP unsubscribe immediately - if (message.text.toLowerCase().includes('stop')) { - await toggleChannelSubscriptions(project.id, user, 'text') - - // If the message includes the word START, re-enable - // SMS messages for the user - } else if (message.text.toLowerCase().includes('start')) { - await toggleChannelSubscriptions(project.id, user, 'text', SubscriptionState.subscribed) - - // If the message includes the word HELP, send the help message - } else if (message.text.toLowerCase().includes('help') && project.text_help_message) { - channel.provider.send({ - to: message.from, - text: project.text_help_message, - }) - - // Otherwise create an event so journeys can trigger off of the message - } else { - await EventPostJob.from({ - project_id: project.id, - event: { - name: 'text_inbound', - external_id: user.external_id, - anonymous_id: user.anonymous_id, - data: { message }, - }, - }).queue() - } - } - - // Register for general `inbound` path but also deprecated `unsubscribe` - router.post(`/${namespace}/inbound`, inbound) - router.post(`/${namespace}/unsubscribe`, inbound) - - return router - } -} diff --git a/services/platform/src/providers/text/TwilioTextProvider.ts b/services/platform/src/providers/text/TwilioTextProvider.ts deleted file mode 100644 index c8143a2d..00000000 --- a/services/platform/src/providers/text/TwilioTextProvider.ts +++ /dev/null @@ -1,107 +0,0 @@ -import App from '../../app' -import { ExternalProviderParams, ProviderControllers, ProviderSchema, ProviderSetupMeta } from '../Provider' -import { createController } from '../ProviderService' -import TextError, { UndeliverableTextError, UnsubscribeTextError } from './TextError' -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import { TextProvider } from './TextProvider' - -/** - * https://www.twilio.com/docs/sms/quickstart/node - */ - -interface TwilioDataParams { - account_sid: string - auth_token: string - phone_number: string -} - -interface TwilioProviderParams extends ExternalProviderParams { - data: TwilioDataParams -} - -export default class TwilioTextProvider extends TextProvider { - account_sid!: string - auth_token!: string - phone_number!: string - - static namespace = 'twilio' - static meta = { - name: 'Twilio', - description: '', - url: 'https://twilio.com', - icon: 'https://lunogram.com/providers/twilio.svg', - } - - static schema = ProviderSchema('twilioTextProviderParams', { - type: 'object', - required: ['account_sid', 'auth_token', 'phone_number'], - properties: { - account_sid: { - type: 'string', - title: 'Account SID', - }, - auth_token: { type: 'string' }, - phone_number: { type: 'string' }, - }, - }) - - get apiKey(): string { - return Buffer.from(`${this.account_sid}:${this.auth_token}`).toString('base64') - } - - loadSetup(app: App): ProviderSetupMeta[] { - return [{ - name: 'Inbound URL', - value: `${app.env.apiBaseUrl}/providers/${this.id}/${(this.constructor as any).namespace}/inbound`, - }] - } - - async send(message: TextMessage): Promise { - const { to, text } = message - const form = new URLSearchParams() - form.append('From', this.phone_number) - form.append('To', to) - form.append('Body', text) - - const response = await fetch(`https://api.twilio.com/2010-04-01/Accounts/${this.account_sid}/Messages.json`, { - method: 'POST', - headers: { - Authorization: `Basic ${this.apiKey}`, - 'User-Agent': 'lunogram/v1 (+https://github.com/lunogram/platform)', - }, - body: form, - }) - - const responseBody = await response.json() - if (response.ok) { - return { - message, - success: true, - response: responseBody.sid, - } - } else { - if (responseBody.code === 21610) { - // Unable to send because recipient has unsubscribed - throw new UnsubscribeTextError(this.type, to, responseBody.message) - } else if (responseBody.code === 21408) { - // Unable to send because region is not enabled - throw new UndeliverableTextError(this.type, to, responseBody.message) - } - throw new TextError(this.type, to, responseBody.message) - } - } - - // https://www.twilio.com/docs/messaging/guides/webhook-request - parseInbound(inbound: any): InboundTextMessage | undefined { - return { - to: inbound.To, - from: inbound.From, - text: inbound.Body || '', - } - } - - static controllers(): ProviderControllers { - const admin = createController('text', this) - return { admin, public: this.inbound(this.namespace) } - } -} diff --git a/services/platform/src/providers/text/WebhookTextProvider.ts b/services/platform/src/providers/text/WebhookTextProvider.ts deleted file mode 100644 index 199677cd..00000000 --- a/services/platform/src/providers/text/WebhookTextProvider.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { sendMessage } from '../external/webhook' -import { ProviderControllers } from '../Provider' -import { createController } from '../ProviderService' -import { InboundTextMessage, TextMessage, TextResponse } from './TextMessage' -import { TextProvider } from './TextProvider' -import App from '../../app' -import { logger } from '../../config/logger' - -export default class WebhookTextProvider extends TextProvider { - async send(message: TextMessage): Promise { - if (!App.main.env.webhooks.send) { - logger.warn('Webhook sending is disabled, not sending text message') - return { success: false, response: 'Webhook sending is disabled', message } - } - - if (!this.external_id) { - throw new Error('No external ID set for webhook text provider') - } - - await sendMessage(this.project_id, { - type: 'text' as const, - to: message.to, - text: message.text, - }) - - return { - message, - success: true, - response: '', - } - } - - parseInbound(inbound: any): InboundTextMessage { - return { - to: inbound.to, - from: inbound.from, - text: inbound.text, - } - } - - static controllers(): ProviderControllers { - return { admin: createController('text', this) } - } -} diff --git a/services/platform/src/providers/text/__tests__/TextChannel.spec.ts b/services/platform/src/providers/text/__tests__/TextChannel.spec.ts deleted file mode 100644 index dd7e1079..00000000 --- a/services/platform/src/providers/text/__tests__/TextChannel.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import Admin from '../../../auth/Admin' -import { createProject } from '../../../projects/ProjectService' -import { Variables } from '../../../render' -import { TextTemplate } from '../../../render/Template' -import { UserEvent } from '../../../users/UserEvent' -import { createUser } from '../../../users/UserRepository' -import { uuid } from '../../../utilities' -import LoggerTextProvider from '../LoggerTextProvider' -import TextChannel from '../TextChannel' - -describe('TextChannel', () => { - - const optOut = 'Reply STOP to opt out.' - const setup = async (text_opt_out_message?: string): Promise<{ variables: Variables, template: TextTemplate }> => { - const text = 'Hello world!' - const admin = await Admin.insertAndFetch({ - first_name: uuid(), - last_name: uuid(), - email: `${uuid()}@test.com`, - }) - const project = await createProject(admin, { - name: uuid(), - timezone: 'utc', - text_opt_out_message, - locale: 'en', - }) - const user = await createUser(project.id, { - anonymous_id: uuid(), - external_id: uuid(), - }) - const template = new TextTemplate() - template.text = text - - return { - variables: { - user, - context: { - template_id: 1, - campaign_id: 1, - subscription_id: 1, - }, - project, - }, - template, - } - } - - describe('build', () => { - test('a first message will get opt out', async () => { - const { variables, template } = await setup(optOut) - const channel = new TextChannel(new LoggerTextProvider()) - - const message = await channel.build(template, variables) - - expect(message.text).toContain(optOut) - }) - - test('a second message has no opt out', async () => { - const { variables, template } = await setup(optOut) - const channel = new TextChannel(new LoggerTextProvider()) - - await UserEvent.insert({ - user_id: variables.user.id, - name: 'text_sent', - project_id: variables.project.id, - }) - - const message = await channel.build(template, variables) - - expect(message.text).not.toContain(optOut) - }) - - test('no opt out template means no opt out appended', async () => { - const { variables, template } = await setup() - const channel = new TextChannel(new LoggerTextProvider()) - - const message = await channel.build(template, variables) - - expect(message.text).not.toContain(optOut) - }) - }) -}) diff --git a/services/platform/src/providers/text/index.ts b/services/platform/src/providers/text/index.ts deleted file mode 100644 index b400e8d3..00000000 --- a/services/platform/src/providers/text/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { UUID } from 'node:crypto' -import { loadProvider } from '../ProviderRepository' -import WebhookTextProvider from './WebhookTextProvider' -import HttpSMSTextProvider from './HttpSMSProvider' -import LoggerTextProvider from './LoggerTextProvider' -import NexmoTextProvider from './NexmoTextProvider' -import PlivoTextProvider from './PlivoTextProvider' -import TelnyxTextProvider from './TelnyxTextProvider' -import TextChannel from './TextChannel' -import { TextProvider, TextProviderName } from './TextProvider' -import TwilioTextProvider from './TwilioTextProvider' - -type TextProviderDerived = { new(): TextProvider } & typeof TextProvider -export const typeMap: Record = { - nexmo: NexmoTextProvider, - plivo: PlivoTextProvider, - telnyx: TelnyxTextProvider, - twilio: TwilioTextProvider, - httpsms: HttpSMSTextProvider, - webhook: WebhookTextProvider, - logger: LoggerTextProvider, -} - -export const providerMap = (record: { type: TextProviderName }): TextProvider => { - if (!typeMap[record.type]) throw new Error(`Unknown text provider type: ${record.type}`) - return typeMap[record.type].fromJson(record) -} - -export const loadTextChannel = async (providerId: UUID, projectId?: UUID): Promise => { - const provider = await loadProvider(providerId, providerMap, projectId) - if (!provider) return - return new TextChannel(provider) -} - -export const textProviders = Object.values(typeMap) diff --git a/services/platform/src/providers/webhook/LocalWebhookProvider.ts b/services/platform/src/providers/webhook/LocalWebhookProvider.ts deleted file mode 100644 index 51b045d8..00000000 --- a/services/platform/src/providers/webhook/LocalWebhookProvider.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' -import { Webhook, WebhookResponse } from './Webhook' -import { WebhookProvider } from './WebhookProvider' - -export default class LocalWebhookProvider extends WebhookProvider { - static namespace = 'local' - static meta = { - name: 'Local', - icon: 'https://lunogram.com/providers/webhook.svg', - } - - static schema = ProviderSchema('localWebhookProviderParams', { - type: 'object', - nullable: true, - additionalProperties: true, - }) - - async send(options: Webhook): Promise { - const { method, endpoint, headers, body } = options - const response = await fetch(endpoint, { - method, - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - ...headers, - }, - body: body ? JSON.stringify(body) : undefined, - }) - - let responseBody: any | undefined - try { - responseBody = await response.json() - } catch { - try { - responseBody = await response.text() - } catch {} - } - - if (response.ok) { - return { - request: options, - success: true, - response: responseBody, - } - } else { - throw new Error(`${response.status} - ${responseBody.message}`) - } - } - - static controllers(): ProviderControllers { - return { admin: createController('webhook', this) } - } -} diff --git a/services/platform/src/providers/webhook/LoggerWebhookProvider.ts b/services/platform/src/providers/webhook/LoggerWebhookProvider.ts deleted file mode 100644 index c8a0cc30..00000000 --- a/services/platform/src/providers/webhook/LoggerWebhookProvider.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { logger } from '../../config/logger' -import { randomInt, sleep } from '../../utilities' -import { ProviderControllers, ProviderParams, ProviderSchema } from '../Provider' -import { createController } from '../ProviderService' -import { Webhook, WebhookResponse } from './Webhook' -import { WebhookProvider } from './WebhookProvider' - -export default class LoggerWebhookProvider extends WebhookProvider { - addLatency?: boolean - - static isDevelopment = true - - static namespace = 'logger' - static meta = { - name: 'Logger', - icon: 'https://lunogram.com/providers/logger.svg', - } - - static schema = ProviderSchema('loggerWebhookProviderParams', { - type: 'object', - }) - - async send(options: Webhook): Promise { - - // Allow for having random latency to aid in performance testing - if (this.addLatency) await sleep(randomInt()) - - logger.info(options, 'provider:webhook:logger') - return { - request: options, - success: true, - response: '', - } - } - - static controllers(): ProviderControllers { - return { admin: createController('webhook', this) } - } -} diff --git a/services/platform/src/providers/webhook/Webhook.ts b/services/platform/src/providers/webhook/Webhook.ts deleted file mode 100644 index b7d10044..00000000 --- a/services/platform/src/providers/webhook/Webhook.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface Webhook { - method: 'DELETE' | 'GET' | 'PATCH' | 'POST' | 'PUT' - endpoint: string - headers: Record - body?: Record - cacheKey?: string -} - -export interface WebhookResponse { - request: Webhook - success: boolean - response: Record | string -} diff --git a/services/platform/src/providers/webhook/WebhookChannel.ts b/services/platform/src/providers/webhook/WebhookChannel.ts deleted file mode 100644 index e35537d3..00000000 --- a/services/platform/src/providers/webhook/WebhookChannel.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { WebhookTemplate } from '../../render/Template' -import { Variables } from '../../render' -import { WebhookProvider } from './WebhookProvider' -import { WebhookResponse } from './Webhook' -import App from '../../app' -import { cacheGet, cacheSet } from '../../config/redis' - -export default class WebhookChannel { - readonly provider: WebhookProvider - constructor(provider?: WebhookProvider) { - if (provider) { - this.provider = provider - } else { - throw new Error('A valid webhook driver must be defined!') - } - } - - async send(template: WebhookTemplate, variables: Variables): Promise { - - const message = template.compile(variables) - const redis = App.main.redis - - // If we have a cache key, check cache first - if (message.cacheKey?.length) { - const key = `wh:${variables.context.campaign_id}:${message.cacheKey}` - const value = await cacheGet(redis, key) - if (value) return value - const response = await this.provider.send(message) - - await cacheSet(redis, key, response, 3600) - return response - } - - return await this.provider.send(message) - } -} diff --git a/services/platform/src/providers/webhook/WebhookJob.ts b/services/platform/src/providers/webhook/WebhookJob.ts deleted file mode 100644 index fa219b3d..00000000 --- a/services/platform/src/providers/webhook/WebhookJob.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { EncodedJob, Job } from '../../queue' -import { MessageTrigger } from '../MessageTrigger' -import { WebhookTemplate } from '../../render/Template' -import { updateSendState } from '../../campaigns/CampaignService' -import { failSend, finalizeSend, loadSendJob, messageLock, prepareSend } from '../MessageTriggerService' -import { loadWebhookChannel } from '.' -import { releaseLock } from '../../core/Lock' - -export default class WebhookJob extends Job { - static $name = 'webhook' - - static from(data: MessageTrigger): WebhookJob { - return new this(data) - } - - static async handler(trigger: MessageTrigger, raw: EncodedJob) { - const data = await loadSendJob(trigger) - if (!data) return - - const { campaign, template, user, project } = data - - // Send and render webhook - const channel = await loadWebhookChannel(campaign.provider_id, project.id) - if (!channel) { - await updateSendState({ - campaign, - user, - reference_id: trigger.reference_id, - state: 'aborted', - }) - return - } - - // Check current send rate and if the send is locked - const isReady = await prepareSend(channel, data, raw) - if (!isReady) return - - try { - const result = await channel.send(template, data) - await finalizeSend(data, result.response) - } catch (error: any) { - await failSend(data, error) - } finally { - await releaseLock(messageLock(campaign, user)) - } - } -} diff --git a/services/platform/src/providers/webhook/WebhookProvider.ts b/services/platform/src/providers/webhook/WebhookProvider.ts deleted file mode 100644 index d78b9864..00000000 --- a/services/platform/src/providers/webhook/WebhookProvider.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Provider, { ProviderGroup } from '../Provider' -import { Webhook, WebhookResponse } from './Webhook' - -export type WebhookProviderName = 'local' | 'logger' - -export abstract class WebhookProvider extends Provider { - abstract send(message: Webhook): Promise - - static group = 'webhook' as ProviderGroup -} diff --git a/services/platform/src/providers/webhook/index.ts b/services/platform/src/providers/webhook/index.ts deleted file mode 100644 index add48b22..00000000 --- a/services/platform/src/providers/webhook/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { UUID } from 'node:crypto' -import { loadProvider } from '../ProviderRepository' -import LocalWebhookProvider from './LocalWebhookProvider' -import LoggerWebhookProvider from './LoggerWebhookProvider' -import WebhookChannel from './WebhookChannel' -import { WebhookProvider, WebhookProviderName } from './WebhookProvider' - -type WebhookProviderDerived = { new(): WebhookProvider } & typeof WebhookProvider -export const typeMap: Record = { - local: LocalWebhookProvider, - logger: LoggerWebhookProvider, -} - -export const providerMap = (record: { type: WebhookProviderName }): WebhookProvider => { - if (!typeMap[record.type]) throw new Error(`Unknown webhook provider type: ${record.type}`) - return typeMap[record.type].fromJson(record) -} - -export const loadWebhookChannel = async (providerId: UUID, projectId: UUID): Promise => { - const provider = await loadProvider(providerId, providerMap, projectId) - if (!provider) return - return new WebhookChannel(provider) -} - -export const webhookProviders = Object.values(typeMap) diff --git a/services/platform/src/queue/Job.ts b/services/platform/src/queue/Job.ts deleted file mode 100644 index 29387fdd..00000000 --- a/services/platform/src/queue/Job.ts +++ /dev/null @@ -1,99 +0,0 @@ -import App from '../app' - -interface JobOptions { - delay?: number // Milliseconds - attempts?: number - jobId?: string - deduplication?: { id: string } -} - -interface JobState { - attemptsMade: number -} - -export interface EncodedJob { - data: any - options: JobOptions - state: JobState - name: string - token?: string -} - -export class JobError extends Error { } -export class RetryError extends JobError { - constructor() { - super('RetryError') - } -} - -export const JobPriority = { - none: 0, - high: 1, - low: 2, -} - -export default class Job implements EncodedJob { - data: any - options: JobOptions = { - delay: 0, - attempts: 3, - } - - state: JobState = { - attemptsMade: 0, - } - - static $name: string = Job.constructor.name - - get name() { - return this.$static.$name - } - - get $static() { - return this.constructor as typeof Job - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - static async handler(data: any, raw?: EncodedJob): Promise { - return Promise.reject(new Error('Handler not defined.')) - } - - static from(...args: any[]): Job { - return new this({ ...args }) - } - - async queue() { - return App.main.queue.enqueue(this) - } - - async handle(): Promise { - return this.$static.handler(this.data, this) - } - - constructor(data: any = {}) { - this.data = data - } - - delay(milliseconds: number) { - this.options.delay = milliseconds - return this - } - - jobId(id: string) { - this.options.jobId = id - return this - } - - deduplicationKey(key: string) { - this.options.deduplication = { id: key } - return this - } - - toJSON() { - return { - name: this.name, - data: this.data, - options: this.options, - } - } -} diff --git a/services/platform/src/queue/MemoryQueueProvider.ts b/services/platform/src/queue/MemoryQueueProvider.ts deleted file mode 100644 index 25a3ee35..00000000 --- a/services/platform/src/queue/MemoryQueueProvider.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { sleep, uuid } from '../utilities' -import Job from './Job' -import Queue, { QueueTypeConfig } from './Queue' -import QueueProvider from './QueueProvider' - -export interface MemoryConfig extends QueueTypeConfig { - driver: 'memory' -} - -export default class MemoryQueueProvider implements QueueProvider { - queue: Queue - jobs: Record = {} - backlog: string[] = [] - loop: NodeJS.Timeout | undefined - batchSize = 1000 as const - #isRunning = false - - constructor(queue: Queue) { - this.queue = queue - } - - async enqueue(job: Job): Promise { - const jobId = job.options.jobId ?? uuid() - if (!this.jobs[jobId]) { - this.jobs[jobId] = job - this.backlog.push(jobId) - } - } - - async enqueueBatch(jobs: Job[]): Promise { - for (const job of jobs) this.enqueue(job) - } - - async delay(job: Job, milliseconds: number): Promise { - job.options.delay = milliseconds - await this.enqueue(job) - } - - async retry(job: Job): Promise { - await this.enqueue(job) - } - - start(): void { - if (process.env.NODE_ENV === 'test') return - if (this.loop) return - this.process() - } - - isRunning(): Promise { - return Promise.resolve(this.#isRunning) - } - - pause(): Promise { - this.#isRunning = false - this.close() - return Promise.resolve() - } - - resume(): Promise { - this.#isRunning = true - this.start() - return Promise.resolve() - } - - close(): void { - clearTimeout(this.loop) - this.loop = undefined - } - - private async process() { - let jobId = this.backlog.shift() - while (jobId) { - - // If we have a jobId fetch job and dequeue - if (jobId) { - const job = this.jobs[jobId] - if (job) await this.queue.dequeue(job) - delete this.jobs[jobId] - } - - jobId = this.backlog.shift() - } - await sleep(1000) - await this.process() - } -} diff --git a/services/platform/src/queue/Queue.ts b/services/platform/src/queue/Queue.ts deleted file mode 100644 index 0d94605c..00000000 --- a/services/platform/src/queue/Queue.ts +++ /dev/null @@ -1,112 +0,0 @@ -import App from '../app' -import { DriverConfig } from '../config/env' -import { logger } from '../config/logger' -import { LoggerConfig } from '../providers/LoggerProvider' -import Job, { EncodedJob, JobError } from './Job' -import MemoryQueueProvider, { MemoryConfig } from './MemoryQueueProvider' -import QueueProvider, { QueueProviderName } from './QueueProvider' -import RedisQueueProvider, { RedisQueueConfig } from './RedisQueueProvider' - -export type QueueConfig = RedisQueueConfig | MemoryConfig | LoggerConfig - -export interface QueueTypeConfig extends DriverConfig { - driver: QueueProviderName -} - -export default class Queue { - provider: QueueProvider - jobs: Record Promise> = {} - - constructor(config?: QueueConfig) { - if (config?.driver === 'redis') { - this.provider = new RedisQueueProvider(config, this) - } else if (config?.driver === 'memory') { - this.provider = new MemoryQueueProvider(this) - } else { - throw new Error('A valid queue driver must be set!') - } - } - - async dequeue(job: EncodedJob): Promise { - if (!job || !job.name) return false - const handler = this.jobs[job.name] - if (!handler) { - App.main.error.notify(new Error(`No handler found for job: ${job.name}`)) - } - - logger.info('queue:dequeue:job', job.name) - - const start = Date.now() - await this.started(job) - await handler(job.data, job) - await this.completed(job, Date.now() - start) - return true - } - - async enqueue(job: Job | EncodedJob): Promise { - logger.trace(job instanceof Job ? job.toJSON() : job, 'queue:job:enqueued') - await this.provider.enqueue(job) - - // Increment stats - await App.main.stats.increment(job.name) - } - - async enqueueBatch(jobs: EncodedJob[]): Promise { - logger.trace({ count: jobs.length }, 'queue:job:enqueuedBatch') - await this.provider.enqueueBatch(jobs) - - // Increment stats - await App.main.stats.increment(jobs.map(job => job.name)) - } - - async delay(job: EncodedJob, milliseconds: number) { - await this.provider.delay(job, milliseconds) - } - - async retry(job: EncodedJob) { - await this.provider.retry(job) - } - - get batchSize() { - return this.provider.batchSize - } - - register(job: typeof Job) { - this.jobs[job.$name] = job.handler - } - - async started(job: EncodedJob) { - logger.trace(job, 'queue:job:started') - } - - async errored(error: Error, job?: EncodedJob) { - if (error instanceof JobError) return - logger.error({ error, stacktrace: error.stack, job }, 'queue:job:errored') - App.main.error.notify(error, job) - } - - async completed(job: EncodedJob, duration: number) { - logger.trace(job, 'queue:job:completed') - - await App.main.stats.increment(`${job.name}:completed`) - await App.main.stats.increment(`${job.name}:duration`, duration) - } - - async start() { - this.provider.start() - } - - async pause() { - logger.info('queue:paused') - await this.provider.pause() - } - - async resume() { - logger.info('queue:resumed') - await this.provider.resume() - } - - async close() { - this.provider.close() - } -} diff --git a/services/platform/src/queue/QueueProvider.ts b/services/platform/src/queue/QueueProvider.ts deleted file mode 100644 index 0c6dc18b..00000000 --- a/services/platform/src/queue/QueueProvider.ts +++ /dev/null @@ -1,24 +0,0 @@ -import Queue from './Queue' -import { EncodedJob } from './Job' - -export type QueueProviderName = 'redis' | 'memory' | 'logger' - -export interface Metric { - date: Date - count: number -} - -export default interface QueueProvider { - queue: Queue - batchSize: number - enqueue(job: EncodedJob): Promise - enqueueBatch(jobs: EncodedJob[]): Promise - delay(job: EncodedJob, milliseconds: number): Promise - retry(job: EncodedJob): Promise - start(): void - pause(): Promise - resume(): Promise - isRunning(): Promise - close(): void - failed?(): Promise -} diff --git a/services/platform/src/queue/RedisQueueProvider.ts b/services/platform/src/queue/RedisQueueProvider.ts deleted file mode 100644 index 6224749c..00000000 --- a/services/platform/src/queue/RedisQueueProvider.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { Queue as BullQueue, Worker, JobsOptions, DelayedError, WaitingError } from 'bullmq' -import { logger } from '../config/logger' -import { batch } from '../utilities' -import { EncodedJob } from './Job' -import Queue, { QueueTypeConfig } from './Queue' -import QueueProvider from './QueueProvider' -import { DefaultRedis, Redis, RedisConfig } from '../config/redis' - -export interface RedisQueueConfig extends QueueTypeConfig, RedisConfig { - driver: 'redis' - concurrency: number -} - -export default class RedisQueueProvider implements QueueProvider { - - redis: Redis - queue: Queue - bull: BullQueue - worker?: Worker - concurrency: number - batchSize = 50 as const - queueName = 'lunogram' as const - - constructor({ concurrency, ...config }: RedisQueueConfig, queue: Queue) { - this.queue = queue - this.concurrency = concurrency ?? 10 - this.redis = DefaultRedis(config, { - maxRetriesPerRequest: null, - }) - this.bull = new BullQueue(this.queueName, { - connection: this.redis, - defaultJobOptions: { - attempts: 3, - backoff: { - type: 'exponential', - delay: 1000, - }, - }, - }) - } - - async enqueue(job: EncodedJob): Promise { - try { - const { name, data, opts } = this.adaptJob(job) - await this.bull.add(name, data, opts) - } catch (error) { - logger.error(error, 'redis:error:enqueue') - } - } - - async enqueueBatch(jobs: EncodedJob[]): Promise { - for (const part of batch(jobs, this.batchSize)) { - await this.bull.addBulk(part.map(item => this.adaptJob(item))) - } - } - - async delay(job: EncodedJob, milliseconds: number): Promise { - - // If we are missing required fields, just enqueue the job manually - if (!job.options.jobId || !job.token) { - job.options.delay = milliseconds - await this.enqueue(job) - return - } - - // If we are able to fetch the job, properly move it to delayed - const bullJob = await this.bull.getJob(job.options.jobId) - await bullJob?.moveToDelayed(Date.now() + milliseconds, job.token) - - // Special error so job stays in queue instead of being removed - throw new DelayedError() - } - - async retry(job: EncodedJob): Promise { - if (!job.options.jobId || !job.token) { - await this.enqueue(job) - return - } - - const bullJob = await this.bull.getJob(job.options.jobId) - await bullJob?.moveToWait(job.token) - - // Special error so the job is just moved - throw new WaitingError() - } - - private adaptJob(job: EncodedJob): { name: string, data: any, opts: JobsOptions | undefined } { - return { - name: job.name, - data: job, - opts: { - removeOnComplete: true, - removeOnFail: { - count: 50, - age: 24 * 3600, // keep up to 24 hours - }, - ...job.options, - }, - } - } - - start(): void { - this.worker = new Worker('lunogram', async (job, token) => { - await this.queue.dequeue({ - ...job.data, - options: { - ...job.data.options, - jobId: job.id, - }, - state: { - attemptsMade: job.attemptsMade, - }, - token, - }) - }, { - connection: this.redis, - concurrency: this.concurrency, - }) - - this.worker.on('failed', (job, error) => { - this.queue.errored(error, job?.data as EncodedJob) - }) - - this.worker.on('error', error => { - this.queue.errored(error) - }) - } - - async isRunning(): Promise { - return !(await this.bull.isPaused()) - } - - async pause(): Promise { - return this.bull.pause() - } - - async resume(): Promise { - return this.bull.resume() - } - - close(): void { - this.bull.close() - this.worker?.close() - } - - async failed() { - return this.bull.getFailed() - } -} diff --git a/services/platform/src/queue/index.ts b/services/platform/src/queue/index.ts deleted file mode 100644 index f1417f15..00000000 --- a/services/platform/src/queue/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Job, { EncodedJob } from './Job' -import Queue from './Queue' - -export { Job, EncodedJob } -export default Queue diff --git a/services/platform/src/render/Helpers/Array.ts b/services/platform/src/render/Helpers/Array.ts deleted file mode 100644 index b4ba49a7..00000000 --- a/services/platform/src/render/Helpers/Array.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { isNumber } from './Number' -import { isString } from './String' -import { checkType, isType } from './Util' - -/** - * Cast the given `value` to an array. - */ -export const wrap = function(value: any): any[] { - return value ? (Array.isArray(value) ? value : [value]) : [] -} - -/** - * Returns the first item of an array. - */ -export const first = function(array: any[]): any { - checkType(array, 'array') - return array[0] -} - -/** - * Returns the first `n` items of an array. - */ -export const firstN = function(array: any[], n?: number): any[] { - checkType(array, 'array') - if (!isNumber(n)) { - return array[0] - } - return array.slice(0, n) -} - -/** - * Returns true if `value` is an array. - */ -export const isArray = function(value: any): boolean { - return Array.isArray(value) -} - -/** - * Returns the item from `array` at index `idx`. - */ -export const itemAt = function(array: any[], idx?: number): any { - checkType(array, 'array') - idx = isNumber(idx) ? idx ?? 0 : 0 - if (idx < 0) { - return array[array.length + idx] - } - if (idx < array.length) { - return array[idx] - } - return array[0] -} - -/** - * Join all elements of array into a string, optionally using a - * given separator. - */ -export const join = function(array: any, separator?: string): string { - if (isString(array)) return array - if (checkType(array, 'array')) { - separator = isString(separator) ? separator : ', ' - } - return array.join(separator) -} - -/** - * Returns the last item of an array. - * Opposite of `first`. - */ -export const last = function(value: any[]): any { - checkType(value, 'array') - return value[value.length - 1] -} - -/** - * Returns the last `n` items of an array or string. Opposite of `firstN`. - */ -export const lastN = function(value: any[], n?: number): any[] { - checkType(value, 'array') - if (!isNumber(n)) { - return value[value.length - 1] - } - return value.slice(-Math.abs(n ?? 1)) -} - -/** - * Returns the length of the given string or array. - */ -export const length = function(value: any): number { - if (isType(value, 'object')) { - value = Object.keys(value) - } - if (isType(value, 'string') || isType(value, 'array')) { - return value.length - } - return 0 -} - -/** - * Map over the given array of objects and create an array containing - * only the single needed value in the object - */ -export const pluck = function(array: any[], prop: string): any[] { - checkType(array, 'array') - - return array.map(item => { - if (prop in item) { - return item[prop] - } - return null - }) -} - -/** - * Reverse the elements in an array, or the characters in a string. - */ -export const reverse = function(value: any[] | string): any[] | string { - if (Array.isArray(value)) { - return value.reverse() - } - if (typeof value === 'string') { - return value.split('').reverse().join('') - } - throw new TypeError('Expected value to be an array or string.') -} - -/** - * Sort the given `array`. A second direction value may be passed to - * determine if the array should be in ascending or descending order. - */ -export const sort = function(array: any[], direction?: 'asc' | 'desc'): any[] { - checkType(array, 'array') - if (isString(direction) && direction === 'desc') { - return array.sort().reverse() - } - return array.sort() -} diff --git a/services/platform/src/render/Helpers/Common.ts b/services/platform/src/render/Helpers/Common.ts deleted file mode 100644 index 608865ff..00000000 --- a/services/platform/src/render/Helpers/Common.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { HelperOptions } from 'handlebars' - -export function ifEquals( - this: T, - left: any, - right: any, - options: HelperOptions, -) { - if (arguments.length !== 3) { - return '' // throw error? - } - return left === right ? options.fn(this) : options.inverse(this) -} - -type HandlebarsOperator = '==' | '===' | '!=' | '!==' | '<' | '>' | '<=' | '>=' -export function compare(a: any, operator: HandlebarsOperator, b: any) { - - if (arguments.length < 4) { - throw new Error('handlebars Helper {{compare}} expects 4 arguments') - } - - switch (operator) { - case '==': - // eslint-disable-next-line eqeqeq - return a == b - case '===': - return a === b - case '!=': - // eslint-disable-next-line eqeqeq - return a != b - case '!==': - return a !== b - case '<': - return a < b - case '>': - return a > b - case '<=': - return a <= b - case '>=': - return a >= b - default: - throw new Error('helper {{compare}}: invalid operator: `' + operator + '`') - } -} - -export function eq(v1: any, v2: any) { - return v1 === v2 -} - -export function ne(v1: any, v2: any) { - return v1 !== v2 -} - -export function lt(v1: any, v2: any) { - return v1 < v2 -} - -export function gt(v1: any, v2: any) { - return v1 > v2 -} - -export function lte(v1: any, v2: any) { - return v1 <= v2 -} - -export function gte(v1: any, v2: any) { - return v1 >= v2 -} - -export function and(...parameters: any[]) { - return Array.prototype.every.call(parameters, Boolean) -} - -export function or(...parameters: any[]) { - return Array.prototype.slice.call(parameters, 0, -1).some(Boolean) -} diff --git a/services/platform/src/render/Helpers/Date.ts b/services/platform/src/render/Helpers/Date.ts deleted file mode 100644 index a8dc1075..00000000 --- a/services/platform/src/render/Helpers/Date.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { add, differenceInMonths, differenceInYears, differenceInDays, differenceInHours, differenceInMinutes, sub, nextDay, Day, differenceInSeconds, set, formatISO } from 'date-fns' -import { formatInTimeZone } from 'date-fns-tz' -import { isOptions } from 'handlebars-utils' - -const baseDate = (date: Date | string): Date => { - if (date === 'now') { return new Date() } - if (typeof date === 'string') { - return new Date(date) - } - return date -} - -export const now = function(format = 'yyyy-MM-dd HH:mm:ss', timezone = 'UTC'): string { - return dateFormat('now', format, timezone) -} - -/** - * Format a date instance into the provided format. - */ -export const dateFormat = function(date: Date | string, format: string, timezone = 'UTC'): string { - if (isOptions(timezone)) timezone = 'UTC' - return formatInTimeZone(baseDate(date), timezone, format) -} - -type DateUnit = 'years' | 'months'| 'weeks' | 'days' | 'hours' | 'minutes' | 'seconds' -const isUnit = (value: DateUnit): boolean => ['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds'].includes(value) - -/** - * Set a given component of a date to a provided value. - * - * i.e. {{setDate "1974-01-23" "months" 1 }} - */ -export const setDate = function(date: Date | string, unit: DateUnit, value: number): string { - return formatISO( - isUnit(unit) - ? set(baseDate(date), { [unit]: value }) - : baseDate(date), - ) -} - -/** - * Perform date math on a given date by adding some unit to the date. - * - * i.e. {{addDate "1974-01-23" 1 "months" }} - */ -export const addDate = function(date: Date | string, amount: number, unit: DateUnit): string { - return formatISO( - isUnit(unit) - ? add(baseDate(date), { [unit]: amount }) - : baseDate(date), - ) -} - -/** - * Perform date math on a given date by subtracting some unit to the date. - * - * i.e. {{subDate "1974-01-23" 1 "months" }} - */ -export const subtractDate = function(date: Date | string, amount: number, unit: DateUnit): string { - return formatISO( - isUnit(unit) - ? sub(baseDate(date), { [unit]: amount }) - : baseDate(date), - ) -} -export const subDate = subtractDate - -/** - * Get the next day of week based on criteria. - * - * i.e. {{nextDate "1974-01-23" "fr" }} - */ -export const nextDate = function(date: Date | string, day: 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa' | 'su'): string { - const dates: Record = { mo: 0, tu: 1, we: 2, th: 3, fr: 4, sa: 5, su: 6 } - const base = baseDate(date) - return formatISO(nextDay(base, dates[day])) -} - -/** - * Get the distance between two days in the provided unit - * - * i.e. {{nextDate "1974-01-23" "fr" }} - */ -export const dateDiff = function(date: Date | string, date2: Date | string, unit: DateUnit = 'days'): number { - if (!isUnit(unit)) return 0 - switch (unit) { - case 'years': return differenceInYears(baseDate(date), baseDate(date2)) - case 'months': return differenceInMonths(baseDate(date), baseDate(date2)) - case 'days': return differenceInDays(baseDate(date), baseDate(date2)) - case 'hours': return differenceInHours(baseDate(date), baseDate(date2)) - case 'minutes': return differenceInMinutes(baseDate(date), baseDate(date2)) - case 'seconds': return differenceInSeconds(baseDate(date), baseDate(date2)) - } - return 0 -} diff --git a/services/platform/src/render/Helpers/Number.ts b/services/platform/src/render/Helpers/Number.ts deleted file mode 100644 index 24a7ea8e..00000000 --- a/services/platform/src/render/Helpers/Number.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { isString } from './String' -import { checkType, isType } from './Util' - -/** - * Return true if `value` is a number. - */ -export const isNumber = function(value: any): boolean { - return isType(value, 'number') -} - -const checkNumber = (value: any, message?: string): boolean => { - return checkType(value, 'number', message ?? 'Expected a number.') -} - -/** - * For a given set of Handlebars arguments, get the number values. - */ -const getNumbers = (...args: any[]): number[] => { - // Loop over each value and check its type - const numbers: number[] = [] - for (const arg of args) { - // Skip the Handlebars helper object - if (Object.hasOwn(arg, 'loc')) continue - - // Check that each value is a number and append - checkNumber(arg, 'Expected all arguments to be numbers.') - numbers.push(Number(arg)) - } - return numbers -} - -/** - * Run a given operation across all values in an array. - */ -const operate = (values: any[], operation: (a: number, b: number) => number) => { - return getNumbers(...values) - .reduce(operation) -} - -/** - * Return the absolute value of `a`. - */ -export const abs = function(value: number | any): number { - const [num] = getNumbers(value) - return Math.abs(num) -} - -/** - * Return the sum of `a` plus `b` - */ -export const add = function(...args: any[]): number { - return operate(args, (a, b) => a + b) -} -export const plus = add - -/** - * Get the `Math.ceil()` of the given value. - */ -export const ceil = function(value: number | any): number { - const [num] = getNumbers(value) - return Math.ceil(num) -} - -/** - * Divide `a` by `b` - */ -export const divide = function(...args: any[]): number { - return operate(args, (a, b) => a / b) -} - -/** - * Get the `Math.floor()` of the given value. - */ -export const floor = function(value: number): number { - const [num] = getNumbers(value) - return Math.floor(num) -} - -/** - * Return the difference of `a` minus `b`. - */ -export const subtract = function(...args: any[]): number { - return operate(args, (a, b) => a - b) -} -export const minus = subtract - -/** - * Return the product of `a` times `b`. - */ -export const multiply = function(...args: any[]): number { - return operate(args, (a, b) => a * b) -} -export const times = multiply - -/** - * Generate a random number between two values - */ -export const random = function(min: number, max: number) { - [min, max] = getNumbers(min, max) - return Math.floor(Math.random() * (max - min + 1)) + min -} - -/** - * Get the remainder when `a` is divided by `b`. - */ -export const remainder = function(a: number, b: number): number { - return operate([a, b], (a, b) => a % b) -} - -/** - * Round the given number. - */ -export const round = function(value: number): number { - const [num] = getNumbers(value) - return Math.round(num) -} - -/** - * Format a string given provided criteria - * @param value The number to be formatted - * @param locale The locale to format the number into (i.e. en-US) - * @param style If formatting for currency or percent, pass either style - * @param currency If formatting for currency, pass the desired currency - * @returns A string format of the number matching the specifications - */ -export const numberFormat = function( - value: number, - locale?: string, - style?: 'currency' | 'percent' | undefined, - currency?: string, -): string { - const [num] = getNumbers(value) - if (!locale || !isString(locale)) { - locale = 'en-US' - } - - const options: Intl.NumberFormatOptions = {} - if (style && isString(style)) { - if (style === 'currency' && currency && isString(currency)) { - options.style = style - options.currency = currency - } - if (style === 'percent') { - options.style = style - } - } - - const formatter = new Intl.NumberFormat(locale, options) - return formatter.format(num) -} diff --git a/services/platform/src/render/Helpers/String.ts b/services/platform/src/render/Helpers/String.ts deleted file mode 100644 index 05f201e9..00000000 --- a/services/platform/src/render/Helpers/String.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { snakeCase } from '../../utilities' -import { isNumber } from './Number' -import { checkType, isType } from './Util' - -/** - * Return true if `value` is a string. - */ -export const isString = function(value: any): boolean { - return isType(value, 'string') -} - -export const checkString = (value: any, message?: string): boolean => { - return checkType(value, 'string', message) -} - -/** - * Appends the speficied `suffix to the given `string`. - */ -export const append = function(str: string, suffix: string) { - if (isString(str) && isString(suffix)) { - return str + suffix - } - return str -} - -/** - * camelCase the characters in the given `string`. - */ -export const camelcase = function(str: string): string { - if (!isString(str)) return '' - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function(word, index) { - return index === 0 ? word.toLowerCase() : word.toUpperCase() - }).replace(/\s+/g, '') -} - -/** - * Capitalize the first word in a sentence. - */ -export const capitalize = function(str: string): string { - if (!isString(str)) return '' - return str.charAt(0).toUpperCase() + str.slice(1) -} - -/** - * Capitalize all words in a string. - */ -export const capitalizeAll = function(str: string): string { - if (!isString(str)) return '' - return str.replace(/\w\S*/g, function(word) { - return capitalize(word) - }) -} - -/** - * Truncates a string to the specified `length`, and appends - * it with an ellipsis, `…`. - */ -export const ellipsis = function(str: string, limit: number): string { - if (!isString(str)) return '' - if (str.length <= limit) { - return str - } - return truncate(str, limit) + '…' -} - -/** - * Lowercase all characters in the given string. - */ -export const lowercase = function(str: string): string { - if (!isString(str)) return '' - return str.toLowerCase() -} - -/** - * Return the number of occurrences of `substring` within the - * given `string`. - */ -export const occurrences = function(str: string, substring: string): number { - if (!isString(str) || !isString(str)) return 0 - const len = substring.length - let pos = 0 - let n = 0 - - while ((pos = str.indexOf(substring, pos)) > -1) { - n++ - pos += len - } - return n -} - -/** - * Prepends the given `string` with the specified `prefix`. - */ -export const prepend = function(str: string, prefix: string): string { - return isString(str) && isString(prefix) - ? (prefix + str) - : str -} - -/** - * Replace all occurrences of substring `a` with substring `b`. - */ -export const replace = function(str: string, a: string, b: string): string { - if (!isString(str)) return '' - if (!isString(a)) return str - if (!isString(b)) b = '' - return str.split(a).join(b) -} - -/** - * Replace the first occurrence of substring `a` with substring `b`. - */ -export const replaceFirst = function(str: string, a: string, b: string): string { - if (!isString(str)) return '' - if (!isString(a)) return str - if (!isString(b)) b = '' - return str.replace(a, b) -} - -/** - * Reverse a string. - */ -export const reverse = function(str: string): string { - if (!isString(str)) return '' - return str.split('').reverse().join('') -} - -/** - * snake_case the characters in the given `string`. - */ -export const snakecase = function(str: string): string { - if (!isString(str)) return '' - return snakeCase(str) -} - -/** - * Split `string` by the given `character`. - */ -export const split = function(str: string, character: string): string[] { - if (!isString(str)) return [str] - if (!isString(character)) character = ',' - return str.split(character) -} - -/** - * Tests whether a string begins with the given prefix. - */ -export const startsWith = function(prefix: string, str: string): boolean { - return isString(str) && str.startsWith(prefix) -} - -/** - * Title case the given string. - */ -export const titleize = function(str: string): string { - if (!isString(str)) return '' - const title = str.replace(/[- _]+/g, ' ') - const words = title.split(' ') - const res = [] - let len = words.length - let i = 0 - while (len--) { - const word = words[i++] - res.push(capitalize(word)) - } - return res.join(' ') -} - -/** - * Removes extraneous whitespace from the beginning and end - * of a string. - */ -export const trim = function(str: string) { - return isString(str) ? str.trim() : '' -} - -/** - * Truncate a string to the specified `length` - */ -export const truncate = function(str: string, limit: number, suffix = ''): string { - if (!isString(str)) return '' - if (!isString(suffix)) suffix = '' - if (str.length > limit) { - return str.slice(0, limit - suffix.length) + suffix - } - return str -} - -/** - * Truncate a string to have the specified number of words. - */ -export const truncateWords = function(str: string, count: number, suffix = ''): string { - if (!isString(str) || !isNumber(count)) return '' - if (!isString(suffix)) { - suffix = '…' - } - - const num = Number(count) - let arr = str.split(/[ \t]/) - if (num > arr.length) { - arr = arr.slice(0, num) - } - - return arr.join(' ').trim() + suffix -} - -/** - * Get the base locale from a given locale string - * @param locale - */ -export const baseLocale = (locale?: string): string | undefined => { - if (!locale) return '' - const parts = locale.split('-') - if (parts.length < 2) return locale - return parts[0] -} diff --git a/services/platform/src/render/Helpers/Url.ts b/services/platform/src/render/Helpers/Url.ts deleted file mode 100644 index 2f12f922..00000000 --- a/services/platform/src/render/Helpers/Url.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { checkString } from './String' - -/** - * Encodes a Uniform Resource Identifier (URI) component - * by replacing each instance of certain characters by - * one, two, three, or four escape sequences representing - * the UTF-8 encoding of the character. - */ -export const encodeURI = function(str: string): string { - checkString(str) - return encodeURIComponent(str) -} - -/** - * Escape the given string by replacing characters with escape sequences. - * Useful for allowing the string to be used in a URL, etc. - */ -export const escape = function(str: string): URLSearchParams { - checkString(str) - return new URLSearchParams(str) -} - -/** - * Decode a Uniform Resource Identifier (URI) component. - */ -export const decodeURI = function(str: string): string { - checkString(str) - return decodeURIComponent(str) -} diff --git a/services/platform/src/render/Helpers/Util.ts b/services/platform/src/render/Helpers/Util.ts deleted file mode 100644 index 0d914e13..00000000 --- a/services/platform/src/render/Helpers/Util.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const isType = (value: any, type: string): boolean => { - if (!value) return false - if (type === 'array') return Array.isArray(value) - if (type === 'object') return typeof value === 'object' && value !== null - return typeof value === type -} - -export const checkType = (value: any, type: string, message?: string): boolean => { - if (!isType(value, type)) { - throw new TypeError(message ?? `Expected a ${type}.`) - } - return true -} diff --git a/services/platform/src/render/LinkController.ts b/services/platform/src/render/LinkController.ts deleted file mode 100644 index 2ef91874..00000000 --- a/services/platform/src/render/LinkController.ts +++ /dev/null @@ -1,54 +0,0 @@ -import Router from '@koa/router' -import App from '../app' -import { encodedLinkToParts, trackMessageEvent } from './LinkService' -import Organization from '../organizations/Organization' -import { cacheGet, cacheSet } from '../config/redis' - -const router = new Router<{ - app: App - organization?: Organization -}>() - -router.get('/c', async ctx => { - - // If no redirect, just show a default page - if (!ctx.query.r) { - ctx.body = 'It looks like this link doesn\'t work properly!' - ctx.status = 200 - return - } - - const parts = await encodedLinkToParts(ctx.URL) - await trackMessageEvent(parts, 'clicked') - ctx.redirect(parts.redirect) - ctx.status = 303 -}) - -router.get('/o', async ctx => { - const parts = await encodedLinkToParts(ctx.URL) - await trackMessageEvent(parts, 'opened') - ctx.status = 204 -}) - -router.get('/.well-known/:file', async ctx => { - const organization = ctx.state.organization - const url = organization?.tracking_deeplink_mirror_url - const file = ctx.params.file - if (!url) { - ctx.status = 404 - return - } - - const key = `well-known:${organization.id}:${file}` - const value = await cacheGet(App.main.redis, key) - if (value) { - ctx.body = value - } else { - const response = await fetch(`${url}/.well-known/${file}`) - const value = await response.json() - await cacheSet(App.main.redis, key, value, 60 * 60 * 5) - ctx.body = value - } -}) - -export default router diff --git a/services/platform/src/render/LinkService.ts b/services/platform/src/render/LinkService.ts deleted file mode 100644 index 25f00aa5..00000000 --- a/services/platform/src/render/LinkService.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { URL } from 'node:url' -import App from '../app' -import Campaign from '../campaigns/Campaign' -import CampaignInteractJob from '../campaigns/CampaignInteractJob' -import { getCampaign } from '../campaigns/CampaignService' -import EventPostJob from '../client/EventPostJob' -import { User } from '../users/User' -import { getUser } from '../users/UserRepository' -import { UUID } from 'node:crypto' - -export interface TrackedLinkParams { - userId: UUID - campaignId: UUID - referenceId?: string -} - -interface TrackedLinkParts extends TrackedLinkParams { - path: string - redirect?: string -} - -export const paramsToEncodedLink = (params: TrackedLinkParts): string => { - const url = new URL(params.path, App.main.env.baseUrl) - url.searchParams.set('u', params.userId) - url.searchParams.set('c', params.campaignId) - if (params.referenceId) { - url.searchParams.set('s', params.referenceId) - } - if (params.redirect) { - url.searchParams.set('r', encodeURIComponent(params.redirect)) - } - return url.href -} - -interface TrackedLinkExport { - user?: User - campaign?: Campaign - referenceId?: string - redirect: string -} - -export const encodedLinkToParts = async (link: string | URL): Promise => { - const url = link instanceof URL ? link : new URL(link) - const userId = url.searchParams.get('u') - const campaignId = url.searchParams.get('c') - const referenceId = url.searchParams.get('s') ?? undefined - const redirect = decodeURIComponent(url.searchParams.get('r') ?? '') - - const parts: TrackedLinkExport = { redirect, referenceId } - - if (userId) { - parts.user = await getUser(userId as UUID) - - if (parts.user && campaignId) { - parts.campaign = await getCampaign(campaignId as UUID, parts.user.project_id) - } - } - - return parts -} - -export const clickWrapHtml = (html: string, params: TrackedLinkParams) => { - const regex = /a.*\s*href\s*=\s*(['"])(https?:\/\/.+?)\1/gi - let link - - while ((link = regex.exec(html)) !== null) { - const redirect = link[2] - - html = html.replace( - redirect, - paramsToEncodedLink({ ...params, redirect, path: 'c' }), - ) - } - - return html -} - -export const openWrapHtml = (html: string, params: TrackedLinkParams) => { - const link = paramsToEncodedLink({ ...params, path: 'o' }) - const imageHtml = `` - return injectInBody(html, imageHtml, 'end') -} - -export const preheaderWrapHtml = (html: string, preheader: string) => { - const preheaderHtml = `${preheader}` - return injectInBody(html, preheaderHtml, 'start') -} - -export const injectInBody = (html: string, injection: string, placement: 'start' | 'end') => { - if (placement === 'end') { - const bodyTag = '/ - const match = html.match(regex) - if (match) { - const offset = match.index! + match[0].length - html = html.substring(0, offset) + injection + html.substring(offset) - } else { - html = injection + html - } - } - return html -} - -export type TrackMessageType = 'opened' | 'clicked' | 'bounced' | 'complained' | 'failed' -export const trackMessageEvent = async ( - parts: Partial, - type: TrackMessageType, - action?: 'unsubscribe', - context?: any, -) => { - const { user, campaign, referenceId } = parts - if (!user || !campaign) return - - const eventJob = EventPostJob.from({ - project_id: user.project_id, - event: { - external_id: user.external_id, - name: campaign.eventName(type), - data: { - campaign_id: campaign.id, - campaign_name: campaign.name, - campaign_type: campaign.type, - channel: campaign.channel, - subscription_id: campaign.subscription_id, - url: parts.redirect, - context, - }, - }, - forward: true, - }) - - const campaignJob = CampaignInteractJob.from({ - campaign_id: campaign.id, - user_id: user.id, - reference_id: referenceId ?? '0', - subscription_id: campaign.subscription_id, - type, - action, - }) - - await App.main.queue.enqueueBatch([ - eventJob, - campaignJob, - ]) -} diff --git a/services/platform/src/render/Resource.ts b/services/platform/src/render/Resource.ts deleted file mode 100644 index 07d72d70..00000000 --- a/services/platform/src/render/Resource.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { UUID } from 'crypto' -import Model, { ModelParams } from '../core/Model' - -export type ResourceType = 'font' | 'snippet' - -export default class Resource extends Model { - project_id!: UUID - type!: ResourceType - name!: string - value!: Record - - static jsonAttributes = ['value'] -} - -export type ResourceParams = Omit diff --git a/services/platform/src/render/ResourceController.ts b/services/platform/src/render/ResourceController.ts deleted file mode 100644 index 69eaed4a..00000000 --- a/services/platform/src/render/ResourceController.ts +++ /dev/null @@ -1,62 +0,0 @@ -import Router from '@koa/router' -import { ProjectState } from '../auth/AuthMiddleware' -import { JSONSchemaType, validate } from '../core/validate' -import Resource, { ResourceParams, ResourceType } from './Resource' -import { allResources, createResource, deleteResource, getResource } from './ResourceService' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' - -const router = new Router< - ProjectState & { resource?: Resource } ->({ - prefix: '/resources', -}) - -router.get('/', async ctx => { - const type = ctx.query.type as ResourceType - ctx.body = await allResources(ctx.state.project.id, type) -}) - -const resourceCreateParams: JSONSchemaType = { - $id: 'resourceCreateParams', - type: 'object', - required: ['type', 'name', 'value'], - properties: { - type: { - type: 'string', - enum: ['font', 'snippet'], - }, - name: { type: 'string' }, - value: { - type: 'object', - additionalProperties: true, - } as any, - }, - additionalProperties: false, -} -router.post('/', async ctx => { - const payload = validate(resourceCreateParams, ctx.request.body) - ctx.body = await createResource(ctx.state.project.id, payload) -}) - -router.param('resourceId', async (value: string, ctx, next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid resource ID') - return - } - - ctx.state.resource = await getResource(value as UUID, ctx.state.project.id) - if (!ctx.state.resource) { - ctx.throw(404) - return - } - return await next() -}) - -router.delete('/:resourceId', async ctx => { - const { id, project_id } = ctx.state.resource! - await deleteResource(id, project_id) - ctx.body = true -}) - -export default router diff --git a/services/platform/src/render/ResourceService.ts b/services/platform/src/render/ResourceService.ts deleted file mode 100644 index add65885..00000000 --- a/services/platform/src/render/ResourceService.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UUID } from 'node:crypto' -import Resource, { ResourceParams, ResourceType } from './Resource' - -export const allResources = async (projectId: UUID, type?: ResourceType): Promise => { - return await Resource.all(qb => { - if (type) { - qb.where('type', type) - } - return qb.where('project_id', projectId) - }) -} - -export const getResource = async (id: UUID, projectId: UUID) => { - return await Resource.find(id, qb => qb.where('project_id', projectId)) -} - -export const createResource = async (projectId: UUID, params: ResourceParams) => { - return await Resource.insertAndFetch({ - ...params, - project_id: projectId, - }) -} - -export const deleteResource = async (id: UUID, projectId: UUID) => { - return await Resource.deleteById(id, qb => qb.where('project_id', projectId)) -} diff --git a/services/platform/src/render/Template.ts b/services/platform/src/render/Template.ts deleted file mode 100644 index 636c85e8..00000000 --- a/services/platform/src/render/Template.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { htmlToText } from 'html-to-text' -import Render, { RenderObject, Variables, Wrap } from '.' -import { ChannelType } from '../config/channels' -import Model, { ModelParams } from '../core/Model' -import { isValid, IsValidSchema } from '../core/validate' -import { Email, NamedEmail } from '../providers/email/Email' -import { BasePush } from '../providers/push/Push' -import { Webhook } from '../providers/webhook/Webhook' -import Provider from '../providers/Provider' -import { paramsToEncodedLink } from './LinkService' -import { UUID } from 'crypto' -import { getCampaignProvider } from '../campaigns/CampaignService' - -export default class Template extends Model { - project_id!: UUID - campaign_id!: UUID - type!: ChannelType - data!: Record - locale!: string - - static tableName = 'templates' - - static jsonAttributes = ['data'] - - async map(): Promise { - const json = this as any - switch (this.type) { - case 'email': { - const provider = await getCampaignProvider(this.campaign_id, this.project_id) - const template = EmailTemplate.fromJson(json) - return template.withProvider(provider) - } - case 'text': { - return TextTemplate.fromJson(json) - } - case 'push': { - return PushTemplate.fromJson(json) - } - default: { - return WebhookTemplate.fromJson(json) - } - } - } - - validate(): IsValidSchema { - return [true, undefined] - } - - requiredErrors(...fields: string[]) { - const errors: Record = {} - for (const field of fields) { - errors[field] = `The \`${field}\` field on the \`${this.locale}\` template is missing and is required.` - } - return errors - } -} - -export type TemplateParams = Omit -export type TemplateUpdateParams = Pick -export type TemplateType = EmailTemplate | TextTemplate | PushTemplate | WebhookTemplate - -type CompiledEmail = Omit & { preheader?: string } - -export class EmailTemplate extends Template { - declare type: 'email' - from!: string | NamedEmail - cc?: string - bcc?: string - reply_to?: string - subject!: string - preheader?: string - editor!: 'code' | 'visual' - text?: string - html!: string - - withProvider(provider: Provider | undefined) { - if (!provider) return this - - const defaults = { - name: provider.data.default_from_name ?? '', - address: provider.data.default_from ?? '', - reply_to: provider.data.default_reply_to ?? undefined, - } - - // Normalize existing "from" into an object shape - let current: NamedEmail | undefined - if (!this.from) { - current = undefined - } else if (typeof this.from === 'string') { - current = { name: '', address: this.from } - } else { - current = this.from - } - - this.reply_to = this.reply_to ?? defaults.reply_to - this.from = { - name: current?.name ?? defaults.name, - address: current?.address ?? defaults.address, - } - - this.data = { - ...this.data, - from: this.from, - reply_to: this.reply_to, - } - - return this - } - - parseJson(json: any) { - super.parseJson(json) - - this.from = json?.data.from - this.cc = json?.data.cc - this.bcc = json?.data.bcc - this.reply_to = json?.data.reply_to - this.subject = json?.data.subject ?? '' - this.preheader = json?.data.preheader - this.editor = json?.data.type ?? 'code' - this.text = json?.data.text - this.html = json?.data.html ?? '' - } - - compile(variables: Variables): CompiledEmail { - const html = Render(this.html, variables) - const preheader = this.preheader ? Render(this.preheader, variables) : undefined - const email: CompiledEmail = { - subject: Render(this.subject, variables), - from: typeof this.from === 'string' - ? Render(this.from, variables) - : { - name: Render(this.from?.name ?? '', variables), - address: Render(this.from?.address ?? '', variables), - }, - html: Wrap({ html, preheader, variables }), // Add link and open tracking - - // If the text copy has been left empty, generate from HTML - text: this.text !== undefined && this.text !== '' - ? Render(this.text, variables) - : htmlToText(html), - } - - if (preheader) email.preheader = preheader - if (this.reply_to) email.reply_to = Render(this.reply_to, variables) - if (this.cc) email.cc = Render(this.cc, variables) - if (this.bcc) email.bcc = Render(this.bcc, variables) - return email - } - - validate() { - return isValid({ - type: 'object', - required: ['from', 'subject', 'html'], - properties: { - from: { - type: 'object', - required: ['address'], - properties: { - name: { type: 'string', nullable: true }, - address: { type: 'string', format: 'email' }, - }, - }, - subject: { type: 'string' }, - text: { type: 'string' }, - html: { type: 'string' }, - }, - additionalProperties: true, - errorMessage: { - required: this.requiredErrors('from', 'subject', 'text', 'html'), - }, - }, this.data) - } -} - -export interface CompiledText { - text: string -} - -export class TextTemplate extends Template { - declare type: 'text' - text!: string - - parseJson(json: any) { - super.parseJson(json) - - this.text = json?.data.text - } - - compile(variables: Variables): CompiledText { - return { text: Render(this.text ?? '', variables) } - } - - validate() { - return isValid({ - type: 'object', - required: ['text'], - properties: { - text: { type: 'string' }, - }, - errorMessage: { - required: this.requiredErrors('text'), - }, - }, this.data) - } -} - -export class PushTemplate extends Template { - declare type: 'push' - title!: string - body!: string - url?: string - silent!: boolean - custom!: Record - - parseJson(json: any) { - super.parseJson(json) - - this.title = json?.data.title - this.body = json?.data.body - this.url = json?.data.url - this.silent = json?.data.silent ?? false - this.custom = json?.data.custom ?? {} - } - - compile(variables: Variables): BasePush { - const custom = RenderObject(this.custom, variables) - const url = this.compileUrl(variables) - - return { - title: Render(this.title, variables), - body: Render(this.body, variables), - silent: this.silent, - custom: { - ...custom, - ...url ? { url } : {}, - }, - } - } - - compileUrl(variables: Variables) { - if (this.url === undefined) { - return undefined - } - - const { project, user, context } = variables - const renderedUrl = Render(this.url, variables) - - return project.link_wrap_push - ? paramsToEncodedLink({ - userId: user.id, - campaignId: context.campaign_id, - referenceId: context.reference_id, - redirect: renderedUrl, - path: 'c', - }) - : renderedUrl - } - - validate() { - return isValid({ - type: 'object', - required: ['title', 'body'], - properties: { - title: { type: 'string' }, - body: { type: 'string' }, - url: { type: 'string', nullable: true }, - }, - additionalProperties: true, - errorMessage: { - required: this.requiredErrors('title', 'body'), - }, - }, this.data) - } -} - -export class WebhookTemplate extends Template { - declare type: 'webhook' - method!: 'DELETE' | 'GET' | 'PATCH' | 'POST' | 'PUT' - endpoint!: string - body!: Record - headers: Record = {} - cacheKey?: string - - parseJson(json: any) { - super.parseJson(json) - - this.method = json?.data.method - this.endpoint = json?.data.endpoint - this.body = json?.data.body - this.headers = json?.data.headers || {} - this.cacheKey = json?.data.cache_key - } - - compile(variables: Variables): Webhook { - const headers = RenderObject(this.headers, variables) - const body = ['POST', 'PATCH', 'PUT'].includes(this.method) - ? RenderObject(this.body, variables) - : undefined - - const endpoint = Render(this.endpoint, variables) - const cacheKey = this.cacheKey - ? Render(this.cacheKey, variables) - : undefined - const method = this.method - return { - endpoint, - method, - headers, - body, - cacheKey, - } - } - - validate() { - return isValid({ - type: 'object', - required: ['method', 'endpoint'], - properties: { - method: { type: 'string' }, - endpoint: { type: 'string', nullable: true }, - }, - additionalProperties: true, - errorMessage: { - required: this.requiredErrors('method', 'endpoint'), - }, - }, this.data) - } -} diff --git a/services/platform/src/render/TemplateController.ts b/services/platform/src/render/TemplateController.ts deleted file mode 100644 index cda85727..00000000 --- a/services/platform/src/render/TemplateController.ts +++ /dev/null @@ -1,258 +0,0 @@ -import Router from '@koa/router' -import { isHandlerbarsError, Variables } from '.' -import { ProjectState } from '../auth/AuthMiddleware' -import { ChannelType } from '../config/channels' -import { RequestError } from '../core/errors' -import { searchParamsSchema } from '../core/searchParams' -import { JSONSchemaType, validate } from '../core/validate' -import { User } from '../users/User' -import { UserEvent } from '../users/UserEvent' -import { extractQueryParams } from '../utilities' -import Template, { TemplateParams, TemplateUpdateParams } from './Template' -import { createTemplate, deleteTemplate, getTemplate, pagedTemplates, sendProof, updateTemplate } from './TemplateService' -import { UUID } from 'crypto' -import { validate as uuidValidate } from 'uuid' -import Campaign from '../campaigns/Campaign' - -const router = new Router< - ProjectState & { template?: Template, campaign?: Campaign } ->({ - prefix: '/templates', -}) - -router.get('/', async ctx => { - const params = extractQueryParams(ctx.query, searchParamsSchema) - ctx.body = await pagedTemplates(params, ctx.state.project.id) -}) - -const templateDataEmailParams = { - type: 'object', - properties: { - from: { - type: 'object', - nullable: true, - properties: { - name: { - type: 'string', - nullable: true, - }, - address: { - type: 'string', - nullable: true, - format: 'email', - }, - }, - }, - cc: { - type: 'string', - nullable: true, - format: 'email', - }, - bcc: { - type: 'string', - nullable: true, - format: 'email', - }, - reply_to: { - type: 'string', - nullable: true, - format: 'email', - }, - subject: { - type: 'string', - nullable: true, - }, - text: { - type: 'string', - nullable: true, - }, - html: { - type: 'string', - nullable: true, - }, - }, - nullable: true, -} - -const templateDataTextParams = { - type: 'object', - properties: { - text: { - type: 'string', - nullable: true, - }, - }, - nullable: true, -} - -const templateDataPushParams = { - type: 'object', - properties: { - title: { type: 'string' }, - body: { type: 'string' }, - custom: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - }, - nullable: true, -} - -const templateDataWebhookParams = { - type: 'object', - properties: { - method: { type: 'string' }, - endpoint: { type: 'string' }, - body: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - headers: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - }, - nullable: true, -} - -const baseCreateType = (type: ChannelType, data: any) => ({ - type: 'object', - required: ['type', 'campaign_id', 'locale'], - properties: { - type: { - type: 'string', - enum: [type], - }, - campaign_id: { - type: 'string', - format: 'uuid', - }, - locale: { - type: 'string', - }, - name: { type: 'string', nullable: true }, - data, - }, - additionalProperties: false, -}) as any - -const baseUpdateType = (type: ChannelType, data: any) => ({ - type: 'object', - required: ['type', 'data'], - properties: { - type: { - type: 'string', - enum: [type], - }, - name: { type: 'string', nullable: true }, - data, - }, - additionalProperties: false, -}) as any - -const templateCreateParams: JSONSchemaType = { - $id: 'templateCreateParams', - oneOf: [ - baseCreateType('email', templateDataEmailParams), - baseCreateType('text', templateDataTextParams), - baseCreateType('push', templateDataPushParams), - baseCreateType('webhook', templateDataWebhookParams), - ], -} -router.post('/', async ctx => { - const payload = validate(templateCreateParams, ctx.request.body) - ctx.body = await createTemplate(ctx.state.project.id, payload) -}) - -router.param('templateId', async (value, ctx, next) => { - if (!uuidValidate(value)) { - ctx.throw(400, 'Invalid template ID') - return - } - - ctx.state.template = await getTemplate(value as UUID, ctx.state.project.id) - if (!ctx.state.template) { - ctx.throw(404) - return - } - return await next() -}) - -router.get('/:templateId', async ctx => { - ctx.body = ctx.state.template -}) - -const templateUpdateParams: JSONSchemaType = { - $id: 'templateUpdateParams', - oneOf: [ - baseUpdateType('email', templateDataEmailParams), - baseUpdateType('text', templateDataTextParams), - baseUpdateType('push', templateDataPushParams), - baseUpdateType('webhook', templateDataWebhookParams), - ], -} -router.patch('/:templateId', async ctx => { - const body = { ...ctx.request.body, type: ctx.state.template!.type } - const payload = validate(templateUpdateParams, body) - ctx.body = await updateTemplate(ctx.state.template!.id, payload) -}) - -router.delete('/:templateId', async ctx => { - const template = ctx.state.template! - ctx.body = await deleteTemplate(template.id, template.project_id) -}) - -router.post('/:templateId/preview', async ctx => { - const payload = ctx.request.body as Variables - const template = await ctx.state.template!.map() - - try { - ctx.body = template.compile({ - user: User.fromJson({ ...payload.user, data: payload.user }), - event: UserEvent.fromJson(payload.event || {}), - journey: payload.journey || {}, - context: payload.context || {}, - project: ctx.state.project, - }) - } catch (error: any) { - throw new RequestError(error.message, 400) - } -}) - -interface TemplateProofParams { - variables: any - recipient: string -} - -const templateProofParams: JSONSchemaType = { - $id: 'templateProof', - type: 'object', - required: ['recipient'], - properties: { - variables: { - type: 'object', - nullable: true, - additionalProperties: true, - }, - recipient: { type: 'string' }, - }, - additionalProperties: false, -} -router.post('/:templateId/proof', async ctx => { - const { variables, recipient } = validate(templateProofParams, ctx.request.body) - const template = await ctx.state.template!.map() - try { - ctx.body = await sendProof(template, variables, recipient) - } catch (error) { - if (isHandlerbarsError(error)) { - throw new RequestError('Failed to send proof, invalid Handlebars in template', 400) - } else { - throw error - } - } -}) - -export default router diff --git a/services/platform/src/render/TemplateService.ts b/services/platform/src/render/TemplateService.ts deleted file mode 100644 index 73d9172d..00000000 --- a/services/platform/src/render/TemplateService.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { PageParams } from '../core/searchParams' -import Template, { EmailTemplate, PushTemplate, TemplateParams, TemplateType, TemplateUpdateParams, TextTemplate, WebhookTemplate } from './Template' -import { partialMatchLocale, pick } from '../utilities' -import { Variables } from '.' -import { loadEmailChannel } from '../providers/email' -import { getCampaign } from '../campaigns/CampaignService' -import { User } from '../users/User' -import { UserEvent } from '../users/UserEvent' -import { loadTextChannel } from '../providers/text' -import { RequestError } from '../core/errors' -import CampaignError from '../campaigns/CampaignError' -import { loadPushChannel } from '../providers/push' -import { disableNotifications, getUserFromEmail, getUserFromPhone } from '../users/UserRepository' -import { loadWebhookChannel } from '../providers/webhook' -import Project from '../projects/Project' -import { getProject } from '../projects/ProjectService' -import { logger } from '../config/logger' -import EventPostJob from '../client/EventPostJob' -import { getPushDevicesForUser } from '../users/DeviceRepository' -import Campaign from '../campaigns/Campaign' -import { UUID } from 'crypto' - -export const pagedTemplates = async (params: PageParams, projectId: UUID) => { - return await Template.search( - params, - qb => qb.where('project_id', projectId), - ) -} - -export const allTemplates = async (projectId: UUID, campaignId?: UUID): Promise => { - return await Template.all(qb => { - if (campaignId) { - qb.where('campaign_id', campaignId) - } - return qb.where('project_id', projectId) - }) -} - -export const getTemplate = async (id: UUID, projectId: UUID) => { - return await Template.find(id, qb => qb.where('project_id', projectId)) -} - -export const createTemplate = async (projectId: UUID, params: TemplateParams) => { - return await Template.insertAndFetch({ - ...params, - data: params.data ?? {}, - project_id: projectId, - }) -} - -export const updateTemplate = async (templateId: UUID, params: TemplateUpdateParams) => { - return await Template.updateAndFetch(templateId, params) -} - -export const deleteTemplate = async (id: UUID, projectId: UUID) => { - return await Template.deleteById(id, qb => qb.where('project_id', projectId)) -} - -export const duplicateTemplate = async (template: Template, campaignId: UUID) => { - const params: Partial