@trycourier/courier 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
6
  ## [Unreleased][unreleased]
7
7
 
8
+ ## [v3.4.0] - 2022-01-25
9
+
10
+ - adds support for the send message object in the request body of a `/send` call
11
+
8
12
  ## [v3.3.0] - 2022-01-25
9
13
 
10
14
  - adds support for bulk processing endpoints
@@ -193,7 +197,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
193
197
 
194
198
  ## v1.0.1 - 2019-07-12
195
199
 
196
- [unreleased]: https://github.com/trycourier/courier-node/compare/v3.3.0...HEAD
200
+ [unreleased]: https://github.com/trycourier/courier-node/compare/v3.4.0...HEAD
201
+ [v3.4.0]: https://github.com/trycourier/courier-node/compare/v3.3.0...v3.4.0
197
202
  [v3.3.0]: https://github.com/trycourier/courier-node/compare/v3.2.1...v3.3.0
198
203
  [v3.2.1]: https://github.com/trycourier/courier-node/compare/v3.2.0...v3.2.1
199
204
  [v3.2.0]: https://github.com/trycourier/courier-node/compare/v3.1.0...v3.2.0
package/lib/client.js CHANGED
@@ -44,38 +44,7 @@ var lists_1 = require("./lists");
44
44
  var notifications_1 = require("./notifications");
45
45
  var preferences_1 = require("./preferences");
46
46
  var profile_1 = require("./profile");
