@novu/framework
Version:
The Code-First Notifications Workflow SDK.
1,136 lines (1,132 loc) • 266 kB
text/typescript
import { F as FromSchemaUnvalidated, S as Schema, a as FromSchema } from './base.schema.types-BApIn9jr.cjs';
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: "s