@memberjunction/core-actions 2.54.0 → 2.56.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.
Files changed (118) hide show
  1. package/dist/custom/ai/execute-ai-prompt.action.d.ts +94 -0
  2. package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -0
  3. package/dist/custom/ai/execute-ai-prompt.action.js +274 -0
  4. package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -0
  5. package/dist/custom/communication/slack-webhook.action.d.ts +101 -0
  6. package/dist/custom/communication/slack-webhook.action.d.ts.map +1 -0
  7. package/dist/custom/communication/slack-webhook.action.js +269 -0
  8. package/dist/custom/communication/slack-webhook.action.js.map +1 -0
  9. package/dist/custom/communication/teams-webhook.action.d.ts +96 -0
  10. package/dist/custom/communication/teams-webhook.action.d.ts.map +1 -0
  11. package/dist/custom/communication/teams-webhook.action.js +275 -0
  12. package/dist/custom/communication/teams-webhook.action.js.map +1 -0
  13. package/dist/custom/data/aggregate-data.action.d.ts +91 -0
  14. package/dist/custom/data/aggregate-data.action.d.ts.map +1 -0
  15. package/dist/custom/data/aggregate-data.action.js +333 -0
  16. package/dist/custom/data/aggregate-data.action.js.map +1 -0
  17. package/dist/custom/data/csv-parser.action.d.ts +68 -0
  18. package/dist/custom/data/csv-parser.action.d.ts.map +1 -0
  19. package/dist/custom/data/csv-parser.action.js +184 -0
  20. package/dist/custom/data/csv-parser.action.js.map +1 -0
  21. package/dist/custom/data/data-mapper.action.d.ts +89 -0
  22. package/dist/custom/data/data-mapper.action.d.ts.map +1 -0
  23. package/dist/custom/data/data-mapper.action.js +325 -0
  24. package/dist/custom/data/data-mapper.action.js.map +1 -0
  25. package/dist/custom/data/json-transform.action.d.ts +57 -0
  26. package/dist/custom/data/json-transform.action.d.ts.map +1 -0
  27. package/dist/custom/data/json-transform.action.js +205 -0
  28. package/dist/custom/data/json-transform.action.js.map +1 -0
  29. package/dist/custom/data/xml-parser.action.d.ts +85 -0
  30. package/dist/custom/data/xml-parser.action.d.ts.map +1 -0
  31. package/dist/custom/data/xml-parser.action.js +326 -0
  32. package/dist/custom/data/xml-parser.action.js.map +1 -0
  33. package/dist/custom/files/excel-reader.action.d.ts +86 -0
  34. package/dist/custom/files/excel-reader.action.d.ts.map +1 -0
  35. package/dist/custom/files/excel-reader.action.js +348 -0
  36. package/dist/custom/files/excel-reader.action.js.map +1 -0
  37. package/dist/custom/files/excel-writer.action.d.ts +79 -0
  38. package/dist/custom/files/excel-writer.action.d.ts.map +1 -0
  39. package/dist/custom/files/excel-writer.action.js +325 -0
  40. package/dist/custom/files/excel-writer.action.js.map +1 -0
  41. package/dist/custom/files/file-compress.action.d.ts +90 -0
  42. package/dist/custom/files/file-compress.action.d.ts.map +1 -0
  43. package/dist/custom/files/file-compress.action.js +346 -0
  44. package/dist/custom/files/file-compress.action.js.map +1 -0
  45. package/dist/custom/files/pdf-extractor.action.d.ts +86 -0
  46. package/dist/custom/files/pdf-extractor.action.d.ts.map +1 -0
  47. package/dist/custom/files/pdf-extractor.action.js +247 -0
  48. package/dist/custom/files/pdf-extractor.action.js.map +1 -0
  49. package/dist/custom/files/pdf-generator.action.d.ts +70 -0
  50. package/dist/custom/files/pdf-generator.action.d.ts.map +1 -0
  51. package/dist/custom/files/pdf-generator.action.js +286 -0
  52. package/dist/custom/files/pdf-generator.action.js.map +1 -0
  53. package/dist/custom/integration/api-rate-limiter.action.d.ts +88 -0
  54. package/dist/custom/integration/api-rate-limiter.action.d.ts.map +1 -0
  55. package/dist/custom/integration/api-rate-limiter.action.js +363 -0
  56. package/dist/custom/integration/api-rate-limiter.action.js.map +1 -0
  57. package/dist/custom/integration/graphql-query.action.d.ts +92 -0
  58. package/dist/custom/integration/graphql-query.action.d.ts.map +1 -0
  59. package/dist/custom/integration/graphql-query.action.js +251 -0
  60. package/dist/custom/integration/graphql-query.action.js.map +1 -0
  61. package/dist/custom/integration/http-request.action.d.ts +96 -0
  62. package/dist/custom/integration/http-request.action.d.ts.map +1 -0
  63. package/dist/custom/integration/http-request.action.js +316 -0
  64. package/dist/custom/integration/http-request.action.js.map +1 -0
  65. package/dist/custom/integration/oauth-flow.action.d.ts +130 -0
  66. package/dist/custom/integration/oauth-flow.action.d.ts.map +1 -0
  67. package/dist/custom/integration/oauth-flow.action.js +624 -0
  68. package/dist/custom/integration/oauth-flow.action.js.map +1 -0
  69. package/dist/custom/security/password-strength.action.d.ts +129 -0
  70. package/dist/custom/security/password-strength.action.d.ts.map +1 -0
  71. package/dist/custom/security/password-strength.action.js +463 -0
  72. package/dist/custom/security/password-strength.action.js.map +1 -0
  73. package/dist/custom/utilities/base-file-handler.d.ts +54 -0
  74. package/dist/custom/utilities/base-file-handler.d.ts.map +1 -0
  75. package/dist/custom/utilities/base-file-handler.js +167 -0
  76. package/dist/custom/utilities/base-file-handler.js.map +1 -0
  77. package/dist/custom/utilities/index.d.ts +3 -0
  78. package/dist/custom/utilities/index.d.ts.map +1 -0
  79. package/dist/custom/utilities/index.js +19 -0
  80. package/dist/custom/utilities/index.js.map +1 -0
  81. package/dist/custom/utilities/json-param-helper.d.ts +33 -0
  82. package/dist/custom/utilities/json-param-helper.d.ts.map +1 -0
  83. package/dist/custom/utilities/json-param-helper.js +66 -0
  84. package/dist/custom/utilities/json-param-helper.js.map +1 -0
  85. package/dist/custom/web/duckduckgo-rate-limiter.d.ts +85 -0
  86. package/dist/custom/web/duckduckgo-rate-limiter.d.ts.map +1 -0
  87. package/dist/custom/web/duckduckgo-rate-limiter.js +257 -0
  88. package/dist/custom/web/duckduckgo-rate-limiter.js.map +1 -0
  89. package/dist/custom/web/web-search.action.d.ts +1 -0
  90. package/dist/custom/web/web-search.action.d.ts.map +1 -1
  91. package/dist/custom/web/web-search.action.js +48 -20
  92. package/dist/custom/web/web-search.action.js.map +1 -1
  93. package/dist/custom/workflow/conditional.action.d.ts +94 -0
  94. package/dist/custom/workflow/conditional.action.d.ts.map +1 -0
  95. package/dist/custom/workflow/conditional.action.js +274 -0
  96. package/dist/custom/workflow/conditional.action.js.map +1 -0
  97. package/dist/custom/workflow/delay.action.d.ts +76 -0
  98. package/dist/custom/workflow/delay.action.d.ts.map +1 -0
  99. package/dist/custom/workflow/delay.action.js +187 -0
  100. package/dist/custom/workflow/delay.action.js.map +1 -0
  101. package/dist/custom/workflow/loop.action.d.ts +112 -0
  102. package/dist/custom/workflow/loop.action.d.ts.map +1 -0
  103. package/dist/custom/workflow/loop.action.js +380 -0
  104. package/dist/custom/workflow/loop.action.js.map +1 -0
  105. package/dist/custom/workflow/parallel-execute.action.d.ts +105 -0
  106. package/dist/custom/workflow/parallel-execute.action.d.ts.map +1 -0
  107. package/dist/custom/workflow/parallel-execute.action.js +457 -0
  108. package/dist/custom/workflow/parallel-execute.action.js.map +1 -0
  109. package/dist/custom/workflow/retry.action.d.ts +90 -0
  110. package/dist/custom/workflow/retry.action.d.ts.map +1 -0
  111. package/dist/custom/workflow/retry.action.js +378 -0
  112. package/dist/custom/workflow/retry.action.js.map +1 -0
  113. package/dist/index.d.ts +23 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +75 -0
  116. package/dist/index.js.map +1 -1
  117. package/package.json +25 -10
  118. package/readme.md +11270 -101
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LoadSlackWebhookAction = exports.SlackWebhookAction = void 0;
13
+ const global_1 = require("@memberjunction/global");
14
+ const actions_1 = require("@memberjunction/actions");
15
+ const axios_1 = __importDefault(require("axios"));
16
+ const json_param_helper_1 = require("../utilities/json-param-helper");
17
+ /**
18
+ * Action that sends messages to Slack via incoming webhooks
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Simple text message
23
+ * await runAction({
24
+ * ActionName: 'Slack Webhook',
25
+ * Params: [{
26
+ * Name: 'WebhookURL',
27
+ * Value: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
28
+ * }, {
29
+ * Name: 'Message',
30
+ * Value: 'Hello from MemberJunction!'
31
+ * }]
32
+ * });
33
+ *
34
+ * // Rich message with blocks
35
+ * await runAction({
36
+ * ActionName: 'Slack Webhook',
37
+ * Params: [{
38
+ * Name: 'WebhookURL',
39
+ * Value: webhookUrl
40
+ * }, {
41
+ * Name: 'Blocks',
42
+ * Value: [
43
+ * {
44
+ * type: 'header',
45
+ * text: {
46
+ * type: 'plain_text',
47
+ * text: 'New Order Received'
48
+ * }
49
+ * },
50
+ * {
51
+ * type: 'section',
52
+ * text: {
53
+ * type: 'mrkdwn',
54
+ * text: `Order *#12345* from *John Doe*\nTotal: $99.99`
55
+ * }
56
+ * }
57
+ * ]
58
+ * }]
59
+ * });
60
+ *
61
+ * // With custom username and icon
62
+ * await runAction({
63
+ * ActionName: 'Slack Webhook',
64
+ * Params: [{
65
+ * Name: 'WebhookURL',
66
+ * Value: webhookUrl
67
+ * }, {
68
+ * Name: 'Message',
69
+ * Value: 'Deployment completed successfully!'
70
+ * }, {
71
+ * Name: 'Username',
72
+ * Value: 'Deploy Bot'
73
+ * }, {
74
+ * Name: 'IconEmoji',
75
+ * Value: ':rocket:'
76
+ * }]
77
+ * });
78
+ * ```
79
+ */
80
+ let SlackWebhookAction = class SlackWebhookAction extends actions_1.BaseAction {
81
+ /**
82
+ * Sends messages to Slack via webhook
83
+ *
84
+ * @param params - The action parameters containing:
85
+ * - WebhookURL: Slack incoming webhook URL (required)
86
+ * - Message: Plain text message (required if no Blocks)
87
+ * - Blocks: Slack Block Kit blocks array (optional, overrides Message)
88
+ * - Username: Override webhook's default username (optional)
89
+ * - IconEmoji: Override webhook's default icon (optional, e.g., ':ghost:')
90
+ * - IconURL: Override webhook's default icon with URL (optional)
91
+ * - Channel: Override webhook's default channel (optional, may be disabled)
92
+ * - ThreadTS: Thread timestamp to reply to (optional)
93
+ * - Attachments: Legacy attachments array (optional)
94
+ *
95
+ * @returns Success confirmation
96
+ */
97
+ async InternalRunAction(params) {
98
+ try {
99
+ const webhookURL = this.getParamValue(params, 'webhookurl');
100
+ const message = this.getParamValue(params, 'message');
101
+ const blocks = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'blocks');
102
+ const username = this.getParamValue(params, 'username');
103
+ const iconEmoji = this.getParamValue(params, 'iconemoji');
104
+ const iconURL = this.getParamValue(params, 'iconurl');
105
+ const channel = this.getParamValue(params, 'channel');
106
+ const threadTS = this.getParamValue(params, 'threadts');
107
+ const attachments = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'attachments');
108
+ // Validate webhook URL
109
+ if (!webhookURL) {
110
+ return {
111
+ Success: false,
112
+ Message: "WebhookURL parameter is required",
113
+ ResultCode: "MISSING_WEBHOOK_URL"
114
+ };
115
+ }
116
+ if (!webhookURL.startsWith('https://hooks.slack.com/')) {
117
+ return {
118
+ Success: false,
119
+ Message: "Invalid Slack webhook URL format",
120
+ ResultCode: "INVALID_WEBHOOK_URL"
121
+ };
122
+ }
123
+ // Validate message content
124
+ if (!message && !blocks) {
125
+ return {
126
+ Success: false,
127
+ Message: "Either Message or Blocks parameter is required",
128
+ ResultCode: "MISSING_CONTENT"
129
+ };
130
+ }
131
+ // Build payload
132
+ const payload = {};
133
+ if (blocks) {
134
+ // Use blocks if provided
135
+ payload.blocks = Array.isArray(blocks) ? blocks : [blocks];
136
+ // Add text as fallback
137
+ if (message) {
138
+ payload.text = message;
139
+ }
140
+ else {
141
+ // Generate fallback text from blocks
142
+ payload.text = this.generateFallbackText(payload.blocks);
143
+ }
144
+ }
145
+ else {
146
+ // Use simple text message
147
+ payload.text = message;
148
+ }
149
+ // Add optional parameters
150
+ if (username) {
151
+ payload.username = username;
152
+ }
153
+ if (iconEmoji && !iconURL) {
154
+ payload.icon_emoji = iconEmoji;
155
+ }
156
+ if (iconURL) {
157
+ payload.icon_url = iconURL;
158
+ }
159
+ if (channel) {
160
+ payload.channel = channel;
161
+ }
162
+ if (threadTS) {
163
+ payload.thread_ts = threadTS;
164
+ }
165
+ if (attachments) {
166
+ payload.attachments = Array.isArray(attachments) ? attachments : [attachments];
167
+ }
168
+ // Send to Slack
169
+ const response = await axios_1.default.post(webhookURL, payload, {
170
+ headers: {
171
+ 'Content-Type': 'application/json'
172
+ },
173
+ validateStatus: () => true // Handle all status codes
174
+ });
175
+ // Check response
176
+ if (response.status === 200 && response.data === 'ok') {
177
+ // Add output parameters
178
+ params.Params.push({
179
+ Name: 'SlackResponse',
180
+ Type: 'Output',
181
+ Value: response.data
182
+ });
183
+ params.Params.push({
184
+ Name: 'MessageSent',
185
+ Type: 'Output',
186
+ Value: payload
187
+ });
188
+ return {
189
+ Success: true,
190
+ ResultCode: "MESSAGE_SENT",
191
+ Message: JSON.stringify({
192
+ message: "Slack message sent successfully",
193
+ response: response.data,
194
+ payload: payload
195
+ }, null, 2)
196
+ };
197
+ }
198
+ else {
199
+ // Error response
200
+ return {
201
+ Success: false,
202
+ Message: `Slack webhook failed: ${response.data || `HTTP ${response.status}`}`,
203
+ ResultCode: response.status === 404 ? "WEBHOOK_NOT_FOUND" :
204
+ response.status === 400 ? "INVALID_PAYLOAD" :
205
+ "WEBHOOK_ERROR"
206
+ };
207
+ }
208
+ }
209
+ catch (error) {
210
+ return {
211
+ Success: false,
212
+ Message: `Slack webhook failed: ${error instanceof Error ? error.message : String(error)}`,
213
+ ResultCode: "REQUEST_FAILED"
214
+ };
215
+ }
216
+ }
217
+ /**
218
+ * Generate fallback text from blocks
219
+ */
220
+ generateFallbackText(blocks) {
221
+ const textParts = [];
222
+ for (const block of blocks) {
223
+ if (block.type === 'section' && block.text) {
224
+ textParts.push(this.extractText(block.text));
225
+ }
226
+ else if (block.type === 'header' && block.text) {
227
+ textParts.push(this.extractText(block.text));
228
+ }
229
+ else if (block.type === 'context' && block.elements) {
230
+ const contextTexts = block.elements
231
+ .filter((el) => el.type === 'plain_text' || el.type === 'mrkdwn')
232
+ .map((el) => this.extractText(el));
233
+ textParts.push(contextTexts.join(' '));
234
+ }
235
+ }
236
+ return textParts.join('\n') || 'Slack message';
237
+ }
238
+ /**
239
+ * Extract text from Slack text object
240
+ */
241
+ extractText(textObj) {
242
+ if (typeof textObj === 'string') {
243
+ return textObj;
244
+ }
245
+ if (textObj && textObj.text) {
246
+ return textObj.text;
247
+ }
248
+ return '';
249
+ }
250
+ /**
251
+ * Get parameter value by name (case-insensitive)
252
+ */
253
+ getParamValue(params, name) {
254
+ const param = params.Params.find(p => p.Name.toLowerCase() === name.toLowerCase());
255
+ return param?.Value;
256
+ }
257
+ };
258
+ exports.SlackWebhookAction = SlackWebhookAction;
259
+ exports.SlackWebhookAction = SlackWebhookAction = __decorate([
260
+ (0, global_1.RegisterClass)(actions_1.BaseAction, "Slack Webhook")
261
+ ], SlackWebhookAction);
262
+ /**
263
+ * Loader function to ensure the SlackWebhookAction class is included in the bundle
264
+ */
265
+ function LoadSlackWebhookAction() {
266
+ // Stub function to prevent tree shaking
267
+ }
268
+ exports.LoadSlackWebhookAction = LoadSlackWebhookAction;
269
+ //# sourceMappingURL=slack-webhook.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-webhook.action.js","sourceRoot":"","sources":["../../../src/custom/communication/slack-webhook.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
+ import { BaseAction } from "@memberjunction/actions";
3
+ /**
4
+ * Action that sends messages to Microsoft Teams via incoming webhooks
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // Simple text message
9
+ * await runAction({
10
+ * ActionName: 'Teams Webhook',
11
+ * Params: [{
12
+ * Name: 'WebhookURL',
13
+ * Value: 'https://company.webhook.office.com/webhookb2/...'
14
+ * }, {
15
+ * Name: 'Message',
16
+ * Value: 'Build completed successfully!'
17
+ * }]
18
+ * });
19
+ *
20
+ * // Rich card with sections
21
+ * await runAction({
22
+ * ActionName: 'Teams Webhook',
23
+ * Params: [{
24
+ * Name: 'WebhookURL',
25
+ * Value: webhookUrl
26
+ * }, {
27
+ * Name: 'Title',
28
+ * Value: 'Deployment Status'
29
+ * }, {
30
+ * Name: 'Message',
31
+ * Value: 'Production deployment completed'
32
+ * }, {
33
+ * Name: 'ThemeColor',
34
+ * Value: '00FF00'
35
+ * }, {
36
+ * Name: 'Sections',
37
+ * Value: [{
38
+ * activityTitle: 'Deployment Details',
39
+ * facts: [
40
+ * { name: 'Environment', value: 'Production' },
41
+ * { name: 'Version', value: 'v2.5.0' },
42
+ * { name: 'Duration', value: '5 minutes' }
43
+ * ]
44
+ * }]
45
+ * }]
46
+ * });
47
+ *
48
+ * // Adaptive Card
49
+ * await runAction({
50
+ * ActionName: 'Teams Webhook',
51
+ * Params: [{
52
+ * Name: 'WebhookURL',
53
+ * Value: webhookUrl
54
+ * }, {
55
+ * Name: 'Card',
56
+ * Value: {
57
+ * type: 'AdaptiveCard',
58
+ * version: '1.2',
59
+ * body: [{
60
+ * type: 'TextBlock',
61
+ * text: 'Hello from MemberJunction!',
62
+ * size: 'Large',
63
+ * weight: 'Bolder'
64
+ * }]
65
+ * }
66
+ * }]
67
+ * });
68
+ * ```
69
+ */
70
+ export declare class TeamsWebhookAction extends BaseAction {
71
+ /**
72
+ * Sends messages to Microsoft Teams via webhook
73
+ *
74
+ * @param params - The action parameters containing:
75
+ * - WebhookURL: Teams incoming webhook URL (required)
76
+ * - Message: Plain text message (required if no Card)
77
+ * - Card: Adaptive Card JSON (optional, overrides other formatting)
78
+ * - Title: Card title (optional)
79
+ * - ThemeColor: Hex color for card accent (optional, e.g., '0076D7')
80
+ * - Summary: Card summary (optional)
81
+ * - Sections: Array of MessageCard sections (optional)
82
+ * - PotentialAction: Array of actions for the card (optional)
83
+ *
84
+ * @returns Success confirmation
85
+ */
86
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
87
+ /**
88
+ * Get parameter value by name (case-insensitive)
89
+ */
90
+ private getParamValue;
91
+ }
92
+ /**
93
+ * Loader function to ensure the TeamsWebhookAction class is included in the bundle
94
+ */
95
+ export declare function LoadTeamsWebhookAction(): void;
96
+ //# sourceMappingURL=teams-webhook.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams-webhook.action.d.ts","sourceRoot":"","sources":["../../../src/custom/communication/teams-webhook.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAIrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,qBACa,kBAAmB,SAAQ,UAAU;IAE9C;;;;;;;;;;;;;;OAcG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsKvF;;OAEG;IACH,OAAO,CAAC,aAAa;CAIxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,SAErC"}
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LoadTeamsWebhookAction = exports.TeamsWebhookAction = void 0;
13
+ const global_1 = require("@memberjunction/global");
14
+ const actions_1 = require("@memberjunction/actions");
15
+ const axios_1 = __importDefault(require("axios"));
16
+ const json_param_helper_1 = require("../utilities/json-param-helper");
17
+ /**
18
+ * Action that sends messages to Microsoft Teams via incoming webhooks
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Simple text message
23
+ * await runAction({
24
+ * ActionName: 'Teams Webhook',
25
+ * Params: [{
26
+ * Name: 'WebhookURL',
27
+ * Value: 'https://company.webhook.office.com/webhookb2/...'
28
+ * }, {
29
+ * Name: 'Message',
30
+ * Value: 'Build completed successfully!'
31
+ * }]
32
+ * });
33
+ *
34
+ * // Rich card with sections
35
+ * await runAction({
36
+ * ActionName: 'Teams Webhook',
37
+ * Params: [{
38
+ * Name: 'WebhookURL',
39
+ * Value: webhookUrl
40
+ * }, {
41
+ * Name: 'Title',
42
+ * Value: 'Deployment Status'
43
+ * }, {
44
+ * Name: 'Message',
45
+ * Value: 'Production deployment completed'
46
+ * }, {
47
+ * Name: 'ThemeColor',
48
+ * Value: '00FF00'
49
+ * }, {
50
+ * Name: 'Sections',
51
+ * Value: [{
52
+ * activityTitle: 'Deployment Details',
53
+ * facts: [
54
+ * { name: 'Environment', value: 'Production' },
55
+ * { name: 'Version', value: 'v2.5.0' },
56
+ * { name: 'Duration', value: '5 minutes' }
57
+ * ]
58
+ * }]
59
+ * }]
60
+ * });
61
+ *
62
+ * // Adaptive Card
63
+ * await runAction({
64
+ * ActionName: 'Teams Webhook',
65
+ * Params: [{
66
+ * Name: 'WebhookURL',
67
+ * Value: webhookUrl
68
+ * }, {
69
+ * Name: 'Card',
70
+ * Value: {
71
+ * type: 'AdaptiveCard',
72
+ * version: '1.2',
73
+ * body: [{
74
+ * type: 'TextBlock',
75
+ * text: 'Hello from MemberJunction!',
76
+ * size: 'Large',
77
+ * weight: 'Bolder'
78
+ * }]
79
+ * }
80
+ * }]
81
+ * });
82
+ * ```
83
+ */
84
+ let TeamsWebhookAction = class TeamsWebhookAction extends actions_1.BaseAction {
85
+ /**
86
+ * Sends messages to Microsoft Teams via webhook
87
+ *
88
+ * @param params - The action parameters containing:
89
+ * - WebhookURL: Teams incoming webhook URL (required)
90
+ * - Message: Plain text message (required if no Card)
91
+ * - Card: Adaptive Card JSON (optional, overrides other formatting)
92
+ * - Title: Card title (optional)
93
+ * - ThemeColor: Hex color for card accent (optional, e.g., '0076D7')
94
+ * - Summary: Card summary (optional)
95
+ * - Sections: Array of MessageCard sections (optional)
96
+ * - PotentialAction: Array of actions for the card (optional)
97
+ *
98
+ * @returns Success confirmation
99
+ */
100
+ async InternalRunAction(params) {
101
+ try {
102
+ const webhookURL = this.getParamValue(params, 'webhookurl');
103
+ const message = this.getParamValue(params, 'message');
104
+ const card = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'card');
105
+ const title = this.getParamValue(params, 'title');
106
+ const themeColor = this.getParamValue(params, 'themecolor');
107
+ const summary = this.getParamValue(params, 'summary');
108
+ const sections = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'sections');
109
+ const potentialAction = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'potentialaction');
110
+ // Validate webhook URL
111
+ if (!webhookURL) {
112
+ return {
113
+ Success: false,
114
+ Message: "WebhookURL parameter is required",
115
+ ResultCode: "MISSING_WEBHOOK_URL"
116
+ };
117
+ }
118
+ if (!webhookURL.includes('webhook.office.com')) {
119
+ return {
120
+ Success: false,
121
+ Message: "Invalid Teams webhook URL format",
122
+ ResultCode: "INVALID_WEBHOOK_URL"
123
+ };
124
+ }
125
+ // Validate content
126
+ if (!message && !card) {
127
+ return {
128
+ Success: false,
129
+ Message: "Either Message or Card parameter is required",
130
+ ResultCode: "MISSING_CONTENT"
131
+ };
132
+ }
133
+ // Build payload
134
+ let payload;
135
+ if (card) {
136
+ // Use Adaptive Card
137
+ payload = {
138
+ type: "message",
139
+ attachments: [{
140
+ contentType: "application/vnd.microsoft.card.adaptive",
141
+ content: card
142
+ }]
143
+ };
144
+ }
145
+ else {
146
+ // Use MessageCard format
147
+ payload = {
148
+ "@type": "MessageCard",
149
+ "@context": "https://schema.org/extensions"
150
+ };
151
+ if (summary) {
152
+ payload.summary = summary;
153
+ }
154
+ else if (message) {
155
+ payload.summary = message.substring(0, 100);
156
+ }
157
+ if (title) {
158
+ payload.title = title;
159
+ }
160
+ if (message) {
161
+ payload.text = message;
162
+ }
163
+ if (themeColor) {
164
+ // Ensure color is in hex format without #
165
+ payload.themeColor = themeColor.replace('#', '');
166
+ }
167
+ if (sections && Array.isArray(sections)) {
168
+ payload.sections = sections;
169
+ }
170
+ if (potentialAction && Array.isArray(potentialAction)) {
171
+ payload.potentialAction = potentialAction;
172
+ }
173
+ }
174
+ // Send to Teams
175
+ const response = await axios_1.default.post(webhookURL, payload, {
176
+ headers: {
177
+ 'Content-Type': 'application/json'
178
+ },
179
+ validateStatus: () => true // Handle all status codes
180
+ });
181
+ // Check response
182
+ if (response.status === 200) {
183
+ // Success response from Teams is "1"
184
+ const isSuccess = response.data === 1 || response.data === "1";
185
+ if (isSuccess) {
186
+ // Add output parameters
187
+ params.Params.push({
188
+ Name: 'TeamsResponse',
189
+ Type: 'Output',
190
+ Value: response.data
191
+ });
192
+ params.Params.push({
193
+ Name: 'MessageSent',
194
+ Type: 'Output',
195
+ Value: payload
196
+ });
197
+ return {
198
+ Success: true,
199
+ ResultCode: "MESSAGE_SENT",
200
+ Message: JSON.stringify({
201
+ message: "Teams message sent successfully",
202
+ response: response.data,
203
+ payload: payload
204
+ }, null, 2)
205
+ };
206
+ }
207
+ else {
208
+ return {
209
+ Success: false,
210
+ Message: `Teams webhook returned unexpected response: ${response.data}`,
211
+ ResultCode: "UNEXPECTED_RESPONSE"
212
+ };
213
+ }
214
+ }
215
+ else if (response.status === 400) {
216
+ // Bad request - usually malformed payload
217
+ return {
218
+ Success: false,
219
+ Message: `Invalid payload: ${response.data || 'Bad Request'}`,
220
+ ResultCode: "INVALID_PAYLOAD"
221
+ };
222
+ }
223
+ else if (response.status === 413) {
224
+ // Payload too large
225
+ return {
226
+ Success: false,
227
+ Message: "Payload too large. Teams webhooks have a size limit.",
228
+ ResultCode: "PAYLOAD_TOO_LARGE"
229
+ };
230
+ }
231
+ else if (response.status === 429) {
232
+ // Rate limited
233
+ return {
234
+ Success: false,
235
+ Message: "Rate limited. Too many requests to Teams webhook.",
236
+ ResultCode: "RATE_LIMITED"
237
+ };
238
+ }
239
+ else {
240
+ // Other error
241
+ return {
242
+ Success: false,
243
+ Message: `Teams webhook failed: HTTP ${response.status} - ${response.data}`,
244
+ ResultCode: `HTTP_${response.status}`
245
+ };
246
+ }
247
+ }
248
+ catch (error) {
249
+ return {
250
+ Success: false,
251
+ Message: `Teams webhook failed: ${error instanceof Error ? error.message : String(error)}`,
252
+ ResultCode: "REQUEST_FAILED"
253
+ };
254
+ }
255
+ }
256
+ /**
257
+ * Get parameter value by name (case-insensitive)
258
+ */
259
+ getParamValue(params, name) {
260
+ const param = params.Params.find(p => p.Name.toLowerCase() === name.toLowerCase());
261
+ return param?.Value;
262
+ }
263
+ };
264
+ exports.TeamsWebhookAction = TeamsWebhookAction;
265
+ exports.TeamsWebhookAction = TeamsWebhookAction = __decorate([
266
+ (0, global_1.RegisterClass)(actions_1.BaseAction, "Teams Webhook")
267
+ ], TeamsWebhookAction);
268
+ /**
269
+ * Loader function to ensure the TeamsWebhookAction class is included in the bundle
270
+ */
271
+ function LoadTeamsWebhookAction() {
272
+ // Stub function to prevent tree shaking
273
+ }
274
+ exports.LoadTeamsWebhookAction = LoadTeamsWebhookAction;
275
+ //# sourceMappingURL=teams-webhook.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams-webhook.action.js","sourceRoot":"","sources":["../../../src/custom/communication/teams-webhook.action.ts"],"names":[],"mappings":"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"}