47
- var send = function (options) {
48
- return function (params, config) { return __awaiter(void 0, void 0, void 0, function () {
49
- var axiosConfig, res;
50
- return __generator(this, function (_a) {
51
- switch (_a.label) {
52
- case 0:
53
- axiosConfig = {
54
- headers: {}
55
- };
56
- if (config && config.idempotencyKey) {
57
- axiosConfig.headers["Idempotency-Key"] = config.idempotencyKey;
58
- }
59
- if (config && config.idempotencyExpiry) {
60
- axiosConfig.headers["x-idempotency-expiration"] =
61
- config.idempotencyExpiry;
62
- }
63
- return [4 /*yield*/, options.httpClient.post("/send", {
64
- brand: params.brand,
65
- data: params.data,
66
- event: params.eventId,
67
- override: params.override,
68
- preferences: params.preferences,
69
- profile: params.profile,
70
- recipient: params.recipientId
71
- }, axiosConfig)];
72
- case 1:
73
- res = _a.sent();
74
- return [2 /*return*/, res.data];
75
- }
76
- });
77
- }); };
78
- };
47
+ var send_1 = require("./send");
79
48
  var getMessage = function (options) {
80
49
  return function (messageId) { return __awaiter(void 0, void 0, void 0, function () {
81
50
  var res;
@@ -161,6 +130,6 @@ exports.client = function (options) {
161
130
  removeRecipientFromAllLists: profile_1.removeRecipientFromAllLists(options),
162
131
  replaceBrand: brands_1.replaceBrand(options),
163
132
  replaceProfile: profile_1.replaceProfile(options),
164
- send: send(options)
133
+ send: send_1.send(options)
165
134
  };
166
135
  };
@@ -0,0 +1,2 @@
1
+ import { ICourierClientConfiguration, ICourierSendConfig, ICourierSendMessageParameters, ICourierSendParameters, SendResponse } from "../types";
2
+ export declare const send: (options: ICourierClientConfiguration) => <T extends ICourierSendParameters | ICourierSendMessageParameters>(params: T, config?: ICourierSendConfig | undefined) => Promise<SendResponse<T>>;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.send = void 0;
40
+ var sendCall = function (options, config, params) { return __awaiter(void 0, void 0, void 0, function () {
41
+ var res;
42
+ return __generator(this, function (_a) {
43
+ switch (_a.label) {
44
+ case 0: return [4 /*yield*/, options.httpClient.post("/send", {
45
+ brand: params.brand,
46
+ data: params.data,
47
+ event: params.eventId,
48
+ override: params.override,
49
+ preferences: params.preferences,
50
+ profile: params.profile,
51
+ recipient: params.recipientId
52
+ }, config)];
53
+ case 1:
54
+ res = _a.sent();
55
+ return [2 /*return*/, res.data];
56
+ }
57
+ });
58
+ }); };
59
+ var sendMessageCall = function (options, config, params) { return __awaiter(void 0, void 0, void 0, function () {
60
+ var res;
61
+ return __generator(this, function (_a) {
62
+ switch (_a.label) {
63
+ case 0: return [4 /*yield*/, options.httpClient.post("/send", {
64
+ message: params.message
65
+ }, config)];
66
+ case 1:
67
+ res = _a.sent();
68
+ return [2 /*return*/, res.data];
69
+ }
70
+ });
71
+ }); };
72
+ exports.send = function (options) {
73
+ return function (params, config) { return __awaiter(void 0, void 0, void 0, function () {
74
+ var axiosConfig, v2Response, v1Response;
75
+ return __generator(this, function (_a) {
76
+ switch (_a.label) {
77
+ case 0:
78
+ axiosConfig = {
79
+ headers: {}
80
+ };
81
+ if (config && config.idempotencyKey) {
82
+ axiosConfig.headers["Idempotency-Key"] = config.idempotencyKey;
83
+ }
84
+ if (config && config.idempotencyExpiry) {
85
+ axiosConfig.headers["x-idempotency-expiration"] =
86
+ config.idempotencyExpiry;
87
+ }
88
+ if (!params.message) return [3 /*break*/, 2];
89
+ return [4 /*yield*/, sendMessageCall(options, axiosConfig, params)];
90
+ case 1:
91
+ v2Response = _a.sent();
92
+ return [2 /*return*/, v2Response];
93
+ case 2: return [4 /*yield*/, sendCall(options, axiosConfig, params)];
94
+ case 3:
95
+ v1Response = _a.sent();
96
+ return [2 /*return*/, v1Response];
97
+ }
98
+ });
99
+ }); };
100
+ };
@@ -0,0 +1,308 @@
1
+ export interface IBrandSnippet {
2
+ format: "handlebars";
3
+ name: string;
4
+ value: string;
5
+ }
6
+ export interface IBrandSnippets {
7
+ items: IBrandSnippet[];
8
+ }
9
+ export interface IBrandColors {
10
+ primary?: string;
11
+ secondary?: string;
12
+ tertiary?: string;
13
+ }
14
+ interface IBrandTemplate {
15
+ backgroundColor?: string;
16
+ blocksBackgroundColor?: string;
17
+ enabled: boolean;
18
+ footer?: string;
19
+ head?: string;
20
+ header?: string;
21
+ width?: string;
22
+ }
23
+ export interface IBrandTemplateOverride extends IBrandTemplate {
24
+ mjml?: IBrandTemplate;
25
+ footerBackgroundColor?: string;
26
+ footerFullWidth?: boolean;
27
+ }
28
+ export interface IBrandSettingsSocialPresence {
29
+ inheritDefault?: boolean;
30
+ facebook?: {
31
+ url: string;
32
+ };
33
+ instagram?: {
34
+ url: string;
35
+ };
36
+ linkedin?: {
37
+ url: string;
38
+ };
39
+ medium?: {
40
+ url: string;
41
+ };
42
+ twitter?: {
43
+ url: string;
44
+ };
45
+ }
46
+ export interface IBrandSettingsEmail {
47
+ templateOverride?: IBrandTemplateOverride;
48
+ head?: {
49
+ inheritDefault: boolean;
50
+ content?: string;
51
+ };
52
+ footer?: {
53
+ content?: object;
54
+ inheritDefault?: boolean;
55
+ markdown?: string;
56
+ social?: IBrandSettingsSocialPresence;
57
+ };
58
+ header?: {
59
+ inheritDefault?: boolean;
60
+ barColor?: string;
61
+ logo?: {
62
+ href?: string;
63
+ image?: string;
64
+ };
65
+ };
66
+ }
67
+ export interface IBrandSettingsInApp {
68
+ borderRadius?: string;
69
+ disableMessageIcon?: boolean;
70
+ fontFamily?: string;
71
+ placement?: "top" | "bottom" | "left" | "right";
72
+ widgetBackground?: {
73
+ topColor?: string;
74
+ bottomColor?: string;
75
+ };
76
+ colors?: {
77
+ invertHeader?: boolean;
78
+ invertButtons?: boolean;
79
+ };
80
+ icons?: {
81
+ bell?: string;
82
+ message?: string;
83
+ };
84
+ preferences?: {
85
+ templateIds: string[];
86
+ };
87
+ }
88
+ export declare type IActionButtonStyle = "button" | "link";
89
+ export declare type IAlignment = "center" | "left" | "right" | "full";
90
+ export interface ElementalContent {
91
+ version: "2022-01-01";
92
+ brand?: any;
93
+ elements: ElementalNode[];
94
+ }
95
+ export declare type ElementalNode = ElementalTextNode | ElementalMetaNode | ElementalChannelNode | ElementalImageNode | ElementalActionNode | ElementalDividerNode | ElementalGroupNode | ElementalQuoteNode;
96
+ export interface ElementalTextNode extends ElementalBaseNode {
97
+ type: "text";
98
+ content: string;
99
+ format?: "markdown";
100
+ locales?: {
101
+ [locale: string]: {
102
+ content: string;
103
+ };
104
+ };
105
+ }
106
+ export interface ElementalMetaNode extends ElementalBaseNode {
107
+ type: "meta";
108
+ title?: string;
109
+ }
110
+ export interface ElementalChannelNode extends ElementalBaseNode {
111
+ type: "channel";
112
+ channel: string;
113
+ elements?: ElementalNode[];
114
+ raw?: {
115
+ [templateName: string]: any;
116
+ };
117
+ }
118
+ export interface ElementalImageNode extends ElementalBaseNode {
119
+ type: "image";
120
+ src: string;
121
+ href?: string;
122
+ align?: IAlignment;
123
+ altText?: string;
124
+ width?: string;
125
+ }
126
+ export interface ElementalActionNode extends ElementalBaseNode {
127
+ type: "action";
128
+ content: string;
129
+ href: string;
130
+ actionId?: string;
131
+ style?: IActionButtonStyle;
132
+ align?: IAlignment;
133
+ backgroundColor?: string;
134
+ locales?: {
135
+ [locale: string]: {
136
+ content: string;
137
+ };
138
+ };
139
+ }
140
+ export interface ElementalDividerNode extends ElementalBaseNode {
141
+ type: "divider";
142
+ color?: string;
143
+ }
144
+ export interface ElementalGroupNode extends ElementalBaseNode {
145
+ type: "group";
146
+ elements: ElementalNode[];
147
+ }
148
+ export interface ElementalQuoteNode extends ElementalBaseNode {
149
+ type: "quote";
150
+ content: string;
151
+ align?: IAlignment;
152
+ borderColor?: string;
153
+ textStyle?: "text" | "h1" | "h2" | "subtext";
154
+ locales?: {
155
+ [locale: string]: {
156
+ content: string;
157
+ };
158
+ };
159
+ }
160
+ interface ElementalBaseNode {
161
+ type: string;
162
+ channels?: string[];
163
+ ref?: string;
164
+ if?: string;
165
+ loop?: string;
166
+ }
167
+ export interface MessageData extends Record<string, any> {
168
+ }
169
+ interface ListRecipient {
170
+ list_id: string;
171
+ pattern?: string;
172
+ }
173
+ export declare type RuleType = "snooze" | "channel_preferences" | "status";
174
+ export interface IRule<T extends RuleType> {
175
+ type: T;
176
+ }
177
+ export interface ISnoozeRule extends IRule<"snooze"> {
178
+ start?: string;
179
+ until: string;
180
+ }
181
+ export declare type Rule = ISnoozeRule;
182
+ export declare type PreferenceStatus = "OPTED_IN" | "OPTED_OUT" | "REQUIRED";
183
+ export declare type ChannelClassification = "direct_message" | "email" | "push";
184
+ export interface IPreference {
185
+ status: PreferenceStatus;
186
+ rules?: Rule[];
187
+ channel_preferences?: Array<{
188
+ channel: ChannelClassification;
189
+ }>;
190
+ source?: "subscription" | "list" | "recipient";
191
+ }
192
+ export interface IPreferences {
193
+ [id: string]: IPreference;
194
+ }
195
+ export interface IProfilePreferences {
196
+ categories?: IPreferences;
197
+ notifications: IPreferences;
198
+ templateId?: string;
199
+ }
200
+ export interface UserRecipient extends Record<string, any> {
201
+ data?: MessageData;
202
+ email?: string;
203
+ locale?: string;
204
+ user_id?: string;
205
+ phone_number?: string;
206
+ preferences?: IProfilePreferences;
207
+ }
208
+ export declare type MessageRecipient = ListRecipient | UserRecipient;
209
+ export interface ElementalContentSugar {
210
+ body?: string;
211
+ title?: string;
212
+ }
213
+ export declare type Content = ElementalContentSugar | ElementalContent;
214
+ export interface BaseMessage {
215
+ to: MessageRecipient | MessageRecipient[];
216
+ data?: MessageData;
217
+ channels?: MessageChannels;
218
+ providers?: MessageProviders;
219
+ routing?: Routing;
220
+ }
221
+ interface TrackingOverride {
222
+ open: boolean;
223
+ }
224
+ export interface MessageProviders {
225
+ [key: string]: {
226
+ override?: Record<string, any>;
227
+ if?: string;
228
+ timeouts?: number;
229
+ };
230
+ }
231
+ export interface MessageChannelEmailOverride {
232
+ attachments?: Record<string, any>[];
233
+ bcc?: string;
234
+ brand?: {
235
+ snippets?: IBrandSnippets;
236
+ settings?: {
237
+ colors?: IBrandColors;
238
+ email?: IBrandSettingsEmail;
239
+ };
240
+ };
241
+ cc?: string;
242
+ from?: string;
243
+ html?: string;
244
+ reply_to?: string;
245
+ subject?: string;
246
+ text?: string;
247
+ tracking?: TrackingOverride;
248
+ }
249
+ export interface MessageChannelPushOverride {
250
+ body?: string;
251
+ brand?: {
252
+ snippets?: IBrandSnippets;
253
+ settings?: {
254
+ colors?: IBrandColors;
255
+ inapp?: IBrandSettingsInApp;
256
+ };
257
+ };
258
+ click_action?: string;
259
+ data?: Record<string, any>;
260
+ icon?: string;
261
+ title?: string;
262
+ }
263
+ export interface MessageChannels {
264
+ [key: string]: {
265
+ brand_id?: string;
266
+ providers?: string[];
267
+ routing_method?: "all" | "single";
268
+ if?: string;
269
+ timeouts?: {
270
+ provider?: number;
271
+ channel?: number;
272
+ };
273
+ override?: MessageChannelEmailOverride | MessageChannelPushOverride;
274
+ };
275
+ }
276
+ export interface Routing {
277
+ method: "all" | "single";
278
+ channels: RoutingChannel[];
279
+ }
280
+ export declare type RoutingChannel = RoutingStrategyChannel | RoutingStrategyProvider | string;
281
+ export interface RoutingStrategyChannel<T = Record<string, any>> {
282
+ channel: string;
283
+ config?: T;
284
+ method?: "all" | "single";
285
+ providers?: (RoutingStrategyProvider | string)[];
286
+ if?: string;
287
+ }
288
+ export interface RoutingStrategyProvider<T = Record<string, any>> {
289
+ name: string;
290
+ config?: T;
291
+ if?: string;
292
+ }
293
+ export interface ContentMessageMetadata {
294
+ event?: string;
295
+ }
296
+ export interface ContentMessage extends BaseMessage {
297
+ content: Content;
298
+ metadata?: ContentMessageMetadata;
299
+ }
300
+ export interface TemplateMessage extends BaseMessage {
301
+ brand?: string;
302
+ template: string;
303
+ }
304
+ export declare type Message = ContentMessage | TemplateMessage;
305
+ export interface RequestV2 {
306
+ message: Message;
307
+ }
308
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/lib/types.d.ts CHANGED
@@ -4,6 +4,7 @@ import { ICourierClientBulk } from "./bulk/types";
4
4
  import { ICourierClientLists, ICourierList, ICourierRecipientSubscriptionsResponse } from "./lists/types";
5
5
  import { ICourierClientNotifications } from "./notifications/types";
6
6
  import { ICourierClientPreferences, IRecipientPreferences } from "./preferences/types";
7
+ import { Message } from "./send/types";
7
8
  export declare type HttpMethodClient = <T>(url: string, body?: object, config?: AxiosRequestConfig) => Promise<{
8
9
  data: T;
9
10
  }>;
@@ -30,6 +31,9 @@ export interface ICourierSendParameters {
30
31
  profile?: object;
31
32
  override?: object;
32
33
  }
34
+ export interface ICourierSendMessageParameters {
35
+ message: Message;
36
+ }
33
37
  export interface ICourierSendConfig {
34
38
  idempotencyKey?: string;
35
39
  idempotencyExpiry?: number;
@@ -37,6 +41,9 @@ export interface ICourierSendConfig {
37
41
  export interface ICourierSendResponse {
38
42
  messageId: string;
39
43
  }
44
+ export interface ICourierSendMessageResponse {
45
+ requestId: string;
46
+ }
40
47
  export interface ICourierSendParams {
41
48
  event: string;
42
49
  data?: object;
@@ -271,6 +278,7 @@ export interface ICourierBrandGetAllResponse {
271
278
  paging: ICourierPaging;
272
279
  results: ICourierBrand[];
273
280
  }
281
+ export declare type SendResponse<T extends ICourierSendParameters | ICourierSendMessageParameters> = T extends ICourierSendParameters ? ICourierSendResponse : ICourierSendMessageResponse;
274
282
  export interface ICourierClient {
275
283
  addRecipientToLists: (params: ICourierProfileListsPostParameters) => Promise<ICourierProfilePostResponse>;
276
284
  automations: ICourierClientAutomations;
@@ -295,6 +303,6 @@ export interface ICourierClient {
295
303
  removeRecipientFromAllLists: (params: ICourierProfileGetParameters) => Promise<ICourierProfilePostResponse>;
296
304
  replaceBrand: (params: ICourierBrandPutParameters) => Promise<ICourierBrand>;
297
305
  replaceProfile: (params: ICourierProfilePutParameters) => Promise<ICourierProfilePutResponse>;
298
- send: (params: ICourierSendParameters, config?: ICourierSendConfig) => Promise<ICourierSendResponse>;
306
+ send: <T extends ICourierSendParameters | ICourierSendMessageParameters>(params: T, config?: ICourierSendConfig) => Promise<SendResponse<T>>;
299
307
  }
300
308
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trycourier/courier",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "A node.js module for communicating with the Courier REST API.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",