From 981da4c008b69989f4cd1f36d8329b0d6818cb9e Mon Sep 17 00:00:00 2001 From: Gosha Date: Thu, 21 Mar 2024 00:08:38 +0200 Subject: [PATCH 1/9] feat(wip): add custom step --- .../get-active-integrations-status.usecase.ts | 5 ++++- .../templates/components/ChannelPreview.tsx | 3 +++ apps/web/src/pages/templates/constants.tsx | 4 +++- apps/web/src/utils/channels.ts | 21 +++++++++++++------ .../execute-step-custom.usecase.ts | 21 +++++++++++++++++++ .../send-message/send-message.usecase.ts | 4 ++++ .../src/app/workflow/workflow.module.ts | 2 ++ libs/dal/src/repositories/job/job.entity.ts | 1 - libs/shared/src/types/channel/index.ts | 1 + 9 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts diff --git a/apps/api/src/app/workflows/usecases/get-active-integrations-status/get-active-integrations-status.usecase.ts b/apps/api/src/app/workflows/usecases/get-active-integrations-status/get-active-integrations-status.usecase.ts index 1ecd2c4dcdf..03000408270 100644 --- a/apps/api/src/app/workflows/usecases/get-active-integrations-status/get-active-integrations-status.usecase.ts +++ b/apps/api/src/app/workflows/usecases/get-active-integrations-status/get-active-integrations-status.usecase.ts @@ -113,7 +113,10 @@ export class GetActiveIntegrationsStatus { for (const step of uniqueSteps) { const stepType = step.template?.type; const skipStep = - stepType === StepTypeEnum.DELAY || stepType === StepTypeEnum.DIGEST || stepType === StepTypeEnum.TRIGGER; + stepType === StepTypeEnum.DELAY || + stepType === StepTypeEnum.DIGEST || + stepType === StepTypeEnum.TRIGGER || + stepType === StepTypeEnum.CUSTOM; const isStepWithPrimaryIntegration = stepType === StepTypeEnum.EMAIL || stepType === StepTypeEnum.SMS; if (stepType && !skipStep) { const hasActiveIntegrations = activeChannelsStatus[stepType].hasActiveIntegrations; diff --git a/apps/web/src/pages/templates/components/ChannelPreview.tsx b/apps/web/src/pages/templates/components/ChannelPreview.tsx index 03115365fcd..0e9e7d15594 100644 --- a/apps/web/src/pages/templates/components/ChannelPreview.tsx +++ b/apps/web/src/pages/templates/components/ChannelPreview.tsx @@ -32,6 +32,9 @@ export const PreviewComponent = ({ channel }: { channel: StepTypeEnum }) => { case StepTypeEnum.DIGEST: return <>DIGEST; + case StepTypeEnum.CUSTOM: + return <>Coming soon!; + default: return <>dummy; } diff --git a/apps/web/src/pages/templates/constants.tsx b/apps/web/src/pages/templates/constants.tsx index 3750095c1dc..9e381645640 100644 --- a/apps/web/src/pages/templates/constants.tsx +++ b/apps/web/src/pages/templates/constants.tsx @@ -47,7 +47,7 @@ export const ordinalNumbers = { 10: 'tenth', }; -export const stepNames: Record = { +export const stepNames: Record = { email: 'Email', chat: 'Chat', in_app: 'In-App', @@ -56,6 +56,7 @@ export const stepNames: Record = { digest: 'Digest', delay: 'Delay', trigger: 'Trigger', + custom: 'Custom', }; export const stepIcon: Record JSX.Element> = { @@ -66,6 +67,7 @@ export const stepIcon: Record <>, }; diff --git a/apps/web/src/utils/channels.ts b/apps/web/src/utils/channels.ts index 1ed7dfb8925..545e1963f9b 100644 --- a/apps/web/src/utils/channels.ts +++ b/apps/web/src/utils/channels.ts @@ -16,7 +16,7 @@ export enum NodeTypeEnum { } interface IChannelDefinition { - tabKey: StepTypeEnum | ChannelTypeEnum; + tabKey: StepTypeEnum; label: string; description: string; Icon: React.FC; @@ -35,7 +35,7 @@ export const CHANNEL_TYPE_TO_STRING: Record = { export const channels: IChannelDefinition[] = [ { - tabKey: ChannelTypeEnum.IN_APP, + tabKey: StepTypeEnum.IN_APP, label: 'In-App', description: 'Send notifications to the in-app notification center', Icon: InAppFilled, @@ -44,7 +44,7 @@ export const channels: IChannelDefinition[] = [ type: NodeTypeEnum.CHANNEL, }, { - tabKey: ChannelTypeEnum.EMAIL, + tabKey: StepTypeEnum.EMAIL, label: 'Email', description: 'Send using one of our email integrations', Icon: EmailFilled, @@ -53,7 +53,7 @@ export const channels: IChannelDefinition[] = [ type: NodeTypeEnum.CHANNEL, }, { - tabKey: ChannelTypeEnum.SMS, + tabKey: StepTypeEnum.SMS, label: 'SMS', description: "Send an SMS directly to the user's phone", Icon: SmsFilled, @@ -80,7 +80,16 @@ export const channels: IChannelDefinition[] = [ type: NodeTypeEnum.ACTION, }, { - tabKey: ChannelTypeEnum.CHAT, + tabKey: StepTypeEnum.CUSTOM, + label: 'Custom', + description: 'Customize your own action', + Icon: InAppFilled, + testId: 'customSelector', + channelType: StepTypeEnum.CUSTOM, + type: NodeTypeEnum.ACTION, + }, + { + tabKey: StepTypeEnum.CHAT, label: 'Chat', description: 'Send a chat message', Icon: ChatFilled, @@ -89,7 +98,7 @@ export const channels: IChannelDefinition[] = [ type: NodeTypeEnum.CHANNEL, }, { - tabKey: ChannelTypeEnum.PUSH, + tabKey: StepTypeEnum.PUSH, label: 'Push', description: "Send an Push Notification to a user's device", Icon: PushFilled, diff --git a/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts b/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts new file mode 100644 index 00000000000..c5fb54dfed6 --- /dev/null +++ b/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@nestjs/common'; + +import { JobRepository } from '@novu/dal'; +import { InstrumentUsecase } from '@novu/application-generic'; + +import { SendMessageCommand } from './send-message.command'; + +@Injectable() +export class ExecuteStepCustom { + constructor(private jobRepository: JobRepository) {} + + @InstrumentUsecase() + public async execute(command: SendMessageCommand) { + this.jobRepository.updateOne( + { _id: command.job._id, _environmentId: command.environmentId }, + { + $set: { 'overrides.customStep': command.chimeraData?.outputs }, + } + ); + } +} diff --git a/apps/worker/src/app/workflow/usecases/send-message/send-message.usecase.ts b/apps/worker/src/app/workflow/usecases/send-message/send-message.usecase.ts index 5cfe288974a..4d3b6d0df92 100644 --- a/apps/worker/src/app/workflow/usecases/send-message/send-message.usecase.ts +++ b/apps/worker/src/app/workflow/usecases/send-message/send-message.usecase.ts @@ -50,6 +50,7 @@ import { SendMessageChat } from './send-message-chat.usecase'; import { SendMessagePush } from './send-message-push.usecase'; import { Digest } from './digest'; import { PlatformException } from '../../../shared/utils'; +import { ExecuteStepCustom } from './execute-step-custom.usecase'; @Injectable() export class SendMessage { @@ -68,6 +69,7 @@ export class SendMessage { private notificationTemplateRepository: NotificationTemplateRepository, private jobRepository: JobRepository, private sendMessageDelay: SendMessageDelay, + private executeStepCustom: ExecuteStepCustom, private conditionsFilter: ConditionsFilter, private subscriberRepository: SubscriberRepository, private tenantRepository: TenantRepository, @@ -182,6 +184,8 @@ export class SendMessage { return await this.digest.execute(command); case StepTypeEnum.DELAY: return await this.sendMessageDelay.execute(command); + case StepTypeEnum.CUSTOM: + return await this.executeStepCustom.execute(sendMessageCommand); } } diff --git a/apps/worker/src/app/workflow/workflow.module.ts b/apps/worker/src/app/workflow/workflow.module.ts index 96dba0a51ce..05e184462a9 100644 --- a/apps/worker/src/app/workflow/workflow.module.ts +++ b/apps/worker/src/app/workflow/workflow.module.ts @@ -59,6 +59,7 @@ import { Type } from '@nestjs/common/interfaces/type.interface'; import { ForwardReference } from '@nestjs/common/interfaces/modules/forward-reference.interface'; import { InboundEmailParse } from './usecases/inbound-email-parse/inbound-email-parse.usecase'; import { JobTopicNameEnum } from '@novu/shared'; +import { ExecuteStepCustom } from './usecases/send-message/execute-step-custom.usecase'; const enterpriseImports = (): Array | ForwardReference> => { const modules: Array | ForwardReference> = []; @@ -123,6 +124,7 @@ const USE_CASES = [ SendMessageInApp, SendMessagePush, SendMessageSms, + ExecuteStepCustom, StoreSubscriberJobs, SetJobAsCompleted, SetJobAsFailed, diff --git a/libs/dal/src/repositories/job/job.entity.ts b/libs/dal/src/repositories/job/job.entity.ts index fe9499e953b..028fc02bcab 100644 --- a/libs/dal/src/repositories/job/job.entity.ts +++ b/libs/dal/src/repositories/job/job.entity.ts @@ -13,7 +13,6 @@ export class JobEntity { identifier: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any payload: any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any overrides: Record>; step: NotificationStepEntity; tenant?: ITenantDefine; diff --git a/libs/shared/src/types/channel/index.ts b/libs/shared/src/types/channel/index.ts index b5d77b7cee8..7543304ceeb 100644 --- a/libs/shared/src/types/channel/index.ts +++ b/libs/shared/src/types/channel/index.ts @@ -15,6 +15,7 @@ export enum StepTypeEnum { DIGEST = 'digest', TRIGGER = 'trigger', DELAY = 'delay', + CUSTOM = 'custom', } export const STEP_TYPE_TO_CHANNEL_TYPE = new Map([ From 097fc39364462ad94bb67efdaf675fdd9c5d12a7 Mon Sep 17 00:00:00 2001 From: Dima Grossman Date: Thu, 21 Mar 2024 09:14:31 +0200 Subject: [PATCH 2/9] feat: fix preview and step variablesfor custom --- apps/web/package.json | 2 +- .../templates/components/ChannelPreview.tsx | 5 ++- .../components/ChannelStepEditor.tsx | 21 ++++++++++- .../custom-editor/TemplateCustomEditor.tsx | 37 +++++++++++++++++++ apps/web/src/pages/templates/constants.tsx | 4 +- apps/web/src/utils/channels.ts | 5 ++- 6 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 apps/web/src/pages/templates/components/custom-editor/TemplateCustomEditor.tsx diff --git a/apps/web/package.json b/apps/web/package.json index aa59763cb3c..6b564d37030 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -3,7 +3,7 @@ "version": "0.24.0", "private": true, "scripts": { - "start": "pnpm panda --watch & cross-env PORT=4200 react-app-rewired start", + "start": "pnpm panda --watch & cross-env NODE_OPTIONS=--max_old_space_size=6096 PORT=4200 react-app-rewired start", "prebuild": "rimraf build", "build": "pnpm panda && cross-env NODE_OPTIONS=--max_old_space_size=4096 GENERATE_SOURCEMAP=false react-app-rewired --max_old_space_size=4096 build", "precommit": "lint-staged", diff --git a/apps/web/src/pages/templates/components/ChannelPreview.tsx b/apps/web/src/pages/templates/components/ChannelPreview.tsx index 0e9e7d15594..8a827aa8ee2 100644 --- a/apps/web/src/pages/templates/components/ChannelPreview.tsx +++ b/apps/web/src/pages/templates/components/ChannelPreview.tsx @@ -5,6 +5,7 @@ import { ChatPreview, EmailPreview, InAppPreview, PushPreview, SmsPreview } from import { useNavigateFromEditor } from '../hooks/useNavigateFromEditor'; import { useStepIndex } from '../hooks/useStepIndex'; import { ChannelPreviewSidebar } from './ChannelPreviewSidebar'; +import { TemplateCustomEditor } from './custom-editor/TemplateCustomEditor'; export const PreviewComponent = ({ channel }: { channel: StepTypeEnum }) => { switch (channel) { @@ -33,10 +34,10 @@ export const PreviewComponent = ({ channel }: { channel: StepTypeEnum }) => { return <>DIGEST; case StepTypeEnum.CUSTOM: - return <>Coming soon!; + return ; default: - return <>dummy; + return <>Unknown Step; } }; diff --git a/apps/web/src/pages/templates/components/ChannelStepEditor.tsx b/apps/web/src/pages/templates/components/ChannelStepEditor.tsx index 42d49edac9a..a6d57458495 100644 --- a/apps/web/src/pages/templates/components/ChannelStepEditor.tsx +++ b/apps/web/src/pages/templates/components/ChannelStepEditor.tsx @@ -11,12 +11,15 @@ import { DigestMetadata } from '../workflow/DigestMetadata'; import { DelayMetadata } from '../workflow/DelayMetadata'; import { useStepIndex } from '../hooks/useStepIndex'; import { useNavigateFromEditor } from '../hooks/useNavigateFromEditor'; +import { TemplateCustomEditor } from './custom-editor/TemplateCustomEditor'; +import { useTemplateEditorForm } from './TemplateEditorFormProvider'; export const ChannelStepEditor = () => { const { channel } = useParams<{ channel: StepTypeEnum | undefined; }>(); - const { stepIndex } = useStepIndex(); + const { stepIndex, step } = useStepIndex(); + const { template } = useTemplateEditorForm(); useNavigateFromEditor(); @@ -40,6 +43,22 @@ export const ChannelStepEditor = () => { ); } + if (channel === StepTypeEnum.CUSTOM) { + return ( + + + + ); + } + + if (template?.type === 'ECHO' && (channel === StepTypeEnum.DIGEST || channel === StepTypeEnum.DELAY)) { + return ( + + + + ); + } + return ( <> diff --git a/apps/web/src/pages/templates/components/custom-editor/TemplateCustomEditor.tsx b/apps/web/src/pages/templates/components/custom-editor/TemplateCustomEditor.tsx new file mode 100644 index 00000000000..5366da1c750 --- /dev/null +++ b/apps/web/src/pages/templates/components/custom-editor/TemplateCustomEditor.tsx @@ -0,0 +1,37 @@ +import { Controller, useFormContext } from 'react-hook-form'; +import { StepSettings } from '../../workflow/SideBar/StepSettings'; +import { useStepFormPath } from '../../hooks/useStepFormPath'; +import { useState } from 'react'; +import { Grid, Stack } from '@mantine/core'; +import { InputVariablesForm } from '../InputVariablesForm'; + +export function TemplateCustomEditor() { + const stepFormPath = useStepFormPath(); + const { control } = useFormContext(); + + const [inputVariables, setInputVariables] = useState(); + + return ( + <> + + + + ( + + { + setInputVariables(values); + }} + /> + + )} + /> + + + + ); +} diff --git a/apps/web/src/pages/templates/constants.tsx b/apps/web/src/pages/templates/constants.tsx index 9e381645640..1e628543b00 100644 --- a/apps/web/src/pages/templates/constants.tsx +++ b/apps/web/src/pages/templates/constants.tsx @@ -1,5 +1,5 @@ import { ChannelTypeEnum, StepTypeEnum } from '@novu/shared'; -import { Bell, Chat, DigestGradient, Mail, Mobile, Sms, TimerGradient } from '@novu/design-system'; +import { Bell, Chat, DigestGradient, Mail, Mobile, Sms, TimerGradient, Bolt } from '@novu/design-system'; export enum TemplateAnalyticsEnum { CREATE_TEMPLATE_CLICK = 'Create Template Click - [Templates]', @@ -67,7 +67,7 @@ export const stepIcon: Record <>, }; diff --git a/apps/web/src/utils/channels.ts b/apps/web/src/utils/channels.ts index 545e1963f9b..30c6380fbb5 100644 --- a/apps/web/src/utils/channels.ts +++ b/apps/web/src/utils/channels.ts @@ -8,6 +8,7 @@ import { InAppFilled, PushFilled, SmsFilled, + Bolt, } from '@novu/design-system'; export enum NodeTypeEnum { @@ -82,8 +83,8 @@ export const channels: IChannelDefinition[] = [ { tabKey: StepTypeEnum.CUSTOM, label: 'Custom', - description: 'Customize your own action', - Icon: InAppFilled, + description: 'Run custom code', + Icon: Bolt, testId: 'customSelector', channelType: StepTypeEnum.CUSTOM, type: NodeTypeEnum.ACTION, From 1ffcfa224d72046a001423ac05cba44f63c85f94 Mon Sep 17 00:00:00 2001 From: Dima Grossman Date: Thu, 21 Mar 2024 09:33:29 +0200 Subject: [PATCH 3/9] fix: pointer --- .source | 2 +- .../usecases/send-message/execute-step-custom.usecase.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.source b/.source index 3774c93229b..3f5a9689325 160000 --- a/.source +++ b/.source @@ -1 +1 @@ -Subproject commit 3774c93229b84fcc9f949fe9689e77c5028fb5dc +Subproject commit 3f5a9689325aae645bc514ac305ddc22cc4e2cba diff --git a/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts b/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts index c5fb54dfed6..fb8130353c8 100644 --- a/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts +++ b/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts @@ -11,7 +11,7 @@ export class ExecuteStepCustom { @InstrumentUsecase() public async execute(command: SendMessageCommand) { - this.jobRepository.updateOne( + await this.jobRepository.updateOne( { _id: command.job._id, _environmentId: command.environmentId }, { $set: { 'overrides.customStep': command.chimeraData?.outputs }, From 527fa560300a2cd9d2a79e012238212d723cb9bf Mon Sep 17 00:00:00 2001 From: Dima Grossman Date: Thu, 21 Mar 2024 09:53:17 +0200 Subject: [PATCH 4/9] fix: workflow create menu --- apps/web/src/pages/templates/workflow/SideBar/AddStepMenu.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/web/src/pages/templates/workflow/SideBar/AddStepMenu.tsx b/apps/web/src/pages/templates/workflow/SideBar/AddStepMenu.tsx index 22aa78ef33c..fee9e089ee5 100644 --- a/apps/web/src/pages/templates/workflow/SideBar/AddStepMenu.tsx +++ b/apps/web/src/pages/templates/workflow/SideBar/AddStepMenu.tsx @@ -5,6 +5,7 @@ import { colors, DragButton, Tooltip } from '@novu/design-system'; import { useEnvController } from '../../../../hooks'; import { channels, NodeTypeEnum } from '../../../../utils/channels'; import { TOP_ROW_HEIGHT } from '../WorkflowEditor'; +import { StepTypeEnum } from '@novu/shared'; export function AddStepMenu({ setDragging, @@ -26,6 +27,7 @@ export function AddStepMenu({ {channels .filter((channel) => channel.type === NodeTypeEnum.ACTION) + .filter((channel) => channel.channelType !== StepTypeEnum.CUSTOM) .map((channel, index) => ( ))} From 2b48ff6c1ebdc64c0b61a225e5d4746f62ac575f Mon Sep 17 00:00:00 2001 From: Gosha Date: Tue, 30 Apr 2024 17:22:12 +0300 Subject: [PATCH 5/9] feat: update hash after next merge --- .source | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.source b/.source index 3f5a9689325..e407483917c 160000 --- a/.source +++ b/.source @@ -1 +1 @@ -Subproject commit 3f5a9689325aae645bc514ac305ddc22cc4e2cba +Subproject commit e407483917c4f90a19838314572a32385aadcac4 From 45436b73926d384b5f9386fa4b708af600ffb83f Mon Sep 17 00:00:00 2001 From: Gosha Date: Thu, 2 May 2024 13:49:00 +0300 Subject: [PATCH 6/9] feat: change custom response naming --- .source | 2 +- .../usecases/send-message/execute-step-custom.usecase.ts | 2 +- libs/dal/src/repositories/job/job.entity.ts | 1 + libs/dal/src/repositories/job/job.schema.ts | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.source b/.source index e407483917c..b5883c3101a 160000 --- a/.source +++ b/.source @@ -1 +1 @@ -Subproject commit e407483917c4f90a19838314572a32385aadcac4 +Subproject commit b5883c3101aeb322e7e73401aa1c4e6ae1390d88 diff --git a/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts b/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts index fb8130353c8..afcd896b671 100644 --- a/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts +++ b/apps/worker/src/app/workflow/usecases/send-message/execute-step-custom.usecase.ts @@ -14,7 +14,7 @@ export class ExecuteStepCustom { await this.jobRepository.updateOne( { _id: command.job._id, _environmentId: command.environmentId }, { - $set: { 'overrides.customStep': command.chimeraData?.outputs }, + $set: { stepOutput: command.chimeraData?.outputs }, } ); } diff --git a/libs/dal/src/repositories/job/job.entity.ts b/libs/dal/src/repositories/job/job.entity.ts index 028fc02bcab..bc5eac1c2f1 100644 --- a/libs/dal/src/repositories/job/job.entity.ts +++ b/libs/dal/src/repositories/job/job.entity.ts @@ -40,6 +40,7 @@ export class JobEntity { type?: StepTypeEnum; _actorId?: string; actorId?: string; + stepOutput?: Record; } export type JobDBModel = ChangePropsValueType< diff --git a/libs/dal/src/repositories/job/job.schema.ts b/libs/dal/src/repositories/job/job.schema.ts index e7ffc277e3e..9701c0fc53d 100644 --- a/libs/dal/src/repositories/job/job.schema.ts +++ b/libs/dal/src/repositories/job/job.schema.ts @@ -127,6 +127,7 @@ const jobSchema = new Schema( type: Schema.Types.String, }, expireAt: Schema.Types.Date, + stepOutput: Schema.Types.Mixed, }, schemaOptions ); From 20091630cc95ce29c882cd1c64fc611ad87dc26a Mon Sep 17 00:00:00 2001 From: ainouzgali Date: Sun, 5 May 2024 17:32:34 +0300 Subject: [PATCH 7/9] test: add test server for echo --- apps/api/e2e/echo.server.ts | 29 ++ apps/api/e2e/setup.ts | 4 + apps/api/package.json | 4 +- .../src/app/events/e2e/echo-trigger.e2e-ee.ts | 102 +++++++ .../send-message-email.usecase.ts | 6 +- pnpm-lock.yaml | 248 ++++++++++++++---- 6 files changed, 335 insertions(+), 58 deletions(-) create mode 100644 apps/api/e2e/echo.server.ts create mode 100644 apps/api/src/app/events/e2e/echo-trigger.e2e-ee.ts diff --git a/apps/api/e2e/echo.server.ts b/apps/api/e2e/echo.server.ts new file mode 100644 index 00000000000..e74556d4662 --- /dev/null +++ b/apps/api/e2e/echo.server.ts @@ -0,0 +1,29 @@ +import * as http from 'http'; +import * as express from 'express'; +import { serve } from '@novu/echo/express'; +import { Echo } from '@novu/echo'; + +class EchoServer { + private server: express.Express; + private app: http.Server; + private port = 9999; + public echo = new Echo({ devModeBypassAuthentication: true }); + + get serverPath() { + return `http://localhost:${this.port}`; + } + + async start() { + this.server = express(); + this.server.use(express.json()); + this.server.use(serve({ client: this.echo })); + + this.app = await this.server.listen(this.port); + } + + async stop() { + await this.app.close(); + } +} + +export const echoServer = new EchoServer(); diff --git a/apps/api/e2e/setup.ts b/apps/api/e2e/setup.ts index a01d0c7f215..e3dd355fef8 100644 --- a/apps/api/e2e/setup.ts +++ b/apps/api/e2e/setup.ts @@ -4,6 +4,7 @@ import * as sinon from 'sinon'; import * as chai from 'chai'; import { bootstrap } from '../src/bootstrap'; +import { echoServer } from './echo.server'; const dalService = new DalService(); @@ -13,11 +14,14 @@ before(async () => { */ chai.config.truncateThreshold = 0; await testServer.create(await bootstrap()); + await echoServer.start(); + await dalService.connect(process.env.MONGO_URL); }); after(async () => { await testServer.teardown(); + await echoServer.stop(); try { await dalService.destroy(); diff --git a/apps/api/package.json b/apps/api/package.json index 3dc2c1b1a8b..0121f6fd24e 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -47,6 +47,7 @@ "@novu/shared": "^0.24.1", "@novu/stateless": "^0.24.1", "@novu/testing": "^0.24.1", + "@novu/echo": "^0.0.1-alpha.25", "@sendgrid/mail": "^8.1.0", "@sentry/hub": "^7.40.0", "@sentry/node": "^7.40.0", @@ -114,7 +115,8 @@ "ts-loader": "~9.4.0", "ts-node": "~10.9.1", "tsconfig-paths": "~4.1.0", - "typescript": "4.9.5" + "typescript": "4.9.5", + "express": "^4.17.1" }, "optionalDependencies": { "@novu/ee-echo-api": "^0.24.1", diff --git a/apps/api/src/app/events/e2e/echo-trigger.e2e-ee.ts b/apps/api/src/app/events/e2e/echo-trigger.e2e-ee.ts new file mode 100644 index 00000000000..25268506da8 --- /dev/null +++ b/apps/api/src/app/events/e2e/echo-trigger.e2e-ee.ts @@ -0,0 +1,102 @@ +import axios from 'axios'; +import { expect } from 'chai'; +import { UserSession, SubscribersService } from '@novu/testing'; +import { MessageRepository, SubscriberEntity, NotificationTemplateRepository } from '@novu/dal'; +import { StepTypeEnum } from '@novu/shared'; +import { echoServer } from '../../../../e2e/echo.server'; + +const eventTriggerPath = '/v1/events/trigger'; + +describe('Echo Trigger ', async () => { + let session: UserSession; + const messageRepository = new MessageRepository(); + const workflowsRepository = new NotificationTemplateRepository(); + let subscriber: SubscriberEntity; + let subscriberService: SubscribersService; + + beforeEach(async () => { + session = new UserSession(); + await session.initialize(); + subscriberService = new SubscribersService(session.organization._id, session.environment._id); + subscriber = await subscriberService.createSubscriber(); + }); + + it('should trigger the echo workflow', async () => { + const workflowId = 'hello-world'; + await echoServer.echo.workflow( + workflowId, + async ({ step, payload }) => { + await step.email( + 'send-email', + async (inputs) => { + return { + subject: 'This is an email subject ' + inputs.name, + body: 'Body result ' + payload.name, + }; + }, + { + inputSchema: { + type: 'object', + properties: { + name: { type: 'string', default: 'TEST' }, + }, + } as const, + } + ); + }, + { + payloadSchema: { + type: 'object', + properties: { + name: { type: 'string', default: 'default_name' }, + }, + required: [], + additionalProperties: false, + } as const, + } + ); + + const resultDiscover = await axios.get(echoServer.serverPath + '/echo?action=discover'); + + await session.testAgent.post(`/v1/echo/sync`).send({ + chimeraUrl: echoServer.serverPath + '/echo', + workflows: resultDiscover.data.workflows, + }); + + const workflow = await workflowsRepository.findByTriggerIdentifier(session.environment._id, workflowId); + expect(workflow).to.be.ok; + + if (!workflow) { + throw new Error('Workflow not found'); + } + + await axios.post( + `${session.serverUrl}${eventTriggerPath}`, + { + name: workflowId, + to: { + subscriberId: subscriber.subscriberId, + email: 'test@subscriber.com', + }, + payload: { + name: 'test_name', + }, + }, + { + headers: { + authorization: `ApiKey ${session.apiKey}`, + }, + } + ); + await session.awaitRunningJobs(workflow._id); + + const messagesAfter = await messageRepository.find({ + _environmentId: session.environment._id, + _subscriberId: subscriber._id, + channel: StepTypeEnum.EMAIL, + }); + + expect(messagesAfter.length).to.be.eq(1); + expect(messagesAfter[0].subject).to.include('This is an email subject TEST'); + }); +}); diff --git a/apps/worker/src/app/workflow/usecases/send-message/send-message-email.usecase.ts b/apps/worker/src/app/workflow/usecases/send-message/send-message-email.usecase.ts index fb1a16c7d71..38c43e9c605 100644 --- a/apps/worker/src/app/workflow/usecases/send-message/send-message-email.usecase.ts +++ b/apps/worker/src/app/workflow/usecases/send-message/send-message-email.usecase.ts @@ -151,9 +151,10 @@ export class SendMessageEmail extends SendMessageBase { command.overrides.email || {}, command.overrides[integration?.providerId] || {} ); + const chimeraOutputs = command.chimeraData?.outputs; let html; - let subject = step?.template?.subject || ''; + let subject = (chimeraOutputs as IChimeraEmailResponse)?.subject || step?.template?.subject || ''; let content; let senderName; @@ -263,11 +264,10 @@ export class SendMessageEmail extends SendMessageBase { } ); - const chimeraOutputs = command.chimeraData?.outputs; const mailData: IEmailOptions = createMailData( { to: email, - subject: (chimeraOutputs as IChimeraEmailResponse)?.subject || subject, + subject: subject, html: (chimeraOutputs as IChimeraEmailResponse)?.body || html, from: integration?.credentials.from || 'no-reply@novu.co', attachments, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6644d205fcd..046518031ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -285,6 +285,9 @@ importers: '@novu/dal': specifier: ^0.24.1 version: link:../../libs/dal + '@novu/echo': + specifier: ^0.0.1-alpha.25 + version: 0.0.1-alpha.25 '@novu/node': specifier: ^0.24.1 version: link:../../packages/node @@ -491,6 +494,9 @@ importers: chai: specifier: ^4.2.0 version: 4.3.7 + express: + specifier: ^4.17.1 + version: 4.18.2 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -10062,21 +10068,21 @@ packages: /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.22.13 + '@babel/highlight': 7.24.2 dev: true /@babel/code-frame@7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.13 + '@babel/highlight': 7.24.2 dev: true /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.13 + '@babel/highlight': 7.24.2 chalk: 2.4.2 /@babel/code-frame@7.24.2: @@ -10122,7 +10128,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) @@ -10145,7 +10151,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) @@ -10168,7 +10174,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) @@ -10839,14 +10845,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.13: - resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.24.2: resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} @@ -15083,7 +15081,7 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 @@ -15091,7 +15089,7 @@ packages: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 dev: true @@ -15108,7 +15106,7 @@ packages: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 @@ -19115,6 +19113,11 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + /@humanwhocodes/momoa@2.0.4: + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + dev: false + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} @@ -21544,6 +21547,24 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@novu/echo@0.0.1-alpha.25: + resolution: {integrity: sha512-l04bf3g+ZsQvQFUGgoNFSP7ipJ+EwasPSHgPKGCflOfgLEc7NWqk9EQbcfgx1ehpiW6UB8WpTHIflJQWxORsdQ==} + requiresBuild: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + better-ajv-errors: 1.2.0(ajv@8.12.0) + chalk: 4.1.2 + cross-fetch: 4.0.0 + h3: 1.11.1 + json-schema-faker: 0.5.6 + json-schema-to-ts: 3.1.0 + ora: 5.4.1 + transitivePeerDependencies: + - encoding + - uWebSockets.js + dev: false + /@novu/floating-vue@2.0.3(vue@3.2.47): resolution: {integrity: sha512-ypymfdAx55M30bd6IluQujtxTlZwJk9ZeTzptj5UFixMjE4MqgTmBe4wQ1+tHcwUSFY3R+CoVR+RpOLO3XODqg==} peerDependencies: @@ -30787,7 +30808,7 @@ packages: dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 - qs: 6.11.1 + qs: 6.11.2 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -31030,7 +31051,7 @@ packages: dependencies: '@storybook/client-logger': 7.4.2 memoizerific: 1.11.3 - qs: 6.11.1 + qs: 6.11.2 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -31442,7 +31463,7 @@ packages: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/runtime': 7.23.2 '@types/aria-query': 5.0.2 aria-query: 5.1.3 @@ -34410,6 +34431,7 @@ packages: acorn: ^8 dependencies: acorn: 8.10.0 + dev: true /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} @@ -34417,7 +34439,6 @@ packages: acorn: ^8 dependencies: acorn: 8.11.3 - dev: false /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -36171,6 +36192,20 @@ packages: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} dev: true + /better-ajv-errors@1.2.0(ajv@8.12.0): + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.24.2 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.12.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + /better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} @@ -36728,6 +36763,10 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.1 + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false + /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} @@ -37782,6 +37821,11 @@ packages: /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: false + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -37910,6 +37954,10 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-es@1.1.0: + resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + dev: false + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -38239,6 +38287,15 @@ packages: '@types/node': 17.0.45 dev: true + /crossws@0.2.4: + resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + peerDependencies: + uWebSockets.js: '*' + peerDependenciesMeta: + uWebSockets.js: + optional: true + dev: false + /crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: false @@ -39404,9 +39461,8 @@ packages: isobject: 3.0.1 dev: true - /defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} - dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} @@ -39474,6 +39530,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + dev: false + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -39849,7 +39909,7 @@ packages: dev: false /ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} @@ -40747,7 +40807,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.21.0 aria-query: 5.1.3 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -40757,7 +40817,7 @@ packages: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 eslint: 8.51.0 - has: 1.0.4 + has: 1.0.3 jsx-ast-utils: 3.3.3 language-tags: 1.0.5 minimatch: 3.1.2 @@ -42161,7 +42221,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -42258,6 +42318,10 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 + /format-util@1.0.5: + resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} + dev: false + /format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -42797,11 +42861,11 @@ packages: hasBin: true dependencies: colorette: 2.0.19 - defu: 6.1.2 + defu: 6.1.4 https-proxy-agent: 5.0.1 mri: 1.2.0 - node-fetch-native: 1.4.0 - pathe: 1.1.1 + node-fetch-native: 1.6.4 + pathe: 1.1.2 tar: 6.1.13 transitivePeerDependencies: - supports-color @@ -43417,6 +43481,23 @@ packages: dependencies: duplexer: 0.1.2 + /h3@1.11.1: + resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + dependencies: + cookie-es: 1.1.0 + crossws: 0.2.4 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.1.1 + ohash: 1.1.3 + radix3: 1.1.2 + ufo: 1.5.3 + uncrypto: 0.1.3 + unenv: 1.9.0 + transitivePeerDependencies: + - uWebSockets.js + dev: false + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -44497,6 +44578,10 @@ packages: resolution: {integrity: sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==} dev: false + /iron-webcrypto@1.1.1: + resolution: {integrity: sha512-5xGwQUWHQSy039rFr+5q/zOmj7GP0Ypzvo34Ep+61bPIhaLduEDp/PvLGlU3awD2mzWUR0weN2vJ1mILydFPEg==} + dev: false + /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} @@ -46008,7 +46093,7 @@ packages: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -46038,7 +46123,7 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -46052,7 +46137,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -47102,6 +47187,14 @@ packages: argparse: 1.0.10 dev: false + /json-schema-faker@0.5.6: + resolution: {integrity: sha512-u/cFC26/GDxh2vPiAC8B8xVvpXAW+QYtG2mijEbKrimCk8IHtiwQBjCE8TwvowdhALWq9IcdIWZ+/8ocXvdL3Q==} + hasBin: true + dependencies: + json-schema-ref-parser: 6.1.0 + jsonpath-plus: 7.2.0 + dev: false + /json-schema-merge-allof@0.8.1: resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} engines: {node: '>=12.0.0'} @@ -47111,6 +47204,23 @@ packages: lodash: 4.17.21 dev: false + /json-schema-ref-parser@6.1.0: + resolution: {integrity: sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==} + deprecated: Please switch to @apidevtools/json-schema-ref-parser + dependencies: + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + ono: 4.0.11 + dev: false + + /json-schema-to-ts@3.1.0: + resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.23.2 + ts-algebra: 2.0.0 + dev: false + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -47192,6 +47302,11 @@ packages: engines: {node: '>=12.0.0'} dev: true + /jsonpath-plus@7.2.0: + resolution: {integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==} + engines: {node: '>=12.0.0'} + dev: false + /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -47624,7 +47739,6 @@ packages: /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - dev: true /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} @@ -48856,7 +48970,7 @@ packages: resolution: {integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==} /media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} /mediaquery-text@1.2.0: @@ -49626,7 +49740,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.3.2 + ufo: 1.5.3 dev: true /mocha@10.2.0: @@ -50296,9 +50410,8 @@ packages: path-is-absolute: 1.0.1 dev: true - /node-fetch-native@1.4.0: - resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} - dev: true + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} @@ -51245,6 +51358,10 @@ packages: /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + /ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + dev: false + /on-exit-leak-free@2.1.0: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} dev: false @@ -51297,6 +51414,12 @@ packages: mimic-fn: 4.0.0 dev: true + /ono@4.0.11: + resolution: {integrity: sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==} + dependencies: + format-util: 1.0.5 + dev: false + /open-cli@6.0.1: resolution: {integrity: sha512-A5h8MF3GrT1efn9TiO9LPajDnLtuEiGQT5G8TxWObBlgt1cZJF1YbQo/kNtsD1bJb7HxnT6SaSjzeLq0Rfhygw==} engines: {node: '>=10'} @@ -51786,7 +51909,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -52067,7 +52190,6 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -53793,10 +53915,6 @@ packages: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -53860,6 +53978,7 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 + dev: false /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} @@ -53901,6 +54020,10 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + /radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + dev: false + /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: @@ -58953,7 +59076,7 @@ packages: engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 @@ -59034,6 +59157,10 @@ packages: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} dev: true + /ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + dev: false + /ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -59813,9 +59940,8 @@ packages: /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -59846,6 +59972,10 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true @@ -59863,6 +59993,16 @@ packages: busboy: 1.6.0 dev: false + /unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + dev: false + /unfetch@3.1.2: resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} dev: false @@ -61304,8 +61444,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 @@ -61344,8 +61484,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 From 4a8be3b8b689a45de887f9aeea3214b87e548fc8 Mon Sep 17 00:00:00 2001 From: ainouzgali Date: Sun, 5 May 2024 17:37:02 +0300 Subject: [PATCH 8/9] Merge remote-tracking branch 'origin/next' into add-custom-step From 711988e639697fbee1012ecba6290f50d893a7cd Mon Sep 17 00:00:00 2001 From: ainouzgali Date: Sun, 5 May 2024 17:38:41 +0300 Subject: [PATCH 9/9] fix: update pnpm lock --- pnpm-lock.yaml | 201 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 184 insertions(+), 17 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3de9715403..cd8741ed3ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -285,6 +285,9 @@ importers: '@novu/dal': specifier: ^0.24.1 version: link:../../libs/dal + '@novu/echo': + specifier: ^0.0.1-alpha.25 + version: 0.0.1-alpha.25 '@novu/node': specifier: ^0.24.1 version: link:../../packages/node @@ -491,6 +494,9 @@ importers: chai: specifier: ^4.2.0 version: 4.3.7 + express: + specifier: ^4.17.1 + version: 4.18.2 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -10171,7 +10177,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) @@ -10194,7 +10200,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) @@ -10217,7 +10223,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) @@ -15123,7 +15129,7 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 @@ -15131,7 +15137,7 @@ packages: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 dev: true @@ -19155,6 +19161,11 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + /@humanwhocodes/momoa@2.0.4: + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + dev: false + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} @@ -21584,6 +21595,24 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@novu/echo@0.0.1-alpha.25: + resolution: {integrity: sha512-l04bf3g+ZsQvQFUGgoNFSP7ipJ+EwasPSHgPKGCflOfgLEc7NWqk9EQbcfgx1ehpiW6UB8WpTHIflJQWxORsdQ==} + requiresBuild: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + better-ajv-errors: 1.2.0(ajv@8.12.0) + chalk: 4.1.2 + cross-fetch: 4.0.0 + h3: 1.11.1 + json-schema-faker: 0.5.6 + json-schema-to-ts: 3.1.0 + ora: 5.4.1 + transitivePeerDependencies: + - encoding + - uWebSockets.js + dev: false + /@novu/floating-vue@2.0.3(vue@3.2.47): resolution: {integrity: sha512-ypymfdAx55M30bd6IluQujtxTlZwJk9ZeTzptj5UFixMjE4MqgTmBe4wQ1+tHcwUSFY3R+CoVR+RpOLO3XODqg==} peerDependencies: @@ -30827,7 +30856,7 @@ packages: dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 - qs: 6.11.1 + qs: 6.11.2 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -31070,7 +31099,7 @@ packages: dependencies: '@storybook/client-logger': 7.4.2 memoizerific: 1.11.3 - qs: 6.11.1 + qs: 6.11.2 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -36190,6 +36219,20 @@ packages: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} dev: true + /better-ajv-errors@1.2.0(ajv@8.12.0): + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.24.2 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.12.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + /better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} @@ -36747,6 +36790,10 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.1 + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false + /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} @@ -37801,6 +37848,11 @@ packages: /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: false + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -37929,6 +37981,10 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-es@1.1.0: + resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + dev: false + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -38258,6 +38314,15 @@ packages: '@types/node': 17.0.45 dev: true + /crossws@0.2.4: + resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + peerDependencies: + uWebSockets.js: '*' + peerDependenciesMeta: + uWebSockets.js: + optional: true + dev: false + /crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: false @@ -39427,6 +39492,10 @@ packages: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: false + /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -39493,6 +39562,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + dev: false + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -39868,7 +39941,7 @@ packages: dev: false /ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} @@ -42180,7 +42253,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -42205,7 +42278,7 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -42277,6 +42350,10 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 + /format-util@1.0.5: + resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} + dev: false + /format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -43436,6 +43513,23 @@ packages: dependencies: duplexer: 0.1.2 + /h3@1.11.1: + resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + dependencies: + cookie-es: 1.1.0 + crossws: 0.2.4 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.1.1 + ohash: 1.1.3 + radix3: 1.1.2 + ufo: 1.5.3 + uncrypto: 0.1.3 + unenv: 1.9.0 + transitivePeerDependencies: + - uWebSockets.js + dev: false + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -44516,6 +44610,10 @@ packages: resolution: {integrity: sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==} dev: false + /iron-webcrypto@1.1.1: + resolution: {integrity: sha512-5xGwQUWHQSy039rFr+5q/zOmj7GP0Ypzvo34Ep+61bPIhaLduEDp/PvLGlU3awD2mzWUR0weN2vJ1mILydFPEg==} + dev: false + /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} @@ -46019,7 +46117,7 @@ packages: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -46049,7 +46147,7 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -46063,7 +46161,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -47114,6 +47212,14 @@ packages: argparse: 1.0.10 dev: false + /json-schema-faker@0.5.6: + resolution: {integrity: sha512-u/cFC26/GDxh2vPiAC8B8xVvpXAW+QYtG2mijEbKrimCk8IHtiwQBjCE8TwvowdhALWq9IcdIWZ+/8ocXvdL3Q==} + hasBin: true + dependencies: + json-schema-ref-parser: 6.1.0 + jsonpath-plus: 7.2.0 + dev: false + /json-schema-merge-allof@0.8.1: resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} engines: {node: '>=12.0.0'} @@ -47123,6 +47229,23 @@ packages: lodash: 4.17.21 dev: false + /json-schema-ref-parser@6.1.0: + resolution: {integrity: sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==} + deprecated: Please switch to @apidevtools/json-schema-ref-parser + dependencies: + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + ono: 4.0.11 + dev: false + + /json-schema-to-ts@3.1.0: + resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.23.2 + ts-algebra: 2.0.0 + dev: false + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -47204,6 +47327,11 @@ packages: engines: {node: '>=12.0.0'} dev: true + /jsonpath-plus@7.2.0: + resolution: {integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==} + engines: {node: '>=12.0.0'} + dev: false + /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -47636,7 +47764,6 @@ packages: /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - dev: true /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} @@ -48868,7 +48995,7 @@ packages: resolution: {integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==} /media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} /mediaquery-text@1.2.0: @@ -50312,6 +50439,10 @@ packages: resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} dev: true + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: false + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -51257,6 +51388,10 @@ packages: /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + /ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + dev: false + /on-exit-leak-free@2.1.0: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} dev: false @@ -51309,6 +51444,12 @@ packages: mimic-fn: 4.0.0 dev: true + /ono@4.0.11: + resolution: {integrity: sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==} + dependencies: + format-util: 1.0.5 + dev: false + /open-cli@6.0.1: resolution: {integrity: sha512-A5h8MF3GrT1efn9TiO9LPajDnLtuEiGQT5G8TxWObBlgt1cZJF1YbQo/kNtsD1bJb7HxnT6SaSjzeLq0Rfhygw==} engines: {node: '>=10'} @@ -51798,7 +51939,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -52079,7 +52220,6 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -53872,6 +54012,7 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 + dev: false /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} @@ -53913,6 +54054,10 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + /radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + dev: false + /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: @@ -59046,6 +59191,10 @@ packages: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} dev: true + /ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + dev: false + /ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -59829,6 +59978,10 @@ packages: resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} dev: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: false + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -59858,6 +60011,10 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true @@ -59875,6 +60032,16 @@ packages: busboy: 1.6.0 dev: false + /unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + dev: false + /unfetch@3.1.2: resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} dev: false