diff --git a/.cspell.json b/.cspell.json index ad07ccd8fa1..b29827d886b 100644 --- a/.cspell.json +++ b/.cspell.json @@ -522,6 +522,7 @@ "pubid", "PUID", "pulumi", + "pulsecron", "Pushpad", "Pushwoosh", "pychecker", @@ -851,11 +852,11 @@ "*.riv", "*/**/.vscode/settings.json", "*/**/CHANGELOG.md", - "apps/api/src/app/workflows-v2/e2e/generate-preview.e2e.ts", + "**/*.e2e.ts", + "**/*.spec.ts", "angular.json", "apps/api/src/.env.test", "apps/api/src/app/analytics/usecases/hubspot-identify-form/hubspot-identify-form.usecase.ts", - "apps/api/src/app/translations/e2e/v2/**/*", "apps/api/src/app/workflows-v2/maily-test-data.ts", "apps/api/src/app/workflows-v2/usecases/validate-content/validate-placeholders/validate-placeholder.usecase.ts", "apps/api/src/app/workflows-v2/util/json-schema-mock.ts", @@ -887,7 +888,7 @@ "apps/dashboard/src/components/variable/constants.ts", "apps/dashboard/src/utils/locales.ts", "apps/dashboard/src/components/primitives/constants.ts", - "enterprise/workers/socket/worker-configuration.d.ts", - "enterprise/workers/scheduler/worker-configuration.d.ts", + "enterprise/workers/socket/worker-configuration.d.ts", + "enterprise/workers/scheduler/worker-configuration.d.ts" ] } diff --git a/apps/api/src/app/change/usecases/promote-layout-change/promote-layout-change.use-case.ts b/apps/api/src/app/change/usecases/promote-layout-change/promote-layout-change.use-case.ts index cb11237f65d..bc0b21bb66f 100644 --- a/apps/api/src/app/change/usecases/promote-layout-change/promote-layout-change.use-case.ts +++ b/apps/api/src/app/change/usecases/promote-layout-change/promote-layout-change.use-case.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { LayoutEntity, LayoutRepository } from '@novu/dal'; import { PromoteTypeChangeCommand } from '../promote-type-change.command'; @@ -8,14 +8,19 @@ export class PromoteLayoutChange { constructor(private layoutRepository: LayoutRepository) {} async execute(command: PromoteTypeChangeCommand) { + const itemId = command.item._id; + if (!itemId) { + throw new BadRequestException('Item must have an _id to promote layout change'); + } + let item = await this.layoutRepository.findOne({ _environmentId: command.environmentId, - _parentId: command.item._id, + _parentId: itemId, }); // For the scenario where the layout is deleted and an active default layout change was pending if (!item) { - item = await this.layoutRepository.findDeletedByParentId(command.item._id, command.environmentId); + item = await this.layoutRepository.findDeletedByParentId(itemId, command.environmentId); } const newItem = command.item as LayoutEntity; @@ -41,7 +46,7 @@ export class PromoteLayoutChange { const count = await this.layoutRepository.count({ _organizationId: command.organizationId, - _id: command.item._id, + _id: itemId, }); if (count === 0) { diff --git a/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.command.ts b/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.command.ts index 88b25abf731..4ce4835e93d 100644 --- a/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.command.ts +++ b/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.command.ts @@ -1,7 +1,9 @@ // apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.command.ts +import { IsValidContextPayload } from '@novu/application-generic'; +import { ContextPayload } from '@novu/shared'; import { Type } from 'class-transformer'; -import { IsArray, IsDefined } from 'class-validator'; +import { IsArray, IsDefined, IsOptional } from 'class-validator'; import { EnvironmentWithSubscriber } from '../../../shared/commands/project.command'; import { BulkUpdatePreferenceItemDto } from '../../dtos/bulk-update-preferences-request.dto'; @@ -11,4 +13,8 @@ export class BulkUpdatePreferencesCommand extends EnvironmentWithSubscriber { @IsArray() @Type(() => BulkUpdatePreferenceItemDto) readonly preferences: BulkUpdatePreferenceItemDto[]; + + @IsOptional() + @IsValidContextPayload({ maxCount: 5 }) + readonly context?: ContextPayload; } diff --git a/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.spec.ts b/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.spec.ts index 1e300cce141..564ecb4468b 100644 --- a/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.spec.ts +++ b/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.spec.ts @@ -1,6 +1,11 @@ import { BadRequestException, NotFoundException, UnprocessableEntityException } from '@nestjs/common'; -import { AnalyticsService } from '@novu/application-generic'; -import { EnvironmentRepository, NotificationTemplateRepository, SubscriberRepository } from '@novu/dal'; +import { AnalyticsService, FeatureFlagsService } from '@novu/application-generic'; +import { + ContextRepository, + EnvironmentRepository, + NotificationTemplateRepository, + SubscriberRepository, +} from '@novu/dal'; import { PreferenceLevelEnum, TriggerTypeEnum } from '@novu/shared'; import { expect } from 'chai'; import sinon from 'sinon'; @@ -80,18 +85,26 @@ describe('BulkUpdatePreferences', () => { let notificationTemplateRepositoryMock: sinon.SinonStubbedInstance; let updatePreferencesUsecaseMock: sinon.SinonStubbedInstance; let environmentRepositoryMock: sinon.SinonStubbedInstance; + let contextRepositoryMock: sinon.SinonStubbedInstance; + let featureFlagsServiceMock: sinon.SinonStubbedInstance; + beforeEach(() => { subscriberRepositoryMock = sinon.createStubInstance(SubscriberRepository); analyticsServiceMock = sinon.createStubInstance(AnalyticsService); notificationTemplateRepositoryMock = sinon.createStubInstance(NotificationTemplateRepository); updatePreferencesUsecaseMock = sinon.createStubInstance(UpdatePreferences); environmentRepositoryMock = sinon.createStubInstance(EnvironmentRepository); + contextRepositoryMock = sinon.createStubInstance(ContextRepository); + featureFlagsServiceMock = sinon.createStubInstance(FeatureFlagsService); + bulkUpdatePreferences = new BulkUpdatePreferences( notificationTemplateRepositoryMock as any, subscriberRepositoryMock as any, analyticsServiceMock as any, updatePreferencesUsecaseMock as any, - environmentRepositoryMock as any + environmentRepositoryMock as any, + contextRepositoryMock as any, + featureFlagsServiceMock as any ); }); diff --git a/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.usecase.ts b/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.usecase.ts index 5dc6309a477..b0422328839 100644 --- a/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.usecase.ts +++ b/apps/api/src/app/inbox/usecases/bulk-update-preferences/bulk-update-preferences.usecase.ts @@ -1,13 +1,14 @@ import { BadRequestException, Injectable, NotFoundException, UnprocessableEntityException } from '@nestjs/common'; -import { AnalyticsService, InstrumentUsecase } from '@novu/application-generic'; +import { AnalyticsService, FeatureFlagsService, InstrumentUsecase } from '@novu/application-generic'; import { BaseRepository, + ContextRepository, EnvironmentRepository, NotificationTemplateEntity, NotificationTemplateRepository, SubscriberRepository, } from '@novu/dal'; -import { PreferenceLevelEnum } from '@novu/shared'; +import { ContextPayload, FeatureFlagsKeysEnum, PreferenceLevelEnum } from '@novu/shared'; import { BulkUpdatePreferenceItemDto } from '../../dtos/bulk-update-preferences-request.dto'; import { AnalyticsEventsEnum } from '../../utils'; import { InboxPreference } from '../../utils/types'; @@ -24,11 +25,15 @@ export class BulkUpdatePreferences { private subscriberRepository: SubscriberRepository, private analyticsService: AnalyticsService, private updatePreferencesUsecase: UpdatePreferences, - private environmentRepository: EnvironmentRepository + private environmentRepository: EnvironmentRepository, + private contextRepository: ContextRepository, + private featureFlagsService: FeatureFlagsService ) {} @InstrumentUsecase() async execute(command: BulkUpdatePreferencesCommand): Promise { + const contextKeys = await this.resolveContexts(command.environmentId, command.organizationId, command.context); + const subscriber = await this.subscriberRepository.findBySubscriberId(command.environmentId, command.subscriberId); if (!subscriber) throw new NotFoundException(`Subscriber with id: ${command.subscriberId} is not found`); @@ -102,7 +107,7 @@ export class BulkUpdatePreferences { organizationId: command.organizationId, subscriberId: command.subscriberId, environmentId: command.environmentId, - contextKeys: command.contextKeys, + contextKeys, level: PreferenceLevelEnum.TEMPLATE, subscriptionIdentifier: preference.subscriptionIdentifier, ...(isUpdatingSubscriptionPreference && { @@ -131,4 +136,33 @@ export class BulkUpdatePreferences { return updatedPreferences; } + + private async resolveContexts( + environmentId: string, + organizationId: string, + context?: ContextPayload + ): Promise { + // Check if context preferences feature is enabled + const isEnabled = await this.featureFlagsService.getFlag({ + key: FeatureFlagsKeysEnum.IS_CONTEXT_PREFERENCES_ENABLED, + defaultValue: false, + organization: { _id: organizationId }, + }); + + if (!isEnabled) { + return undefined; // Ignore context when FF is off + } + + if (!context) { + return []; + } + + const contexts = await this.contextRepository.findOrCreateContextsFromPayload( + environmentId, + organizationId, + context + ); + + return contexts.map((ctx) => ctx.key); + } } diff --git a/apps/api/src/app/inbox/usecases/snooze-notification/snooze-notification.usecase.ts b/apps/api/src/app/inbox/usecases/snooze-notification/snooze-notification.usecase.ts index eb1883d6288..a11d093a7f6 100644 --- a/apps/api/src/app/inbox/usecases/snooze-notification/snooze-notification.usecase.ts +++ b/apps/api/src/app/inbox/usecases/snooze-notification/snooze-notification.usecase.ts @@ -174,7 +174,7 @@ export class SnoozeNotification { status: JobStatusEnum.PENDING, delay, createdAt: Date.now().toString(), - id: JobRepository.createObjectId(), + _id: JobRepository.createObjectId(), _parentId: null, payload: { ...originalJob.payload, diff --git a/apps/api/src/app/subscribers-v2/dtos/bulk-update-subscriber-preferences.dto.ts b/apps/api/src/app/subscribers-v2/dtos/bulk-update-subscriber-preferences.dto.ts index 948f83df583..36d1258abdf 100644 --- a/apps/api/src/app/subscribers-v2/dtos/bulk-update-subscriber-preferences.dto.ts +++ b/apps/api/src/app/subscribers-v2/dtos/bulk-update-subscriber-preferences.dto.ts @@ -1,7 +1,9 @@ import { ApiProperty } from '@nestjs/swagger'; -import { parseSlugId } from '@novu/application-generic'; +import { IsValidContextPayload, parseSlugId } from '@novu/application-generic'; +import { ContextPayload } from '@novu/shared'; import { Transform, Type } from 'class-transformer'; -import { ArrayMaxSize, IsArray, IsDefined, IsString, ValidateNested } from 'class-validator'; +import { ArrayMaxSize, IsArray, IsDefined, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { ApiContextPayload } from '../../shared/framework/swagger'; import { PatchPreferenceChannelsDto } from './patch-subscriber-preferences.dto'; export class BulkUpdateSubscriberPreferenceItemDto { @@ -30,4 +32,9 @@ export class BulkUpdateSubscriberPreferencesDto { @Type(() => BulkUpdateSubscriberPreferenceItemDto) @ValidateNested({ each: true }) readonly preferences: BulkUpdateSubscriberPreferenceItemDto[]; + + @ApiContextPayload() + @IsOptional() + @IsValidContextPayload({ maxCount: 5 }) + context?: ContextPayload; } diff --git a/apps/api/src/app/subscribers-v2/dtos/get-subscriber-preferences-request.dto.ts b/apps/api/src/app/subscribers-v2/dtos/get-subscriber-preferences-request.dto.ts index 2bc1dfadda9..a001d2b54d4 100644 --- a/apps/api/src/app/subscribers-v2/dtos/get-subscriber-preferences-request.dto.ts +++ b/apps/api/src/app/subscribers-v2/dtos/get-subscriber-preferences-request.dto.ts @@ -1,6 +1,7 @@ import { ApiPropertyOptional } from '@nestjs/swagger'; import { WorkflowCriticalityEnum } from '@novu/shared'; -import { IsEnum, IsOptional } from 'class-validator'; +import { Transform } from 'class-transformer'; +import { IsArray, IsEnum, IsOptional, IsString } from 'class-validator'; export class GetSubscriberPreferencesRequestDto { @IsEnum(WorkflowCriticalityEnum) @@ -10,4 +11,25 @@ export class GetSubscriberPreferencesRequestDto { default: WorkflowCriticalityEnum.NON_CRITICAL, }) criticality?: WorkflowCriticalityEnum = WorkflowCriticalityEnum.NON_CRITICAL; + + @IsOptional() + @Transform(({ value }) => { + // No parameter = no filter + if (value === undefined) return undefined; + + // Empty string = filter for records with no (default) context + if (value === '') return []; + + // Normalize to array and remove empty strings + const array = Array.isArray(value) ? value : [value]; + return array.filter((v) => v !== ''); + }) + @IsArray() + @IsString({ each: true }) + @ApiPropertyOptional({ + description: 'Context keys for filtering preferences (e.g., ["tenant:acme"])', + type: [String], + example: ['tenant:acme'], + }) + contextKeys?: string[]; } diff --git a/apps/api/src/app/subscribers-v2/dtos/patch-subscriber-preferences.dto.ts b/apps/api/src/app/subscribers-v2/dtos/patch-subscriber-preferences.dto.ts index 3cc89f47556..c6aa33bc2bf 100644 --- a/apps/api/src/app/subscribers-v2/dtos/patch-subscriber-preferences.dto.ts +++ b/apps/api/src/app/subscribers-v2/dtos/patch-subscriber-preferences.dto.ts @@ -1,9 +1,10 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { parseSlugId } from '@novu/application-generic'; -import { IPreferenceChannels } from '@novu/shared'; +import { IsValidContextPayload, parseSlugId } from '@novu/application-generic'; +import { ContextPayload, IPreferenceChannels } from '@novu/shared'; import { Transform, Type } from 'class-transformer'; import { IsOptional, ValidateNested } from 'class-validator'; import { ScheduleDto } from '../../shared/dtos/schedule'; +import { ApiContextPayload } from '../../shared/framework/swagger'; export class PatchPreferenceChannelsDto implements IPreferenceChannels { @ApiProperty({ description: 'Email channel preference' }) @@ -41,4 +42,9 @@ export class PatchSubscriberPreferencesDto { @ValidateNested() @Type(() => ScheduleDto) schedule?: ScheduleDto; + + @ApiContextPayload() + @IsOptional() + @IsValidContextPayload({ maxCount: 5 }) + context?: ContextPayload; } diff --git a/apps/api/src/app/subscribers-v2/e2e/get-subscriber-preferences.e2e.ts b/apps/api/src/app/subscribers-v2/e2e/get-subscriber-preferences.e2e.ts index 90acd26d8e1..37401624071 100644 --- a/apps/api/src/app/subscribers-v2/e2e/get-subscriber-preferences.e2e.ts +++ b/apps/api/src/app/subscribers-v2/e2e/get-subscriber-preferences.e2e.ts @@ -14,6 +14,7 @@ describe('Get Subscriber Preferences - /subscribers/:subscriberId/preferences (G let workflow: NotificationTemplateEntity; beforeEach(async () => { + (process.env as any).IS_CONTEXT_PREFERENCES_ENABLED = 'true'; const uuid = randomBytes(4).toString('hex'); session = new UserSession(); await session.initialize(); @@ -24,8 +25,12 @@ describe('Get Subscriber Preferences - /subscribers/:subscriberId/preferences (G }); }); + afterEach(() => { + delete (process.env as any).IS_CONTEXT_PREFERENCES_ENABLED; + }); + it('should fetch subscriber preferences with default values', async () => { - const response = await novuClient.subscribers.preferences.list(subscriber.subscriberId); + const response = await novuClient.subscribers.preferences.list({ subscriberId: subscriber.subscriberId }); const { global, workflows } = response.result; @@ -37,7 +42,7 @@ describe('Get Subscriber Preferences - /subscribers/:subscriberId/preferences (G it('should return 404 if subscriber does not exist', async () => { const invalidSubscriberId = `non-existent-${randomBytes(2).toString('hex')}`; const { error } = await expectSdkExceptionGeneric(() => - novuClient.subscribers.preferences.list(invalidSubscriberId) + novuClient.subscribers.preferences.list({ subscriberId: invalidSubscriberId }) ); expect(error?.statusCode).to.equal(404); @@ -48,7 +53,7 @@ describe('Get Subscriber Preferences - /subscribers/:subscriberId/preferences (G const workflow2 = await session.createTemplate({ noFeedId: true }); const workflow3 = await session.createTemplate({ noFeedId: true }); - const response = await novuClient.subscribers.preferences.list(subscriber.subscriberId); + const response = await novuClient.subscribers.preferences.list({ subscriberId: subscriber.subscriberId }); const { workflows } = response.result; @@ -75,7 +80,7 @@ describe('Get Subscriber Preferences - /subscribers/:subscriberId/preferences (G const newWorkflow = await session.createTemplate({ noFeedId: true }); // Check preferences - const response = await novuClient.subscribers.preferences.list(subscriber.subscriberId); + const response = await novuClient.subscribers.preferences.list({ subscriberId: subscriber.subscriberId }); const { workflows } = response.result; @@ -85,6 +90,106 @@ describe('Get Subscriber Preferences - /subscribers/:subscriberId/preferences (G // New workflow should inherit global settings expect(newWorkflowPreferences?.channels).to.deep.equal({ email: false, inApp: true }); }); + + it('should filter preferences by contextKeys', async () => { + // Create preference for context A + await novuClient.subscribers.preferences.update( + { + workflowId: workflow._id, + channels: { email: false }, + context: { tenant: 'acme' }, + }, + subscriber.subscriberId + ); + + // Create preference for context B + const workflow2 = await session.createTemplate({ noFeedId: true }); + await novuClient.subscribers.preferences.update( + { + workflowId: workflow2._id, + channels: { email: false }, + context: { tenant: 'globex' }, + }, + subscriber.subscriberId + ); + + // List with context A filter + const responseA = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:acme'], + }); + + // Should return BOTH workflows (all workflows always returned regardless of context) + const workflowIdentifiers = responseA.result.workflows.map((w) => w.workflow.identifier); + expect(workflowIdentifiers).to.include(workflow.triggers[0].identifier); + expect(workflowIdentifiers).to.include(workflow2.triggers[0].identifier); + + // workflow1 uses tenant:acme preference (email: false) + const wf1 = responseA.result.workflows.find((w) => w.workflow.identifier === workflow.triggers[0].identifier); + expect(wf1?.channels.email).to.equal(false); + + // workflow2 falls back to global/default (email: true by default) + const wf2 = responseA.result.workflows.find((w) => w.workflow.identifier === workflow2.triggers[0].identifier); + expect(wf2?.channels.email).to.equal(true); + }); + + it('should return default preferences when no context-specific preference exists', async () => { + // Create workflow preference for context A + await novuClient.subscribers.preferences.update( + { + workflowId: workflow._id, + channels: { email: false }, + context: { tenant: 'acme' }, + }, + subscriber.subscriberId + ); + + // List with different context B (no specific preference exists) + const response = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:globex'], + }); + + // Should return workflow with default/inherited settings + expect(response.result.workflows).to.have.lengthOf(1); + // Default should be enabled + expect(response.result.workflows[0].channels.email).to.equal(true); + }); + + it('should isolate preferences per context', async () => { + // Set global preference + await novuClient.subscribers.preferences.update( + { + channels: { email: false, inApp: false }, + }, + subscriber.subscriberId + ); + + // Create workflow preference for context A (override email) + await novuClient.subscribers.preferences.update( + { + workflowId: workflow._id, + channels: { email: true }, // Override to true + context: { tenant: 'acme' }, + }, + subscriber.subscriberId + ); + + // List with context A + const responseA = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:acme'], + }); + expect(responseA.result.workflows[0].channels.email).to.equal(true); + expect(responseA.result.global.channels.email).to.equal(false); // Global unchanged + + // List with context B (should see global) + const responseB = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:globex'], + }); + expect(responseB.result.workflows[0].channels.email).to.equal(false); // Inherits global + }); }); async function createSubscriberAndValidate(id: string = '') { diff --git a/apps/api/src/app/subscribers-v2/e2e/patch-subscriber-preferences.e2e.ts b/apps/api/src/app/subscribers-v2/e2e/patch-subscriber-preferences.e2e.ts index 953a768b361..4f0f7823af7 100644 --- a/apps/api/src/app/subscribers-v2/e2e/patch-subscriber-preferences.e2e.ts +++ b/apps/api/src/app/subscribers-v2/e2e/patch-subscriber-preferences.e2e.ts @@ -24,6 +24,7 @@ describe('Patch Subscriber Preferences - /subscribers/:subscriberId/preferences let workflow: NotificationTemplateEntity; beforeEach(async () => { + (process.env as any).IS_CONTEXT_PREFERENCES_ENABLED = 'true'; const uuid = randomBytes(4).toString('hex'); session = new UserSession(); await session.initialize(); @@ -34,6 +35,10 @@ describe('Patch Subscriber Preferences - /subscribers/:subscriberId/preferences }); }); + afterEach(() => { + delete (process.env as any).IS_CONTEXT_PREFERENCES_ENABLED; + }); + it('should patch workflow channel preferences', async () => { // Patch with workflow id const workflowId = workflow._id; @@ -259,6 +264,101 @@ describe('Patch Subscriber Preferences - /subscribers/:subscriberId/preferences expect(error?.statusCode).to.equal(404); expect(error?.message).to.include('Workflows with ids: non-existent-workflow-id not found'); }); + + it('should create workflow preference with context', async () => { + const patchData: PatchSubscriberPreferencesDto = { + workflowId: workflow._id, + channels: { + email: false, + inApp: true, + }, + context: { tenant: 'acme' }, + }; + + const response = await novuClient.subscribers.preferences.update(patchData, subscriber.subscriberId); + + expect(response.result.workflows).to.have.lengthOf(1); + expect(response.result.workflows[0].channels).to.deep.equal({ inApp: true, email: false }); + }); + + it('should create separate preferences for different contexts', async () => { + // Create preference for context A + await novuClient.subscribers.preferences.update( + { + workflowId: workflow._id, + channels: { email: false }, + context: { tenant: 'acme' }, + }, + subscriber.subscriberId + ); + + // Create preference for context B + await novuClient.subscribers.preferences.update( + { + workflowId: workflow._id, + channels: { email: true }, + context: { tenant: 'globex' }, + }, + subscriber.subscriberId + ); + + // Both should coexist - verify by listing with different contextKeys + const responseA = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:acme'], + }); + expect(responseA.result.workflows[0].channels.email).to.equal(false); + + const responseB = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:globex'], + }); + expect(responseB.result.workflows[0].channels.email).to.equal(true); + }); + + it('should reject context for global preferences', async () => { + const patchData: PatchSubscriberPreferencesDto = { + // No workflowId = global preference + channels: { + email: false, + }, + context: { tenant: 'acme' }, // Should be rejected + }; + + const { error } = await expectSdkExceptionGeneric(() => + novuClient.subscribers.preferences.update(patchData, subscriber.subscriberId) + ); + + expect(error?.statusCode).to.equal(400); + expect(error?.message).to.include('Context cannot be used with global preferences'); + }); + + it('should bulk update with context', async () => { + const bulkUpdateData: BulkUpdateSubscriberPreferencesDto = { + context: { tenant: 'acme' }, + preferences: [ + { + workflowId: workflow._id, + channels: { + email: false, + inApp: true, + }, + }, + ], + }; + + const response = await novuClient.subscribers.preferences.bulkUpdate(bulkUpdateData, subscriber.subscriberId); + + expect(response.result).to.have.lengthOf(1); + expect(response.result[0].channels.email).to.equal(false); + + // Verify it's stored with context + const listResponse = await novuClient.subscribers.preferences.list({ + subscriberId: subscriber.subscriberId, + contextKeys: ['tenant:acme'], + }); + expect(listResponse.result.workflows[0].channels.email).to.equal(false); + }); }); async function createSubscriberAndValidate(id: string = '') { diff --git a/apps/api/src/app/subscribers-v2/subscribers.controller.ts b/apps/api/src/app/subscribers-v2/subscribers.controller.ts index e82d8e0de31..4a79e7b0f0d 100644 --- a/apps/api/src/app/subscribers-v2/subscribers.controller.ts +++ b/apps/api/src/app/subscribers-v2/subscribers.controller.ts @@ -260,6 +260,7 @@ export class SubscribersController { organizationId: user.organizationId, subscriberId, criticality: query.criticality, + contextKeys: query.contextKeys, }) ); } @@ -322,6 +323,7 @@ export class SubscribersController { subscriberId, environmentId: user.environmentId, preferences, + context: body.context, }) ); } @@ -351,6 +353,7 @@ export class SubscribersController { workflowIdOrInternalId: body.workflowId, channels: body.channels, schedule: body.schedule, + context: body.context, }) ); } diff --git a/apps/api/src/app/subscribers-v2/subscribers.module.ts b/apps/api/src/app/subscribers-v2/subscribers.module.ts index 8ac84359ce2..1f334965838 100644 --- a/apps/api/src/app/subscribers-v2/subscribers.module.ts +++ b/apps/api/src/app/subscribers-v2/subscribers.module.ts @@ -15,6 +15,7 @@ import { } from '@novu/application-generic'; import { CommunityOrganizationRepository, + ContextRepository, EnvironmentRepository, IntegrationRepository, MessageRepository, @@ -71,6 +72,7 @@ const DAL_MODELS = [ WorkflowOverrideRepository, TenantRepository, MessageRepository, + ContextRepository, ]; @Module({ diff --git a/apps/api/src/app/subscribers-v2/usecases/get-subscriber-preferences/get-subscriber-preferences.usecase.ts b/apps/api/src/app/subscribers-v2/usecases/get-subscriber-preferences/get-subscriber-preferences.usecase.ts index 9f688b7bfd9..846f1e32c14 100644 --- a/apps/api/src/app/subscribers-v2/usecases/get-subscriber-preferences/get-subscriber-preferences.usecase.ts +++ b/apps/api/src/app/subscribers-v2/usecases/get-subscriber-preferences/get-subscriber-preferences.usecase.ts @@ -57,6 +57,7 @@ export class GetSubscriberPreferences { organizationId: command.organizationId, includeInactiveChannels: false, criticality: command.criticality ?? WorkflowCriticalityEnum.NON_CRITICAL, + contextKeys: command.contextKeys, }) ); diff --git a/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.command.ts b/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.command.ts index 0cf8130dc36..4705780a375 100644 --- a/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.command.ts +++ b/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.command.ts @@ -1,3 +1,5 @@ +import { IsValidContextPayload } from '@novu/application-generic'; +import { ContextPayload } from '@novu/shared'; import { Type } from 'class-transformer'; import { IsOptional, IsString } from 'class-validator'; import { EnvironmentWithSubscriber } from '../../../shared/commands/project.command'; @@ -16,4 +18,8 @@ export class UpdateSubscriberPreferencesCommand extends EnvironmentWithSubscribe @IsOptional() @Type(() => ScheduleDto) readonly schedule?: ScheduleDto; + + @IsOptional() + @IsValidContextPayload({ maxCount: 5 }) + readonly context?: ContextPayload; } diff --git a/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.usecase.ts b/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.usecase.ts index 5d67a5593ee..fda0f235948 100644 --- a/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.usecase.ts +++ b/apps/api/src/app/subscribers-v2/usecases/update-subscriber-preferences/update-subscriber-preferences.usecase.ts @@ -1,6 +1,7 @@ -import { Injectable } from '@nestjs/common'; -import { GetWorkflowByIdsCommand, GetWorkflowByIdsUseCase } from '@novu/application-generic'; -import { PreferenceLevelEnum, WorkflowCriticalityEnum } from '@novu/shared'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { FeatureFlagsService, GetWorkflowByIdsCommand, GetWorkflowByIdsUseCase } from '@novu/application-generic'; +import { ContextRepository } from '@novu/dal'; +import { ContextPayload, FeatureFlagsKeysEnum, PreferenceLevelEnum, WorkflowCriticalityEnum } from '@novu/shared'; import { plainToInstance } from 'class-transformer'; import { UpdatePreferencesCommand } from '../../../inbox/usecases/update-preferences/update-preferences.command'; import { UpdatePreferences } from '../../../inbox/usecases/update-preferences/update-preferences.usecase'; @@ -13,10 +14,16 @@ export class UpdateSubscriberPreferences { constructor( private updatePreferencesUsecase: UpdatePreferences, private getSubscriberPreferences: GetSubscriberPreferences, - private getWorkflowByIdsUseCase: GetWorkflowByIdsUseCase + private getWorkflowByIdsUseCase: GetWorkflowByIdsUseCase, + private contextRepository: ContextRepository, + private featureFlagsService: FeatureFlagsService ) {} async execute(command: UpdateSubscriberPreferencesCommand): Promise { + this.validateContextRequiresWorkflow(command); + + const contextKeys = await this.resolveContexts(command.environmentId, command.organizationId, command.context); + let workflowId: string | undefined; if (command.workflowIdOrInternalId) { const workflowEntity = await this.getWorkflowByIdsUseCase.execute( @@ -39,6 +46,7 @@ export class UpdateSubscriberPreferences { includeInactiveChannels: false, ...command.channels, schedule: command.schedule, + contextKeys, }) ); @@ -47,6 +55,7 @@ export class UpdateSubscriberPreferences { organizationId: command.organizationId, subscriberId: command.subscriberId, criticality: WorkflowCriticalityEnum.NON_CRITICAL, + contextKeys, }); return plainToInstance(GetSubscriberPreferencesDto, { @@ -54,4 +63,41 @@ export class UpdateSubscriberPreferences { workflows: subscriberPreferences.workflows, }); } + + private validateContextRequiresWorkflow(command: UpdateSubscriberPreferencesCommand): void { + if (command.context && !command.workflowIdOrInternalId) { + throw new BadRequestException( + 'Context cannot be used with global preferences. Please provide a workflowId to update workflow preferences with context.' + ); + } + } + + private async resolveContexts( + environmentId: string, + organizationId: string, + context?: ContextPayload + ): Promise { + // Check if context preferences feature is enabled + const isEnabled = await this.featureFlagsService.getFlag({ + key: FeatureFlagsKeysEnum.IS_CONTEXT_PREFERENCES_ENABLED, + defaultValue: false, + organization: { _id: organizationId }, + }); + + if (!isEnabled) { + return undefined; // Ignore context when FF is off + } + + if (!context) { + return []; + } + + const contexts = await this.contextRepository.findOrCreateContextsFromPayload( + environmentId, + organizationId, + context + ); + + return contexts.map((ctx) => ctx.key); + } } diff --git a/apps/dashboard/src/components/activity/activity-table.tsx b/apps/dashboard/src/components/activity/activity-table.tsx index 33ffe7585f7..b0816d2e703 100644 --- a/apps/dashboard/src/components/activity/activity-table.tsx +++ b/apps/dashboard/src/components/activity/activity-table.tsx @@ -1,6 +1,6 @@ import { FeatureFlagsKeysEnum } from '@novu/shared'; import { AnimatePresence, motion } from 'motion/react'; -import { useEffect, useState } from 'react'; +import { useEffect } from 'react'; import { createSearchParams, useLocation, useNavigate, useSearchParams } from 'react-router-dom'; import type { ActivityFilters } from '@/api/activity'; import { Skeleton } from '@/components/primitives/skeleton'; @@ -16,11 +16,14 @@ import { } from '@/components/primitives/table'; import { TablePaginationFooter } from '@/components/primitives/table-pagination-footer'; import { useFeatureFlag } from '@/hooks/use-feature-flag'; +import { usePersistedPageSize } from '@/hooks/use-persisted-page-size'; import { parsePageParam } from '@/utils/parse-page-param'; import { useFetchActivities } from '../../hooks/use-fetch-activities'; import { ActivityEmptyState } from './activity-empty-state'; import { ActivityTableRow } from './components/activity-table-row'; +const ACTIVITY_TABLE_ID = 'activity-table'; + export interface ActivityTableProps { selectedActivityId: string | null; onActivitySelect: (activityItemId: string) => void; @@ -43,9 +46,10 @@ export function ActivityTable({ const location = useLocation(); const navigate = useNavigate(); const isWorkflowRunMigrationEnabled = useFeatureFlag(FeatureFlagsKeysEnum.IS_WORKFLOW_RUN_PAGE_MIGRATION_ENABLED); - - // Page size state - const [pageSize, setPageSize] = useState(10); + const { pageSize, setPageSize } = usePersistedPageSize({ + tableId: ACTIVITY_TABLE_ID, + defaultPageSize: 10, + }); // Get pagination parameters from URL const page = parsePageParam(searchParams.get('page')); @@ -116,6 +120,11 @@ export function ActivityTable({ function handlePageSizeChange(newPageSize: number) { setPageSize(newPageSize); + if (isWorkflowRunMigrationEnabled) { + handleCursorNavigation(null, 'first'); + } else { + handlePageChange(0); + } } return ( diff --git a/apps/dashboard/src/components/contexts/hooks/use-contexts-url-state.ts b/apps/dashboard/src/components/contexts/hooks/use-contexts-url-state.ts index 7476c5140d3..2b4d495abe5 100644 --- a/apps/dashboard/src/components/contexts/hooks/use-contexts-url-state.ts +++ b/apps/dashboard/src/components/contexts/hooks/use-contexts-url-state.ts @@ -1,6 +1,9 @@ import { DirectionEnum } from '@novu/shared'; import { useCallback, useMemo, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; +import { getPersistedPageSize, usePersistedPageSize } from '@/hooks/use-persisted-page-size'; + +const CONTEXTS_TABLE_ID = 'contexts-list'; export type ContextsSortableColumn = 'createdAt' | 'updatedAt'; @@ -26,12 +29,16 @@ export interface ContextsUrlState { handlePageSizeChange: (newSize: number) => void; } -const DEFAULT_LIMIT = 10; +const DEFAULT_LIMIT = getPersistedPageSize(CONTEXTS_TABLE_ID, 10); export const useContextsUrlState = (): ContextsUrlState => { const [searchParams, setSearchParams] = useSearchParams(); const [nextCursor, setNextCursor] = useState(undefined); const [previousCursor, setPreviousCursor] = useState(undefined); + const { setPageSize: setPersistedPageSize } = usePersistedPageSize({ + tableId: CONTEXTS_TABLE_ID, + defaultPageSize: 10, + }); const filterValues: ContextsFilter = useMemo(() => { const search = searchParams.get('search') || ''; @@ -166,6 +173,7 @@ export const useContextsUrlState = (): ContextsUrlState => { const handlePageSizeChange = useCallback( (newSize: number) => { + setPersistedPageSize(newSize); setSearchParams((prev) => { prev.set('limit', newSize.toString()); prev.delete('after'); @@ -174,7 +182,7 @@ export const useContextsUrlState = (): ContextsUrlState => { return prev; }); }, - [setSearchParams] + [setSearchParams, setPersistedPageSize] ); return { diff --git a/apps/dashboard/src/components/http-logs/logs-table.tsx b/apps/dashboard/src/components/http-logs/logs-table.tsx index 3a1adc4906f..2eb429b182f 100644 --- a/apps/dashboard/src/components/http-logs/logs-table.tsx +++ b/apps/dashboard/src/components/http-logs/logs-table.tsx @@ -1,6 +1,5 @@ import { motion } from 'motion/react'; import { useEffect, useMemo, useState } from 'react'; -import { useSearchParams } from 'react-router-dom'; import { ResizablePanel, ResizablePanelGroup } from '@/components/primitives/resizable'; import { Table, @@ -35,6 +34,7 @@ export function RequestsTable({ onLogClick }: RequestsTableProps) { handleNext, handlePrevious, handleFiltersChange, + handlePageSizeChange, clearFilters, hasActiveFilters, currentPage, @@ -42,16 +42,6 @@ export function RequestsTable({ onLogClick }: RequestsTableProps) { filters, } = useLogsUrlState(); - const [, setSearchParams] = useSearchParams(); - - const handlePageSizeChange = (newPageSize: number) => { - setSearchParams((prev) => { - prev.set('limit', newPageSize.toString()); - prev.delete('page'); // Reset to first page when changing page size - return prev; - }); - }; - const track = useTelemetry(); const { diff --git a/apps/dashboard/src/components/layouts/hooks/use-layouts-url-state.tsx b/apps/dashboard/src/components/layouts/hooks/use-layouts-url-state.tsx index a59f0431afa..6a78d014bd9 100644 --- a/apps/dashboard/src/components/layouts/hooks/use-layouts-url-state.tsx +++ b/apps/dashboard/src/components/layouts/hooks/use-layouts-url-state.tsx @@ -1,6 +1,9 @@ import { DirectionEnum } from '@novu/shared'; import { useCallback, useMemo } from 'react'; import { createSearchParams, useSearchParams } from 'react-router-dom'; +import { getPersistedPageSize } from '@/hooks/use-persisted-page-size'; + +const LAYOUTS_TABLE_ID = 'layouts-list'; export type LayoutsSortableColumn = 'name' | 'createdAt' | 'updatedAt'; @@ -17,7 +20,7 @@ export const defaultLayoutsFilter: LayoutsFilter = { orderBy: 'createdAt', orderDirection: DirectionEnum.DESC, offset: 0, - limit: 10, + limit: getPersistedPageSize(LAYOUTS_TABLE_ID, 10), }; export type LayoutsUrlState = { diff --git a/apps/dashboard/src/components/layouts/layout-list.tsx b/apps/dashboard/src/components/layouts/layout-list.tsx index dca07366b02..19271ba320f 100644 --- a/apps/dashboard/src/components/layouts/layout-list.tsx +++ b/apps/dashboard/src/components/layouts/layout-list.tsx @@ -6,6 +6,10 @@ import { LayoutsUrlState, useLayoutsUrlState, } from '@/components/layouts/hooks/use-layouts-url-state'; +import { usePersistedPageSize } from '@/hooks/use-persisted-page-size'; + +const LAYOUTS_TABLE_ID = 'layouts-list'; + import { LayoutListBlank } from '@/components/layouts/layout-list-blank'; import { LayoutRow, LayoutRowSkeleton } from '@/components/layouts/layout-row'; import { LayoutsFilters } from '@/components/layouts/layouts-filters'; @@ -126,6 +130,10 @@ type LayoutListProps = HTMLAttributes; export const LayoutList = (props: LayoutListProps) => { const { filterValues, handleFiltersChange, toggleSort, resetFilters } = useLayoutsUrlState(); + const { setPageSize: setPersistedPageSize } = usePersistedPageSize({ + tableId: LAYOUTS_TABLE_ID, + defaultPageSize: 10, + }); const areFiltersApplied = (Object.keys(filterValues) as (keyof LayoutsFilter)[]).some( (key) => ['query'].includes(key) && filterValues[key] !== '' ); @@ -155,9 +163,10 @@ export const LayoutList = (props: LayoutListProps) => { }; const handlePageSizeChange = (newPageSize: number) => { + setPersistedPageSize(newPageSize); handleFiltersChange({ limit: newPageSize, - offset: 0, // Reset to first page when changing page size + offset: 0, }); }; diff --git a/apps/dashboard/src/components/subscribers/hooks/use-subscribers-url-state.ts b/apps/dashboard/src/components/subscribers/hooks/use-subscribers-url-state.ts index 627963bb5e7..3778b264b26 100644 --- a/apps/dashboard/src/components/subscribers/hooks/use-subscribers-url-state.ts +++ b/apps/dashboard/src/components/subscribers/hooks/use-subscribers-url-state.ts @@ -2,9 +2,12 @@ import { DirectionEnum } from '@novu/shared'; import { useQueryClient } from '@tanstack/react-query'; import { useCallback, useMemo } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; +import { getPersistedPageSize, usePersistedPageSize } from '@/hooks/use-persisted-page-size'; import { QueryKeys } from '@/utils/query-keys'; import { useDebounce } from '../../../hooks/use-debounce'; +const SUBSCRIBERS_TABLE_ID = 'subscribers-list'; + export type SubscribersSortableColumn = '_id' | 'updatedAt'; export interface SubscribersFilter { email?: string; @@ -23,7 +26,7 @@ export const defaultSubscribersFilter: Required = { phone: '', name: '', subscriberId: '', - limit: 10, + limit: getPersistedPageSize(SUBSCRIBERS_TABLE_ID, 10), after: '', before: '', orderBy: '_id', @@ -53,6 +56,10 @@ export function useSubscribersUrlState(props: UseSubscribersUrlStateProps = {}): const [searchParams, setSearchParams] = useSearchParams(); const navigate = useNavigate(); const queryClient = useQueryClient(); + const { setPageSize: setPersistedPageSize } = usePersistedPageSize({ + tableId: SUBSCRIBERS_TABLE_ID, + defaultPageSize: 10, + }); const filterValues = useMemo( () => ({ email: searchParams.get('email') || '', @@ -233,12 +240,13 @@ export function useSubscribersUrlState(props: UseSubscribersUrlStateProps = {}): const handlePageSizeChange = useCallback( (newSize: number) => { + setPersistedPageSize(newSize); updateSearchParams({ ...filterValues, limit: newSize, }); }, - [updateSearchParams, filterValues] + [updateSearchParams, filterValues, setPersistedPageSize] ); return { diff --git a/apps/dashboard/src/components/topics/hooks/use-topics-url-state.ts b/apps/dashboard/src/components/topics/hooks/use-topics-url-state.ts index 8eb247cdc70..aecb56218d8 100644 --- a/apps/dashboard/src/components/topics/hooks/use-topics-url-state.ts +++ b/apps/dashboard/src/components/topics/hooks/use-topics-url-state.ts @@ -1,6 +1,9 @@ import { DirectionEnum } from '@novu/shared'; import { useCallback, useMemo, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; +import { getPersistedPageSize, usePersistedPageSize } from '@/hooks/use-persisted-page-size'; + +const TOPICS_TABLE_ID = 'topics-list'; export type TopicsSortableColumn = '_id' | 'updatedAt' | 'name'; @@ -28,12 +31,16 @@ export interface TopicsUrlState { handlePageSizeChange: (newSize: number) => void; } -const DEFAULT_LIMIT = 10; +const DEFAULT_LIMIT = getPersistedPageSize(TOPICS_TABLE_ID, 10); export const useTopicsUrlState = (): TopicsUrlState => { const [searchParams, setSearchParams] = useSearchParams(); const [nextCursor, setNextCursor] = useState(undefined); const [previousCursor, setPreviousCursor] = useState(undefined); + const { setPageSize: setPersistedPageSize } = usePersistedPageSize({ + tableId: TOPICS_TABLE_ID, + defaultPageSize: 10, + }); const key = searchParams.get('key') || ''; const name = searchParams.get('name') || ''; @@ -176,18 +183,18 @@ export const useTopicsUrlState = (): TopicsUrlState => { const handlePageSizeChange = useCallback( (newSize: number) => { + setPersistedPageSize(newSize); setNextCursor(undefined); setPreviousCursor(undefined); setSearchParams((prev) => { prev.set('limit', newSize.toString()); - // Reset pagination when page size changes prev.delete('before'); prev.delete('after'); return prev; }); }, - [setSearchParams] + [setSearchParams, setPersistedPageSize] ); return { diff --git a/apps/dashboard/src/hooks/use-logs-url-state.ts b/apps/dashboard/src/hooks/use-logs-url-state.ts index 3e4c58a2988..42bcaa3e82f 100644 --- a/apps/dashboard/src/hooks/use-logs-url-state.ts +++ b/apps/dashboard/src/hooks/use-logs-url-state.ts @@ -2,8 +2,11 @@ import { useOrganization } from '@clerk/clerk-react'; import { useCallback, useMemo } from 'react'; import { useSearchParams } from 'react-router-dom'; import { useFetchSubscription } from '@/hooks/use-fetch-subscription'; +import { getPersistedPageSize, usePersistedPageSize } from '@/hooks/use-persisted-page-size'; import { getMaxAvailableLogsDateRange } from '@/utils/logs-filters.utils'; +const LOGS_TABLE_ID = 'logs-table'; + export interface LogsFilters { status: string[]; transactionId: string; @@ -19,6 +22,7 @@ export interface LogsUrlState { handleNext: () => void; handlePrevious: () => void; handleFirst: () => void; + handlePageSizeChange: (newLimit: number) => void; filters: LogsFilters; handleFiltersChange: (newFilters: LogsFilters) => void; clearFilters: () => void; @@ -30,6 +34,10 @@ export function useLogsUrlState(): LogsUrlState { const { organization } = useOrganization(); const { subscription } = useFetchSubscription(); const selectedLogId = searchParams.get('selectedLogId'); + const { setPageSize: setPersistedPageSize } = usePersistedPageSize({ + tableId: LOGS_TABLE_ID, + defaultPageSize: 20, + }); const maxAvailableLogsDateRange = useMemo( () => @@ -55,9 +63,10 @@ export function useLogsUrlState(): LogsUrlState { [selectedLogId, searchParams, setSearchParams] ); - // Pagination state + const defaultLimit = getPersistedPageSize(LOGS_TABLE_ID, 20); + const currentPage = parseInt(searchParams.get('page') || '1', 10); - const limit = parseInt(searchParams.get('limit') || '20', 10); + const limit = parseInt(searchParams.get('limit') || defaultLimit.toString(), 10); const handleNext = useCallback(() => { setSearchParams((prev) => { @@ -76,10 +85,24 @@ export function useLogsUrlState(): LogsUrlState { const handleFirst = useCallback(() => { setSearchParams((prev) => { prev.delete('page'); + return prev; }); }, [setSearchParams]); + const handlePageSizeChange = useCallback( + (newLimit: number) => { + setPersistedPageSize(newLimit); + setSearchParams((prev) => { + prev.set('limit', newLimit.toString()); + prev.delete('page'); + + return prev; + }); + }, + [setSearchParams, setPersistedPageSize] + ); + // Filter state const filters = useMemo( (): LogsFilters => ({ @@ -155,6 +178,7 @@ export function useLogsUrlState(): LogsUrlState { handleNext, handlePrevious, handleFirst, + handlePageSizeChange, filters, handleFiltersChange, clearFilters, @@ -168,6 +192,7 @@ export function useLogsUrlState(): LogsUrlState { handleNext, handlePrevious, handleFirst, + handlePageSizeChange, filters, handleFiltersChange, clearFilters, diff --git a/apps/dashboard/src/hooks/use-persisted-page-size.ts b/apps/dashboard/src/hooks/use-persisted-page-size.ts new file mode 100644 index 00000000000..0115fe36aa2 --- /dev/null +++ b/apps/dashboard/src/hooks/use-persisted-page-size.ts @@ -0,0 +1,65 @@ +import { useCallback, useEffect, useState } from 'react'; +import { loadFromStorage, saveToStorage } from '@/utils/local-storage'; + +const STORAGE_KEY = 'novu-page-sizes'; +const DATA_KEY = 'pageSizeMap'; + +type PageSizeMap = Record; + +function getPageSizeMap(): PageSizeMap { + return loadFromStorage(STORAGE_KEY, DATA_KEY) || {}; +} + +function savePageSizeMap(map: PageSizeMap): void { + saveToStorage(STORAGE_KEY, map, DATA_KEY); +} + +type UsePersistedPageSizeOptions = { + tableId: string; + defaultPageSize?: number; +}; + +type UsePersistedPageSizeReturn = { + pageSize: number; + setPageSize: (size: number) => void; +}; + +export function usePersistedPageSize(options: UsePersistedPageSizeOptions): UsePersistedPageSizeReturn { + const { tableId, defaultPageSize = 10 } = options; + + const [pageSize, setPageSizeState] = useState(() => { + const map = getPageSizeMap(); + + return map[tableId] ?? defaultPageSize; + }); + + useEffect(() => { + const map = getPageSizeMap(); + const stored = map[tableId]; + + if (stored !== undefined && stored !== pageSize) { + setPageSizeState(stored); + } + }, [tableId, pageSize]); + + const setPageSize = useCallback( + (size: number) => { + setPageSizeState(size); + const map = getPageSizeMap(); + map[tableId] = size; + savePageSizeMap(map); + }, + [tableId] + ); + + return { + pageSize, + setPageSize, + }; +} + +export function getPersistedPageSize(tableId: string, defaultPageSize = 10): number { + const map = getPageSizeMap(); + + return map[tableId] ?? defaultPageSize; +} diff --git a/apps/dashboard/src/pages/workflows.tsx b/apps/dashboard/src/pages/workflows.tsx index e3d7c007e41..ac9d4f6be77 100644 --- a/apps/dashboard/src/pages/workflows.tsx +++ b/apps/dashboard/src/pages/workflows.tsx @@ -33,22 +33,31 @@ import { useEnvironment } from '@/context/environment/hooks'; import { useDebounce } from '@/hooks/use-debounce'; import { useFetchWorkflows } from '@/hooks/use-fetch-workflows'; import { useHasPermission } from '@/hooks/use-has-permission'; +import { getPersistedPageSize, usePersistedPageSize } from '@/hooks/use-persisted-page-size'; import { useTags } from '@/hooks/use-tags'; import { useTelemetry } from '@/hooks/use-telemetry'; import { QuickTemplate, useTemplateStore } from '@/hooks/use-template-store'; import { buildRoute, ROUTES } from '@/utils/routes'; import { TelemetryEvent } from '@/utils/telemetry'; +const WORKFLOWS_TABLE_ID = 'workflows-list'; + interface WorkflowFilters { query: string; tags: string[]; status: string[]; } +const DEFAULT_PAGE_SIZE = getPersistedPageSize(WORKFLOWS_TABLE_ID, 10); + export const WorkflowsPage = () => { const { environmentSlug } = useParams(); const track = useTelemetry(); const navigate = useNavigate(); + const { setPageSize: setPersistedPageSize } = usePersistedPageSize({ + tableId: WORKFLOWS_TABLE_ID, + defaultPageSize: 10, + }); const [searchParams, setSearchParams] = useSearchParams({ orderDirection: DirectionEnum.DESC, orderBy: 'createdAt', @@ -145,7 +154,7 @@ export const WorkflowsPage = () => { }, [quickTemplates]); const offset = parseInt(searchParams.get('offset') || '0', 10); - const limit = parseInt(searchParams.get('limit') || '10', 10); + const limit = parseInt(searchParams.get('limit') || DEFAULT_PAGE_SIZE.toString(), 10); const { data: workflowsData, @@ -317,10 +326,12 @@ export const WorkflowsPage = () => { isError={isError} limit={limit} onPageSizeChange={(newPageSize) => { + setPersistedPageSize(newPageSize); setSearchParams((prev) => { const sp = new URLSearchParams(prev); sp.set('limit', newPageSize.toString()); - sp.delete('offset'); // Reset to first page when changing page size + sp.delete('offset'); + return sp; }); }} diff --git a/enterprise/packages/auth/package.json b/enterprise/packages/auth/package.json index 9739b6034b4..8ed387b6334 100644 --- a/enterprise/packages/auth/package.json +++ b/enterprise/packages/auth/package.json @@ -21,7 +21,7 @@ "class-transformer": "0.5.1", "class-validator": "0.14.1", "jwks-rsa": "^3.1.0", - "mongoose": "^7.8.7", + "mongoose": "^8.9.5", "svix": "^1.64.1" }, "devDependencies": { diff --git a/enterprise/packages/billing/package.json b/enterprise/packages/billing/package.json index 0cf9e237558..3c15ac1d313 100644 --- a/enterprise/packages/billing/package.json +++ b/enterprise/packages/billing/package.json @@ -24,7 +24,7 @@ "class-transformer": "0.5.1", "class-validator": "0.14.1", "date-fns": "^4.1.0", - "mongoose": "^7.8.7", + "mongoose": "^8.9.5", "rxjs": "7.8.1", "shortid": "^2.2.16", "stripe": "^11.18.0", diff --git a/enterprise/packages/dal/package.json b/enterprise/packages/dal/package.json index 798b51fa10b..057eb8a633b 100644 --- a/enterprise/packages/dal/package.json +++ b/enterprise/packages/dal/package.json @@ -20,8 +20,8 @@ "dependencies": { "@novu/dal": "workspace:*", "@novu/shared": "workspace:*", - "mongoose": "^7.8.7", - "mongoose-delete": "^1.0.1", + "mongoose": "^8.9.5", + "mongoose-delete": "^1.0.7", "rimraf": "^3.0.2" }, "devDependencies": { diff --git a/libs/application-generic/package.json b/libs/application-generic/package.json index 0ed09d92ef4..4dbc0b31f65 100644 --- a/libs/application-generic/package.json +++ b/libs/application-generic/package.json @@ -42,7 +42,7 @@ "@azure/storage-blob": "^12.11.0", "@clickhouse/client": "^1.11.2", "@google-cloud/storage": "^6.2.3", - "@hokify/agenda": "^6.3.0", + "@pulsecron/pulse": "1.6.8", "@launchdarkly/node-server-sdk": "^9.7.3", "@novu/maily-render": "workspace:*", "@novu/dal": "workspace:*", diff --git a/libs/application-generic/src/modules/cron.module.ts b/libs/application-generic/src/modules/cron.module.ts index b3c66b8c524..57d4d818b06 100644 --- a/libs/application-generic/src/modules/cron.module.ts +++ b/libs/application-generic/src/modules/cron.module.ts @@ -1,10 +1,10 @@ -import { Agenda } from '@hokify/agenda'; +import { Pulse } from '@pulsecron/pulse'; import { DynamicModule, Module, Provider } from '@nestjs/common'; import { DalService } from '@novu/dal'; import { JobCronNameEnum, JobTopicNameEnum } from '@novu/shared'; import os from 'os'; import { dalService as customDalService } from '../custom-providers'; -import { ACTIVE_CRON_JOBS_TOKEN, AgendaCronService, CronService, MetricsService } from '../services'; +import { ACTIVE_CRON_JOBS_TOKEN, PulseCronService, CronService, MetricsService } from '../services'; import { MetricsModule } from './metrics.module'; /** @@ -21,17 +21,17 @@ const cronJobsFromWorkers: Partial { - const agenda = new Agenda({ + const pulse = new Pulse({ mongo: dalService.connection.getClient().db() as any, /** * Sets the hostname for the Job. Used to debug last host to run the job via * the collection's `lastModifiedBy` attribute. * - * @see https://github.com/agenda/agenda/tree/master?tab=readme-ov-file#namename + * @see https://github.com/pulsecron/pulse#name */ name: `${os.hostname}-${process.pid}`, }); - const service = new AgendaCronService(metricsService, activeCronJobs, agenda); + const service = new PulseCronService(metricsService, activeCronJobs, pulse); return service; }, diff --git a/libs/application-generic/src/services/cron/agenda-cron.service.ts b/libs/application-generic/src/services/cron/agenda-cron.service.ts deleted file mode 100644 index 076de673f25..00000000000 --- a/libs/application-generic/src/services/cron/agenda-cron.service.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Agenda } from '@hokify/agenda'; -import { JobCronNameEnum } from '@novu/shared'; -import { MetricsService } from '../metrics'; -import { CronService } from './cron.service'; -import { CronJobProcessor, CronMetrics, CronOptions } from './cron.types'; - -export class AgendaCronService extends CronService { - cronServiceName = 'AgendaCronService'; - - constructor( - metricsService: MetricsService, - activeJobs: JobCronNameEnum[], - private agenda: Agenda - ) { - super(metricsService, activeJobs); - } - - protected async addJob( - jobName: JobCronNameEnum, - processor: CronJobProcessor, - interval: string, - options: CronOptions - ) { - this.agenda.define( - jobName, - async (job) => { - await processor({ - name: jobName, - startedAt: job.attrs.lastRunAt, - data: job.attrs.data as TData, - }); - }, - { - lockLifetime: options.lockLifetime, - lockLimit: options.lockLimit, - concurrency: options.concurrency, - priority: options.priority, - } - ); - - await this.agenda.every(interval, jobName, { - timezone: options.timezone, - }); - } - - protected async removeJob(jobName: string) { - await this.agenda.cancel({ name: jobName }); - } - - protected async initialize() { - await this.agenda.start(); - } - - protected async shutdown() { - await this.agenda.stop(); - } - - protected async getMetrics() { - const stats = await this.agenda.getRunningStats(); - - const metrics = Object.entries(stats.jobStatus).reduce((acc, [jobName, status]) => { - acc[jobName] = { - active: status.running ?? 0, - waiting: status.locked ?? 0, - }; - - return acc; - }, {} as CronMetrics); - - return metrics; - } -} diff --git a/libs/application-generic/src/services/cron/index.ts b/libs/application-generic/src/services/cron/index.ts index 4678c3ded95..829d90ef284 100644 --- a/libs/application-generic/src/services/cron/index.ts +++ b/libs/application-generic/src/services/cron/index.ts @@ -1,4 +1,4 @@ -export * from './agenda-cron.service'; +export * from './pulse-cron.service'; export * from './cron.constants'; export * from './cron.service'; export * from './cron.types'; diff --git a/libs/application-generic/src/services/cron/pulse-cron.service.ts b/libs/application-generic/src/services/cron/pulse-cron.service.ts new file mode 100644 index 00000000000..529788335ea --- /dev/null +++ b/libs/application-generic/src/services/cron/pulse-cron.service.ts @@ -0,0 +1,97 @@ +import { Pulse, JobPriority } from '@pulsecron/pulse'; +import { JobCronNameEnum } from '@novu/shared'; +import { MetricsService } from '../metrics'; +import { CronService } from './cron.service'; +import { CronJobProcessor, CronMetrics, CronOptions } from './cron.types'; + +type PulsePriority = keyof typeof JobPriority; + +function mapPriorityToPulse(priority: number | undefined): PulsePriority { + if (priority === undefined || priority === 0) return 'normal'; + if (priority >= 20) return 'highest'; + if (priority >= 10) return 'high'; + if (priority <= -20) return 'lowest'; + if (priority <= -10) return 'low'; + + return 'normal'; +} + +export class PulseCronService extends CronService { + cronServiceName = 'PulseCronService'; + + constructor( + metricsService: MetricsService, + activeJobs: JobCronNameEnum[], + private pulse: Pulse + ) { + super(metricsService, activeJobs); + } + + protected async addJob( + jobName: JobCronNameEnum, + processor: CronJobProcessor, + interval: string, + options: CronOptions + ) { + this.pulse.define( + jobName, + async (job) => { + await processor({ + name: jobName, + startedAt: job.attrs.lastRunAt, + data: job.attrs.data as TData, + }); + }, + { + lockLifetime: options.lockLifetime, + lockLimit: options.lockLimit, + concurrency: options.concurrency, + priority: mapPriorityToPulse(options.priority), + } + ); + + await this.pulse.every(interval, jobName, {}, { + timezone: options.timezone, + }); + } + + protected async removeJob(jobName: string) { + await this.pulse.cancel({ name: jobName }); + } + + protected async initialize() { + await this.pulse.start(); + } + + protected async shutdown() { + await this.pulse.stop(); + } + + protected async getMetrics() { + const allJobs = await this.pulse.jobs({}); + + const metrics = allJobs.reduce((acc, job) => { + const jobName = job.attrs.name; + if (!acc[jobName]) { + acc[jobName] = { active: 0, waiting: 0 }; + } + + const lockedAt = job.attrs.lockedAt; + const lastFinishedAt = job.attrs.lastFinishedAt; + + const isRunning = + lockedAt && (!lastFinishedAt || lockedAt.getTime() > lastFinishedAt.getTime()); + const isWaiting = !isRunning && lastFinishedAt && !lockedAt; + + if (isRunning) { + acc[jobName].active += 1; + } else if (isWaiting) { + acc[jobName].waiting += 1; + } + + return acc; + }, {} as CronMetrics); + + return metrics; + } +} diff --git a/libs/application-generic/src/usecases/create-change/create-change.command.ts b/libs/application-generic/src/usecases/create-change/create-change.command.ts index 9a13e428b33..cb2e6700769 100644 --- a/libs/application-generic/src/usecases/create-change/create-change.command.ts +++ b/libs/application-generic/src/usecases/create-change/create-change.command.ts @@ -1,9 +1,9 @@ import { ChangeEntityTypeEnum } from '@novu/shared'; import { IsDefined, IsMongoId, IsOptional, IsString } from 'class-validator'; -import { Document } from 'mongoose'; import { EnvironmentWithUserCommand } from '../../commands'; -export interface IItem extends Pick { +export interface IItem { + _id?: string; [key: string]: any; } diff --git a/libs/application-generic/src/usecases/create-change/create-change.usecase.ts b/libs/application-generic/src/usecases/create-change/create-change.usecase.ts index b58ddfb63de..93e9e366f9a 100644 --- a/libs/application-generic/src/usecases/create-change/create-change.usecase.ts +++ b/libs/application-generic/src/usecases/create-change/create-change.usecase.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, BadRequestException } from '@nestjs/common'; import { ChangeRepository } from '@novu/dal'; import { applyDiff, getDiff } from 'recursive-diff'; @@ -9,10 +9,15 @@ export class CreateChange { constructor(private changeRepository: ChangeRepository) {} async execute(command: CreateChangeCommand) { + const itemId = command.item._id; + if (!itemId) { + throw new BadRequestException('Item must have an _id to create a change'); + } + const changes = await this.changeRepository.getEntityChanges( command.organizationId, command.type, - command.item._id + itemId ); const aggregatedItem = changes .filter((change) => change.enabled) @@ -46,7 +51,7 @@ export class CreateChange { _creatorId: command.userId, change: changePayload, type: command.type, - _entityId: command.item._id, + _entityId: itemId, enabled: false, _parentId: command.parentChangeId, _id: command.changeId, diff --git a/libs/application-generic/src/usecases/message-template/create-message-template/create-message-template.usecase.ts b/libs/application-generic/src/usecases/message-template/create-message-template/create-message-template.usecase.ts index e754780c361..2f88535d8e5 100644 --- a/libs/application-generic/src/usecases/message-template/create-message-template/create-message-template.usecase.ts +++ b/libs/application-generic/src/usecases/message-template/create-message-template/create-message-template.usecase.ts @@ -64,7 +64,7 @@ export class CreateMessageTemplate { })) as MessageTemplateEntity; } - if (!isBridgeWorkflow(command.workflowType)) { + if (!isBridgeWorkflow(command.workflowType) && item._id) { await this.createChange.execute( CreateChangeCommand.create({ organizationId: command.organizationId, diff --git a/libs/dal/package.json b/libs/dal/package.json index a280dfa8401..8d154bd1135 100644 --- a/libs/dal/package.json +++ b/libs/dal/package.json @@ -36,8 +36,8 @@ "fs-extra": "^9.0.0", "googleapis": "^60.0.1", "jsonfile": "^6.0.1", - "mongoose": "^7.8.7", - "mongoose-delete": "^1.0.1", + "mongoose": "^8.9.5", + "mongoose-delete": "^1.0.7", "reflect-metadata": "0.2.2", "superagent-defaults": "^0.1.14", "uuid": "^8.3.0" diff --git a/libs/dal/src/repositories/base-repository.ts b/libs/dal/src/repositories/base-repository.ts index f491ebe3f3e..4bad86d46a2 100644 --- a/libs/dal/src/repositories/base-repository.ts +++ b/libs/dal/src/repositories/base-repository.ts @@ -4,6 +4,7 @@ import { ClientSession, FilterQuery, Model, + mongo, ProjectionType, QueryOptions, QueryWithHelpers, @@ -349,19 +350,18 @@ export class BaseRepository { async update( query: FilterQuery & T_Enforcement, updateBody: UpdateQuery, - options: QueryOptions & { + options: Omit & { + timestamps?: boolean; + strict?: boolean | 'throw'; session?: ClientSession | null; - writeConcern?: { w: number | 'majority' }; } = {} ): Promise<{ matched: number; modified: number; }> { - const { session, ...updateOptions } = options; - + const { session, ...restOptions } = options; const saved = await this.MongooseModel.updateMany(query, updateBody, { - multi: true, - ...updateOptions, + ...restOptions, ...(session && { session }), }); diff --git a/libs/dal/src/repositories/message/message.schema.ts b/libs/dal/src/repositories/message/message.schema.ts index dcc1e836b15..6cdaefda96f 100644 --- a/libs/dal/src/repositories/message/message.schema.ts +++ b/libs/dal/src/repositories/message/message.schema.ts @@ -172,9 +172,6 @@ messageSchema.pre('findOneAndUpdate', function filterDeletedFindOneAndUpdate() { messageSchema.pre('countDocuments', function filterDeletedCountDocuments() { this.where({ deleted: { $exists: false } }); }); -messageSchema.pre('count', function filterDeletedCount() { - this.where({ deleted: { $exists: false } }); -}); messageSchema.virtual('subscriber', { ref: 'Subscriber', diff --git a/libs/dal/src/repositories/notification-template/notification-template.schema.ts b/libs/dal/src/repositories/notification-template/notification-template.schema.ts index a1c27e50d40..f3aba4a5d4f 100644 --- a/libs/dal/src/repositories/notification-template/notification-template.schema.ts +++ b/libs/dal/src/repositories/notification-template/notification-template.schema.ts @@ -271,11 +271,11 @@ notificationTemplateSchema.virtual('steps.variants.template', { justOne: true, }); -notificationTemplateSchema.path('steps').schema.set('toJSON', { virtuals: true }); -notificationTemplateSchema.path('steps').schema.set('toObject', { virtuals: true }); +notificationTemplateSchema.path('steps')?.schema?.set('toJSON', { virtuals: true }); +notificationTemplateSchema.path('steps')?.schema?.set('toObject', { virtuals: true }); -notificationTemplateSchema.path('steps.variants').schema.set('toJSON', { virtuals: true }); -notificationTemplateSchema.path('steps.variants').schema.set('toObject', { virtuals: true }); +notificationTemplateSchema.path('steps.variants')?.schema?.set('toJSON', { virtuals: true }); +notificationTemplateSchema.path('steps.variants')?.schema?.set('toObject', { virtuals: true }); notificationTemplateSchema.virtual('notificationGroup', { ref: 'NotificationGroup', diff --git a/libs/dal/src/repositories/preferences/preferences.schema.ts b/libs/dal/src/repositories/preferences/preferences.schema.ts index b41fbb564f2..ffce7e00fb5 100644 --- a/libs/dal/src/repositories/preferences/preferences.schema.ts +++ b/libs/dal/src/repositories/preferences/preferences.schema.ts @@ -107,7 +107,8 @@ preferencesSchema.index( ); // Subscriber Workflow Preferences -// Ensures one workflow preference per subscriber per template (SUBSCRIBER_WORKFLOW type) +// Ensures one workflow preference per subscriber per template per context (SUBSCRIBER_WORKFLOW type) +// Includes contextKeys to allow multiple preferences for different contexts // Partial filter ensures this only applies to SUBSCRIBER_WORKFLOW type, // preventing conflicts with other preference types preferencesSchema.index( @@ -116,6 +117,7 @@ preferencesSchema.index( _subscriberId: 1, _templateId: 1, type: 1, + contextKeys: 1, }, { unique: true, @@ -143,7 +145,8 @@ preferencesSchema.index( } ); -// Ensures one workflow preference per subscriber per template per topic subscription (SUBSCRIPTION_SUBSCRIBER_WORKFLOW type) +// Ensures one workflow preference per subscriber per template per topic subscription per context (SUBSCRIPTION_SUBSCRIBER_WORKFLOW type) +// Includes contextKeys to allow multiple preferences for different contexts // Only for this type (via partial filter). preferencesSchema.index( { @@ -152,6 +155,7 @@ preferencesSchema.index( _topicSubscriptionId: 1, _templateId: 1, type: 1, + contextKeys: 1, }, { unique: true, diff --git a/libs/dal/src/repositories/subscriber/subscriber.repository.ts b/libs/dal/src/repositories/subscriber/subscriber.repository.ts index ded532b5563..aec775f7120 100644 --- a/libs/dal/src/repositories/subscriber/subscriber.repository.ts +++ b/libs/dal/src/repositories/subscriber/subscriber.repository.ts @@ -46,6 +46,7 @@ export class SubscriberRepository extends BaseRepository = []; try { bulkResponse = await this.bulkWrite(bulkWriteOps); } catch (e: unknown) { @@ -54,12 +55,17 @@ export class SubscriberRepository extends BaseRepository; } else { throw new DalException('An unknown error occurred'); } } - const created = bulkResponse.getUpsertedIds(); - const writeErrors = bulkResponse.getWriteErrors(); + + const upsertedIds = bulkResponse.upsertedIds || {}; + const created = Object.entries(upsertedIds).map(([index, _id]) => ({ + index: parseInt(index, 10), + _id, + })); const indexes: number[] = []; @@ -69,7 +75,7 @@ export class SubscriberRepository extends BaseRepository = []; if (writeErrors.length > 0) { failed = writeErrors.map((error) => { indexes.push(error.err.index); diff --git a/libs/dal/src/repositories/topic/topic-subscribers.repository.ts b/libs/dal/src/repositories/topic/topic-subscribers.repository.ts index d7731c6d7e9..d8b36b9a700 100644 --- a/libs/dal/src/repositories/topic/topic-subscribers.repository.ts +++ b/libs/dal/src/repositories/topic/topic-subscribers.repository.ts @@ -87,6 +87,7 @@ export class TopicSubscribersRepository extends BaseRepository< }); let bulkResponse: mongo.BulkWriteResult; + let writeErrors: Array<{ err: { index: number; errmsg: string } }> = []; try { bulkResponse = await this.bulkWrite(bulkUpsertWriteOps); } catch (e: unknown) { @@ -95,13 +96,13 @@ export class TopicSubscribersRepository extends BaseRepository< throw new DalException(e.message || 'Unknown error'); } bulkResponse = e.result as mongo.BulkWriteResult; + writeErrors = e.writeErrors as Array<{ err: { index: number; errmsg: string } }>; } else { throw new DalException('An unknown error occurred while adding topic subscribers'); } } const upsertedIds = bulkResponse.upsertedIds || {}; - const writeErrors = bulkResponse.getWriteErrors() || []; const createdOrFailedIndexes: number[] = []; diff --git a/libs/internal-sdk/.speakeasy/gen.yaml b/libs/internal-sdk/.speakeasy/gen.yaml index c7661901093..c6d6a6aa0cd 100755 --- a/libs/internal-sdk/.speakeasy/gen.yaml +++ b/libs/internal-sdk/.speakeasy/gen.yaml @@ -22,7 +22,8 @@ generation: schemas: allOfMergeStrategy: shallowMerge requestBodyFieldName: "" - persistentEdits: {} + persistentEdits: + enabled: never tests: generateTests: true generateNewTests: false @@ -91,6 +92,7 @@ typescript: outputModelSuffix: output packageName: '@novu/api' preApplyUnionDiscriminators: true + preserveModelFieldNames: false responseFormat: flat sseFlatResponse: false templateVersion: v2 diff --git a/libs/internal-sdk/src/funcs/subscribersPreferencesList.ts b/libs/internal-sdk/src/funcs/subscribersPreferencesList.ts index f853b0d01f7..8b61c7750f6 100644 --- a/libs/internal-sdk/src/funcs/subscribersPreferencesList.ts +++ b/libs/internal-sdk/src/funcs/subscribersPreferencesList.ts @@ -2,28 +2,28 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import { NovuCore } from "../core.js"; -import { encodeFormQuery, encodeSimple } from "../lib/encodings.js"; -import * as M from "../lib/matchers.js"; -import { compactMap } from "../lib/primitives.js"; -import { safeParse } from "../lib/schemas.js"; -import { RequestOptions } from "../lib/sdks.js"; -import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js"; -import { pathToFunc } from "../lib/url.js"; +import { NovuCore } from '../core.js'; +import { encodeFormQuery, encodeSimple } from '../lib/encodings.js'; +import * as M from '../lib/matchers.js'; +import { compactMap } from '../lib/primitives.js'; +import { safeParse } from '../lib/schemas.js'; +import { RequestOptions } from '../lib/sdks.js'; +import { extractSecurity, resolveGlobalSecurity } from '../lib/security.js'; +import { pathToFunc } from '../lib/url.js'; import { ConnectionError, InvalidRequestError, RequestAbortedError, RequestTimeoutError, UnexpectedClientError, -} from "../models/errors/httpclienterrors.js"; -import * as errors from "../models/errors/index.js"; -import { NovuError } from "../models/errors/novuerror.js"; -import { ResponseValidationError } from "../models/errors/responsevalidationerror.js"; -import { SDKValidationError } from "../models/errors/sdkvalidationerror.js"; -import * as operations from "../models/operations/index.js"; -import { APICall, APIPromise } from "../types/async.js"; -import { Result } from "../types/fp.js"; +} from '../models/errors/httpclienterrors.js'; +import * as errors from '../models/errors/index.js'; +import { NovuError } from '../models/errors/novuerror.js'; +import { ResponseValidationError } from '../models/errors/responsevalidationerror.js'; +import { SDKValidationError } from '../models/errors/sdkvalidationerror.js'; +import * as operations from '../models/operations/index.js'; +import { APICall, APIPromise } from '../types/async.js'; +import { Result } from '../types/fp.js'; /** * Retrieve subscriber preferences @@ -34,10 +34,8 @@ import { Result } from "../types/fp.js"; */ export function subscribersPreferencesList( client: NovuCore, - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: RequestOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: RequestOptions ): APIPromise< Result< operations.SubscribersControllerGetSubscriberPreferencesResponse, @@ -53,21 +51,13 @@ export function subscribersPreferencesList( | SDKValidationError > > { - return new APIPromise($do( - client, - subscriberId, - criticality, - idempotencyKey, - options, - )); + return new APIPromise($do(client, request, options)); } async function $do( client: NovuCore, - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: RequestOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: RequestOptions ): Promise< [ Result< @@ -86,67 +76,56 @@ async function $do( APICall, ] > { - const input: operations.SubscribersControllerGetSubscriberPreferencesRequest = - { - subscriberId: subscriberId, - criticality: criticality, - idempotencyKey: idempotencyKey, - }; - const parsed = safeParse( - input, - (value) => - operations - .SubscribersControllerGetSubscriberPreferencesRequest$outboundSchema - .parse(value), - "Input validation failed", + request, + (value) => operations.SubscribersControllerGetSubscriberPreferencesRequest$outboundSchema.parse(value), + 'Input validation failed' ); if (!parsed.ok) { - return [parsed, { status: "invalid" }]; + return [parsed, { status: 'invalid' }]; } const payload = parsed.value; const body = null; const pathParams = { - subscriberId: encodeSimple("subscriberId", payload.subscriberId, { + subscriberId: encodeSimple('subscriberId', payload.subscriberId, { explode: false, - charEncoding: "percent", + charEncoding: 'percent', }), }; - const path = pathToFunc("/v2/subscribers/{subscriberId}/preferences")( - pathParams, - ); + const path = pathToFunc('/v2/subscribers/{subscriberId}/preferences')(pathParams); const query = encodeFormQuery({ - "criticality": payload.criticality, + contextKeys: payload.contextKeys, + criticality: payload.criticality, }); - const headers = new Headers(compactMap({ - Accept: "application/json", - "idempotency-key": encodeSimple( - "idempotency-key", - payload["idempotency-key"], - { explode: false, charEncoding: "none" }, - ), - })); + const headers = new Headers( + compactMap({ + Accept: 'application/json', + 'idempotency-key': encodeSimple('idempotency-key', payload['idempotency-key'], { + explode: false, + charEncoding: 'none', + }), + }) + ); const securityInput = await extractSecurity(client._options.security); const requestSecurity = resolveGlobalSecurity(securityInput); const context = { options: client._options, - baseURL: options?.serverURL ?? client._baseURL ?? "", - operationID: "SubscribersController_getSubscriberPreferences", + baseURL: options?.serverURL ?? client._baseURL ?? '', + operationID: 'SubscribersController_getSubscriberPreferences', oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client._options.security, - retryConfig: options?.retries - || client._options.retryConfig - || { - strategy: "backoff", + retryConfig: options?.retries || + client._options.retryConfig || { + strategy: 'backoff', backoff: { initialInterval: 1000, maxInterval: 30000, @@ -154,51 +133,54 @@ async function $do( maxElapsedTime: 3600000, }, retryConnectionErrors: true, - } - || { strategy: "none" }, - retryCodes: options?.retryCodes || ["408", "409", "429", "5XX"], + } || { strategy: 'none' }, + retryCodes: options?.retryCodes || ['408', '409', '429', '5XX'], }; - const requestRes = client._createRequest(context, { - security: requestSecurity, - method: "GET", - baseURL: options?.serverURL, - path: path, - headers: headers, - query: query, - body: body, - userAgent: client._options.userAgent, - timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1, - }, options); + const requestRes = client._createRequest( + context, + { + security: requestSecurity, + method: 'GET', + baseURL: options?.serverURL, + path: path, + headers: headers, + query: query, + body: body, + userAgent: client._options.userAgent, + timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1, + }, + options + ); if (!requestRes.ok) { - return [requestRes, { status: "invalid" }]; + return [requestRes, { status: 'invalid' }]; } const req = requestRes.value; const doResult = await client._do(req, { context, errorCodes: [ - "400", - "401", - "403", - "404", - "405", - "409", - "413", - "414", - "415", - "422", - "429", - "4XX", - "500", - "503", - "5XX", + '400', + '401', + '403', + '404', + '405', + '409', + '413', + '414', + '415', + '422', + '429', + '4XX', + '500', + '503', + '5XX', ], retryConfig: context.retryConfig, retryCodes: context.retryCodes, }); if (!doResult.ok) { - return [doResult, { status: "request-error", request: req }]; + return [doResult, { status: 'request-error', request: req }]; } const response = doResult.value; @@ -219,28 +201,22 @@ async function $do( | UnexpectedClientError | SDKValidationError >( - M.json( - 200, - operations - .SubscribersControllerGetSubscriberPreferencesResponse$inboundSchema, - { hdrs: true, key: "Result" }, - ), + M.json(200, operations.SubscribersControllerGetSubscriberPreferencesResponse$inboundSchema, { + hdrs: true, + key: 'Result', + }), M.jsonErr(414, errors.ErrorDto$inboundSchema), - M.jsonErr( - [400, 401, 403, 404, 405, 409, 413, 415], - errors.ErrorDto$inboundSchema, - { hdrs: true }, - ), + M.jsonErr([400, 401, 403, 404, 405, 409, 413, 415], errors.ErrorDto$inboundSchema, { hdrs: true }), M.jsonErr(422, errors.ValidationErrorDto$inboundSchema, { hdrs: true }), M.fail(429), M.jsonErr(500, errors.ErrorDto$inboundSchema, { hdrs: true }), M.fail(503), - M.fail("4XX"), - M.fail("5XX"), + M.fail('4XX'), + M.fail('5XX') )(response, req, { extraFields: responseFields }); if (!result.ok) { - return [result, { status: "complete", request: req, response }]; + return [result, { status: 'complete', request: req, response }]; } - return [result, { status: "complete", request: req, response }]; + return [result, { status: 'complete', request: req, response }]; } diff --git a/libs/internal-sdk/src/lib/config.ts b/libs/internal-sdk/src/lib/config.ts index 1bfe131b974..e2b8c0b84c5 100644 --- a/libs/internal-sdk/src/lib/config.ts +++ b/libs/internal-sdk/src/lib/config.ts @@ -59,8 +59,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null { export const SDK_METADATA = { language: 'typescript', - openapiDocVersion: '3.11.0', + openapiDocVersion: '3.12.0', sdkVersion: '0.1.21', - genVersion: '2.791.1', - userAgent: 'speakeasy-sdk/typescript 0.1.21 2.791.1 3.11.0 @novu/api', + genVersion: '2.792.3', + userAgent: 'speakeasy-sdk/typescript 0.1.21 2.792.3 3.12.0 @novu/api', } as const; diff --git a/libs/internal-sdk/src/lib/sdks.ts b/libs/internal-sdk/src/lib/sdks.ts index fb7e9ac575a..d8808ff2732 100644 --- a/libs/internal-sdk/src/lib/sdks.ts +++ b/libs/internal-sdk/src/lib/sdks.ts @@ -2,19 +2,19 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import { SDKHooks } from "../hooks/hooks.js"; -import { HookContext } from "../hooks/types.js"; +import { SDKHooks } from '../hooks/hooks.js'; +import { HookContext } from '../hooks/types.js'; import { ConnectionError, InvalidRequestError, RequestAbortedError, RequestTimeoutError, UnexpectedClientError, -} from "../models/errors/httpclienterrors.js"; -import { ERR, OK, Result } from "../types/fp.js"; -import { stringToBase64 } from "./base64.js"; -import { SDK_METADATA, SDKOptions, serverURLFromOptions } from "./config.js"; -import { encodeForm } from "./encodings.js"; +} from '../models/errors/httpclienterrors.js'; +import { ERR, OK, Result } from '../types/fp.js'; +import { stringToBase64 } from './base64.js'; +import { SDK_METADATA, SDKOptions, serverURLFromOptions } from './config.js'; +import { encodeForm } from './encodings.js'; import { HTTPClient, isAbortError, @@ -22,10 +22,10 @@ import { isTimeoutError, matchContentType, matchStatusCode, -} from "./http.js"; -import { Logger } from "./logger.js"; -import { retry, RetryConfig } from "./retries.js"; -import { SecurityState } from "./security.js"; +} from './http.js'; +import { Logger } from './logger.js'; +import { RetryConfig, retry } from './retries.js'; +import { SecurityState } from './security.js'; export type RequestOptions = { /** @@ -52,15 +52,15 @@ export type RequestOptions = { * * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#options|Request} */ - fetchOptions?: Omit; -} & Omit; + fetchOptions?: Omit; +} & Omit; type RequestConfig = { method: string; path: string; baseURL?: string | URL | undefined; query?: string; - body?: RequestInit["body"]; + body?: RequestInit['body']; headers?: HeadersInit; security?: SecurityState | null; uaHeader?: string; @@ -68,14 +68,13 @@ type RequestConfig = { timeoutMs?: number; }; -const gt: unknown = typeof globalThis === "undefined" ? null : globalThis; -const webWorkerLike = typeof gt === "object" - && gt != null - && "importScripts" in gt - && typeof gt["importScripts"] === "function"; -const isBrowserLike = webWorkerLike - || (typeof navigator !== "undefined" && "serviceWorker" in navigator) - || (typeof window === "object" && typeof window.document !== "undefined"); +const gt: unknown = typeof globalThis === 'undefined' ? null : globalThis; +const webWorkerLike = + typeof gt === 'object' && gt != null && 'importScripts' in gt && typeof gt['importScripts'] === 'function'; +const isBrowserLike = + webWorkerLike || + (typeof navigator !== 'undefined' && 'serviceWorker' in navigator) || + (typeof window === 'object' && typeof window.document !== 'undefined'); export class ClientSDK { readonly #httpClient: HTTPClient; @@ -86,12 +85,7 @@ export class ClientSDK { constructor(options: SDKOptions = {}) { const opt = options as unknown; - if ( - typeof opt === "object" - && opt != null - && "hooks" in opt - && opt.hooks instanceof SDKHooks - ) { + if (typeof opt === 'object' && opt != null && 'hooks' in opt && opt.hooks instanceof SDKHooks) { this.#hooks = opt.hooks; } else { this.#hooks = new SDKHooks(); @@ -102,7 +96,7 @@ export class ClientSDK { const url = serverURLFromOptions(options); if (url) { - url.pathname = url.pathname.replace(/\/+$/, "") + "/"; + url.pathname = url.pathname.replace(/\/+$/, '') + '/'; } this._baseURL = url; this.#httpClient = options.httpClient || defaultHttpClient; @@ -115,37 +109,37 @@ export class ClientSDK { public _createRequest( context: HookContext, conf: RequestConfig, - options?: RequestOptions, + options?: RequestOptions ): Result { const { method, path, query, headers: opHeaders, security } = conf; const base = conf.baseURL ?? this._baseURL; if (!base) { - return ERR(new InvalidRequestError("No base URL provided for operation")); + return ERR(new InvalidRequestError('No base URL provided for operation')); } const reqURL = new URL(base); const inputURL = new URL(path, reqURL); if (path) { - reqURL.pathname += reqURL.pathname.endsWith("/") ? "" : "/"; - reqURL.pathname += inputURL.pathname.replace(/^\/+/, ""); + reqURL.pathname += reqURL.pathname.endsWith('/') ? '' : '/'; + reqURL.pathname += inputURL.pathname.replace(/^\/+/, ''); } - let finalQuery = query || ""; + let finalQuery = query || ''; const secQuery: string[] = []; for (const [k, v] of Object.entries(security?.queryParams || {})) { - const q = encodeForm(k, v, { charEncoding: "percent" }); - if (typeof q !== "undefined") { + const q = encodeForm(k, v, { charEncoding: 'percent' }); + if (typeof q !== 'undefined') { secQuery.push(q); } } if (secQuery.length) { - finalQuery += `&${secQuery.join("&")}`; + finalQuery += `&${secQuery.join('&')}`; } if (finalQuery) { - const q = finalQuery.startsWith("&") ? finalQuery.slice(1) : finalQuery; + const q = finalQuery.startsWith('&') ? finalQuery.slice(1) : finalQuery; reqURL.search = `?${q}`; } @@ -154,10 +148,8 @@ export class ClientSDK { const username = security?.basic.username; const password = security?.basic.password; if (username != null || password != null) { - const encoded = stringToBase64( - [username || "", password || ""].join(":"), - ); - headers.set("Authorization", `Basic ${encoded}`); + const encoded = stringToBase64([username || '', password || ''].join(':')); + headers.set('Authorization', `Basic ${encoded}`); } const securityHeaders = new Headers(security?.headers || {}); @@ -165,16 +157,14 @@ export class ClientSDK { headers.set(k, v); } - let cookie = headers.get("cookie") || ""; + let cookie = headers.get('cookie') || ''; for (const [k, v] of Object.entries(security?.cookies || {})) { cookie += `; ${k}=${v}`; } - cookie = cookie.startsWith("; ") ? cookie.slice(2) : cookie; - headers.set("cookie", cookie); + cookie = cookie.startsWith('; ') ? cookie.slice(2) : cookie; + headers.set('cookie', cookie); - const userHeaders = new Headers( - options?.headers ?? options?.fetchOptions?.headers, - ); + const userHeaders = new Headers(options?.headers ?? options?.fetchOptions?.headers); for (const [k, v] of userHeaders) { headers.set(k, v); } @@ -182,13 +172,10 @@ export class ClientSDK { // Only set user agent header in non-browser-like environments since CORS // policy disallows setting it in browsers e.g. Chrome throws an error. if (!isBrowserLike) { - headers.set( - conf.uaHeader ?? "user-agent", - conf.userAgent ?? SDK_METADATA.userAgent, - ); + headers.set(conf.uaHeader ?? 'user-agent', conf.userAgent ?? SDK_METADATA.userAgent); } - const fetchOptions: Omit = { + const fetchOptions: Omit = { ...options?.fetchOptions, ...options, }; @@ -198,7 +185,7 @@ export class ClientSDK { } if (conf.body instanceof ReadableStream) { - Object.assign(fetchOptions, { duplex: "half" }); + Object.assign(fetchOptions, { duplex: 'half' }); } let input; @@ -214,9 +201,9 @@ export class ClientSDK { }); } catch (err: unknown) { return ERR( - new UnexpectedClientError("Create request hook failed to execute", { + new UnexpectedClientError('Create request hook failed to execute', { cause: err, - }), + }) ); } @@ -230,34 +217,20 @@ export class ClientSDK { errorCodes: number | string | (number | string)[]; retryConfig: RetryConfig; retryCodes: string[]; - }, - ): Promise< - Result< - Response, - | RequestAbortedError - | RequestTimeoutError - | ConnectionError - | UnexpectedClientError - > - > { + } + ): Promise> { const { context, errorCodes } = options; return retry( async () => { const req = await this.#hooks.beforeRequest(context, request.clone()); - await logRequest(this.#logger, req).catch((e) => - this.#logger?.log("Failed to log request:", e) - ); + await logRequest(this.#logger, req).catch((e) => this.#logger?.log('Failed to log request:', e)); let response = await this.#httpClient.request(req); try { if (matchStatusCode(response, errorCodes)) { - const result = await this.#hooks.afterError( - context, - response, - null, - ); + const result = await this.#hooks.afterError(context, response, null); if (result.error) { throw result.error; } @@ -266,74 +239,68 @@ export class ClientSDK { response = await this.#hooks.afterSuccess(context, response); } } finally { - await logResponse(this.#logger, response, req) - .catch(e => this.#logger?.log("Failed to log response:", e)); + await logResponse(this.#logger, response, req).catch((e) => this.#logger?.log('Failed to log response:', e)); } return response; }, - { config: options.retryConfig, statusCodes: options.retryCodes }, + { config: options.retryConfig, statusCodes: options.retryCodes } ).then( (r) => OK(r), (err) => { switch (true) { case isAbortError(err): return ERR( - new RequestAbortedError("Request aborted by client", { + new RequestAbortedError('Request aborted by client', { cause: err, - }), + }) ); case isTimeoutError(err): - return ERR( - new RequestTimeoutError("Request timed out", { cause: err }), - ); + return ERR(new RequestTimeoutError('Request timed out', { cause: err })); case isConnectionError(err): - return ERR( - new ConnectionError("Unable to make request", { cause: err }), - ); + return ERR(new ConnectionError('Unable to make request', { cause: err })); default: return ERR( - new UnexpectedClientError("Unexpected HTTP client error", { + new UnexpectedClientError('Unexpected HTTP client error', { cause: err, - }), + }) ); } - }, + } ); } } -const jsonLikeContentTypeRE = /(application|text)\/.*?\+*json.*/; -const jsonlLikeContentTypeRE = - /(application|text)\/(.*?\+*\bjsonl\b.*|.*?\+*\bx-ndjson\b.*)/; +const jsonLikeContentTypeRE = /(application|text)\/([^+]+\+)*json.*/; +const jsonlLikeContentTypeRE = /(application|text)\/(([^+]+\+)*jsonl\b.*|([^+]+\+)*x-ndjson\b.*)/; async function logRequest(logger: Logger | undefined, req: Request) { if (!logger) { return; } - const contentType = req.headers.get("content-type"); - const ct = contentType?.split(";")[0] || ""; + const contentType = req.headers.get('content-type'); + const ct = contentType?.split(';')[0] || ''; logger.group(`> Request: ${req.method} ${req.url}`); - logger.group("Headers:"); + logger.group('Headers:'); for (const [k, v] of req.headers.entries()) { logger.log(`${k}: ${v}`); } logger.groupEnd(); - logger.group("Body:"); + logger.group('Body:'); switch (true) { case jsonLikeContentTypeRE.test(ct): logger.log(await req.clone().json()); break; - case ct.startsWith("text/"): + case ct.startsWith('text/'): logger.log(await req.clone().text()); break; - case ct === "multipart/form-data": { + case ct === 'multipart/form-data': { const body = await req.clone().formData(); for (const [k, v] of body) { - const vlabel = v instanceof Blob ? "" : v; + const vlabel = v instanceof Blob ? '' : v; logger.log(`${k}: ${vlabel}`); } break; @@ -347,47 +314,42 @@ async function logRequest(logger: Logger | undefined, req: Request) { logger.groupEnd(); } -async function logResponse( - logger: Logger | undefined, - res: Response, - req: Request, -) { +async function logResponse(logger: Logger | undefined, res: Response, req: Request) { if (!logger) { return; } - const contentType = res.headers.get("content-type"); - const ct = contentType?.split(";")[0] || ""; + const contentType = res.headers.get('content-type'); + const ct = contentType?.split(';')[0] || ''; logger.group(`< Response: ${req.method} ${req.url}`); - logger.log("Status Code:", res.status, res.statusText); + logger.log('Status Code:', res.status, res.statusText); - logger.group("Headers:"); + logger.group('Headers:'); for (const [k, v] of res.headers.entries()) { logger.log(`${k}: ${v}`); } logger.groupEnd(); - logger.group("Body:"); + logger.group('Body:'); switch (true) { - case matchContentType(res, "application/json") - || jsonLikeContentTypeRE.test(ct) && !jsonlLikeContentTypeRE.test(ct): + case matchContentType(res, 'application/json') || + (jsonLikeContentTypeRE.test(ct) && !jsonlLikeContentTypeRE.test(ct)): logger.log(await res.clone().json()); break; - case matchContentType(res, "application/jsonl") - || jsonlLikeContentTypeRE.test(ct): + case matchContentType(res, 'application/jsonl') || jsonlLikeContentTypeRE.test(ct): logger.log(await res.clone().text()); break; - case matchContentType(res, "text/event-stream"): + case matchContentType(res, 'text/event-stream'): logger.log(`<${contentType}>`); break; - case matchContentType(res, "text/*"): + case matchContentType(res, 'text/*'): logger.log(await res.clone().text()); break; - case matchContentType(res, "multipart/form-data"): { + case matchContentType(res, 'multipart/form-data'): { const body = await res.clone().formData(); for (const [k, v] of body) { - const vlabel = v instanceof Blob ? "" : v; + const vlabel = v instanceof Blob ? '' : v; logger.log(`${k}: ${vlabel}`); } break; diff --git a/libs/internal-sdk/src/models/components/bulkupdatesubscriberpreferencesdto.ts b/libs/internal-sdk/src/models/components/bulkupdatesubscriberpreferencesdto.ts index 415f7aef321..09a318b3bf3 100644 --- a/libs/internal-sdk/src/models/components/bulkupdatesubscriberpreferencesdto.ts +++ b/libs/internal-sdk/src/models/components/bulkupdatesubscriberpreferencesdto.ts @@ -2,23 +2,72 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import * as z from "zod/v3"; +import * as z from 'zod/v3'; import { BulkUpdateSubscriberPreferenceItemDto, BulkUpdateSubscriberPreferenceItemDto$Outbound, BulkUpdateSubscriberPreferenceItemDto$outboundSchema, -} from "./bulkupdatesubscriberpreferenceitemdto.js"; +} from './bulkupdatesubscriberpreferenceitemdto.js'; + +/** + * Rich context object with id and optional data + */ +export type Context2 = { + id: string; + /** + * Optional additional context data + */ + data?: { [k: string]: any } | undefined; +}; + +export type BulkUpdateSubscriberPreferencesDtoContext = Context2 | string; export type BulkUpdateSubscriberPreferencesDto = { /** * Array of workflow preferences to update (maximum 100 items) */ preferences: Array; + context?: { [k: string]: Context2 | string } | undefined; }; +/** @internal */ +export type Context2$Outbound = { + id: string; + data?: { [k: string]: any } | undefined; +}; + +/** @internal */ +export const Context2$outboundSchema: z.ZodType = z.object({ + id: z.string(), + data: z.record(z.any()).optional(), +}); + +export function context2ToJSON(context2: Context2): string { + return JSON.stringify(Context2$outboundSchema.parse(context2)); +} + +/** @internal */ +export type BulkUpdateSubscriberPreferencesDtoContext$Outbound = Context2$Outbound | string; + +/** @internal */ +export const BulkUpdateSubscriberPreferencesDtoContext$outboundSchema: z.ZodType< + BulkUpdateSubscriberPreferencesDtoContext$Outbound, + z.ZodTypeDef, + BulkUpdateSubscriberPreferencesDtoContext +> = z.union([z.lazy(() => Context2$outboundSchema), z.string()]); + +export function bulkUpdateSubscriberPreferencesDtoContextToJSON( + bulkUpdateSubscriberPreferencesDtoContext: BulkUpdateSubscriberPreferencesDtoContext +): string { + return JSON.stringify( + BulkUpdateSubscriberPreferencesDtoContext$outboundSchema.parse(bulkUpdateSubscriberPreferencesDtoContext) + ); +} + /** @internal */ export type BulkUpdateSubscriberPreferencesDto$Outbound = { preferences: Array; + context?: { [k: string]: Context2$Outbound | string } | undefined; }; /** @internal */ @@ -28,14 +77,11 @@ export const BulkUpdateSubscriberPreferencesDto$outboundSchema: z.ZodType< BulkUpdateSubscriberPreferencesDto > = z.object({ preferences: z.array(BulkUpdateSubscriberPreferenceItemDto$outboundSchema), + context: z.record(z.union([z.lazy(() => Context2$outboundSchema), z.string()])).optional(), }); export function bulkUpdateSubscriberPreferencesDtoToJSON( - bulkUpdateSubscriberPreferencesDto: BulkUpdateSubscriberPreferencesDto, + bulkUpdateSubscriberPreferencesDto: BulkUpdateSubscriberPreferencesDto ): string { - return JSON.stringify( - BulkUpdateSubscriberPreferencesDto$outboundSchema.parse( - bulkUpdateSubscriberPreferencesDto, - ), - ); + return JSON.stringify(BulkUpdateSubscriberPreferencesDto$outboundSchema.parse(bulkUpdateSubscriberPreferencesDto)); } diff --git a/libs/internal-sdk/src/models/components/createchannelconnectionrequestdto.ts b/libs/internal-sdk/src/models/components/createchannelconnectionrequestdto.ts index 2c146c6cdd4..51873c61c6f 100644 --- a/libs/internal-sdk/src/models/components/createchannelconnectionrequestdto.ts +++ b/libs/internal-sdk/src/models/components/createchannelconnectionrequestdto.ts @@ -2,22 +2,14 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import * as z from "zod/v3"; -import { - AuthDto, - AuthDto$Outbound, - AuthDto$outboundSchema, -} from "./authdto.js"; -import { - WorkspaceDto, - WorkspaceDto$Outbound, - WorkspaceDto$outboundSchema, -} from "./workspacedto.js"; +import * as z from 'zod/v3'; +import { AuthDto, AuthDto$Outbound, AuthDto$outboundSchema } from './authdto.js'; +import { WorkspaceDto, WorkspaceDto$Outbound, WorkspaceDto$outboundSchema } from './workspacedto.js'; /** * Rich context object with id and optional data */ -export type Context2 = { +export type CreateChannelConnectionRequestDtoContext2 = { id: string; /** * Optional additional context data @@ -25,7 +17,7 @@ export type Context2 = { data?: { [k: string]: any } | undefined; }; -export type CreateChannelConnectionRequestDtoContext = Context2 | string; +export type CreateChannelConnectionRequestDtoContext = CreateChannelConnectionRequestDtoContext2 | string; export type CreateChannelConnectionRequestDto = { /** @@ -36,7 +28,7 @@ export type CreateChannelConnectionRequestDto = { * The subscriber ID to link the channel connection to */ subscriberId?: string | undefined; - context?: { [k: string]: Context2 | string } | undefined; + context?: { [k: string]: CreateChannelConnectionRequestDtoContext2 | string } | undefined; /** * The identifier of the integration to use for this channel connection. */ @@ -46,28 +38,32 @@ export type CreateChannelConnectionRequestDto = { }; /** @internal */ -export type Context2$Outbound = { +export type CreateChannelConnectionRequestDtoContext2$Outbound = { id: string; data?: { [k: string]: any } | undefined; }; /** @internal */ -export const Context2$outboundSchema: z.ZodType< - Context2$Outbound, +export const CreateChannelConnectionRequestDtoContext2$outboundSchema: z.ZodType< + CreateChannelConnectionRequestDtoContext2$Outbound, z.ZodTypeDef, - Context2 + CreateChannelConnectionRequestDtoContext2 > = z.object({ id: z.string(), data: z.record(z.any()).optional(), }); -export function context2ToJSON(context2: Context2): string { - return JSON.stringify(Context2$outboundSchema.parse(context2)); +export function createChannelConnectionRequestDtoContext2ToJSON( + createChannelConnectionRequestDtoContext2: CreateChannelConnectionRequestDtoContext2 +): string { + return JSON.stringify( + CreateChannelConnectionRequestDtoContext2$outboundSchema.parse(createChannelConnectionRequestDtoContext2) + ); } /** @internal */ export type CreateChannelConnectionRequestDtoContext$Outbound = - | Context2$Outbound + | CreateChannelConnectionRequestDtoContext2$Outbound | string; /** @internal */ @@ -75,16 +71,13 @@ export const CreateChannelConnectionRequestDtoContext$outboundSchema: z.ZodType< CreateChannelConnectionRequestDtoContext$Outbound, z.ZodTypeDef, CreateChannelConnectionRequestDtoContext -> = z.union([z.lazy(() => Context2$outboundSchema), z.string()]); +> = z.union([z.lazy(() => CreateChannelConnectionRequestDtoContext2$outboundSchema), z.string()]); export function createChannelConnectionRequestDtoContextToJSON( - createChannelConnectionRequestDtoContext: - CreateChannelConnectionRequestDtoContext, + createChannelConnectionRequestDtoContext: CreateChannelConnectionRequestDtoContext ): string { return JSON.stringify( - CreateChannelConnectionRequestDtoContext$outboundSchema.parse( - createChannelConnectionRequestDtoContext, - ), + CreateChannelConnectionRequestDtoContext$outboundSchema.parse(createChannelConnectionRequestDtoContext) ); } @@ -92,7 +85,11 @@ export function createChannelConnectionRequestDtoContextToJSON( export type CreateChannelConnectionRequestDto$Outbound = { identifier?: string | undefined; subscriberId?: string | undefined; - context?: { [k: string]: Context2$Outbound | string } | undefined; + context?: + | { + [k: string]: CreateChannelConnectionRequestDtoContext2$Outbound | string; + } + | undefined; integrationIdentifier: string; workspace: WorkspaceDto$Outbound; auth: AuthDto$Outbound; @@ -106,20 +103,16 @@ export const CreateChannelConnectionRequestDto$outboundSchema: z.ZodType< > = z.object({ identifier: z.string().optional(), subscriberId: z.string().optional(), - context: z.record( - z.union([z.lazy(() => Context2$outboundSchema), z.string()]), - ).optional(), + context: z + .record(z.union([z.lazy(() => CreateChannelConnectionRequestDtoContext2$outboundSchema), z.string()])) + .optional(), integrationIdentifier: z.string(), workspace: WorkspaceDto$outboundSchema, auth: AuthDto$outboundSchema, }); export function createChannelConnectionRequestDtoToJSON( - createChannelConnectionRequestDto: CreateChannelConnectionRequestDto, + createChannelConnectionRequestDto: CreateChannelConnectionRequestDto ): string { - return JSON.stringify( - CreateChannelConnectionRequestDto$outboundSchema.parse( - createChannelConnectionRequestDto, - ), - ); + return JSON.stringify(CreateChannelConnectionRequestDto$outboundSchema.parse(createChannelConnectionRequestDto)); } diff --git a/libs/internal-sdk/src/models/components/patchsubscriberpreferencesdto.ts b/libs/internal-sdk/src/models/components/patchsubscriberpreferencesdto.ts index ecee4508e7f..0638169ad6e 100644 --- a/libs/internal-sdk/src/models/components/patchsubscriberpreferencesdto.ts +++ b/libs/internal-sdk/src/models/components/patchsubscriberpreferencesdto.ts @@ -2,17 +2,26 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import * as z from "zod/v3"; +import * as z from 'zod/v3'; import { PatchPreferenceChannelsDto, PatchPreferenceChannelsDto$Outbound, PatchPreferenceChannelsDto$outboundSchema, -} from "./patchpreferencechannelsdto.js"; -import { - ScheduleDto, - ScheduleDto$Outbound, - ScheduleDto$outboundSchema, -} from "./scheduledto.js"; +} from './patchpreferencechannelsdto.js'; +import { ScheduleDto, ScheduleDto$Outbound, ScheduleDto$outboundSchema } from './scheduledto.js'; + +/** + * Rich context object with id and optional data + */ +export type Two = { + id: string; + /** + * Optional additional context data + */ + data?: { [k: string]: any } | undefined; +}; + +export type Context = Two | string; export type PatchSubscriberPreferencesDto = { /** @@ -27,13 +36,44 @@ export type PatchSubscriberPreferencesDto = { * Subscriber schedule */ schedule?: ScheduleDto | undefined; + context?: { [k: string]: Two | string } | undefined; }; +/** @internal */ +export type Two$Outbound = { + id: string; + data?: { [k: string]: any } | undefined; +}; + +/** @internal */ +export const Two$outboundSchema: z.ZodType = z.object({ + id: z.string(), + data: z.record(z.any()).optional(), +}); + +export function twoToJSON(two: Two): string { + return JSON.stringify(Two$outboundSchema.parse(two)); +} + +/** @internal */ +export type Context$Outbound = Two$Outbound | string; + +/** @internal */ +export const Context$outboundSchema: z.ZodType = z.union([ + z.lazy(() => Two$outboundSchema), + z.string(), +]); + +export function contextToJSON(context: Context): string { + return JSON.stringify(Context$outboundSchema.parse(context)); +} + /** @internal */ export type PatchSubscriberPreferencesDto$Outbound = { channels?: PatchPreferenceChannelsDto$Outbound | undefined; workflowId?: string | undefined; schedule?: ScheduleDto$Outbound | undefined; + context?: { [k: string]: Two$Outbound | string } | undefined; }; /** @internal */ @@ -45,14 +85,11 @@ export const PatchSubscriberPreferencesDto$outboundSchema: z.ZodType< channels: PatchPreferenceChannelsDto$outboundSchema.optional(), workflowId: z.string().optional(), schedule: ScheduleDto$outboundSchema.optional(), + context: z.record(z.union([z.lazy(() => Two$outboundSchema), z.string()])).optional(), }); export function patchSubscriberPreferencesDtoToJSON( - patchSubscriberPreferencesDto: PatchSubscriberPreferencesDto, + patchSubscriberPreferencesDto: PatchSubscriberPreferencesDto ): string { - return JSON.stringify( - PatchSubscriberPreferencesDto$outboundSchema.parse( - patchSubscriberPreferencesDto, - ), - ); + return JSON.stringify(PatchSubscriberPreferencesDto$outboundSchema.parse(patchSubscriberPreferencesDto)); } diff --git a/libs/internal-sdk/src/models/components/previewpayloaddto.ts b/libs/internal-sdk/src/models/components/previewpayloaddto.ts index 5e09c3ceb8b..e88d8f673ec 100644 --- a/libs/internal-sdk/src/models/components/previewpayloaddto.ts +++ b/libs/internal-sdk/src/models/components/previewpayloaddto.ts @@ -2,21 +2,21 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import * as z from "zod/v3"; -import { safeParse } from "../../lib/schemas.js"; -import { Result as SafeParseResult } from "../../types/fp.js"; -import { SDKValidationError } from "../errors/sdkvalidationerror.js"; +import * as z from 'zod/v3'; +import { safeParse } from '../../lib/schemas.js'; +import { Result as SafeParseResult } from '../../types/fp.js'; +import { SDKValidationError } from '../errors/sdkvalidationerror.js'; import { SubscriberResponseDtoOptional, SubscriberResponseDtoOptional$inboundSchema, SubscriberResponseDtoOptional$Outbound, SubscriberResponseDtoOptional$outboundSchema, -} from "./subscriberresponsedtooptional.js"; +} from './subscriberresponsedtooptional.js'; /** * Rich context object with id and optional data */ -export type Two = { +export type PreviewPayloadDtoContext2 = { id: string; /** * Optional additional context data @@ -24,7 +24,7 @@ export type Two = { data?: { [k: string]: any } | undefined; }; -export type Context = Two | string; +export type PreviewPayloadDtoContext = PreviewPayloadDtoContext2 | string; export type PreviewPayloadDto = { /** @@ -39,113 +39,101 @@ export type PreviewPayloadDto = { * Steps data */ steps?: { [k: string]: any } | undefined; - context?: { [k: string]: Two | string } | undefined; + context?: { [k: string]: PreviewPayloadDtoContext2 | string } | undefined; }; /** @internal */ -export const Two$inboundSchema: z.ZodType = z - .object({ +export const PreviewPayloadDtoContext2$inboundSchema: z.ZodType = + z.object({ id: z.string(), data: z.record(z.any()).optional(), }); /** @internal */ -export type Two$Outbound = { +export type PreviewPayloadDtoContext2$Outbound = { id: string; data?: { [k: string]: any } | undefined; }; /** @internal */ -export const Two$outboundSchema: z.ZodType = z - .object({ - id: z.string(), - data: z.record(z.any()).optional(), - }); +export const PreviewPayloadDtoContext2$outboundSchema: z.ZodType< + PreviewPayloadDtoContext2$Outbound, + z.ZodTypeDef, + PreviewPayloadDtoContext2 +> = z.object({ + id: z.string(), + data: z.record(z.any()).optional(), +}); -export function twoToJSON(two: Two): string { - return JSON.stringify(Two$outboundSchema.parse(two)); +export function previewPayloadDtoContext2ToJSON(previewPayloadDtoContext2: PreviewPayloadDtoContext2): string { + return JSON.stringify(PreviewPayloadDtoContext2$outboundSchema.parse(previewPayloadDtoContext2)); } -export function twoFromJSON( - jsonString: string, -): SafeParseResult { +export function previewPayloadDtoContext2FromJSON( + jsonString: string +): SafeParseResult { return safeParse( jsonString, - (x) => Two$inboundSchema.parse(JSON.parse(x)), - `Failed to parse 'Two' from JSON`, + (x) => PreviewPayloadDtoContext2$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'PreviewPayloadDtoContext2' from JSON` ); } /** @internal */ -export const Context$inboundSchema: z.ZodType = - z.union([z.lazy(() => Two$inboundSchema), z.string()]); +export const PreviewPayloadDtoContext$inboundSchema: z.ZodType = + z.union([z.lazy(() => PreviewPayloadDtoContext2$inboundSchema), z.string()]); /** @internal */ -export type Context$Outbound = Two$Outbound | string; +export type PreviewPayloadDtoContext$Outbound = PreviewPayloadDtoContext2$Outbound | string; /** @internal */ -export const Context$outboundSchema: z.ZodType< - Context$Outbound, +export const PreviewPayloadDtoContext$outboundSchema: z.ZodType< + PreviewPayloadDtoContext$Outbound, z.ZodTypeDef, - Context -> = z.union([z.lazy(() => Two$outboundSchema), z.string()]); + PreviewPayloadDtoContext +> = z.union([z.lazy(() => PreviewPayloadDtoContext2$outboundSchema), z.string()]); -export function contextToJSON(context: Context): string { - return JSON.stringify(Context$outboundSchema.parse(context)); +export function previewPayloadDtoContextToJSON(previewPayloadDtoContext: PreviewPayloadDtoContext): string { + return JSON.stringify(PreviewPayloadDtoContext$outboundSchema.parse(previewPayloadDtoContext)); } -export function contextFromJSON( - jsonString: string, -): SafeParseResult { +export function previewPayloadDtoContextFromJSON( + jsonString: string +): SafeParseResult { return safeParse( jsonString, - (x) => Context$inboundSchema.parse(JSON.parse(x)), - `Failed to parse 'Context' from JSON`, + (x) => PreviewPayloadDtoContext$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'PreviewPayloadDtoContext' from JSON` ); } /** @internal */ -export const PreviewPayloadDto$inboundSchema: z.ZodType< - PreviewPayloadDto, - z.ZodTypeDef, - unknown -> = z.object({ +export const PreviewPayloadDto$inboundSchema: z.ZodType = z.object({ subscriber: SubscriberResponseDtoOptional$inboundSchema.optional(), payload: z.record(z.any()).optional(), steps: z.record(z.any()).optional(), - context: z.record(z.union([z.lazy(() => Two$inboundSchema), z.string()])) - .optional(), + context: z.record(z.union([z.lazy(() => PreviewPayloadDtoContext2$inboundSchema), z.string()])).optional(), }); /** @internal */ export type PreviewPayloadDto$Outbound = { subscriber?: SubscriberResponseDtoOptional$Outbound | undefined; payload?: { [k: string]: any } | undefined; steps?: { [k: string]: any } | undefined; - context?: { [k: string]: Two$Outbound | string } | undefined; + context?: { [k: string]: PreviewPayloadDtoContext2$Outbound | string } | undefined; }; /** @internal */ -export const PreviewPayloadDto$outboundSchema: z.ZodType< - PreviewPayloadDto$Outbound, - z.ZodTypeDef, - PreviewPayloadDto -> = z.object({ - subscriber: SubscriberResponseDtoOptional$outboundSchema.optional(), - payload: z.record(z.any()).optional(), - steps: z.record(z.any()).optional(), - context: z.record(z.union([z.lazy(() => Two$outboundSchema), z.string()])) - .optional(), -}); +export const PreviewPayloadDto$outboundSchema: z.ZodType = + z.object({ + subscriber: SubscriberResponseDtoOptional$outboundSchema.optional(), + payload: z.record(z.any()).optional(), + steps: z.record(z.any()).optional(), + context: z.record(z.union([z.lazy(() => PreviewPayloadDtoContext2$outboundSchema), z.string()])).optional(), + }); -export function previewPayloadDtoToJSON( - previewPayloadDto: PreviewPayloadDto, -): string { - return JSON.stringify( - PreviewPayloadDto$outboundSchema.parse(previewPayloadDto), - ); +export function previewPayloadDtoToJSON(previewPayloadDto: PreviewPayloadDto): string { + return JSON.stringify(PreviewPayloadDto$outboundSchema.parse(previewPayloadDto)); } -export function previewPayloadDtoFromJSON( - jsonString: string, -): SafeParseResult { +export function previewPayloadDtoFromJSON(jsonString: string): SafeParseResult { return safeParse( jsonString, (x) => PreviewPayloadDto$inboundSchema.parse(JSON.parse(x)), - `Failed to parse 'PreviewPayloadDto' from JSON`, + `Failed to parse 'PreviewPayloadDto' from JSON` ); } diff --git a/libs/internal-sdk/src/models/operations/subscriberscontrollergetsubscriberpreferences.ts b/libs/internal-sdk/src/models/operations/subscriberscontrollergetsubscriberpreferences.ts index 0f02dbac26d..723fe204c65 100644 --- a/libs/internal-sdk/src/models/operations/subscriberscontrollergetsubscriberpreferences.ts +++ b/libs/internal-sdk/src/models/operations/subscriberscontrollergetsubscriberpreferences.ts @@ -2,24 +2,28 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import * as z from "zod/v3"; -import { remap as remap$ } from "../../lib/primitives.js"; -import { safeParse } from "../../lib/schemas.js"; -import { ClosedEnum } from "../../types/enums.js"; -import { Result as SafeParseResult } from "../../types/fp.js"; -import * as components from "../components/index.js"; -import { SDKValidationError } from "../errors/sdkvalidationerror.js"; +import * as z from 'zod/v3'; +import { remap as remap$ } from '../../lib/primitives.js'; +import { safeParse } from '../../lib/schemas.js'; +import { ClosedEnum } from '../../types/enums.js'; +import { Result as SafeParseResult } from '../../types/fp.js'; +import * as components from '../components/index.js'; +import { SDKValidationError } from '../errors/sdkvalidationerror.js'; export const Criticality = { - Critical: "critical", - NonCritical: "nonCritical", - All: "all", + Critical: 'critical', + NonCritical: 'nonCritical', + All: 'all', } as const; export type Criticality = ClosedEnum; export type SubscribersControllerGetSubscriberPreferencesRequest = { subscriberId: string; criticality?: Criticality | undefined; + /** + * Context keys for filtering preferences (e.g., ["tenant:acme"]) + */ + contextKeys?: Array | undefined; /** * A header for idempotency purposes */ @@ -32,71 +36,67 @@ export type SubscribersControllerGetSubscriberPreferencesResponse = { }; /** @internal */ -export const Criticality$outboundSchema: z.ZodNativeEnum = z - .nativeEnum(Criticality); +export const Criticality$outboundSchema: z.ZodNativeEnum = z.nativeEnum(Criticality); /** @internal */ export type SubscribersControllerGetSubscriberPreferencesRequest$Outbound = { subscriberId: string; criticality: string; - "idempotency-key"?: string | undefined; + contextKeys?: Array | undefined; + 'idempotency-key'?: string | undefined; }; /** @internal */ -export const SubscribersControllerGetSubscriberPreferencesRequest$outboundSchema: - z.ZodType< - SubscribersControllerGetSubscriberPreferencesRequest$Outbound, - z.ZodTypeDef, - SubscribersControllerGetSubscriberPreferencesRequest - > = z.object({ +export const SubscribersControllerGetSubscriberPreferencesRequest$outboundSchema: z.ZodType< + SubscribersControllerGetSubscriberPreferencesRequest$Outbound, + z.ZodTypeDef, + SubscribersControllerGetSubscriberPreferencesRequest +> = z + .object({ subscriberId: z.string(), - criticality: Criticality$outboundSchema.default("nonCritical"), + criticality: Criticality$outboundSchema.default('nonCritical'), + contextKeys: z.array(z.string()).optional(), idempotencyKey: z.string().optional(), - }).transform((v) => { + }) + .transform((v) => { return remap$(v, { - idempotencyKey: "idempotency-key", + idempotencyKey: 'idempotency-key', }); }); export function subscribersControllerGetSubscriberPreferencesRequestToJSON( - subscribersControllerGetSubscriberPreferencesRequest: - SubscribersControllerGetSubscriberPreferencesRequest, + subscribersControllerGetSubscriberPreferencesRequest: SubscribersControllerGetSubscriberPreferencesRequest ): string { return JSON.stringify( SubscribersControllerGetSubscriberPreferencesRequest$outboundSchema.parse( - subscribersControllerGetSubscriberPreferencesRequest, - ), + subscribersControllerGetSubscriberPreferencesRequest + ) ); } /** @internal */ -export const SubscribersControllerGetSubscriberPreferencesResponse$inboundSchema: - z.ZodType< - SubscribersControllerGetSubscriberPreferencesResponse, - z.ZodTypeDef, - unknown - > = z.object({ +export const SubscribersControllerGetSubscriberPreferencesResponse$inboundSchema: z.ZodType< + SubscribersControllerGetSubscriberPreferencesResponse, + z.ZodTypeDef, + unknown +> = z + .object({ Headers: z.record(z.array(z.string())).default({}), Result: components.GetSubscriberPreferencesDto$inboundSchema, - }).transform((v) => { + }) + .transform((v) => { return remap$(v, { - "Headers": "headers", - "Result": "result", + Headers: 'headers', + Result: 'result', }); }); export function subscribersControllerGetSubscriberPreferencesResponseFromJSON( - jsonString: string, -): SafeParseResult< - SubscribersControllerGetSubscriberPreferencesResponse, - SDKValidationError -> { + jsonString: string +): SafeParseResult { return safeParse( jsonString, - (x) => - SubscribersControllerGetSubscriberPreferencesResponse$inboundSchema.parse( - JSON.parse(x), - ), - `Failed to parse 'SubscribersControllerGetSubscriberPreferencesResponse' from JSON`, + (x) => SubscribersControllerGetSubscriberPreferencesResponse$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'SubscribersControllerGetSubscriberPreferencesResponse' from JSON` ); } diff --git a/libs/internal-sdk/src/react-query/subscribersPreferencesList.core.ts b/libs/internal-sdk/src/react-query/subscribersPreferencesList.core.ts index 4bf231bacf2..b1f4d63f344 100644 --- a/libs/internal-sdk/src/react-query/subscribersPreferencesList.core.ts +++ b/libs/internal-sdk/src/react-query/subscribersPreferencesList.core.ts @@ -2,77 +2,49 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import { - QueryClient, - QueryFunctionContext, - QueryKey, -} from "@tanstack/react-query"; -import { NovuCore } from "../core.js"; -import { subscribersPreferencesList } from "../funcs/subscribersPreferencesList.js"; -import { combineSignals } from "../lib/primitives.js"; -import { RequestOptions } from "../lib/sdks.js"; -import * as operations from "../models/operations/index.js"; -import { unwrapAsync } from "../types/fp.js"; -export type SubscribersPreferencesListQueryData = - operations.SubscribersControllerGetSubscriberPreferencesResponse; +import { QueryClient, QueryFunctionContext, QueryKey } from '@tanstack/react-query'; +import { NovuCore } from '../core.js'; +import { subscribersPreferencesList } from '../funcs/subscribersPreferencesList.js'; +import { combineSignals } from '../lib/primitives.js'; +import { RequestOptions } from '../lib/sdks.js'; +import * as operations from '../models/operations/index.js'; +import { unwrapAsync } from '../types/fp.js'; +export type SubscribersPreferencesListQueryData = operations.SubscribersControllerGetSubscriberPreferencesResponse; export function prefetchSubscribersPreferencesList( queryClient: QueryClient, client$: NovuCore, - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: RequestOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: RequestOptions ): Promise { return queryClient.prefetchQuery({ - ...buildSubscribersPreferencesListQuery( - client$, - subscriberId, - criticality, - idempotencyKey, - options, - ), + ...buildSubscribersPreferencesListQuery(client$, request, options), }); } export function buildSubscribersPreferencesListQuery( client$: NovuCore, - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: RequestOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: RequestOptions ): { queryKey: QueryKey; - queryFn: ( - context: QueryFunctionContext, - ) => Promise; + queryFn: (context: QueryFunctionContext) => Promise; } { return { - queryKey: queryKeySubscribersPreferencesList(subscriberId, { - criticality, - idempotencyKey, + queryKey: queryKeySubscribersPreferencesList(request.subscriberId, { + criticality: request.criticality, + contextKeys: request.contextKeys, + idempotencyKey: request.idempotencyKey, }), - queryFn: async function subscribersPreferencesListQueryFn( - ctx, - ): Promise { - const sig = combineSignals( - ctx.signal, - options?.signal, - options?.fetchOptions?.signal, - ); + queryFn: async function subscribersPreferencesListQueryFn(ctx): Promise { + const sig = combineSignals(ctx.signal, options?.signal, options?.fetchOptions?.signal); const mergedOptions = { ...options?.fetchOptions, ...options, signal: sig, }; - return unwrapAsync(subscribersPreferencesList( - client$, - subscriberId, - criticality, - idempotencyKey, - mergedOptions, - )); + return unwrapAsync(subscribersPreferencesList(client$, request, mergedOptions)); }, }; } @@ -81,8 +53,9 @@ export function queryKeySubscribersPreferencesList( subscriberId: string, parameters: { criticality?: operations.Criticality | undefined; + contextKeys?: Array | undefined; idempotencyKey?: string | undefined; - }, + } ): QueryKey { - return ["@novu/api", "Preferences", "list", subscriberId, parameters]; + return ['@novu/api', 'Preferences', 'list', subscriberId, parameters]; } diff --git a/libs/internal-sdk/src/react-query/subscribersPreferencesList.ts b/libs/internal-sdk/src/react-query/subscribersPreferencesList.ts index 16ef4ced8ef..938e09ddff8 100644 --- a/libs/internal-sdk/src/react-query/subscribersPreferencesList.ts +++ b/libs/internal-sdk/src/react-query/subscribersPreferencesList.ts @@ -5,24 +5,20 @@ import { InvalidateQueryFilters, QueryClient, - useQuery, UseQueryResult, - useSuspenseQuery, UseSuspenseQueryResult, -} from "@tanstack/react-query"; -import * as operations from "../models/operations/index.js"; -import { useNovuContext } from "./_context.js"; -import { - QueryHookOptions, - SuspenseQueryHookOptions, - TupleToPrefixes, -} from "./_types.js"; + useQuery, + useSuspenseQuery, +} from '@tanstack/react-query'; +import * as operations from '../models/operations/index.js'; +import { useNovuContext } from './_context.js'; +import { QueryHookOptions, SuspenseQueryHookOptions, TupleToPrefixes } from './_types.js'; import { buildSubscribersPreferencesListQuery, prefetchSubscribersPreferencesList, queryKeySubscribersPreferencesList, SubscribersPreferencesListQueryData, -} from "./subscribersPreferencesList.core.js"; +} from './subscribersPreferencesList.core.js'; export { buildSubscribersPreferencesListQuery, prefetchSubscribersPreferencesList, @@ -38,20 +34,12 @@ export { * This API returns all five channels preferences for all workflows and global preferences. */ export function useSubscribersPreferencesList( - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: QueryHookOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: QueryHookOptions ): UseQueryResult { const client = useNovuContext(); return useQuery({ - ...buildSubscribersPreferencesListQuery( - client, - subscriberId, - criticality, - idempotencyKey, - options, - ), + ...buildSubscribersPreferencesListQuery(client, request, options), ...options, }); } @@ -64,20 +52,12 @@ export function useSubscribersPreferencesList( * This API returns all five channels preferences for all workflows and global preferences. */ export function useSubscribersPreferencesListSuspense( - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: SuspenseQueryHookOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: SuspenseQueryHookOptions ): UseSuspenseQueryResult { const client = useNovuContext(); return useSuspenseQuery({ - ...buildSubscribersPreferencesListQuery( - client, - subscriberId, - criticality, - idempotencyKey, - options, - ), + ...buildSubscribersPreferencesListQuery(client, request, options), ...options, }); } @@ -88,10 +68,11 @@ export function setSubscribersPreferencesListData( subscriberId: string, parameters: { criticality?: operations.Criticality | undefined; + contextKeys?: Array | undefined; idempotencyKey?: string | undefined; }, ], - data: SubscribersPreferencesListQueryData, + data: SubscribersPreferencesListQueryData ): SubscribersPreferencesListQueryData | undefined { const key = queryKeySubscribersPreferencesList(...queryKeyBase); @@ -105,24 +86,25 @@ export function invalidateSubscribersPreferencesList( subscriberId: string, parameters: { criticality?: operations.Criticality | undefined; + contextKeys?: Array | undefined; idempotencyKey?: string | undefined; }, ] >, - filters?: Omit, + filters?: Omit ): Promise { return client.invalidateQueries({ ...filters, - queryKey: ["@novu/api", "Preferences", "list", ...queryKeyBase], + queryKey: ['@novu/api', 'Preferences', 'list', ...queryKeyBase], }); } export function invalidateAllSubscribersPreferencesList( client: QueryClient, - filters?: Omit, + filters?: Omit ): Promise { return client.invalidateQueries({ ...filters, - queryKey: ["@novu/api", "Preferences", "list"], + queryKey: ['@novu/api', 'Preferences', 'list'], }); } diff --git a/libs/internal-sdk/src/sdk/preferences.ts b/libs/internal-sdk/src/sdk/preferences.ts index ad035f18fe5..a111a93b756 100644 --- a/libs/internal-sdk/src/sdk/preferences.ts +++ b/libs/internal-sdk/src/sdk/preferences.ts @@ -2,13 +2,13 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import { subscribersPreferencesBulkUpdate } from "../funcs/subscribersPreferencesBulkUpdate.js"; -import { subscribersPreferencesList } from "../funcs/subscribersPreferencesList.js"; -import { subscribersPreferencesUpdate } from "../funcs/subscribersPreferencesUpdate.js"; -import { ClientSDK, RequestOptions } from "../lib/sdks.js"; -import * as components from "../models/components/index.js"; -import * as operations from "../models/operations/index.js"; -import { unwrapAsync } from "../types/fp.js"; +import { subscribersPreferencesBulkUpdate } from '../funcs/subscribersPreferencesBulkUpdate.js'; +import { subscribersPreferencesList } from '../funcs/subscribersPreferencesList.js'; +import { subscribersPreferencesUpdate } from '../funcs/subscribersPreferencesUpdate.js'; +import { ClientSDK, RequestOptions } from '../lib/sdks.js'; +import * as components from '../models/components/index.js'; +import * as operations from '../models/operations/index.js'; +import { unwrapAsync } from '../types/fp.js'; export class Preferences extends ClientSDK { /** @@ -19,18 +19,10 @@ export class Preferences extends ClientSDK { * This API returns all five channels preferences for all workflows and global preferences. */ async list( - subscriberId: string, - criticality?: operations.Criticality | undefined, - idempotencyKey?: string | undefined, - options?: RequestOptions, + request: operations.SubscribersControllerGetSubscriberPreferencesRequest, + options?: RequestOptions ): Promise { - return unwrapAsync(subscribersPreferencesList( - this, - subscriberId, - criticality, - idempotencyKey, - options, - )); + return unwrapAsync(subscribersPreferencesList(this, request, options)); } /** @@ -45,17 +37,11 @@ export class Preferences extends ClientSDK { patchSubscriberPreferencesDto: components.PatchSubscriberPreferencesDto, subscriberId: string, idempotencyKey?: string | undefined, - options?: RequestOptions, - ): Promise< - operations.SubscribersControllerUpdateSubscriberPreferencesResponse - > { - return unwrapAsync(subscribersPreferencesUpdate( - this, - patchSubscriberPreferencesDto, - subscriberId, - idempotencyKey, - options, - )); + options?: RequestOptions + ): Promise { + return unwrapAsync( + subscribersPreferencesUpdate(this, patchSubscriberPreferencesDto, subscriberId, idempotencyKey, options) + ); } /** @@ -66,20 +52,13 @@ export class Preferences extends ClientSDK { * This API allows updating multiple workflow preferences in a single request. */ async bulkUpdate( - bulkUpdateSubscriberPreferencesDto: - components.BulkUpdateSubscriberPreferencesDto, + bulkUpdateSubscriberPreferencesDto: components.BulkUpdateSubscriberPreferencesDto, subscriberId: string, idempotencyKey?: string | undefined, - options?: RequestOptions, - ): Promise< - operations.SubscribersControllerBulkUpdateSubscriberPreferencesResponse - > { - return unwrapAsync(subscribersPreferencesBulkUpdate( - this, - bulkUpdateSubscriberPreferencesDto, - subscriberId, - idempotencyKey, - options, - )); + options?: RequestOptions + ): Promise { + return unwrapAsync( + subscribersPreferencesBulkUpdate(this, bulkUpdateSubscriberPreferencesDto, subscriberId, idempotencyKey, options) + ); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92adbe1fe51..19ad3cf6afc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -256,7 +256,7 @@ importers: version: 7.4.0(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) '@nestjs/terminus': specifier: 10.2.3 - version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/throttler': specifier: 6.2.1 version: 6.2.1(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(reflect-metadata@0.2.2) @@ -1548,7 +1548,7 @@ importers: version: 10.4.18(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18) '@nestjs/terminus': specifier: 10.2.3 - version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@novu/application-generic': specifier: workspace:* version: link:../../libs/application-generic @@ -1711,7 +1711,7 @@ importers: version: 7.4.0(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) '@nestjs/terminus': specifier: 10.2.3 - version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@novu/application-generic': specifier: workspace:* version: link:../../libs/application-generic @@ -1932,7 +1932,7 @@ importers: version: 7.4.0(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) '@nestjs/terminus': specifier: 10.2.3 - version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/websockets': specifier: 10.4.18 version: 10.4.18(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(@nestjs/platform-socket.io@10.4.18)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -2185,8 +2185,8 @@ importers: specifier: ^3.1.0 version: 3.1.0 mongoose: - specifier: ^7.8.7 - version: 7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0))) + specifier: ^8.9.5 + version: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) passport: specifier: 0.7.0 version: 0.7.0 @@ -2282,8 +2282,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 mongoose: - specifier: ^7.8.7 - version: 7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))) + specifier: ^8.9.5 + version: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) rxjs: specifier: 7.8.1 version: 7.8.1 @@ -2340,11 +2340,11 @@ importers: specifier: workspace:* version: link:../../../packages/shared mongoose: - specifier: ^7.8.7 - version: 7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))) + specifier: ^8.9.5 + version: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) mongoose-delete: - specifier: ^1.0.1 - version: 1.0.1(mongoose@7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))) + specifier: ^1.0.7 + version: 1.0.7(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1)) rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -2510,9 +2510,6 @@ importers: '@google-cloud/storage': specifier: ^6.2.3 version: 6.12.0(encoding@0.1.13) - '@hokify/agenda': - specifier: ^6.3.0 - version: 6.3.0 '@launchdarkly/node-server-sdk': specifier: ^9.7.3 version: 9.7.3 @@ -2533,7 +2530,7 @@ importers: version: 7.4.0(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) '@nestjs/terminus': specifier: 10.2.3 - version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/testing': specifier: 10.4.18 version: 10.4.18(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(@nestjs/platform-express@10.4.18) @@ -2606,6 +2603,9 @@ importers: '@opentelemetry/semantic-conventions': specifier: ~1.19.0 version: 1.19.0 + '@pulsecron/pulse': + specifier: 1.6.8 + version: 1.6.8(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) '@segment/analytics-node': specifier: ^1.1.4 version: 1.1.4(encoding@0.1.13) @@ -2756,7 +2756,7 @@ importers: version: 16.5.0 jest: specifier: ^27.1.0 - version: 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)) + version: 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -2771,16 +2771,16 @@ importers: version: 9.2.4 ts-jest: specifier: ^27.0.5 - version: 27.1.5(@babel/core@7.28.0)(@types/jest@29.5.2)(babel-jest@27.5.1(@babel/core@7.28.0))(esbuild@0.23.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)))(typescript@5.6.2) + version: 27.1.5(@babel/core@7.28.0)(@types/jest@29.5.2)(babel-jest@27.5.1(@babel/core@7.28.0))(esbuild@0.23.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ~10.9.1 - version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2) typescript: specifier: 5.6.2 version: 5.6.2 vitest: specifier: ^2.1.9 - version: 2.1.9(@edge-runtime/vm@4.0.2)(@types/node@20.19.10)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + version: 2.1.9(@edge-runtime/vm@4.0.2)(@types/node@22.15.13)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) optionalDependencies: '@novu/ee-shared-services': specifier: workspace:* @@ -2871,11 +2871,11 @@ importers: specifier: ^6.0.1 version: 6.1.0 mongoose: - specifier: ^7.8.7 - version: 7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))) + specifier: ^8.9.5 + version: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) mongoose-delete: - specifier: ^1.0.1 - version: 1.0.1(mongoose@7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))) + specifier: ^1.0.7 + version: 1.0.7(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1)) reflect-metadata: specifier: 0.2.2 version: 0.2.2 @@ -3264,7 +3264,7 @@ importers: devDependencies: '@tailwindcss/typography': specifier: ^0.5.15 - version: 0.5.19(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2))) + version: 0.5.19(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3))) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) @@ -3273,13 +3273,13 @@ importers: version: 8.4.47 tailwind-scrollbar: specifier: ^3.1.0 - version: 3.1.0(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2))) + version: 3.1.0(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3))) tailwindcss: specifier: ^3.4.14 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3))) libs/maily-tsconfig: {} @@ -3564,13 +3564,13 @@ importers: version: 5.0.10 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3) typescript: specifier: ^5.0.0 version: 5.8.3 vitest: specifier: ^2.1.9 - version: 2.1.9(@edge-runtime/vm@4.0.2)(@types/node@20.19.10)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + version: 2.1.9(@edge-runtime/vm@4.0.2)(@types/node@22.15.13)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) packages/framework: dependencies: @@ -3952,13 +3952,13 @@ importers: version: 3.0.1 ts-node: specifier: ~10.9.1 - version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2) typescript: specifier: 5.6.2 version: 5.6.2 vitest: specifier: ^1.2.1 - version: 1.6.1(@edge-runtime/vm@4.0.2)(@types/node@20.19.10)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + version: 1.6.1(@edge-runtime/vm@4.0.2)(@types/node@22.15.13)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) packages/providers: dependencies: @@ -4133,7 +4133,7 @@ importers: version: 3.0.2 ts-node: specifier: ~10.9.1 - version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2) typedoc: specifier: ^0.24.0 version: 0.24.6(typescript@5.6.2) @@ -4142,7 +4142,7 @@ importers: version: 5.6.2 vitest: specifier: 2.1.9 - version: 2.1.9(@edge-runtime/vm@4.0.2)(@types/node@20.19.10)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + version: 2.1.9(@edge-runtime/vm@4.0.2)(@types/node@22.15.13)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) packages/react: dependencies: @@ -4595,10 +4595,6 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.504.0': - resolution: {integrity: sha512-WsQY6CRDC9Y1rKjpsk187EHKES6nLmM9sD6iHAKZFLhi/DiYsy8SIafPFPEvluubYlheeLzgUB8Oxpj6Z69hlA==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-cognito-identity@3.637.0': resolution: {integrity: sha512-391mca6yEfXVcSOTLGcxzlT0QCFfvoymLlVHfb//bzl806UUTq12cR2k+AnaCKLj+QSejmA7n6lwZWADm00Fvg==} engines: {node: '>=16.0.0'} @@ -4623,12 +4619,6 @@ packages: resolution: {integrity: sha512-hTfvB1ftbrqaz7qiEkmRobzUQwG34oZlByobn8Frdr5ZQbJk969bX6evQAPyKlJEr26+kL9TnaX+rbLR/+gwHQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/client-sso-oidc@3.504.0': - resolution: {integrity: sha512-ODA33/nm2srhV08EW0KZAP577UgV0qjyr7Xp2yEo8MXWL4ZqQZprk1c+QKBhjr4Djesrm0VPmSD/np0mtYP68A==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@aws-sdk/credential-provider-node': ^3.504.0 - '@aws-sdk/client-sso-oidc@3.575.0': resolution: {integrity: sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==} engines: {node: '>=16.0.0'} @@ -4653,10 +4643,6 @@ packages: resolution: {integrity: sha512-E7uKSvbA0XMKSN5KLInf52hmMpe9/OKo6N9OPffGXdn3fNEQlvyQq3meUkqG7Is0ldgsQMz5EUBNtNybXzr3tQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/client-sso@3.502.0': - resolution: {integrity: sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-sso@3.575.0': resolution: {integrity: sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==} engines: {node: '>=16.0.0'} @@ -4677,12 +4663,6 @@ packages: resolution: {integrity: sha512-y9FAcAYHT8O6T/jqhgsIQUb4gLiSTKD3xtzudDvjmFi8gl0oRIY1npbeckSiK6k07VQugm2s64I0nDnDxtWsBg==} engines: {node: '>=14.0.0'} - '@aws-sdk/client-sts@3.504.0': - resolution: {integrity: sha512-IESs8FkL7B/uY+ml4wgoRkrr6xYo4PizcNw6JX17eveq1gRBCPKeGMjE6HTDOcIYZZ8rqz/UeuH3JD4UhrMOnA==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@aws-sdk/credential-provider-node': ^3.504.0 - '@aws-sdk/client-sts@3.575.0': resolution: {integrity: sha512-8MrT4J2dRiskf0JFMGL5VNBqPvc6igNa218LGBJzHXmLsm1WfGCGnce84R7U2USr8oPOenu0XzSCLvMQyZbGWQ==} engines: {node: '>=16.0.0'} @@ -4695,10 +4675,6 @@ packages: resolution: {integrity: sha512-047EqXv2BAn/43eP92zsozPnR3paFFMsj5gjytx9kGNtp+WV0fUZNztCOobtouAxBY0ZQ8Xx5RFnmjpRb6Kjsg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.496.0': - resolution: {integrity: sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==} - engines: {node: '>=14.0.0'} - '@aws-sdk/core@3.575.0': resolution: {integrity: sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==} engines: {node: '>=16.0.0'} @@ -4711,10 +4687,6 @@ packages: resolution: {integrity: sha512-UraXNmvqj3vScSsTkjMwQkhei30BhXlW5WxX6JacMKVtl95c7z0qOXquTWeTalYkFfulfdirUhvSZrl+hcyqTw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.504.0': - resolution: {integrity: sha512-QRmKLl4wM7Yd1HBzUdHIA+QhQxLROXptQjwMNL+KNfl5vMFYOUt0FMXwg80DRHl7qEScvZZEDovcswuuw5Uo2w==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.637.0': resolution: {integrity: sha512-9qK1mF+EThtv3tsL1C/wb9MpWctJSkzjrLTFj+0Rtk8VYm6DlGepo/I6a2x3SeDmdBfHAFSrKFU39GqWDp1mwQ==} engines: {node: '>=16.0.0'} @@ -4727,10 +4699,6 @@ packages: resolution: {integrity: sha512-PVqNk7XPIYe5CMYNvELkcALtkl/pIM8/uPtqEtTg+mgnZBeL4fAmgXZiZMahQo1DxP5t/JaK384f6JG+A0qDjA==} engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-env@3.502.0': - resolution: {integrity: sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-env@3.575.0': resolution: {integrity: sha512-YTgpq3rvYBXzW6OTDB00cE79evQtss/lz2GlJXgqqVXD0m7i77hGA8zb44VevP/WxtDaiSW7SSjuu8VCBGsg4g==} engines: {node: '>=16.0.0'} @@ -4743,10 +4711,6 @@ packages: resolution: {integrity: sha512-OuH2yULYUHTVDUotBoP/9AEUIJPn81GQ/YBtZLoo2QyezRJ2QiO/1epVtbJlhNZRwXrToLEDmQGA2QfC8c7pbA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.503.1': - resolution: {integrity: sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-http@3.575.0': resolution: {integrity: sha512-xQfVmYI+9KqRvhWY8fyElnpcVUBBUgi/Hoji3oU6WLrUjrX98k93He7gKDQSyHf7ykMLUAJYWwsV4AjQ2j6njA==} engines: {node: '>=16.0.0'} @@ -4767,10 +4731,6 @@ packages: resolution: {integrity: sha512-3dg3A8AiZ5vXkSAYyyI3V/AW3Eo6KQJyE/glA+Nr2M0oAjT4z3vHhS3pf2B+hfKGZBTuKKgxusrrhrQABd/Diw==} engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-ini@3.504.0': - resolution: {integrity: sha512-ODICLXfr8xTUd3wweprH32Ge41yuBa+u3j0JUcLdTUO1N9ldczSMdo8zOPlP0z4doqD3xbnqMkjNQWgN/Q+5oQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-ini@3.575.0': resolution: {integrity: sha512-BdM6a/5VUuNge3c6yRuxvO+4srLoSfqHfkQGfUDfhTdTJpljlpfnc9h3z2Ni1+aueOHPZMNFWIktHDcX5wUGBg==} engines: {node: '>=16.0.0'} @@ -4797,10 +4757,6 @@ packages: resolution: {integrity: sha512-BqWAkIG08gj/wevpesaZhAjALjfUNVjseHQRk+DNUoHIfyibW7Ahf3q/GIPs11dA2o8ECwR9/fo68Sq+sK799A==} engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-node@3.504.0': - resolution: {integrity: sha512-6+V5hIh+tILmUjf2ZQWQINR3atxQVgH/bFrGdSR/sHSp/tEgw3m0xWL3IRslWU1e4/GtXrfg1iYnMknXy68Ikw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-node@3.575.0': resolution: {integrity: sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==} engines: {node: '>=16.0.0'} @@ -4821,10 +4777,6 @@ packages: resolution: {integrity: sha512-tQScLHmDlqkQN+mqw4s3cxepEUeHYDhFl5eH+J8puvPqWjXMYpCEdY79SAtWs6SZd4CWiZ0VLeYU6xQBZengbQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-process@3.502.0': - resolution: {integrity: sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-process@3.575.0': resolution: {integrity: sha512-2/5NJV7MZysKglqJSQ/O8OELNcwLcH3xknabL9NagtzB7RNB2p1AUXR0UlTey9sSDLL4oCmNa/+unYuglW/Ahg==} engines: {node: '>=16.0.0'} @@ -4845,10 +4797,6 @@ packages: resolution: {integrity: sha512-RH02+rntaO0UhnSBr42n+7q8HOztc+Dets/hh6cWovf3Yi9s9ghLgYLN9FXpSosfot3XkmT/HOCa+CphAmGN9A==} engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-sso@3.504.0': - resolution: {integrity: sha512-4MgH2or2SjPzaxM08DCW+BjaX4DSsEGJlicHKmz6fh+w9JmLh750oXcTnbvgUeVz075jcs6qTKjvUcsdGM/t8Q==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-sso@3.575.0': resolution: {integrity: sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==} engines: {node: '>=16.0.0'} @@ -4869,10 +4817,6 @@ packages: resolution: {integrity: sha512-6ueMPl+J3KWv6ZaAWF4Z138QCuBVFZRVAgwbtP3BNqWrrs4Q6TPksOQJ79lRDMpv0EUoyVl04B6lldNlhN8RdA==} engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-web-identity@3.504.0': - resolution: {integrity: sha512-L1ljCvGpIEFdJk087ijf2ohg7HBclOeB1UgBxUBBzf4iPRZTQzd2chGaKj0hm2VVaXz7nglswJeURH5PFcS5oA==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-provider-web-identity@3.575.0': resolution: {integrity: sha512-QcvVH7wpvpFRXGAGgCBfQeiF/ptD0NJ+Hrc8dDYfPGhFeZ0EoVQBYNphLi25xe7JZ+XbaqCKrURHZtr4fAEOJw==} engines: {node: '>=16.0.0'} @@ -4891,10 +4835,6 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.723.0 - '@aws-sdk/credential-providers@3.504.1': - resolution: {integrity: sha512-D/ef7ZVxJVXC1qe6ZMS0dOWM92LNHJRHn9Biz5eRqRvRhNL+Rq68ZULlc0TQTVY71Fcc5TJ8OwFhaboPUiqWXA==} - engines: {node: '>=14.0.0'} - '@aws-sdk/credential-providers@3.637.0': resolution: {integrity: sha512-yW1scL3Z7JsrTrmhjyZsB6tsMJ49UCO42BGlNWZAW+kN1vNJ+qbv6XYQJWR4gjpuD2rdmtGcEawcgllE2Bmigw==} engines: {node: '>=16.0.0'} @@ -4919,10 +4859,6 @@ packages: resolution: {integrity: sha512-EWm9PXSr8dSp7hnRth1U7OfelXQp9dLf1yS1kUL+UhppYDJpjhdP7ql3NI4xJKw8e76sP2FuJYEuzWnJHuWoyQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-host-header@3.502.0': - resolution: {integrity: sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-host-header@3.575.0': resolution: {integrity: sha512-V2WoLBiXNCc4rIWZt6FUcP4TN0Vk02A9PPCBWkTfyOooiqfq+WZmZjRRBpwl1+5UsvARslrKWF0VzheMRXPJLQ==} engines: {node: '>=16.0.0'} @@ -4947,10 +4883,6 @@ packages: resolution: {integrity: sha512-FjAvJr1XyaInT81RxUwgifnbXoFJrRBFc64XeFJgFanGIQCWLYxRrK2HV9eBpao/AycbmuoHgLd/f0sa4hZFoQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-logger@3.502.0': - resolution: {integrity: sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-logger@3.575.0': resolution: {integrity: sha512-7DEKx9Z11Maaye7FfhYtC8rjbM/PcFcMO2N4QEAfypcgWCj+w4gseE2OGdfAH9OFDoFc6YvLp53v16vbPjzQSg==} engines: {node: '>=16.0.0'} @@ -4971,10 +4903,6 @@ packages: resolution: {integrity: sha512-ZF45T785ru8OwvYZw6awD9Z76OwSMM1eZzj2eY+FDz1cHfkpLjxEiti2iIH1FxbyK7n9ZqDUx29lVlCv238YyQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-recursion-detection@3.502.0': - resolution: {integrity: sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-recursion-detection@3.575.0': resolution: {integrity: sha512-ri89ldRFos6KZDGaknWPS2XPO9qr+gZ7+mPaoU8YkSM1W4uKqtnUSONyc+O3CFGJrqReuGHhRq0l2Sld0bjwOw==} engines: {node: '>=16.0.0'} @@ -5007,10 +4935,6 @@ packages: resolution: {integrity: sha512-oJXlE0MES8gxNLo137PPNNiOICQGOaETTvq3kBSJgb/gtEAxQajMIlaNT7s1wsjOAruFHt4975nCXuY4lpx7GQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-signing@3.502.0': - resolution: {integrity: sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-signing@3.575.0': resolution: {integrity: sha512-frpGG7i3YngWwrYIeDq8/nbat3Gfl803qasaS112rmlPU0ezmYS1SPxpXjpIKxUUYofbzaFtRBAOHU1u7GnWew==} engines: {node: '>=16.0.0'} @@ -5027,10 +4951,6 @@ packages: resolution: {integrity: sha512-hTfFTwDtp86xS98BKa+RFuLfcvGftxwzrbZeisZV8hdb4ZhvNXjSxnvM3vetW0GUEnY9xHPSGyp2ERRTinPKFQ==} engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-user-agent@3.502.0': - resolution: {integrity: sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-user-agent@3.575.0': resolution: {integrity: sha512-fWlr4RfrUNS2R3PgP+WsoMYORAgv/47Lp0J0fb3dXO1YvdczNWddRbFSUX2MQxM/y9XFfQPLpLgzluhoL3Cjeg==} engines: {node: '>=16.0.0'} @@ -5043,10 +4963,6 @@ packages: resolution: {integrity: sha512-hZvzuE5S0JmFie1r68K2wQvJbzyxJFdzltj9skgnnwdvLe8F/tz7MqLkm28uV0m4jeHk0LpiBo6eZaPkQiwsZQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.502.0': - resolution: {integrity: sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/region-config-resolver@3.575.0': resolution: {integrity: sha512-sBJKwTWKCWu9y8FzXIijYGwkKr3tDkPXM7BylToe6W+tGkp4OirV4iXrWA9zReNwTTepoxHufofqjGK9BtcI8g==} engines: {node: '>=16.0.0'} @@ -5075,10 +4991,6 @@ packages: resolution: {integrity: sha512-2lo1gFJl624kfjo/YdU6zW+k6dEwhoqjNkDNbOZEFgS1KDofHe9GX8W4/ReKb0Ggho5/EcjzZ53/1CjkzUq4tA==} engines: {node: '>=14.0.0'} - '@aws-sdk/token-providers@3.504.0': - resolution: {integrity: sha512-YIJWWsZi2ClUiILS1uh5L6VjmCUSTI6KKMuL9DkGjYqJ0aI6M8bd8fT9Wm7QmXCyjcArTgr/Atkhia4T7oKvzQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/token-providers@3.575.0': resolution: {integrity: sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==} engines: {node: '>=16.0.0'} @@ -5105,10 +5017,6 @@ packages: resolution: {integrity: sha512-YTjFabNwjTF+6yl88f0/tWff018qmmgMmjlw45s6sdVKueWxdxV68U7gepNLF2nhaQPZa6FDOBoA51NaviVs0Q==} engines: {node: '>=14.0.0'} - '@aws-sdk/types@3.502.0': - resolution: {integrity: sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==} - engines: {node: '>=14.0.0'} - '@aws-sdk/types@3.575.0': resolution: {integrity: sha512-XrnolQGs0wXxdgNudirR14OgNOarH7WUif38+2Pd4onZH+L7XoILem0EgA1tRpgFpw2pFHlZCNaAHDNSBEal7g==} engines: {node: '>=16.0.0'} @@ -5137,10 +5045,6 @@ packages: resolution: {integrity: sha512-g7kvuCXehGXHHBw9PkSQdwVyDFmNUZLmfrRmqMyrMDG9QLQrxr4pyWcSaYgTE16yUzhQQOR+QSey+BL6W9/N6g==} engines: {node: '>=14.0.0'} - '@aws-sdk/util-endpoints@3.502.0': - resolution: {integrity: sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==} - engines: {node: '>=14.0.0'} - '@aws-sdk/util-endpoints@3.575.0': resolution: {integrity: sha512-wC5x+V6w3kRlR6X6XVINsAPDYG+Tzs3Wthlw+YLtjuPODUNZIQAqsABHahxnekFyAvse+1929Hwo+CaL+BHZGA==} engines: {node: '>=16.0.0'} @@ -5171,9 +5075,6 @@ packages: '@aws-sdk/util-user-agent-browser@3.387.0': resolution: {integrity: sha512-lpgSVvDqx+JjHZCTYs/yQSS7J71dPlJeAlvxc7bmx5m+vfwKe07HAnIs+929DngS0QbAp/VaXbTiMFsInLkO4Q==} - '@aws-sdk/util-user-agent-browser@3.502.0': - resolution: {integrity: sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==} - '@aws-sdk/util-user-agent-browser@3.575.0': resolution: {integrity: sha512-iADonXyaXgwvC4T0qRuDWCdKInz82GX2cyezq/oqVlL8bPY7HD8jwZZruuJdq5tkaJi1EhbO4+f1ksZqOiZKvQ==} @@ -5201,15 +5102,6 @@ packages: aws-crt: optional: true - '@aws-sdk/util-user-agent-node@3.502.0': - resolution: {integrity: sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==} - engines: {node: '>=14.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - '@aws-sdk/util-user-agent-node@3.575.0': resolution: {integrity: sha512-kwzvBfA0LoILDOFS6BV8uOkksBHrYulP6kNXegB5eZnDSNia5DbBsXqxQ/HknNF5a429SWQw2aaQJEgQvZB1VA==} engines: {node: '>=16.0.0'} @@ -8356,10 +8248,6 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@hokify/agenda@6.3.0': - resolution: {integrity: sha512-fWrKMDe/8QHJXLOdEsMogb6cb213Z82iNsnU7nFrSIMFifEXSkXNTyCZ99FV3KLf+Du1gS/M9/8uTC6FHyWRZQ==} - engines: {node: '>=14.0.0'} - '@hookform/devtools@4.3.1': resolution: {integrity: sha512-CrWxEoHQZaOXJZVQ8KBgOuAa8p2LI8M0DAN5GTRTmdCieRwFVjVDEmuTAVazWVRRkpEQSgSt3KYp7VmmqXdEnw==} peerDependencies: @@ -9150,6 +9038,9 @@ packages: '@mongodb-js/saslprep@1.1.8': resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} + '@mongodb-js/saslprep@1.4.4': + resolution: {integrity: sha512-p7X/ytJDIdwUfFL/CLOhKgdfJe1Fa8uw9seJYvdOmnP9JBWGWHW69HkOixXS6Wy9yvGf1MbhcS6lVmrhy4jm2g==} + '@motionone/animation@10.18.0': resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} @@ -11296,6 +11187,9 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@pulsecron/pulse@1.6.8': + resolution: {integrity: sha512-fg9sT/pfpZTlUYr/ktDu6om6XEm2zmulcZ8TP4JZa+Dmol7/35mMKzDwT1H5a0AUcxiFIRfB4KOpkJ+BI2fgmg==} + '@radix-ui/colors@3.0.0': resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} @@ -13408,10 +13302,6 @@ packages: resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} engines: {node: '>=18.0.0'} - '@smithy/core@1.3.1': - resolution: {integrity: sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==} - engines: {node: '>=14.0.0'} - '@smithy/core@2.4.0': resolution: {integrity: sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==} engines: {node: '>=16.0.0'} @@ -13815,10 +13705,6 @@ packages: resolution: {integrity: sha512-LeAx2faB83litC9vaOdwFaldtto2gczUHxfFf8yoRwDU3cwL4/pDm7i0hxsuBCRk5mzHsrVGw+3EVCj32UZMdw==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@1.1.1': - resolution: {integrity: sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==} - engines: {node: '>= 14.0.0'} - '@smithy/util-endpoints@2.0.5': resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} engines: {node: '>=16.0.0'} @@ -15565,9 +15451,6 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@types/whatwg-url@8.2.2': - resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} - '@types/ws@8.5.4': resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} @@ -17414,13 +17297,9 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - bson@4.7.2: - resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} - engines: {node: '>=6.9.0'} - - bson@5.5.0: - resolution: {integrity: sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==} - engines: {node: '>=14.20.1'} + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} bson@6.8.0: resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} @@ -22974,10 +22853,6 @@ packages: jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - kareem@2.5.1: - resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} - engines: {node: '>=12.0.0'} - kareem@2.6.3: resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} engines: {node: '>=12.0.0'} @@ -23585,10 +23460,6 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - luxon@3.3.0: - resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} - engines: {node: '>=12'} - luxon@3.4.4: resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} engines: {node: '>=12'} @@ -24259,42 +24130,47 @@ packages: engines: {node: '>=18'} hasBin: true + moment-timezone@0.5.48: + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} + moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} monaco-editor@0.39.0: resolution: {integrity: sha512-zhbZ2Nx93tLR8aJmL2zI1mhJpsl87HMebNBM6R8z4pLfs8pj604pIVIVwyF1TivcfNtIPpMXL+nb3DsBmE/x6Q==} - mongodb-connection-string-url@2.6.0: - resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} - mongodb-connection-string-url@3.0.1: resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} - mongodb@4.17.2: - resolution: {integrity: sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==} - engines: {node: '>=12.9.0'} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@5.9.2: - resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} - engines: {node: '>=14.20.1'} + mongodb@6.20.0: + resolution: {integrity: sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==} + engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.0.0 - kerberos: ^1.0.0 || ^2.0.0 - mongodb-client-encryption: '>=2.3.0 <3' - snappy: ^7.2.2 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.3.2 + socks: ^2.7.1 peerDependenciesMeta: '@aws-sdk/credential-providers': optional: true '@mongodb-js/zstd': optional: true + gcp-metadata: + optional: true kerberos: optional: true mongodb-client-encryption: optional: true snappy: optional: true + socks: + optional: true mongodb@6.8.0: resolution: {integrity: sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==} @@ -24323,17 +24199,13 @@ packages: socks: optional: true - mongoose-delete@1.0.1: - resolution: {integrity: sha512-vm24uep4UJOW3Ac8H/gDxURcwvl+1Cc2H7tIJ0O8ejDEFJIUoksKS9HzTOM4SvEJusAVQ0JpjhbttHpevUz71A==} + mongoose-delete@1.0.7: + resolution: {integrity: sha512-bOEKYhYdS5LxcPXG1wIimx+Gh3xecmtL1jfWnthzLvMuGDk6+WVQebf8xug2I3aMIKan3StS66CjpAj9UPOdiw==} peerDependencies: - mongoose: 5.x || 6.x || 7.x - - mongoose@7.8.7: - resolution: {integrity: sha512-5Bo4CrUxrPITrhMKsqUTOkXXo2CoRC5tXxVQhnddCzqDMwRXfyStrxj1oY865g8gaekSBhxAeNkYyUSJvGm9Hw==} - engines: {node: '>=14.20.1'} + mongoose: 5.x || 6.x || 7.x || 8.x || 9.x - mongoose@8.6.0: - resolution: {integrity: sha512-p6VSbYKvD4ZIabqo8C0kS5eKX1Xpji+opTAIJ9wyuPJ8Y/FblgXSMnFRXnB40bYZLKPQT089K5KU8+bqIXtFdw==} + mongoose@8.21.0: + resolution: {integrity: sha512-dW2U01gN8EVQT5KAO5AkzjbqWc8A/CsEq15jOzq/M9ISpy8jw3iq7W9ZP135h9zykFOMt3AMxq4+anvt2YNJgw==} engines: {node: '>=16.20.1'} motion@11.12.0: @@ -28438,9 +28310,6 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - sift@16.0.1: - resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} - sift@17.1.3: resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} @@ -31910,52 +31779,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.504.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/core': 3.496.0 - '@aws-sdk/credential-provider-node': 3.504.0 - '@aws-sdk/middleware-host-header': 3.502.0 - '@aws-sdk/middleware-logger': 3.502.0 - '@aws-sdk/middleware-recursion-detection': 3.502.0 - '@aws-sdk/middleware-signing': 3.502.0 - '@aws-sdk/middleware-user-agent': 3.502.0 - '@aws-sdk/region-config-resolver': 3.502.0 - '@aws-sdk/types': 3.502.0 - '@aws-sdk/util-endpoints': 3.502.0 - '@aws-sdk/util-user-agent-browser': 3.502.0 - '@aws-sdk/util-user-agent-node': 3.502.0 - '@smithy/config-resolver': 2.1.1 - '@smithy/core': 1.3.1 - '@smithy/fetch-http-handler': 2.4.1 - '@smithy/hash-node': 2.1.1 - '@smithy/invalid-dependency': 2.1.1 - '@smithy/middleware-content-length': 2.1.1 - '@smithy/middleware-endpoint': 2.4.1 - '@smithy/middleware-retry': 2.1.1 - '@smithy/middleware-serde': 2.1.1 - '@smithy/middleware-stack': 2.1.1 - '@smithy/node-config-provider': 2.2.1 - '@smithy/node-http-handler': 2.3.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - '@smithy/url-parser': 2.1.1 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.1 - '@smithy/util-defaults-mode-node': 2.1.1 - '@smithy/util-endpoints': 1.1.1 - '@smithy/util-retry': 2.1.1 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - '@aws-sdk/client-cognito-identity@3.637.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -32008,8 +31831,8 @@ snapshots: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.575.0 - '@aws-sdk/client-sts': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) + '@aws-sdk/client-sts': 3.575.0 '@aws-sdk/core': 3.575.0 '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) '@aws-sdk/middleware-bucket-endpoint': 3.575.0 @@ -32237,57 +32060,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.504.0(@aws-sdk/credential-provider-node@3.504.0)': + '@aws-sdk/client-sso-oidc@3.575.0(@aws-sdk/client-sts@3.575.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/core': 3.496.0 - '@aws-sdk/credential-provider-node': 3.504.0 - '@aws-sdk/middleware-host-header': 3.502.0 - '@aws-sdk/middleware-logger': 3.502.0 - '@aws-sdk/middleware-recursion-detection': 3.502.0 - '@aws-sdk/middleware-signing': 3.502.0 - '@aws-sdk/middleware-user-agent': 3.502.0 - '@aws-sdk/region-config-resolver': 3.502.0 - '@aws-sdk/types': 3.502.0 - '@aws-sdk/util-endpoints': 3.502.0 - '@aws-sdk/util-user-agent-browser': 3.502.0 - '@aws-sdk/util-user-agent-node': 3.502.0 - '@smithy/config-resolver': 2.1.1 - '@smithy/core': 1.3.1 - '@smithy/fetch-http-handler': 2.4.1 - '@smithy/hash-node': 2.1.1 - '@smithy/invalid-dependency': 2.1.1 - '@smithy/middleware-content-length': 2.1.1 - '@smithy/middleware-endpoint': 2.4.1 - '@smithy/middleware-retry': 2.1.1 - '@smithy/middleware-serde': 2.1.1 - '@smithy/middleware-stack': 2.1.1 - '@smithy/node-config-provider': 2.2.1 - '@smithy/node-http-handler': 2.3.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - '@smithy/url-parser': 2.1.1 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.1 - '@smithy/util-defaults-mode-node': 2.1.1 - '@smithy/util-endpoints': 1.1.1 - '@smithy/util-retry': 2.1.1 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/client-sso-oidc@3.575.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + '@aws-sdk/client-sts': 3.575.0 '@aws-sdk/core': 3.575.0 '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) '@aws-sdk/middleware-host-header': 3.575.0 @@ -32326,6 +32103,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: + - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0)': @@ -32541,49 +32319,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.502.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.496.0 - '@aws-sdk/middleware-host-header': 3.502.0 - '@aws-sdk/middleware-logger': 3.502.0 - '@aws-sdk/middleware-recursion-detection': 3.502.0 - '@aws-sdk/middleware-user-agent': 3.502.0 - '@aws-sdk/region-config-resolver': 3.502.0 - '@aws-sdk/types': 3.502.0 - '@aws-sdk/util-endpoints': 3.502.0 - '@aws-sdk/util-user-agent-browser': 3.502.0 - '@aws-sdk/util-user-agent-node': 3.502.0 - '@smithy/config-resolver': 2.1.1 - '@smithy/core': 1.3.1 - '@smithy/fetch-http-handler': 2.4.1 - '@smithy/hash-node': 2.1.1 - '@smithy/invalid-dependency': 2.1.1 - '@smithy/middleware-content-length': 2.1.1 - '@smithy/middleware-endpoint': 2.4.1 - '@smithy/middleware-retry': 2.1.1 - '@smithy/middleware-serde': 2.1.1 - '@smithy/middleware-stack': 2.1.1 - '@smithy/node-config-provider': 2.2.1 - '@smithy/node-http-handler': 2.3.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - '@smithy/url-parser': 2.1.1 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.1 - '@smithy/util-defaults-mode-node': 2.1.1 - '@smithy/util-endpoints': 1.1.1 - '@smithy/util-retry': 2.1.1 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - '@aws-sdk/client-sso@3.575.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 @@ -32798,57 +32533,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.504.0(@aws-sdk/credential-provider-node@3.504.0)': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.496.0 - '@aws-sdk/credential-provider-node': 3.504.0 - '@aws-sdk/middleware-host-header': 3.502.0 - '@aws-sdk/middleware-logger': 3.502.0 - '@aws-sdk/middleware-recursion-detection': 3.502.0 - '@aws-sdk/middleware-user-agent': 3.502.0 - '@aws-sdk/region-config-resolver': 3.502.0 - '@aws-sdk/types': 3.502.0 - '@aws-sdk/util-endpoints': 3.502.0 - '@aws-sdk/util-user-agent-browser': 3.502.0 - '@aws-sdk/util-user-agent-node': 3.502.0 - '@smithy/config-resolver': 2.1.1 - '@smithy/core': 1.3.1 - '@smithy/fetch-http-handler': 2.4.1 - '@smithy/hash-node': 2.1.1 - '@smithy/invalid-dependency': 2.1.1 - '@smithy/middleware-content-length': 2.1.1 - '@smithy/middleware-endpoint': 2.4.1 - '@smithy/middleware-retry': 2.1.1 - '@smithy/middleware-serde': 2.1.1 - '@smithy/middleware-stack': 2.1.1 - '@smithy/node-config-provider': 2.2.1 - '@smithy/node-http-handler': 2.3.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - '@smithy/url-parser': 2.1.1 - '@smithy/util-base64': 2.1.1 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.1 - '@smithy/util-defaults-mode-node': 2.1.1 - '@smithy/util-endpoints': 1.1.1 - '@smithy/util-middleware': 2.1.1 - '@smithy/util-retry': 2.1.1 - '@smithy/util-utf8': 2.3.0 - fast-xml-parser: 4.2.5 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/client-sts@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': + '@aws-sdk/client-sts@3.575.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) '@aws-sdk/core': 3.575.0 '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) '@aws-sdk/middleware-host-header': 3.575.0 @@ -32887,7 +32576,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/client-sts@3.637.0': @@ -32981,16 +32669,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.496.0': - dependencies: - '@smithy/core': 1.3.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/signature-v4': 2.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/core@3.575.0': dependencies: '@smithy/core': 2.4.0 @@ -33029,17 +32707,6 @@ snapshots: fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.504.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.504.0 - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - '@aws-sdk/credential-provider-cognito-identity@3.637.0': dependencies: '@aws-sdk/client-cognito-identity': 3.637.0 @@ -33065,14 +32732,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/credential-provider-env@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -33096,19 +32755,6 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.503.1': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/fetch-http-handler': 2.4.1 - '@smithy/node-http-handler': 2.3.1 - '@smithy/property-provider': 2.1.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - '@smithy/util-stream': 2.1.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/credential-provider-http@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -33177,27 +32823,9 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-ini@3.504.0(@aws-sdk/credential-provider-node@3.504.0)': - dependencies: - '@aws-sdk/client-sts': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-env': 3.502.0 - '@aws-sdk/credential-provider-process': 3.502.0 - '@aws-sdk/credential-provider-sso': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-web-identity': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/types': 3.502.0 - '@smithy/credential-provider-imds': 2.2.1 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - optional: true - '@aws-sdk/credential-provider-ini@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0)': dependencies: - '@aws-sdk/client-sts': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + '@aws-sdk/client-sts': 3.575.0 '@aws-sdk/credential-provider-env': 3.575.0 '@aws-sdk/credential-provider-process': 3.575.0 '@aws-sdk/credential-provider-sso': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) @@ -33359,24 +32987,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.504.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.502.0 - '@aws-sdk/credential-provider-http': 3.503.1 - '@aws-sdk/credential-provider-ini': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-process': 3.502.0 - '@aws-sdk/credential-provider-sso': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-web-identity': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/types': 3.502.0 - '@smithy/credential-provider-imds': 2.2.1 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - '@aws-sdk/credential-provider-node@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0)': dependencies: '@aws-sdk/credential-provider-env': 3.575.0 @@ -33531,15 +33141,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/credential-provider-process@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -33590,20 +33191,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-sso@3.504.0(@aws-sdk/credential-provider-node@3.504.0)': - dependencies: - '@aws-sdk/client-sso': 3.502.0 - '@aws-sdk/token-providers': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - optional: true - '@aws-sdk/credential-provider-sso@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': dependencies: '@aws-sdk/client-sso': 3.575.0 @@ -33716,21 +33303,9 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.504.0(@aws-sdk/credential-provider-node@3.504.0)': - dependencies: - '@aws-sdk/client-sts': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - optional: true - '@aws-sdk/credential-provider-web-identity@3.575.0(@aws-sdk/client-sts@3.575.0)': dependencies: - '@aws-sdk/client-sts': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + '@aws-sdk/client-sts': 3.575.0 '@aws-sdk/types': 3.575.0 '@smithy/property-provider': 3.1.3 '@smithy/types': 3.3.0 @@ -33764,28 +33339,6 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 - '@aws-sdk/credential-providers@3.504.1': - dependencies: - '@aws-sdk/client-cognito-identity': 3.504.0 - '@aws-sdk/client-sso': 3.502.0 - '@aws-sdk/client-sts': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-cognito-identity': 3.504.0 - '@aws-sdk/credential-provider-env': 3.502.0 - '@aws-sdk/credential-provider-http': 3.503.1 - '@aws-sdk/credential-provider-ini': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-node': 3.504.0 - '@aws-sdk/credential-provider-process': 3.502.0 - '@aws-sdk/credential-provider-sso': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/credential-provider-web-identity': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/types': 3.502.0 - '@smithy/credential-provider-imds': 2.2.1 - '@smithy/property-provider': 2.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - '@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0)': dependencies: '@aws-sdk/client-cognito-identity': 3.637.0 @@ -33897,14 +33450,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/protocol-http': 3.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/middleware-host-header@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -33945,13 +33490,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/middleware-logger@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -33985,14 +33523,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/protocol-http': 3.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/middleware-recursion-detection@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -34061,17 +33591,6 @@ snapshots: '@smithy/util-middleware': 2.1.1 tslib: 2.8.1 - '@aws-sdk/middleware-signing@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/signature-v4': 2.1.1 - '@smithy/types': 2.9.1 - '@smithy/util-middleware': 2.1.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/middleware-signing@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -34104,15 +33623,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@aws-sdk/util-endpoints': 3.502.0 - '@smithy/protocol-http': 3.1.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/middleware-user-agent@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -34140,16 +33650,6 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/node-config-provider': 2.2.1 - '@smithy/types': 2.9.1 - '@smithy/util-config-provider': 2.2.1 - '@smithy/util-middleware': 2.1.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/region-config-resolver@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -34249,22 +33749,9 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/token-providers@3.504.0(@aws-sdk/credential-provider-node@3.504.0)': - dependencies: - '@aws-sdk/client-sso-oidc': 3.504.0(@aws-sdk/credential-provider-node@3.504.0) - '@aws-sdk/types': 3.502.0 - '@smithy/property-provider': 2.1.1 - '@smithy/shared-ini-file-loader': 2.3.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/credential-provider-node' - - aws-crt - optional: true - '@aws-sdk/token-providers@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) '@aws-sdk/types': 3.575.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 @@ -34273,7 +33760,7 @@ snapshots: '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.575.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 @@ -34340,12 +33827,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/types@3.502.0': - dependencies: - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/types@3.575.0': dependencies: '@smithy/types': 3.3.0 @@ -34381,14 +33862,6 @@ snapshots: '@aws-sdk/types': 3.387.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/types': 2.9.1 - '@smithy/util-endpoints': 1.1.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/util-endpoints@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -34440,14 +33913,6 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/types': 2.9.1 - bowser: 2.11.0 - tslib: 2.8.1 - optional: true - '@aws-sdk/util-user-agent-browser@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -34484,14 +33949,6 @@ snapshots: '@smithy/types': 2.9.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.502.0': - dependencies: - '@aws-sdk/types': 3.502.0 - '@smithy/node-config-provider': 2.2.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@aws-sdk/util-user-agent-node@3.575.0': dependencies: '@aws-sdk/types': 3.575.0 @@ -37894,18 +37351,6 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hokify/agenda@6.3.0': - dependencies: - cron-parser: 4.9.0 - date.js: 0.3.3 - debug: 4.3.4(supports-color@8.1.1) - human-interval: 2.0.1 - luxon: 3.3.0 - mongodb: 4.17.2 - transitivePeerDependencies: - - aws-crt - - supports-color - '@hookform/devtools@4.3.1(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@emotion/react': 11.10.6(@types/react@18.3.18)(react@18.3.1) @@ -38262,6 +37707,43 @@ snapshots: - ts-node - utf-8-validate + '@jest/core@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2))': + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.19.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.8 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 @@ -39231,7 +38713,10 @@ snapshots: '@mongodb-js/saslprep@1.1.8': dependencies: sparse-bitfield: 3.0.3 - optional: true + + '@mongodb-js/saslprep@1.4.4': + dependencies: + sparse-bitfield: 3.0.3 '@motionone/animation@10.18.0': dependencies: @@ -39512,7 +38997,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/terminus@10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)': + '@nestjs/terminus@10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.18(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.18)(@nestjs/websockets@10.4.18)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -39524,9 +39009,9 @@ snapshots: '@grpc/grpc-js': 1.13.4 '@grpc/proto-loader': 0.7.13 '@nestjs/axios': 3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1) - mongoose: 8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) + mongoose: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) - '@nestjs/terminus@10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)': + '@nestjs/terminus@10.2.3(@grpc/grpc-js@1.13.4)(@grpc/proto-loader@0.7.13)(@nestjs/axios@3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1))(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.4.18(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.18)(@nestjs/websockets@10.4.18)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -39538,7 +39023,7 @@ snapshots: '@grpc/grpc-js': 1.13.4 '@grpc/proto-loader': 0.7.13 '@nestjs/axios': 3.0.3(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(axios@1.9.0)(rxjs@7.8.1) - mongoose: 8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) + mongoose: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) '@nestjs/testing@10.4.18(@nestjs/common@10.4.18(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.18)(@nestjs/platform-express@10.4.18)': dependencies: @@ -42187,6 +41672,24 @@ snapshots: '@protobufjs/utf8@1.1.0': {} + '@pulsecron/pulse@1.6.8(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1)': + dependencies: + cron-parser: 4.9.0 + date.js: 0.3.3 + debug: 4.3.6 + human-interval: 2.0.1 + moment-timezone: 0.5.48 + mongodb: 6.8.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + '@radix-ui/colors@3.0.0': {} '@radix-ui/number@1.0.0': @@ -44422,18 +43925,6 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@1.3.1': - dependencies: - '@smithy/middleware-endpoint': 2.4.1 - '@smithy/middleware-retry': 2.1.1 - '@smithy/middleware-serde': 2.1.1 - '@smithy/protocol-http': 3.1.1 - '@smithy/smithy-client': 2.3.1 - '@smithy/types': 2.9.1 - '@smithy/util-middleware': 2.1.1 - tslib: 2.8.1 - optional: true - '@smithy/core@2.4.0': dependencies: '@smithy/middleware-endpoint': 3.1.0 @@ -45116,13 +44607,6 @@ snapshots: '@smithy/types': 4.3.0 tslib: 2.8.1 - '@smithy/util-endpoints@1.1.1': - dependencies: - '@smithy/node-config-provider': 2.2.1 - '@smithy/types': 2.9.1 - tslib: 2.8.1 - optional: true - '@smithy/util-endpoints@2.0.5': dependencies: '@smithy/node-config-provider': 3.1.4 @@ -46035,10 +45519,10 @@ snapshots: postcss: 8.4.47 tailwindcss: 4.0.12 - '@tailwindcss/typography@0.5.19(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)))': + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)))': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)) + tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)) '@tanem/svg-injector@10.1.68': dependencies: @@ -47295,12 +46779,6 @@ snapshots: '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 - optional: true - - '@types/whatwg-url@8.2.2': - dependencies: - '@types/node': 20.19.10 - '@types/webidl-conversions': 7.0.3 '@types/ws@8.5.4': dependencies: @@ -49917,14 +49395,9 @@ snapshots: dependencies: node-int64: 0.4.0 - bson@4.7.2: - dependencies: - buffer: 5.7.1 - - bson@5.5.0: {} + bson@6.10.4: {} - bson@6.8.0: - optional: true + bson@6.8.0: {} buffer-crc32@0.2.13: optional: true @@ -55908,6 +55381,27 @@ snapshots: - ts-node - utf-8-validate + jest-cli@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)): + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + jest-cli@29.7.0(@types/node@20.19.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)) @@ -55980,6 +55474,40 @@ snapshots: - supports-color - utf-8-validate + jest-config@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)): + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + jest-config@29.7.0(@types/node@20.19.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)): dependencies: '@babel/core': 7.28.0 @@ -56837,6 +56365,18 @@ snapshots: - ts-node - utf-8-validate + jest@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)): + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + import-local: 3.1.0 + jest-cli: 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + jest@29.7.0(@types/node@20.19.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)) @@ -57271,10 +56811,7 @@ snapshots: jwt-decode@3.1.2: {} - kareem@2.5.1: {} - - kareem@2.6.3: - optional: true + kareem@2.6.3: {} keyv@4.5.4: dependencies: @@ -57878,8 +57415,6 @@ snapshots: lunr@2.3.9: {} - luxon@3.3.0: {} - luxon@3.4.4: {} lz-string@1.5.0: {} @@ -58319,8 +57854,7 @@ snapshots: memoize-one@6.0.0: {} - memory-pager@1.5.0: - optional: true + memory-pager@1.5.0: {} memorystream@0.3.1: {} @@ -58939,115 +58473,94 @@ snapshots: requirejs: 2.3.7 requirejs-config-file: 4.0.0 + moment-timezone@0.5.48: + dependencies: + moment: 2.29.4 + moment@2.29.4: {} monaco-editor@0.39.0: {} - mongodb-connection-string-url@2.6.0: + mongodb-connection-string-url@3.0.1: dependencies: - '@types/whatwg-url': 8.2.2 - whatwg-url: 11.0.0 + '@types/whatwg-url': 11.0.5 + whatwg-url: 13.0.0 - mongodb-connection-string-url@3.0.1: + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - optional: true - mongodb@4.17.2: + mongodb@6.20.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: - bson: 4.7.2 - mongodb-connection-string-url: 2.6.0 - socks: 2.7.1 + '@mongodb-js/saslprep': 1.4.4 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.504.1 - '@mongodb-js/saslprep': 1.1.8 - transitivePeerDependencies: - - aws-crt + '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.575.0) + gcp-metadata: 5.3.0(encoding@0.1.13) + socks: 2.7.1 + optional: true - mongodb@5.9.2(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0))): + mongodb@6.20.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: - bson: 5.5.0 - mongodb-connection-string-url: 2.6.0 - socks: 2.7.1 + '@mongodb-js/saslprep': 1.4.4 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 optionalDependencies: '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0)) - '@mongodb-js/saslprep': 1.1.8 - - mongodb@5.9.2(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))): - dependencies: - bson: 5.5.0 - mongodb-connection-string-url: 2.6.0 + gcp-metadata: 5.3.0(encoding@0.1.13) socks: 2.7.1 - optionalDependencies: - '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)) - '@mongodb-js/saslprep': 1.1.8 - mongodb@6.8.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): + mongodb@6.20.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: - '@mongodb-js/saslprep': 1.1.8 - bson: 6.8.0 - mongodb-connection-string-url: 3.0.1 + '@mongodb-js/saslprep': 1.4.4 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.575.0) + '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)) gcp-metadata: 5.3.0(encoding@0.1.13) socks: 2.7.1 - optional: true - mongodb@6.8.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): + mongodb@6.8.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: '@mongodb-js/saslprep': 1.1.8 bson: 6.8.0 mongodb-connection-string-url: 3.0.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)) + '@aws-sdk/credential-providers': 3.637.0(@aws-sdk/client-sso-oidc@3.575.0) gcp-metadata: 5.3.0(encoding@0.1.13) socks: 2.7.1 - optional: true - mongoose-delete@1.0.1(mongoose@7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))): + mongoose-delete@1.0.7(mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1)): dependencies: - mongoose: 7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))) + mongoose: 8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) - mongoose@7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0))): + mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: - bson: 5.5.0 - kareem: 2.5.1 - mongodb: 5.9.2(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0))) - mpath: 0.9.0 - mquery: 5.0.0 - ms: 2.1.3 - sift: 16.0.1 - transitivePeerDependencies: - - '@aws-sdk/credential-providers' - - '@mongodb-js/zstd' - - kerberos - - mongodb-client-encryption - - snappy - - supports-color - - mongoose@7.8.7(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))): - dependencies: - bson: 5.5.0 - kareem: 2.5.1 - mongodb: 5.9.2(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0))) + bson: 6.10.4 + kareem: 2.6.3 + mongodb: 6.20.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 - sift: 16.0.1 + sift: 17.1.3 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' + - gcp-metadata - kerberos - mongodb-client-encryption - snappy + - socks - supports-color + optional: true - mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): + mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: - bson: 6.8.0 + bson: 6.10.4 kareem: 2.6.3 - mongodb: 6.8.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.575.0))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) + mongodb: 6.20.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.637.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -59061,13 +58574,12 @@ snapshots: - snappy - socks - supports-color - optional: true - mongoose@8.6.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): + mongoose@8.21.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: - bson: 6.8.0 + bson: 6.10.4 kareem: 2.6.3 - mongodb: 6.8.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) + mongodb: 6.20.0(@aws-sdk/credential-providers@3.637.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.0)))(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -59081,7 +58593,6 @@ snapshots: - snappy - socks - supports-color - optional: true motion@11.12.0(@emotion/is-prop-valid@1.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -61041,6 +60552,14 @@ snapshots: postcss: 8.4.47 ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2) + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.6.1 + optionalDependencies: + postcss: 8.4.47 + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3) + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.47)(tsx@4.16.2)(yaml@2.6.1): dependencies: lilconfig: 3.1.3 @@ -64237,10 +63756,7 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - sift@16.0.1: {} - - sift@17.1.3: - optional: true + sift@17.1.3: {} siginfo@2.0.0: {} @@ -64586,7 +64102,6 @@ snapshots: sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 - optional: true spawn-command@0.0.2-1: {} @@ -65327,9 +64842,9 @@ snapshots: tailwind-merge@2.6.0: {} - tailwind-scrollbar@3.1.0(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2))): + tailwind-scrollbar@3.1.0(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)) + tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)) tailwind-variants@0.3.0(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2))): dependencies: @@ -65344,6 +64859,10 @@ snapshots: dependencies: tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + tailwindcss-animate@1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3))): + dependencies: + tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)) + tailwindcss-animate@1.0.7(tailwindcss@4.0.12): dependencies: tailwindcss: 4.0.12 @@ -65402,6 +64921,33 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3)) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tailwindcss@4.0.12: {} tapable@1.1.3: {} @@ -65791,7 +65337,6 @@ snapshots: tr46@4.1.1: dependencies: punycode: 2.3.1 - optional: true tr46@5.0.0: dependencies: @@ -65876,6 +65421,24 @@ snapshots: babel-jest: 27.5.1(@babel/core@7.28.0) esbuild: 0.23.1 + ts-jest@27.1.5(@babel/core@7.28.0)(@types/jest@29.5.2)(babel-jest@27.5.1(@babel/core@7.28.0))(esbuild@0.23.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)))(typescript@5.6.2): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2)) + jest-util: 27.5.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.6.2 + yargs-parser: 20.2.9 + optionalDependencies: + '@babel/core': 7.28.0 + '@types/jest': 29.5.2 + babel-jest: 27.5.1(@babel/core@7.28.0) + esbuild: 0.23.1 + ts-jest@27.1.5(@babel/core@7.28.0)(@types/jest@30.0.0)(babel-jest@27.5.1(@babel/core@7.28.0))(esbuild@0.23.1)(jest@30.0.5(@types/node@20.19.10)(babel-plugin-macros@3.1.0)(esbuild-register@3.5.0(esbuild@0.23.1))(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 @@ -66024,27 +65587,27 @@ snapshots: optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@20.19.10)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.19.10 + '@types/node': 22.15.13 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.15.13)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -66058,12 +65621,11 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.2 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) - optional: true ts-node@9.1.1(typescript@5.6.2): dependencies: @@ -67060,6 +66622,24 @@ snapshots: - supports-color - terser + vite-node@1.6.1(@types/node@22.15.13)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6): + dependencies: + cac: 6.7.14 + debug: 4.4.0(supports-color@8.1.1) + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.21(@types/node@22.15.13)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@2.1.9(@types/node@20.19.10)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6): dependencies: cac: 6.7.14 @@ -67256,6 +66836,43 @@ snapshots: - supports-color - terser + vitest@1.6.1(@edge-runtime/vm@4.0.2)(@types/node@22.15.13)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.4.0(supports-color@8.1.1) + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.21(@types/node@22.15.13)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + vite-node: 1.6.1(@types/node@22.15.13)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + why-is-node-running: 2.3.0 + optionalDependencies: + '@edge-runtime/vm': 4.0.2 + '@types/node': 22.15.13 + happy-dom: 20.0.11 + jsdom: 25.0.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@2.1.9(@edge-runtime/vm@4.0.2)(@types/node@20.19.10)(happy-dom@20.0.11)(jsdom@25.0.0)(less@4.2.0)(lightningcss@1.29.2)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6): dependencies: '@vitest/expect': 2.1.9 @@ -67666,7 +67283,6 @@ snapshots: dependencies: tr46: 4.1.1 webidl-conversions: 7.0.0 - optional: true whatwg-url@14.0.0: dependencies: