@dereekb/trello 13.11.14

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +6 -0
  3. package/index.cjs.default.js +1 -0
  4. package/index.cjs.js +1629 -0
  5. package/index.cjs.mjs +2 -0
  6. package/index.d.ts +1 -0
  7. package/index.esm.js +1583 -0
  8. package/nestjs/index.cjs.default.js +1 -0
  9. package/nestjs/index.cjs.js +1127 -0
  10. package/nestjs/index.cjs.mjs +2 -0
  11. package/nestjs/index.d.ts +1 -0
  12. package/nestjs/index.esm.js +1105 -0
  13. package/nestjs/package.json +28 -0
  14. package/nestjs/src/index.d.ts +1 -0
  15. package/nestjs/src/lib/index.d.ts +2 -0
  16. package/nestjs/src/lib/trello/index.d.ts +3 -0
  17. package/nestjs/src/lib/trello/trello.api.d.ts +36 -0
  18. package/nestjs/src/lib/trello/trello.config.d.ts +12 -0
  19. package/nestjs/src/lib/trello/trello.module.d.ts +21 -0
  20. package/nestjs/src/lib/webhook/index.d.ts +7 -0
  21. package/nestjs/src/lib/webhook/webhook.trello.config.d.ts +22 -0
  22. package/nestjs/src/lib/webhook/webhook.trello.controller.d.ts +12 -0
  23. package/nestjs/src/lib/webhook/webhook.trello.d.ts +50 -0
  24. package/nestjs/src/lib/webhook/webhook.trello.module.d.ts +13 -0
  25. package/nestjs/src/lib/webhook/webhook.trello.service.d.ts +24 -0
  26. package/nestjs/src/lib/webhook/webhook.trello.type.d.ts +85 -0
  27. package/nestjs/src/lib/webhook/webhook.trello.verify.d.ts +46 -0
  28. package/package.json +34 -0
  29. package/src/index.d.ts +1 -0
  30. package/src/lib/index.d.ts +7 -0
  31. package/src/lib/shared/index.d.ts +1 -0
  32. package/src/lib/shared/trello.type.d.ts +23 -0
  33. package/src/lib/trello/index.d.ts +11 -0
  34. package/src/lib/trello/trello.api.board.d.ts +103 -0
  35. package/src/lib/trello/trello.api.board.type.d.ts +75 -0
  36. package/src/lib/trello/trello.api.card.d.ts +116 -0
  37. package/src/lib/trello/trello.api.card.type.d.ts +141 -0
  38. package/src/lib/trello/trello.api.list.d.ts +46 -0
  39. package/src/lib/trello/trello.api.list.type.d.ts +40 -0
  40. package/src/lib/trello/trello.api.member.d.ts +25 -0
  41. package/src/lib/trello/trello.api.member.type.d.ts +20 -0
  42. package/src/lib/trello/trello.api.webhook.d.ts +57 -0
  43. package/src/lib/trello/trello.api.webhook.type.d.ts +41 -0
  44. package/src/lib/trello/trello.factory.d.ts +54 -0
  45. package/src/lib/trello.api.page.d.ts +92 -0
  46. package/src/lib/trello.config.d.ts +20 -0
  47. package/src/lib/trello.error.api.d.ts +77 -0
  48. package/src/lib/trello.limit.d.ts +40 -0
  49. package/src/lib/trello.type.d.ts +39 -0
@@ -0,0 +1,1105 @@
1
+ import { Injectable, Inject, Logger, Head, Post, Req, Controller, Module } from '@nestjs/common';
2
+ import { trelloFactory, getBoard, createBoard, updateBoard, deleteBoard, listBoardLists, listBoardCards, listBoardMembers, listBoardLabels, getList, createList, updateList, listCardsInList, getCard, createCard, updateCard, deleteCard, addCommentToCard, addMemberToCard, addLabelToCard, listCardActions, getMember, getMe, createWebhook, getWebhook, updateWebhook, deleteWebhook, listWebhooksForToken } from '@dereekb/trello';
3
+ import { ConfigService, ConfigModule } from '@nestjs/config';
4
+ import { handlerFactory, handlerConfigurerFactory, handlerMappedSetFunctionFactory } from '@dereekb/util';
5
+ import { RawBody } from '@dereekb/nestjs';
6
+ import { timingSafeEqual, createHmac } from 'node:crypto';
7
+
8
+ function _type_of(obj) {
9
+ "@swc/helpers - typeof";
10
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
11
+ }
12
+ function __decorate(decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if ((typeof Reflect === "undefined" ? "undefined" : _type_of(Reflect)) === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ }
18
+ function __param(paramIndex, decorator) {
19
+ return function(target, key) {
20
+ decorator(target, key, paramIndex);
21
+ };
22
+ }
23
+ typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
24
+ var e = new Error(message);
25
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
26
+ };
27
+
28
+ function _class_call_check$5(instance, Constructor) {
29
+ if (!(instance instanceof Constructor)) {
30
+ throw new TypeError("Cannot call a class as a function");
31
+ }
32
+ }
33
+ function _defineProperties$4(target, props) {
34
+ for(var i = 0; i < props.length; i++){
35
+ var descriptor = props[i];
36
+ descriptor.enumerable = descriptor.enumerable || false;
37
+ descriptor.configurable = true;
38
+ if ("value" in descriptor) descriptor.writable = true;
39
+ Object.defineProperty(target, descriptor.key, descriptor);
40
+ }
41
+ }
42
+ function _create_class$4(Constructor, protoProps, staticProps) {
43
+ if (staticProps) _defineProperties$4(Constructor, staticProps);
44
+ return Constructor;
45
+ }
46
+ function _define_property$5(obj, key, value) {
47
+ if (key in obj) {
48
+ Object.defineProperty(obj, key, {
49
+ value: value,
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true
53
+ });
54
+ } else {
55
+ obj[key] = value;
56
+ }
57
+ return obj;
58
+ }
59
+ var TRELLO_API_KEY_ENV_VAR = 'TRELLO_API_KEY';
60
+ var TRELLO_API_TOKEN_ENV_VAR = 'TRELLO_API_TOKEN';
61
+ /**
62
+ * Configuration for TrelloApi.
63
+ */ var TrelloServiceConfig = /*#__PURE__*/ function() {
64
+ function TrelloServiceConfig() {
65
+ _class_call_check$5(this, TrelloServiceConfig);
66
+ _define_property$5(this, "trello", void 0);
67
+ _define_property$5(this, "factoryConfig", void 0);
68
+ }
69
+ _create_class$4(TrelloServiceConfig, null, [
70
+ {
71
+ key: "assertValidConfig",
72
+ value: function assertValidConfig(config) {
73
+ if (!config.trello.apiKey) {
74
+ throw new Error('No Trello API key specified.');
75
+ }
76
+ if (!config.trello.apiToken) {
77
+ throw new Error('No Trello API token specified.');
78
+ }
79
+ }
80
+ }
81
+ ]);
82
+ return TrelloServiceConfig;
83
+ }
84
+ ();
85
+
86
+ function _class_call_check$4(instance, Constructor) {
87
+ if (!(instance instanceof Constructor)) {
88
+ throw new TypeError("Cannot call a class as a function");
89
+ }
90
+ }
91
+ function _defineProperties$3(target, props) {
92
+ for(var i = 0; i < props.length; i++){
93
+ var descriptor = props[i];
94
+ descriptor.enumerable = descriptor.enumerable || false;
95
+ descriptor.configurable = true;
96
+ if ("value" in descriptor) descriptor.writable = true;
97
+ Object.defineProperty(target, descriptor.key, descriptor);
98
+ }
99
+ }
100
+ function _create_class$3(Constructor, protoProps, staticProps) {
101
+ if (protoProps) _defineProperties$3(Constructor.prototype, protoProps);
102
+ return Constructor;
103
+ }
104
+ function _define_property$4(obj, key, value) {
105
+ if (key in obj) {
106
+ Object.defineProperty(obj, key, {
107
+ value: value,
108
+ enumerable: true,
109
+ configurable: true,
110
+ writable: true
111
+ });
112
+ } else {
113
+ obj[key] = value;
114
+ }
115
+ return obj;
116
+ }
117
+ var TrelloApi = /*#__PURE__*/ function() {
118
+ function TrelloApi(config) {
119
+ _class_call_check$4(this, TrelloApi);
120
+ _define_property$4(this, "config", void 0);
121
+ _define_property$4(this, "trello", void 0);
122
+ this.config = config;
123
+ this.trello = trelloFactory(config.factoryConfig)(config.trello);
124
+ }
125
+ _create_class$3(TrelloApi, [
126
+ {
127
+ key: "trelloContext",
128
+ get: function get() {
129
+ return this.trello.trelloContext;
130
+ }
131
+ },
132
+ {
133
+ key: "trelloRateLimiter",
134
+ get: function get() {
135
+ return this.trello.trelloContext.trelloRateLimiter;
136
+ }
137
+ },
138
+ {
139
+ key: "getBoard",
140
+ get: // MARK: Boards
141
+ function get() {
142
+ return getBoard(this.trelloContext);
143
+ }
144
+ },
145
+ {
146
+ key: "createBoard",
147
+ get: function get() {
148
+ return createBoard(this.trelloContext);
149
+ }
150
+ },
151
+ {
152
+ key: "updateBoard",
153
+ get: function get() {
154
+ return updateBoard(this.trelloContext);
155
+ }
156
+ },
157
+ {
158
+ key: "deleteBoard",
159
+ get: function get() {
160
+ return deleteBoard(this.trelloContext);
161
+ }
162
+ },
163
+ {
164
+ key: "listBoardLists",
165
+ get: function get() {
166
+ return listBoardLists(this.trelloContext);
167
+ }
168
+ },
169
+ {
170
+ key: "listBoardCards",
171
+ get: function get() {
172
+ return listBoardCards(this.trelloContext);
173
+ }
174
+ },
175
+ {
176
+ key: "listBoardMembers",
177
+ get: function get() {
178
+ return listBoardMembers(this.trelloContext);
179
+ }
180
+ },
181
+ {
182
+ key: "listBoardLabels",
183
+ get: function get() {
184
+ return listBoardLabels(this.trelloContext);
185
+ }
186
+ },
187
+ {
188
+ key: "getList",
189
+ get: // MARK: Lists
190
+ function get() {
191
+ return getList(this.trelloContext);
192
+ }
193
+ },
194
+ {
195
+ key: "createList",
196
+ get: function get() {
197
+ return createList(this.trelloContext);
198
+ }
199
+ },
200
+ {
201
+ key: "updateList",
202
+ get: function get() {
203
+ return updateList(this.trelloContext);
204
+ }
205
+ },
206
+ {
207
+ key: "listCardsInList",
208
+ get: function get() {
209
+ return listCardsInList(this.trelloContext);
210
+ }
211
+ },
212
+ {
213
+ key: "getCard",
214
+ get: // MARK: Cards
215
+ function get() {
216
+ return getCard(this.trelloContext);
217
+ }
218
+ },
219
+ {
220
+ key: "createCard",
221
+ get: function get() {
222
+ return createCard(this.trelloContext);
223
+ }
224
+ },
225
+ {
226
+ key: "updateCard",
227
+ get: function get() {
228
+ return updateCard(this.trelloContext);
229
+ }
230
+ },
231
+ {
232
+ key: "deleteCard",
233
+ get: function get() {
234
+ return deleteCard(this.trelloContext);
235
+ }
236
+ },
237
+ {
238
+ key: "addCommentToCard",
239
+ get: function get() {
240
+ return addCommentToCard(this.trelloContext);
241
+ }
242
+ },
243
+ {
244
+ key: "addMemberToCard",
245
+ get: function get() {
246
+ return addMemberToCard(this.trelloContext);
247
+ }
248
+ },
249
+ {
250
+ key: "addLabelToCard",
251
+ get: function get() {
252
+ return addLabelToCard(this.trelloContext);
253
+ }
254
+ },
255
+ {
256
+ key: "listCardActions",
257
+ get: function get() {
258
+ return listCardActions(this.trelloContext);
259
+ }
260
+ },
261
+ {
262
+ key: "getMember",
263
+ get: // MARK: Members
264
+ function get() {
265
+ return getMember(this.trelloContext);
266
+ }
267
+ },
268
+ {
269
+ key: "getMe",
270
+ get: function get() {
271
+ return getMe(this.trelloContext);
272
+ }
273
+ },
274
+ {
275
+ key: "createWebhook",
276
+ get: // MARK: Webhooks
277
+ function get() {
278
+ return createWebhook(this.trelloContext);
279
+ }
280
+ },
281
+ {
282
+ key: "getWebhook",
283
+ get: function get() {
284
+ return getWebhook(this.trelloContext);
285
+ }
286
+ },
287
+ {
288
+ key: "updateWebhook",
289
+ get: function get() {
290
+ return updateWebhook(this.trelloContext);
291
+ }
292
+ },
293
+ {
294
+ key: "deleteWebhook",
295
+ get: function get() {
296
+ return deleteWebhook(this.trelloContext);
297
+ }
298
+ },
299
+ {
300
+ key: "listWebhooksForToken",
301
+ get: function get() {
302
+ return listWebhooksForToken(this.trelloContext);
303
+ }
304
+ }
305
+ ]);
306
+ return TrelloApi;
307
+ }();
308
+ TrelloApi = __decorate([
309
+ Injectable(),
310
+ __param(0, Inject(TrelloServiceConfig))
311
+ ], TrelloApi);
312
+
313
+ function _array_like_to_array(arr, len) {
314
+ if (len == null || len > arr.length) len = arr.length;
315
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
316
+ return arr2;
317
+ }
318
+ function _array_without_holes(arr) {
319
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
320
+ }
321
+ function _iterable_to_array(iter) {
322
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
323
+ }
324
+ function _non_iterable_spread() {
325
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
326
+ }
327
+ function _to_consumable_array(arr) {
328
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
329
+ }
330
+ function _unsupported_iterable_to_array(o, minLen) {
331
+ if (!o) return;
332
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
333
+ var n = Object.prototype.toString.call(o).slice(8, -1);
334
+ if (n === "Object" && o.constructor) n = o.constructor.name;
335
+ if (n === "Map" || n === "Set") return Array.from(n);
336
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
337
+ }
338
+ /**
339
+ * Default factory function for creating TrelloServiceConfig from ConfigService.
340
+ *
341
+ * Reads `TRELLO_API_KEY` and `TRELLO_API_TOKEN` from the environment.
342
+ *
343
+ * @param configService The NestJS ConfigService.
344
+ * @returns A validated TrelloServiceConfig.
345
+ */ function trelloServiceConfigFactory(configService) {
346
+ var config = {
347
+ trello: {
348
+ apiKey: configService.get(TRELLO_API_KEY_ENV_VAR),
349
+ apiToken: configService.get(TRELLO_API_TOKEN_ENV_VAR)
350
+ }
351
+ };
352
+ TrelloServiceConfig.assertValidConfig(config);
353
+ return config;
354
+ }
355
+ /**
356
+ * Convenience function used to generate ModuleMetadata for an app's TrelloModule.
357
+ *
358
+ * @param config Optional additional module metadata overrides.
359
+ * @returns Module metadata for the Trello module.
360
+ */ function appTrelloModuleMetadata(config) {
361
+ var _ref = config !== null && config !== void 0 ? config : {}, imports = _ref.imports, exports = _ref.exports, providers = _ref.providers;
362
+ return {
363
+ imports: [
364
+ ConfigModule
365
+ ].concat(_to_consumable_array(imports !== null && imports !== void 0 ? imports : [])),
366
+ exports: [
367
+ TrelloApi
368
+ ].concat(_to_consumable_array(exports !== null && exports !== void 0 ? exports : [])),
369
+ providers: [
370
+ {
371
+ provide: TrelloServiceConfig,
372
+ inject: [
373
+ ConfigService
374
+ ],
375
+ useFactory: trelloServiceConfigFactory
376
+ },
377
+ TrelloApi
378
+ ].concat(_to_consumable_array(providers !== null && providers !== void 0 ? providers : []))
379
+ };
380
+ }
381
+
382
+ function _define_property$3(obj, key, value) {
383
+ if (key in obj) {
384
+ Object.defineProperty(obj, key, {
385
+ value: value,
386
+ enumerable: true,
387
+ configurable: true,
388
+ writable: true
389
+ });
390
+ } else {
391
+ obj[key] = value;
392
+ }
393
+ return obj;
394
+ }
395
+ function _object_spread(target) {
396
+ for(var i = 1; i < arguments.length; i++){
397
+ var source = arguments[i] != null ? arguments[i] : {};
398
+ var ownKeys = Object.keys(source);
399
+ if (typeof Object.getOwnPropertySymbols === "function") {
400
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
401
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
402
+ }));
403
+ }
404
+ ownKeys.forEach(function(key) {
405
+ _define_property$3(target, key, source[key]);
406
+ });
407
+ }
408
+ return target;
409
+ }
410
+ function ownKeys(object, enumerableOnly) {
411
+ var keys = Object.keys(object);
412
+ if (Object.getOwnPropertySymbols) {
413
+ var symbols = Object.getOwnPropertySymbols(object);
414
+ keys.push.apply(keys, symbols);
415
+ }
416
+ return keys;
417
+ }
418
+ function _object_spread_props(target, source) {
419
+ source = source != null ? source : {};
420
+ if (Object.getOwnPropertyDescriptors) {
421
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
422
+ } else {
423
+ ownKeys(Object(source)).forEach(function(key) {
424
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
425
+ });
426
+ }
427
+ return target;
428
+ }
429
+ /**
430
+ * Action type emitted when a new card is created.
431
+ */ var TRELLO_WEBHOOK_CREATE_CARD_ACTION_TYPE = 'createCard';
432
+ /**
433
+ * Action type emitted when a card is updated.
434
+ */ var TRELLO_WEBHOOK_UPDATE_CARD_ACTION_TYPE = 'updateCard';
435
+ /**
436
+ * Action type emitted when a card is deleted.
437
+ */ var TRELLO_WEBHOOK_DELETE_CARD_ACTION_TYPE = 'deleteCard';
438
+ /**
439
+ * Action type emitted when a comment is added to a card.
440
+ */ var TRELLO_WEBHOOK_COMMENT_CARD_ACTION_TYPE = 'commentCard';
441
+ /**
442
+ * Action type emitted when a member is added to a card.
443
+ */ var TRELLO_WEBHOOK_ADD_MEMBER_TO_CARD_ACTION_TYPE = 'addMemberToCard';
444
+ /**
445
+ * Action type emitted when a member is removed from a card.
446
+ */ var TRELLO_WEBHOOK_REMOVE_MEMBER_FROM_CARD_ACTION_TYPE = 'removeMemberFromCard';
447
+ /**
448
+ * Action type emitted when a board is updated.
449
+ */ var TRELLO_WEBHOOK_UPDATE_BOARD_ACTION_TYPE = 'updateBoard';
450
+ /**
451
+ * Re-narrows an UntypedTrelloWebhookEvent's payload to the given action data type.
452
+ *
453
+ * @param event The untyped event.
454
+ * @returns A typed view over the same event.
455
+ */ function trelloWebhookEvent(event) {
456
+ return {
457
+ action: event.action,
458
+ model: event.model,
459
+ webhook: event.webhook
460
+ };
461
+ }
462
+ var trelloEventHandlerFactory = handlerFactory(function(x) {
463
+ return x.action.type;
464
+ });
465
+ var trelloEventHandlerConfigurerFactory = handlerConfigurerFactory({
466
+ configurerForAccessor: function configurerForAccessor(accessor) {
467
+ var fnWithKey = handlerMappedSetFunctionFactory(accessor, trelloWebhookEvent);
468
+ var configurer = _object_spread_props(_object_spread({}, accessor), {
469
+ handleCreateCard: fnWithKey(TRELLO_WEBHOOK_CREATE_CARD_ACTION_TYPE),
470
+ handleUpdateCard: fnWithKey(TRELLO_WEBHOOK_UPDATE_CARD_ACTION_TYPE),
471
+ handleDeleteCard: fnWithKey(TRELLO_WEBHOOK_DELETE_CARD_ACTION_TYPE),
472
+ handleCommentCard: fnWithKey(TRELLO_WEBHOOK_COMMENT_CARD_ACTION_TYPE),
473
+ handleAddMemberToCard: fnWithKey(TRELLO_WEBHOOK_ADD_MEMBER_TO_CARD_ACTION_TYPE),
474
+ handleRemoveMemberFromCard: fnWithKey(TRELLO_WEBHOOK_REMOVE_MEMBER_FROM_CARD_ACTION_TYPE),
475
+ handleUpdateBoard: fnWithKey(TRELLO_WEBHOOK_UPDATE_BOARD_ACTION_TYPE)
476
+ });
477
+ return configurer;
478
+ }
479
+ });
480
+
481
+ function _class_call_check$3(instance, Constructor) {
482
+ if (!(instance instanceof Constructor)) {
483
+ throw new TypeError("Cannot call a class as a function");
484
+ }
485
+ }
486
+ function _defineProperties$2(target, props) {
487
+ for(var i = 0; i < props.length; i++){
488
+ var descriptor = props[i];
489
+ descriptor.enumerable = descriptor.enumerable || false;
490
+ descriptor.configurable = true;
491
+ if ("value" in descriptor) descriptor.writable = true;
492
+ Object.defineProperty(target, descriptor.key, descriptor);
493
+ }
494
+ }
495
+ function _create_class$2(Constructor, protoProps, staticProps) {
496
+ if (staticProps) _defineProperties$2(Constructor, staticProps);
497
+ return Constructor;
498
+ }
499
+ function _define_property$2(obj, key, value) {
500
+ if (key in obj) {
501
+ Object.defineProperty(obj, key, {
502
+ value: value,
503
+ enumerable: true,
504
+ configurable: true,
505
+ writable: true
506
+ });
507
+ } else {
508
+ obj[key] = value;
509
+ }
510
+ return obj;
511
+ }
512
+ var TRELLO_APP_SECRET_ENV_VAR = 'TRELLO_APP_SECRET';
513
+ var TRELLO_WEBHOOK_CALLBACK_URL_ENV_VAR = 'TRELLO_WEBHOOK_CALLBACK_URL';
514
+ /**
515
+ * Configuration for {@link TrelloWebhookService}.
516
+ */ var TrelloWebhookServiceConfig = /*#__PURE__*/ function() {
517
+ function TrelloWebhookServiceConfig() {
518
+ _class_call_check$3(this, TrelloWebhookServiceConfig);
519
+ _define_property$2(this, "webhookConfig", void 0);
520
+ }
521
+ _create_class$2(TrelloWebhookServiceConfig, null, [
522
+ {
523
+ key: "assertValidConfig",
524
+ value: function assertValidConfig(config) {
525
+ if (!config.webhookConfig.appSecret) {
526
+ throw new Error('No Trello app secret specified.');
527
+ }
528
+ if (!config.webhookConfig.callbackUrl) {
529
+ throw new Error('No Trello webhook callback URL specified.');
530
+ }
531
+ }
532
+ }
533
+ ]);
534
+ return TrelloWebhookServiceConfig;
535
+ }
536
+ ();
537
+
538
+ /**
539
+ * Computes the expected `X-Trello-Webhook` value for the given body + callback URL.
540
+ *
541
+ * Exported for testability.
542
+ *
543
+ * @param appSecret The Trello app secret.
544
+ * @param rawBody The raw request body bytes.
545
+ * @param callbackUrl The exact callback URL configured for this webhook.
546
+ * @returns The expected base64 signature value.
547
+ */ function trelloWebhookExpectedSignature(appSecret, rawBody, callbackUrl) {
548
+ var hmac = createHmac('sha1', appSecret);
549
+ hmac.update(rawBody);
550
+ hmac.update(callbackUrl);
551
+ return hmac.digest('base64');
552
+ }
553
+ /**
554
+ * Verifies a Trello webhook event header.
555
+ *
556
+ * @see https://developer.atlassian.com/cloud/trello/guides/rest-api/webhooks/#webhook-signatures
557
+ *
558
+ * @param config The verifier configuration.
559
+ * @returns A function that verifies a Trello webhook event.
560
+ */ function trelloWebhookEventVerifier(config) {
561
+ var appSecret = config.appSecret, callbackUrl = config.callbackUrl;
562
+ return function(request, rawBody) {
563
+ var headerValue = request.headers['x-trello-webhook'];
564
+ var signature = typeof headerValue === 'string' ? headerValue : Array.isArray(headerValue) ? headerValue[0] : undefined;
565
+ var valid = false;
566
+ if (signature) {
567
+ var expected = trelloWebhookExpectedSignature(appSecret, rawBody, callbackUrl);
568
+ var expectedBuffer = Buffer.from(expected);
569
+ var signatureBuffer = Buffer.from(signature);
570
+ valid = expectedBuffer.length === signatureBuffer.length && timingSafeEqual(expectedBuffer, signatureBuffer);
571
+ }
572
+ var event;
573
+ if (valid) {
574
+ try {
575
+ event = JSON.parse(rawBody.toString('utf8'));
576
+ } catch (unused) {
577
+ return {
578
+ valid: false
579
+ };
580
+ }
581
+ }
582
+ return {
583
+ valid: valid,
584
+ event: event
585
+ };
586
+ };
587
+ }
588
+
589
+ function asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, key, arg) {
590
+ try {
591
+ var info = gen[key](arg);
592
+ var value = info.value;
593
+ } catch (error) {
594
+ reject(error);
595
+ return;
596
+ }
597
+ if (info.done) {
598
+ resolve(value);
599
+ } else {
600
+ Promise.resolve(value).then(_next, _throw);
601
+ }
602
+ }
603
+ function _async_to_generator$1(fn) {
604
+ return function() {
605
+ var self = this, args = arguments;
606
+ return new Promise(function(resolve, reject) {
607
+ var gen = fn.apply(self, args);
608
+ function _next(value) {
609
+ asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, "next", value);
610
+ }
611
+ function _throw(err) {
612
+ asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, "throw", err);
613
+ }
614
+ _next(undefined);
615
+ });
616
+ };
617
+ }
618
+ function _class_call_check$2(instance, Constructor) {
619
+ if (!(instance instanceof Constructor)) {
620
+ throw new TypeError("Cannot call a class as a function");
621
+ }
622
+ }
623
+ function _defineProperties$1(target, props) {
624
+ for(var i = 0; i < props.length; i++){
625
+ var descriptor = props[i];
626
+ descriptor.enumerable = descriptor.enumerable || false;
627
+ descriptor.configurable = true;
628
+ if ("value" in descriptor) descriptor.writable = true;
629
+ Object.defineProperty(target, descriptor.key, descriptor);
630
+ }
631
+ }
632
+ function _create_class$1(Constructor, protoProps, staticProps) {
633
+ if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);
634
+ return Constructor;
635
+ }
636
+ function _define_property$1(obj, key, value) {
637
+ if (key in obj) {
638
+ Object.defineProperty(obj, key, {
639
+ value: value,
640
+ enumerable: true,
641
+ configurable: true,
642
+ writable: true
643
+ });
644
+ } else {
645
+ obj[key] = value;
646
+ }
647
+ return obj;
648
+ }
649
+ function _ts_generator$1(thisArg, body) {
650
+ var f, y, t, _ = {
651
+ label: 0,
652
+ sent: function() {
653
+ if (t[0] & 1) throw t[1];
654
+ return t[1];
655
+ },
656
+ trys: [],
657
+ ops: []
658
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
659
+ return d(g, "next", {
660
+ value: verb(0)
661
+ }), d(g, "throw", {
662
+ value: verb(1)
663
+ }), d(g, "return", {
664
+ value: verb(2)
665
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
666
+ value: function() {
667
+ return this;
668
+ }
669
+ }), g;
670
+ function verb(n) {
671
+ return function(v) {
672
+ return step([
673
+ n,
674
+ v
675
+ ]);
676
+ };
677
+ }
678
+ function step(op) {
679
+ if (f) throw new TypeError("Generator is already executing.");
680
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
681
+ 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;
682
+ if (y = 0, t) op = [
683
+ op[0] & 2,
684
+ t.value
685
+ ];
686
+ switch(op[0]){
687
+ case 0:
688
+ case 1:
689
+ t = op;
690
+ break;
691
+ case 4:
692
+ _.label++;
693
+ return {
694
+ value: op[1],
695
+ done: false
696
+ };
697
+ case 5:
698
+ _.label++;
699
+ y = op[1];
700
+ op = [
701
+ 0
702
+ ];
703
+ continue;
704
+ case 7:
705
+ op = _.ops.pop();
706
+ _.trys.pop();
707
+ continue;
708
+ default:
709
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
710
+ _ = 0;
711
+ continue;
712
+ }
713
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
714
+ _.label = op[1];
715
+ break;
716
+ }
717
+ if (op[0] === 6 && _.label < t[1]) {
718
+ _.label = t[1];
719
+ t = op;
720
+ break;
721
+ }
722
+ if (t && _.label < t[2]) {
723
+ _.label = t[2];
724
+ _.ops.push(op);
725
+ break;
726
+ }
727
+ if (t[2]) _.ops.pop();
728
+ _.trys.pop();
729
+ continue;
730
+ }
731
+ op = body.call(thisArg, _);
732
+ } catch (e) {
733
+ op = [
734
+ 6,
735
+ e
736
+ ];
737
+ y = 0;
738
+ } finally{
739
+ f = t = 0;
740
+ }
741
+ if (op[0] & 5) throw op[1];
742
+ return {
743
+ value: op[0] ? op[1] : void 0,
744
+ done: true
745
+ };
746
+ }
747
+ }
748
+ /**
749
+ * Service that processes Trello webhook events.
750
+ *
751
+ * Verifies the signature, then dispatches verified events through a {@link Handler}
752
+ * configured via {@link TrelloEventHandlerConfigurer}.
753
+ */ var TrelloWebhookService = /*#__PURE__*/ function() {
754
+ function TrelloWebhookService(config) {
755
+ _class_call_check$2(this, TrelloWebhookService);
756
+ _define_property$1(this, "logger", new Logger('TrelloWebhookService'));
757
+ _define_property$1(this, "_verifier", void 0);
758
+ _define_property$1(this, "handler", trelloEventHandlerFactory());
759
+ _define_property$1(this, "configure", trelloEventHandlerConfigurerFactory(this.handler));
760
+ this._verifier = trelloWebhookEventVerifier({
761
+ appSecret: config.webhookConfig.appSecret,
762
+ callbackUrl: config.webhookConfig.callbackUrl
763
+ });
764
+ }
765
+ _create_class$1(TrelloWebhookService, [
766
+ {
767
+ key: "updateForWebhook",
768
+ value: function updateForWebhook(req, rawBody) {
769
+ return _async_to_generator$1(function() {
770
+ var _this__verifier, valid, event, handled;
771
+ return _ts_generator$1(this, function(_state) {
772
+ switch(_state.label){
773
+ case 0:
774
+ _this__verifier = this._verifier(req, rawBody), valid = _this__verifier.valid, event = _this__verifier.event;
775
+ handled = false;
776
+ if (!!valid) return [
777
+ 3,
778
+ 1
779
+ ];
780
+ this.logger.warn('Received invalid Trello webhook event');
781
+ return [
782
+ 3,
783
+ 3
784
+ ];
785
+ case 1:
786
+ if (!event) return [
787
+ 3,
788
+ 3
789
+ ];
790
+ return [
791
+ 4,
792
+ this.updateForTrelloEvent(event)
793
+ ];
794
+ case 2:
795
+ handled = _state.sent();
796
+ _state.label = 3;
797
+ case 3:
798
+ return [
799
+ 2,
800
+ {
801
+ valid: valid,
802
+ handled: handled,
803
+ event: event
804
+ }
805
+ ];
806
+ }
807
+ });
808
+ }).call(this);
809
+ }
810
+ },
811
+ {
812
+ key: "updateForTrelloEvent",
813
+ value: function updateForTrelloEvent(event) {
814
+ return _async_to_generator$1(function() {
815
+ var handled;
816
+ return _ts_generator$1(this, function(_state) {
817
+ switch(_state.label){
818
+ case 0:
819
+ return [
820
+ 4,
821
+ this.handler(event)
822
+ ];
823
+ case 1:
824
+ handled = _state.sent();
825
+ if (!handled) {
826
+ this.logger.warn("Unhandled Trello webhook action type: ".concat(event.action.type));
827
+ }
828
+ return [
829
+ 2,
830
+ handled
831
+ ];
832
+ }
833
+ });
834
+ }).call(this);
835
+ }
836
+ }
837
+ ]);
838
+ return TrelloWebhookService;
839
+ }();
840
+ TrelloWebhookService = __decorate([
841
+ Injectable(),
842
+ __param(0, Inject(TrelloWebhookServiceConfig))
843
+ ], TrelloWebhookService);
844
+
845
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
846
+ try {
847
+ var info = gen[key](arg);
848
+ var value = info.value;
849
+ } catch (error) {
850
+ reject(error);
851
+ return;
852
+ }
853
+ if (info.done) {
854
+ resolve(value);
855
+ } else {
856
+ Promise.resolve(value).then(_next, _throw);
857
+ }
858
+ }
859
+ function _async_to_generator(fn) {
860
+ return function() {
861
+ var self = this, args = arguments;
862
+ return new Promise(function(resolve, reject) {
863
+ var gen = fn.apply(self, args);
864
+ function _next(value) {
865
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
866
+ }
867
+ function _throw(err) {
868
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
869
+ }
870
+ _next(undefined);
871
+ });
872
+ };
873
+ }
874
+ function _class_call_check$1(instance, Constructor) {
875
+ if (!(instance instanceof Constructor)) {
876
+ throw new TypeError("Cannot call a class as a function");
877
+ }
878
+ }
879
+ function _defineProperties(target, props) {
880
+ for(var i = 0; i < props.length; i++){
881
+ var descriptor = props[i];
882
+ descriptor.enumerable = descriptor.enumerable || false;
883
+ descriptor.configurable = true;
884
+ if ("value" in descriptor) descriptor.writable = true;
885
+ Object.defineProperty(target, descriptor.key, descriptor);
886
+ }
887
+ }
888
+ function _create_class(Constructor, protoProps, staticProps) {
889
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
890
+ return Constructor;
891
+ }
892
+ function _define_property(obj, key, value) {
893
+ if (key in obj) {
894
+ Object.defineProperty(obj, key, {
895
+ value: value,
896
+ enumerable: true,
897
+ configurable: true,
898
+ writable: true
899
+ });
900
+ } else {
901
+ obj[key] = value;
902
+ }
903
+ return obj;
904
+ }
905
+ function _ts_generator(thisArg, body) {
906
+ var f, y, t, _ = {
907
+ label: 0,
908
+ sent: function() {
909
+ if (t[0] & 1) throw t[1];
910
+ return t[1];
911
+ },
912
+ trys: [],
913
+ ops: []
914
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
915
+ return d(g, "next", {
916
+ value: verb(0)
917
+ }), d(g, "throw", {
918
+ value: verb(1)
919
+ }), d(g, "return", {
920
+ value: verb(2)
921
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
922
+ value: function() {
923
+ return this;
924
+ }
925
+ }), g;
926
+ function verb(n) {
927
+ return function(v) {
928
+ return step([
929
+ n,
930
+ v
931
+ ]);
932
+ };
933
+ }
934
+ function step(op) {
935
+ if (f) throw new TypeError("Generator is already executing.");
936
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
937
+ 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;
938
+ if (y = 0, t) op = [
939
+ op[0] & 2,
940
+ t.value
941
+ ];
942
+ switch(op[0]){
943
+ case 0:
944
+ case 1:
945
+ t = op;
946
+ break;
947
+ case 4:
948
+ _.label++;
949
+ return {
950
+ value: op[1],
951
+ done: false
952
+ };
953
+ case 5:
954
+ _.label++;
955
+ y = op[1];
956
+ op = [
957
+ 0
958
+ ];
959
+ continue;
960
+ case 7:
961
+ op = _.ops.pop();
962
+ _.trys.pop();
963
+ continue;
964
+ default:
965
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
966
+ _ = 0;
967
+ continue;
968
+ }
969
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
970
+ _.label = op[1];
971
+ break;
972
+ }
973
+ if (op[0] === 6 && _.label < t[1]) {
974
+ _.label = t[1];
975
+ t = op;
976
+ break;
977
+ }
978
+ if (t && _.label < t[2]) {
979
+ _.label = t[2];
980
+ _.ops.push(op);
981
+ break;
982
+ }
983
+ if (t[2]) _.ops.pop();
984
+ _.trys.pop();
985
+ continue;
986
+ }
987
+ op = body.call(thisArg, _);
988
+ } catch (e) {
989
+ op = [
990
+ 6,
991
+ e
992
+ ];
993
+ y = 0;
994
+ } finally{
995
+ f = t = 0;
996
+ }
997
+ if (op[0] & 5) throw op[1];
998
+ return {
999
+ value: op[0] ? op[1] : void 0,
1000
+ done: true
1001
+ };
1002
+ }
1003
+ }
1004
+ var TrelloWebhookController = /*#__PURE__*/ function() {
1005
+ function TrelloWebhookController(trelloWebhookService) {
1006
+ _class_call_check$1(this, TrelloWebhookController);
1007
+ _define_property(this, "trelloWebhookService", void 0);
1008
+ this.trelloWebhookService = trelloWebhookService;
1009
+ }
1010
+ _create_class(TrelloWebhookController, [
1011
+ {
1012
+ /**
1013
+ * Endpoint Trello pings with HEAD during webhook registration. Must return 200.
1014
+ */ key: "handleTrelloWebhookHead",
1015
+ value: function handleTrelloWebhookHead() {
1016
+ // Empty body, 200 status.
1017
+ }
1018
+ },
1019
+ {
1020
+ key: "handleTrelloWebhook",
1021
+ value: function handleTrelloWebhook(req, rawBody) {
1022
+ return _async_to_generator(function() {
1023
+ return _ts_generator(this, function(_state) {
1024
+ switch(_state.label){
1025
+ case 0:
1026
+ return [
1027
+ 4,
1028
+ this.trelloWebhookService.updateForWebhook(req, rawBody)
1029
+ ];
1030
+ case 1:
1031
+ _state.sent();
1032
+ return [
1033
+ 2
1034
+ ];
1035
+ }
1036
+ });
1037
+ }).call(this);
1038
+ }
1039
+ }
1040
+ ]);
1041
+ return TrelloWebhookController;
1042
+ }();
1043
+ __decorate([
1044
+ Head()
1045
+ ], TrelloWebhookController.prototype, "handleTrelloWebhookHead", null);
1046
+ __decorate([
1047
+ Post(),
1048
+ __param(0, Req()),
1049
+ __param(1, RawBody())
1050
+ ], TrelloWebhookController.prototype, "handleTrelloWebhook", null);
1051
+ TrelloWebhookController = __decorate([
1052
+ Controller('/webhook/trello'),
1053
+ __param(0, Inject(TrelloWebhookService))
1054
+ ], TrelloWebhookController);
1055
+
1056
+ function _class_call_check(instance, Constructor) {
1057
+ if (!(instance instanceof Constructor)) {
1058
+ throw new TypeError("Cannot call a class as a function");
1059
+ }
1060
+ }
1061
+ /**
1062
+ * Factory function that creates TrelloWebhookServiceConfig from NestJS ConfigService.
1063
+ *
1064
+ * Reads `TRELLO_APP_SECRET` and `TRELLO_WEBHOOK_CALLBACK_URL` from the environment.
1065
+ *
1066
+ * @param configService The NestJS ConfigService.
1067
+ * @returns A validated TrelloWebhookServiceConfig.
1068
+ */ function trelloWebhookServiceConfigFactory(configService) {
1069
+ var config = {
1070
+ webhookConfig: {
1071
+ appSecret: configService.get(TRELLO_APP_SECRET_ENV_VAR),
1072
+ callbackUrl: configService.get(TRELLO_WEBHOOK_CALLBACK_URL_ENV_VAR)
1073
+ }
1074
+ };
1075
+ TrelloWebhookServiceConfig.assertValidConfig(config);
1076
+ return config;
1077
+ }
1078
+ var TrelloWebhookModule = function TrelloWebhookModule() {
1079
+ _class_call_check(this, TrelloWebhookModule);
1080
+ };
1081
+ TrelloWebhookModule = __decorate([
1082
+ Module({
1083
+ imports: [
1084
+ ConfigModule
1085
+ ],
1086
+ controllers: [
1087
+ TrelloWebhookController
1088
+ ],
1089
+ exports: [
1090
+ TrelloWebhookService
1091
+ ],
1092
+ providers: [
1093
+ {
1094
+ provide: TrelloWebhookServiceConfig,
1095
+ inject: [
1096
+ ConfigService
1097
+ ],
1098
+ useFactory: trelloWebhookServiceConfigFactory
1099
+ },
1100
+ TrelloWebhookService
1101
+ ]
1102
+ })
1103
+ ], TrelloWebhookModule);
1104
+
1105
+ export { TRELLO_API_KEY_ENV_VAR, TRELLO_API_TOKEN_ENV_VAR, TRELLO_APP_SECRET_ENV_VAR, TRELLO_WEBHOOK_ADD_MEMBER_TO_CARD_ACTION_TYPE, TRELLO_WEBHOOK_CALLBACK_URL_ENV_VAR, TRELLO_WEBHOOK_COMMENT_CARD_ACTION_TYPE, TRELLO_WEBHOOK_CREATE_CARD_ACTION_TYPE, TRELLO_WEBHOOK_DELETE_CARD_ACTION_TYPE, TRELLO_WEBHOOK_REMOVE_MEMBER_FROM_CARD_ACTION_TYPE, TRELLO_WEBHOOK_UPDATE_BOARD_ACTION_TYPE, TRELLO_WEBHOOK_UPDATE_CARD_ACTION_TYPE, TrelloApi, TrelloServiceConfig, TrelloWebhookController, TrelloWebhookModule, TrelloWebhookService, TrelloWebhookServiceConfig, appTrelloModuleMetadata, trelloEventHandlerConfigurerFactory, trelloEventHandlerFactory, trelloServiceConfigFactory, trelloWebhookEvent, trelloWebhookEventVerifier, trelloWebhookExpectedSignature, trelloWebhookServiceConfigFactory };