UNPKG

@novu/framework

Version:

The Code-First Notifications Workflow SDK.

1,136 lines (1,132 loc) 266 kB
import { F as FromSchemaUnvalidated, S as Schema, a as FromSchema } from './base.schema.types-BApIn9jr.js'; type ContextType = string; type ContextId = string; type ContextData = Record<string, unknown>; /** * Context value can be either a simple string identifier or a rich object with additional data * * @example * // Simple string value * "org-acme" * * @example * // Rich object with optional data * { * id: "org-acme", * data: { name: "Acme Corp", plan: "enterprise" } * } */ type ContextValue = string | { id: ContextId; data?: ContextData; }; /** * Context payload represents the raw context data provided by users when triggering workflows. * It's a flexible structure that maps context types to their values. * * This is the input format that gets processed and resolved into ContextResolved. * * @example * // Single context with string value * { tenant: "org-acme" } * * @example * // Multiple contexts with string values * { tenant: "org-acme", app: "jira", user: "john-doe" } * * @example * // Context with rich object containing additional data * { * tenant: { * id: "org-acme", * data: { name: "Acme Corp", plan: "enterprise" } * } * } * * @example * // Mixed context values (string and object) * { * tenant: { id: "org-acme", data: { name: "Acme Corp" } }, * app: "jira", * user: "john-doe" * } */ type ContextPayload = Partial<Record<ContextType, ContextValue>>; /** * Resolved contexts represent the normalized, fully-processed context data used internally * throughout the application and framework. This ensures consistent structure regardless * of the input format in ContextPayload. * * All contexts are normalized to have both an `id` and `data` field, even if the original * payload only provided a string value (in which case `data` will be an empty object). * * This type is used to: * - Pass context data between services without exposing full entity details * - Ensure consistent context structure in workflow execution * - Provide type safety for context access in templates and conditions * * @example * // Resolved from payload: { tenant: "org-acme", app: "jira" } * { * tenant: { * id: "org-acme", * data: {} // Empty data since only ID was provided * }, * app: { * id: "jira", * data: {} // Empty data since only ID was provided * } * } * * @example * // Resolved from payload with rich data * { * tenant: { * id: "org-acme", * data: { name: "Acme Corp", plan: "enterprise", region: "us-east" } * }, * app: { * id: "jira", * data: { version: "8.0", environment: "production" } * } * } */ type ContextResolved = Record<ContextType, { id: ContextId; data: ContextData; }>; declare enum ChannelStepEnum { EMAIL = "email", SMS = "sms", PUSH = "push", CHAT = "chat", IN_APP = "in_app" } declare enum ActionStepEnum { DIGEST = "digest", DELAY = "delay", THROTTLE = "throttle", CUSTOM = "custom", HTTP_REQUEST = "http_request" } /** * A type that represents either `A` or `B`. Shared properties retain their * types and unique properties are marked as optional. */ type Either<A, B> = Partial<A> & Partial<B> & (A | B); /** * A type that represents a value that may be a promise or a regular value. */ type Awaitable<T> = T | Promise<T>; /** * A type that represents a type that is a prettified version of the original type. * The prettified type has all generics removed from intellisense and displays a flat object. */ type Prettify<T> = { [K in keyof T]: T[K]; } & {}; /** * Mark properties of T as optional if Condition is true */ type ConditionalPartial<T extends Obj, Condition extends boolean> = Condition extends true ? Partial<T> : T; /** * Same as Nullable except without `null`. */ type Optional<T> = T | undefined; /** * Types that can be used to index native JavaScript types, (Object, Array, etc.). */ type IndexSignature = string | number | symbol; /** * An object of any index-able type to avoid conflicts between `{}`, `Record`, `object`, etc. */ type Obj<O extends Record<IndexSignature, unknown> | object = Record<IndexSignature, unknown> | object> = { [K in keyof O as K extends never ? never : K]: K extends never ? never : O[K] extends never ? never : O[K]; } & Omit<O, never>; /** * Any type that is indexable using `string`, `number`, or `symbol`. */ type Indexable<ValueTypes = unknown> = { [K: IndexSignature]: ValueTypes; } | Obj; /** * Picks only the optional properties from a type, removing the required ones. * Optionally, recurses through nested objects if `DEEP` is true. */ type PickOptional<T, DEEP extends boolean = true> = { [K in keyof T as undefined extends T[K] ? K : never]: DEEP extends false ? T[K] : T[K] extends Optional<Indexable> ? PickOptional<T[K], DEEP> : T[K]; }; /** * Picks only the required fields out of a type, removing the optional ones. * Optionally, recurses through nested objects if `DEEP` is true. */ type PickRequired<T, DEEP extends boolean = true> = { [K in keyof T as K extends keyof PickOptional<T, DEEP> ? never : K]: T[K] extends Indexable ? PickRequired<T[K], DEEP> : T[K]; }; /** * Picks only the required keys out of a type, removing the optional ones. * Optionally, recurses through nested objects if `DEEP` is true. */ type PickRequiredKeys<T, DEEP extends boolean = true> = keyof PickRequired<T, DEEP>; /** * Picks only the optional keys out of a type, removing the required ones. * Optionally, recurses through nested objects if `DEEP` is true. */ type PickOptionalKeys<T, DEEP extends boolean = true> = keyof PickOptional<T, DEEP>; /** * Recursively make all properties of type `T` optional. */ type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]>; } : T; /** * Recursively make all properties of type `T` required. */ type DeepRequired<T> = T extends object ? { [P in keyof T]-?: DeepRequired<T[P]>; } : T; declare const providerSchemas: { readonly chat: { readonly 'chat-webhook': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly discord: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly getstream: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'grafana-on-call': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly mattermost: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly msteams: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'rocket-chat': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly ryver: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly slack: { output: { readonly type: "object"; readonly properties: { readonly webhookUrl: { readonly type: "string"; readonly format: "uri"; }; readonly text: { readonly type: "string"; }; readonly blocks: { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly type: { readonly enum: readonly ["image", "context", "actions", "divider", "section", "input", "file", "header", "video", "rich_text"]; }; }; readonly required: readonly ["type"]; readonly additionalProperties: true; }; }; }; readonly additionalProperties: true; }; }; readonly 'whatsapp-business': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly zulip: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; }; readonly sms: { readonly 'africas-talking': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'azure-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly bandwidth: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'brevo-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'bulk-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'burst-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly clickatell: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly clicksend: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'eazy-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly firetext: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'forty-six-elks': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'generic-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly gupshup: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'infobip-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'isend-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly kannel: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly maqsam: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly messagebird: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly mobishastra: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly nexmo: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'novu-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: false; }; }; readonly plivo: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'ring-central': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly sendchamp: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly simpletexting: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly sms77: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'sms-central': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly smsmode: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly sns: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly telnyx: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly termii: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly twilio: { output: { readonly type: "object"; readonly properties: { readonly to: { readonly type: "string"; readonly pattern: "^\\+[1-9]\\d{1,14}$"; readonly description: "The recipient's phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (for SMS/MMS) or [channel address](https://www.twilio.com/docs/messaging/channels), e.g. `whatsapp:+15552229999`."; }; readonly statusCallback: { readonly type: "string"; readonly format: "uri"; readonly description: "The URL of the endpoint to which Twilio sends [Message status callback requests](https://www.twilio.com/docs/sms/api/message-resource#twilios-request-to-the-statuscallback-url). URL must contain a valid hostname and underscores are not allowed. If you include this parameter with the `messagingServiceSid`, Twilio uses this URL instead of the Status Callback URL of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource). "; }; readonly applicationSid: { readonly type: "string"; readonly minLength: 34; readonly maxLength: 34; readonly pattern: "^AP[0-9a-fA-F]{32}$"; readonly description: "The SID of the associated [TwiML Application](https://www.twilio.com/docs/usage/api/applications). [Message status callback requests](https://www.twilio.com/docs/sms/api/message-resource#twilios-request-to-the-statuscallback-url) are sent to the TwiML App's `statusCallback` URL. Note that the `statusCallback` parameter of a request takes priority over the `applicationSid` parameter; if both are included `applicationSid` is ignored."; }; readonly maxPrice: { readonly type: "number"; readonly description: "[OBSOLETE] This parameter will no longer have any effect as of 2024-06-03."; }; readonly provideFeedback: { readonly type: "boolean"; readonly description: "Boolean indicating whether or not you intend to provide delivery confirmation feedback to Twilio (used in conjunction with the [Message Feedback subresource](https://www.twilio.com/docs/sms/api/message-feedback-resource)). Default value is `false`."; }; readonly attempt: { readonly type: "integer"; readonly description: "Total number of attempts made (including this request) to send the message regardless of the provider used"; }; readonly validityPeriod: { readonly type: "integer"; readonly description: "The maximum length in seconds that the Message can remain in Twilio's outgoing message queue. If a queued Message exceeds the `validityPeriod`, the Message is not sent. Accepted values are integers from `1` to `36000`. Default value is `36000`. A `validityPeriod` greater than `5` is recommended. [Learn more about the validity period](https://www.twilio.com/blog/take-more-control-of-outbound-messages-using-validity-period-html)"; }; readonly forceDelivery: { readonly type: "boolean"; readonly description: "Reserved"; }; readonly contentRetention: { readonly type: "string"; readonly enum: readonly ["retain", "discard"]; readonly description: "Determines if the message content can be stored or redacted based on privacy settings"; }; readonly addressRetention: { readonly type: "string"; readonly enum: readonly ["retain", "obfuscate"]; readonly description: "Determines if the address can be stored or obfuscated based on privacy settings"; }; readonly smartEncoded: { readonly type: "boolean"; readonly description: "Whether to detect Unicode characters that have a similar GSM-7 character and replace them. Can be: `true` or `false`."; }; readonly persistentAction: { readonly type: "array"; readonly items: { readonly type: "string"; }; readonly description: "Rich actions for non-SMS/MMS channels. Used for [sending location in WhatsApp messages](https://www.twilio.com/docs/whatsapp/message-features#location-messages-with-whatsapp)."; }; readonly shortenUrls: { readonly type: "boolean"; readonly description: "For Messaging Services with [Link Shortening configured](https://www.twilio.com/docs/messaging/features/link-shortening) only: A Boolean indicating whether or not Twilio should shorten links in the `body` of the Message. Default value is `false`. If `true`, the `messagingServiceSid` parameter must also be provided."; }; readonly scheduleType: { readonly type: "string"; readonly enum: readonly ["fixed"]; readonly description: "For Messaging Services only: Include this parameter with a value of `fixed` in conjunction with the `sendAt` parameter in order to [schedule a Message](https://www.twilio.com/docs/messaging/features/message-scheduling)."; }; readonly sendAt: { readonly type: "string"; readonly format: "date-time"; readonly description: "The time that Twilio will send the message. Must be in ISO 8601 format."; }; readonly sendAsMms: { readonly type: "boolean"; readonly description: "If set to `true`, Twilio delivers the message as a single MMS message, regardless of the presence of media."; }; readonly contentVariables: { readonly type: "string"; readonly description: "For [Content Editor/API](https://www.twilio.com/docs/content) only: Key-value pairs of [Template variables](https://www.twilio.com/docs/content/using-variables-with-content-api) and their substitution values. `contentSid` parameter must also be provided. If values are not defined in the `contentVariables` parameter, the [Template's default placeholder values](https://www.twilio.com/docs/content/content-api-resources#create-templates) are used."; }; readonly riskCheck: { readonly type: "string"; readonly enum: readonly ["enable", "disable"]; readonly description: "Include this parameter with a value of `disable` to skip any kind of risk check on the respective message request."; }; readonly from: { readonly type: "string"; readonly pattern: "^\\+[1-9]\\d{1,14}$"; readonly description: "The sender's Twilio phone number (in [E.164](https://en.wikipedia.org/wiki/E.164) format), [alphanumeric sender ID](https://www.twilio.com/docs/sms/quickstart), [Wireless SIM](https://www.twilio.com/docs/iot/wireless/programmable-wireless-send-machine-machine-sms-commands), [short code](https://www.twilio.com/en-us/messaging/channels/sms/short-codes), or [channel address](https://www.twilio.com/docs/messaging/channels) (e.g., `whatsapp:+15554449999`). The value of the `from` parameter must be a sender that is hosted within Twilio and belongs to the Account creating the Message. If you are using `messagingServiceSid`, this parameter can be empty (Twilio assigns a `from` value from the Messaging Service's Sender Pool) or you can provide a specific sender from your Sender Pool."; }; readonly messagingServiceSid: { readonly type: "string"; readonly minLength: 34; readonly maxLength: 34; readonly pattern: "^MG[0-9a-fA-F]{32}$"; readonly description: "The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/services) you want to associate with the Message. When this parameter is provided and the `from` parameter is omitted, Twilio selects the optimal sender from the Messaging Service's Sender Pool. You may also provide a `from` parameter if you want to use a specific Sender from the Sender Pool."; }; readonly body: { readonly type: "string"; readonly description: "The text content of the outgoing message. Can be up to 1,600 characters in length. SMS only: If the `body` contains more than 160 [GSM-7](https://www.twilio.com/docs/glossary/what-is-gsm-7-character-encoding) characters (or 70 [UCS-2](https://www.twilio.com/docs/glossary/what-is-ucs-2-character-encoding) characters), the message is segmented and charged accordingly. For long `body` text, consider using the [sendAsMms parameter](https://www.twilio.com/blog/mms-for-long-text-messages)."; }; readonly mediaUrl: { readonly type: "array"; readonly items: { readonly type: "string"; readonly format: "uri"; }; readonly description: "The URL of media to include in the Message content. `jpeg`, `jpg`, `gif`, and `png` file types are fully supported by Twilio and content is formatted for delivery on destination devices. The media size limit is 5 MB for supported file types (`jpeg`, `jpg`, `png`, `gif`) and 500 KB for [other types](https://www.twilio.com/docs/messaging/guides/accepted-mime-types) of accepted media. To send more than one image in the message, provide multiple `mediaUrl` parameters in the POST request. You can include up to ten `mediaUrl` parameters per message. [International](https://support.twilio.com/hc/en-us/articles/223179808-Sending-and-receiving-MMS-messages) and [carrier](https://support.twilio.com/hc/en-us/articles/223133707-Is-MMS-supported-for-all-carriers-in-US-and-Canada-) limits apply."; }; readonly contentSid: { readonly type: "string"; readonly minLength: 34; readonly maxLength: 34; readonly pattern: "^HX[0-9a-fA-F]{32}$"; readonly description: "For [Content Editor/API](https://www.twilio.com/docs/content) only: The SID of the Content Template to be used with the Message, e.g., `HXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`. If this parameter is not provided, a Content Template is not used. Find the SID in the Console on the Content Editor page. For Content API users, the SID is found in Twilio's response when [creating the Template](https://www.twilio.com/docs/content/content-api-resources#create-templates) or by [fetching your Templates](https://www.twilio.com/docs/content/content-api-resources#fetch-all-content-resources)."; }; }; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'afro-message': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly unifonic: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly imedia: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly sinch: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'isendpro-sms': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; }; readonly email: { readonly braze: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly clickatell: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly nodemailer: { output: { readonly type: "object"; readonly properties: { readonly from: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; readonly sender: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; readonly to: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }, { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }; }]; }; readonly cc: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }, { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }; }]; }; readonly bcc: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }, { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }; }]; }; readonly replyTo: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }, { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }; }]; }; readonly inReplyTo: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly address: { readonly type: "string"; }; readonly name: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; readonly references: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "array"; readonly items: { readonly type: "string"; }; }]; }; readonly subject: { readonly type: "string"; }; readonly text: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; readonly html: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; readonly watchHtml: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; readonly amp: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; readonly href: { readonly type: "string"; }; readonly encoding: { readonly type: "string"; }; readonly contentType: { readonly type: "string"; }; readonly raw: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: true; }]; }; }; }]; }; readonly icalEvent: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; readonly method: { readonly type: "string"; }; readonly filename: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "boolean"; }]; }; readonly href: { readonly type: "string"; }; readonly encoding: { readonly type: "string"; }; }; }]; }; readonly headers: { readonly anyOf: readonly [{ readonly type: "object"; readonly additionalProperties: true; }, { readonly type: "array"; readonly items: { readonly type: "object"; readonly additionalProperties: true; }; }]; }; readonly list: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "array"; readonly items: { readonly type: "string"; }; }]; }; readonly attachments: { readonly type: "array"; readonly items: { readonly type: "object"; readonly properties: { readonly content: { readonly type: "string"; }; readonly path: { readonly type: "string"; }; }; readonly additionalProperties: true; }; }; }; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly emailjs: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'email-webhook': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly 'infobip-email': { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly mailersend: { output: { readonly type: "object"; readonly properties: {}; readonly required: readonly []; readonly additionalProperties: true; }; }; readonly mailgun: { output: { readonly type: "object"; readonly properties: { readonly to: { readonly anyOf: readonly [{ readonly type: "string"; }, { readonly type: "array"; readonly items: { readonly type: "string"; }; }]; readonly description: "Email address of the recipient(s). Example: \"Bob bob@host.com\". You can use commas to separate multiple recipients (e.g.: \"test@example.com,test@example.com\" or [\"test@example.com\", \"test@example.com\"])."; }; readonly from: { readonly type: "string"; }; readonly subject: { readonly type: "string"; readonly description: "Subject of the message."; }; readonly text: { readonly type: "st