slackblock 0.4.0 → 1.0.0-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 (139) hide show
  1. package/CHANGELOG.md +33 -26
  2. package/LICENSE +21 -21
  3. package/README.md +95 -85
  4. package/dist/block.cjs +341 -0
  5. package/dist/block.cjs.map +1 -0
  6. package/dist/block.d.mts +412 -0
  7. package/dist/block.d.ts +412 -0
  8. package/dist/block.mjs +268 -0
  9. package/dist/block.mjs.map +1 -0
  10. package/dist/index.cjs +1202 -0
  11. package/dist/index.cjs.map +1 -0
  12. package/dist/index.d.mts +6 -0
  13. package/dist/index.d.ts +6 -0
  14. package/dist/index.mjs +1170 -0
  15. package/dist/index.mjs.map +1 -0
  16. package/dist/types.d-DgQXbJte.d.mts +296 -0
  17. package/dist/types.d-DgQXbJte.d.ts +296 -0
  18. package/package.json +85 -135
  19. package/blocks.js +0 -12
  20. package/index.js +0 -7
  21. package/lib/components/block/button.js +0 -27
  22. package/lib/components/block/confirmation.js +0 -27
  23. package/lib/components/block/image.js +0 -27
  24. package/lib/components/block/text.js +0 -27
  25. package/lib/components/index.js +0 -42
  26. package/lib/components/input/date-picker.js +0 -27
  27. package/lib/components/input/option-group.js +0 -27
  28. package/lib/components/input/option.js +0 -27
  29. package/lib/components/input/overflow.js +0 -27
  30. package/lib/components/input/radio-group.js +0 -27
  31. package/lib/components/input/select.js +0 -34
  32. package/lib/components/input/text.js +0 -27
  33. package/lib/components/layout/actions.js +0 -27
  34. package/lib/components/layout/container.js +0 -27
  35. package/lib/components/layout/context.js +0 -27
  36. package/lib/components/layout/divider.js +0 -27
  37. package/lib/components/layout/file.js +0 -27
  38. package/lib/components/layout/image.js +0 -27
  39. package/lib/components/layout/input.js +0 -27
  40. package/lib/components/layout/section.js +0 -27
  41. package/lib/components/message.js +0 -27
  42. package/lib/index.js +0 -7
  43. package/lib/parser/index.js +0 -32
  44. package/lib/renderer/index.js +0 -71
  45. package/lib/transformers/block/button.js +0 -29
  46. package/lib/transformers/block/confirmation.js +0 -18
  47. package/lib/transformers/block/image.js +0 -10
  48. package/lib/transformers/block/text.js +0 -16
  49. package/lib/transformers/index.js +0 -54
  50. package/lib/transformers/input/date-picker.js +0 -30
  51. package/lib/transformers/input/option-group.js +0 -19
  52. package/lib/transformers/input/option.js +0 -19
  53. package/lib/transformers/input/overflow.js +0 -19
  54. package/lib/transformers/input/radio-group.js +0 -22
  55. package/lib/transformers/input/select.js +0 -84
  56. package/lib/transformers/input/text.js +0 -31
  57. package/lib/transformers/layout/actions.js +0 -18
  58. package/lib/transformers/layout/container.js +0 -11
  59. package/lib/transformers/layout/context.js +0 -18
  60. package/lib/transformers/layout/divider.js +0 -10
  61. package/lib/transformers/layout/file.js +0 -14
  62. package/lib/transformers/layout/image.js +0 -23
  63. package/lib/transformers/layout/input.js +0 -26
  64. package/lib/transformers/layout/section.js +0 -31
  65. package/lib/utils/get-type.js +0 -16
  66. package/lib/utils/type-helpers.js +0 -2
  67. package/src/components/block/button.tsx +0 -20
  68. package/src/components/block/confirmation.tsx +0 -19
  69. package/src/components/block/image.tsx +0 -8
  70. package/src/components/block/text.tsx +0 -10
  71. package/src/components/index.ts +0 -23
  72. package/src/components/input/date-picker.tsx +0 -11
  73. package/src/components/input/option-group.tsx +0 -9
  74. package/src/components/input/option.tsx +0 -9
  75. package/src/components/input/overflow.tsx +0 -12
  76. package/src/components/input/radio-group.tsx +0 -13
  77. package/src/components/input/select.tsx +0 -36
  78. package/src/components/input/text.tsx +0 -12
  79. package/src/components/layout/actions.tsx +0 -9
  80. package/src/components/layout/container.tsx +0 -9
  81. package/src/components/layout/context.tsx +0 -12
  82. package/src/components/layout/divider.tsx +0 -7
  83. package/src/components/layout/file.tsx +0 -8
  84. package/src/components/layout/image.tsx +0 -10
  85. package/src/components/layout/input.tsx +0 -12
  86. package/src/components/layout/section.tsx +0 -15
  87. package/src/components/message.tsx +0 -20
  88. package/src/constants/types.d.ts +0 -93
  89. package/src/index.ts +0 -3
  90. package/src/parser/index.ts +0 -32
  91. package/src/renderer/index.ts +0 -75
  92. package/src/transformers/block/button.tsx +0 -47
  93. package/src/transformers/block/confirmation.tsx +0 -26
  94. package/src/transformers/block/image.ts +0 -18
  95. package/src/transformers/block/text.ts +0 -34
  96. package/src/transformers/index.ts +0 -65
  97. package/src/transformers/input/date-picker.tsx +0 -43
  98. package/src/transformers/input/option-group.tsx +0 -26
  99. package/src/transformers/input/option.tsx +0 -27
  100. package/src/transformers/input/overflow.ts +0 -33
  101. package/src/transformers/input/radio-group.ts +0 -38
  102. package/src/transformers/input/select.tsx +0 -136
  103. package/src/transformers/input/text.tsx +0 -47
  104. package/src/transformers/layout/actions.ts +0 -29
  105. package/src/transformers/layout/container.ts +0 -16
  106. package/src/transformers/layout/context.ts +0 -35
  107. package/src/transformers/layout/divider.ts +0 -20
  108. package/src/transformers/layout/file.ts +0 -24
  109. package/src/transformers/layout/image.tsx +0 -34
  110. package/src/transformers/layout/input.tsx +0 -39
  111. package/src/transformers/layout/section.ts +0 -53
  112. package/src/tsconfig.json +0 -11
  113. package/src/utils/get-type.ts +0 -20
  114. package/src/utils/type-helpers.ts +0 -1
  115. package/test/index.test.tsx +0 -11
  116. package/test/parser/parser.test.tsx +0 -67
  117. package/test/renderer/renderer.test.tsx +0 -138
  118. package/test/transformers/block/button.test.tsx +0 -63
  119. package/test/transformers/block/confirmation.test.tsx +0 -37
  120. package/test/transformers/block/image.test.tsx +0 -20
  121. package/test/transformers/block/text.test.tsx +0 -32
  122. package/test/transformers/input/date-picker.test.tsx +0 -66
  123. package/test/transformers/input/option-group.test.tsx +0 -26
  124. package/test/transformers/input/option.test.tsx +0 -36
  125. package/test/transformers/input/overflow.test.tsx +0 -57
  126. package/test/transformers/input/radio-group.test.tsx +0 -81
  127. package/test/transformers/input/select.test.tsx +0 -249
  128. package/test/transformers/input/text.test.tsx +0 -42
  129. package/test/transformers/layout/actions.test.tsx +0 -33
  130. package/test/transformers/layout/container.test.tsx +0 -34
  131. package/test/transformers/layout/context.test.tsx +0 -43
  132. package/test/transformers/layout/divider.test.tsx +0 -20
  133. package/test/transformers/layout/file.test.tsx +0 -26
  134. package/test/transformers/layout/image.test.tsx +0 -43
  135. package/test/transformers/layout/input.test.tsx +0 -59
  136. package/test/transformers/layout/section.test.tsx +0 -89
  137. package/test/tsconfig.json +0 -9
  138. package/test/utils/get-type.test.tsx +0 -21
  139. package/tsconfig.json +0 -14
package/dist/index.cjs ADDED
@@ -0,0 +1,1202 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/index.ts
30
+ var src_exports = {};
31
+ __export(src_exports, {
32
+ default: () => renderer_default
33
+ });
34
+ module.exports = __toCommonJS(src_exports);
35
+
36
+ // src/utils/get-type.ts
37
+ var getType = (element) => {
38
+ if (typeof element === "string") {
39
+ return "string";
40
+ }
41
+ if (element === null || element === void 0 || typeof element === "boolean") {
42
+ return "null";
43
+ }
44
+ if (Array.isArray(element)) {
45
+ throw new TypeError("Cannot type arrays");
46
+ }
47
+ const { type } = element;
48
+ if (typeof type === "string") {
49
+ return type;
50
+ }
51
+ const { slackType, displayName, name } = type;
52
+ return slackType || displayName || name || type;
53
+ };
54
+ var get_type_default = getType;
55
+
56
+ // src/utils/validation.ts
57
+ var warn = (message) => {
58
+ console.warn(message);
59
+ };
60
+ var warnIfTooLong = (name, value, max) => {
61
+ if (!value) {
62
+ return;
63
+ }
64
+ if (value.length > max) {
65
+ warn(`${name} exceeds ${max} characters.`);
66
+ }
67
+ };
68
+ var warnIfTooMany = (name, values, max) => {
69
+ if (!values) {
70
+ return;
71
+ }
72
+ if (values.length > max) {
73
+ warn(`${name} exceeds ${max} items.`);
74
+ }
75
+ };
76
+
77
+ // src/transformers/block/text.ts
78
+ var transformText = (element) => {
79
+ const {
80
+ props: {
81
+ plainText,
82
+ children,
83
+ emoji,
84
+ verbatim
85
+ }
86
+ } = element;
87
+ const res = {
88
+ type: plainText ? "plain_text" : "mrkdwn",
89
+ text: children
90
+ };
91
+ if (typeof children === "string") {
92
+ warnIfTooLong("Text", children, 3e3);
93
+ }
94
+ if (emoji) {
95
+ res.emoji = true;
96
+ }
97
+ if (verbatim) {
98
+ res.verbatim = true;
99
+ }
100
+ return res;
101
+ };
102
+ var text_default = transformText;
103
+
104
+ // src/transformers/block/confirmation.tsx
105
+ var import_react2 = __toESM(require("react"));
106
+
107
+ // src/components/block/text.tsx
108
+ var import_react = __toESM(require("react"));
109
+ var Text = class extends import_react.default.Component {
110
+ };
111
+ Text.slackType = "Text";
112
+
113
+ // src/transformers/block/confirmation.tsx
114
+ var transformConfirmation = (child) => {
115
+ const { title, confirm, deny, children } = child.props;
116
+ const res = {
117
+ title: transform(/* @__PURE__ */ import_react2.default.createElement(Text, { plainText: true }, title)),
118
+ text: transform(children),
119
+ confirm: transform(/* @__PURE__ */ import_react2.default.createElement(Text, { plainText: true }, confirm)),
120
+ deny: transform(/* @__PURE__ */ import_react2.default.createElement(Text, { plainText: true }, deny))
121
+ };
122
+ return res;
123
+ };
124
+ var confirmation_default = transformConfirmation;
125
+
126
+ // src/transformers/block/button.tsx
127
+ var import_react3 = __toESM(require("react"));
128
+ var transformButton = (child) => {
129
+ const { actionId, children, url, value, style, confirm, accessibilityLabel } = child.props;
130
+ warnIfTooLong("Button action_id", actionId, 255);
131
+ if (typeof children === "string") {
132
+ warnIfTooLong("Button text", children, 75);
133
+ }
134
+ warnIfTooLong("Button value", value, 2e3);
135
+ const res = {
136
+ type: "button",
137
+ text: transform(/* @__PURE__ */ import_react3.default.createElement(Text, { plainText: true }, children)),
138
+ action_id: actionId
139
+ };
140
+ if (url) {
141
+ res.url = url;
142
+ }
143
+ if (value) {
144
+ res.value = value;
145
+ }
146
+ if (style) {
147
+ res.style = style;
148
+ }
149
+ if (confirm) {
150
+ res.confirm = transform(confirm);
151
+ }
152
+ if (accessibilityLabel) {
153
+ res.accessibility_label = accessibilityLabel;
154
+ }
155
+ return res;
156
+ };
157
+ var button_default = transformButton;
158
+
159
+ // src/transformers/block/image.ts
160
+ var transformImage = (child) => {
161
+ const { url, alt } = child.props;
162
+ return {
163
+ type: "image",
164
+ image_url: url,
165
+ alt_text: alt
166
+ };
167
+ };
168
+ var image_default = transformImage;
169
+
170
+ // src/transformers/layout/container.ts
171
+ var normalizeChildren = (children) => {
172
+ const result = [];
173
+ const stack = Array.isArray(children) ? [...children] : [children];
174
+ while (stack.length > 0) {
175
+ const child = stack.shift();
176
+ if (child === null || child === void 0 || typeof child === "boolean") {
177
+ continue;
178
+ }
179
+ if (Array.isArray(child)) {
180
+ stack.unshift(...child);
181
+ continue;
182
+ }
183
+ result.push(child);
184
+ }
185
+ return result;
186
+ };
187
+ var transformContainer = (child) => {
188
+ const { children } = child.props;
189
+ const elements = normalizeChildren(children);
190
+ return elements.map((element) => transform(element));
191
+ };
192
+ var container_default = transformContainer;
193
+
194
+ // src/transformers/layout/section.ts
195
+ var transformSection = (element) => {
196
+ const {
197
+ props: {
198
+ text,
199
+ blockId,
200
+ children,
201
+ accessory
202
+ }
203
+ } = element;
204
+ warnIfTooLong("block_id", blockId, 255);
205
+ const res = {
206
+ type: "section",
207
+ text: transform(text)
208
+ };
209
+ if (blockId) {
210
+ res.block_id = blockId;
211
+ }
212
+ if (accessory) {
213
+ res.accessory = transform(accessory);
214
+ }
215
+ if (children) {
216
+ res.fields = [];
217
+ let fields = children;
218
+ if (!Array.isArray(fields)) {
219
+ fields = [fields];
220
+ }
221
+ for (const field of fields) {
222
+ if (field) {
223
+ const t = transform(field);
224
+ res.fields.push(t);
225
+ }
226
+ }
227
+ warnIfTooMany("Section fields", res.fields, 10);
228
+ }
229
+ return res;
230
+ };
231
+ var section_default = transformSection;
232
+
233
+ // src/transformers/layout/actions.ts
234
+ var transformActions = (child) => {
235
+ const { children, blockId } = child.props;
236
+ warnIfTooLong("block_id", blockId, 255);
237
+ let elements = children;
238
+ if (!Array.isArray(elements)) {
239
+ elements = [elements];
240
+ }
241
+ const res = {
242
+ type: "actions",
243
+ elements: elements.map((element) => transform(element))
244
+ };
245
+ if (blockId) {
246
+ res.block_id = blockId;
247
+ }
248
+ warnIfTooMany("Actions elements", res.elements, 25);
249
+ return res;
250
+ };
251
+ var actions_default = transformActions;
252
+
253
+ // src/transformers/layout/context.ts
254
+ var transformContext = (child) => {
255
+ const { children, blockId } = child.props;
256
+ warnIfTooLong("block_id", blockId, 255);
257
+ let elements = children;
258
+ if (!Array.isArray(elements)) {
259
+ elements = [elements];
260
+ }
261
+ const res = {
262
+ type: "context",
263
+ elements: elements.map((element) => transform(element))
264
+ };
265
+ if (blockId) {
266
+ res.block_id = blockId;
267
+ }
268
+ warnIfTooMany("Context elements", res.elements, 10);
269
+ return res;
270
+ };
271
+ var context_default = transformContext;
272
+
273
+ // src/transformers/layout/divider.ts
274
+ var transformDivider = (child) => {
275
+ const { blockId } = child.props;
276
+ warnIfTooLong("block_id", blockId, 255);
277
+ const res = { type: "divider" };
278
+ if (blockId) {
279
+ res.block_id = blockId;
280
+ }
281
+ return res;
282
+ };
283
+ var divider_default = transformDivider;
284
+
285
+ // src/transformers/layout/file.ts
286
+ var transformFile = (child) => {
287
+ const { externalId, blockId } = child.props;
288
+ warnIfTooLong("block_id", blockId, 255);
289
+ const res = {
290
+ type: "file",
291
+ source: "remote",
292
+ external_id: externalId
293
+ };
294
+ if (blockId) {
295
+ res.block_id = blockId;
296
+ }
297
+ return res;
298
+ };
299
+ var file_default = transformFile;
300
+
301
+ // src/transformers/layout/header.tsx
302
+ var import_react4 = __toESM(require("react"));
303
+ var transformHeader = (child) => {
304
+ const { text, blockId, emoji } = child.props;
305
+ warnIfTooLong("block_id", blockId, 255);
306
+ const res = {
307
+ type: "header",
308
+ text: transform(/* @__PURE__ */ import_react4.default.createElement(Text, { plainText: true, emoji }, text))
309
+ };
310
+ if (blockId) {
311
+ res.block_id = blockId;
312
+ }
313
+ return res;
314
+ };
315
+ var header_default = transformHeader;
316
+
317
+ // src/transformers/layout/image.tsx
318
+ var import_react5 = __toESM(require("react"));
319
+ var transformImageLayout = (child) => {
320
+ const { url, alt, title, blockId } = child.props;
321
+ warnIfTooLong("block_id", blockId, 255);
322
+ const res = {
323
+ type: "image",
324
+ image_url: url,
325
+ alt_text: alt
326
+ };
327
+ if (title) {
328
+ res.title = transform(/* @__PURE__ */ import_react5.default.createElement(Text, { plainText: true }, title));
329
+ }
330
+ if (blockId) {
331
+ res.block_id = blockId;
332
+ }
333
+ return res;
334
+ };
335
+ var image_default2 = transformImageLayout;
336
+
337
+ // src/transformers/layout/input.tsx
338
+ var import_react6 = __toESM(require("react"));
339
+ var transformInput = (child) => {
340
+ const { label, element, hint, optional, blockId } = child.props;
341
+ warnIfTooLong("block_id", blockId, 255);
342
+ const res = {
343
+ type: "input",
344
+ label: transform(/* @__PURE__ */ import_react6.default.createElement(Text, { plainText: true }, label)),
345
+ element: transform(element)
346
+ };
347
+ if (hint) {
348
+ res.hint = transform(/* @__PURE__ */ import_react6.default.createElement(Text, { plainText: true }, hint));
349
+ }
350
+ if (optional) {
351
+ res.optional = true;
352
+ }
353
+ if (blockId) {
354
+ res.block_id = blockId;
355
+ }
356
+ return res;
357
+ };
358
+ var input_default = transformInput;
359
+
360
+ // src/transformers/rich-text/utils.ts
361
+ var normalizeRichTextChildren = (children) => {
362
+ const result = [];
363
+ const stack = Array.isArray(children) ? [...children] : [children];
364
+ while (stack.length > 0) {
365
+ const child = stack.shift();
366
+ if (child === null || child === void 0 || typeof child === "boolean") {
367
+ continue;
368
+ }
369
+ if (Array.isArray(child)) {
370
+ stack.unshift(...child);
371
+ continue;
372
+ }
373
+ result.push(child);
374
+ }
375
+ return result;
376
+ };
377
+ var toInlineElements = (children) => {
378
+ const items = normalizeRichTextChildren(children);
379
+ return items.map((item) => {
380
+ if (typeof item === "string") {
381
+ return { type: "text", text: item };
382
+ }
383
+ return transform(item);
384
+ });
385
+ };
386
+ var toBlockElements = (children) => {
387
+ const items = normalizeRichTextChildren(children);
388
+ return items.map((item) => {
389
+ if (typeof item === "string") {
390
+ return {
391
+ type: "rich_text_section",
392
+ elements: [{ type: "text", text: item }]
393
+ };
394
+ }
395
+ return transform(item);
396
+ });
397
+ };
398
+
399
+ // src/transformers/layout/rich-text.ts
400
+ var transformRichText = (child) => {
401
+ const { elements, children, blockId } = child.props;
402
+ warnIfTooLong("block_id", blockId, 255);
403
+ const res = {
404
+ type: "rich_text",
405
+ elements: elements != null ? elements : toBlockElements(children)
406
+ };
407
+ if (blockId) {
408
+ res.block_id = blockId;
409
+ }
410
+ return res;
411
+ };
412
+ var rich_text_default = transformRichText;
413
+
414
+ // src/transformers/layout/video.tsx
415
+ var import_react7 = __toESM(require("react"));
416
+ var transformVideo = (child) => {
417
+ const {
418
+ title,
419
+ videoUrl,
420
+ thumbnailUrl,
421
+ altText,
422
+ titleUrl,
423
+ description,
424
+ authorName,
425
+ providerName,
426
+ providerIconUrl,
427
+ blockId
428
+ } = child.props;
429
+ warnIfTooLong("block_id", blockId, 255);
430
+ const res = {
431
+ type: "video",
432
+ title: transform(/* @__PURE__ */ import_react7.default.createElement(Text, { plainText: true }, title)),
433
+ video_url: videoUrl,
434
+ thumbnail_url: thumbnailUrl,
435
+ alt_text: altText
436
+ };
437
+ if (titleUrl) {
438
+ res.title_url = titleUrl;
439
+ }
440
+ if (description) {
441
+ res.description = transform(/* @__PURE__ */ import_react7.default.createElement(Text, { plainText: true }, description));
442
+ }
443
+ if (authorName) {
444
+ res.author_name = authorName;
445
+ }
446
+ if (providerName) {
447
+ res.provider_name = providerName;
448
+ }
449
+ if (providerIconUrl) {
450
+ res.provider_icon_url = providerIconUrl;
451
+ }
452
+ if (blockId) {
453
+ res.block_id = blockId;
454
+ }
455
+ return res;
456
+ };
457
+ var video_default = transformVideo;
458
+
459
+ // src/transformers/input/text.tsx
460
+ var import_react8 = __toESM(require("react"));
461
+ var transformTextInput = (child) => {
462
+ const {
463
+ actionId,
464
+ placeholder,
465
+ initial,
466
+ multiline,
467
+ minLength,
468
+ maxLength,
469
+ focusOnLoad,
470
+ dispatchActionConfig
471
+ } = child.props;
472
+ warnIfTooLong("TextInput action_id", actionId, 255);
473
+ if (placeholder) {
474
+ warnIfTooLong("TextInput placeholder", placeholder, 150);
475
+ }
476
+ const res = {
477
+ type: "plain_text_input",
478
+ action_id: actionId
479
+ };
480
+ if (placeholder) {
481
+ res.placeholder = transform(/* @__PURE__ */ import_react8.default.createElement(Text, { plainText: true }, placeholder));
482
+ }
483
+ if (initial) {
484
+ res.initial_value = initial;
485
+ }
486
+ if (multiline) {
487
+ res.multiline = true;
488
+ }
489
+ if (minLength) {
490
+ res.min_length = minLength;
491
+ }
492
+ if (maxLength) {
493
+ res.max_length = maxLength;
494
+ }
495
+ if (focusOnLoad !== void 0) {
496
+ res.focus_on_load = focusOnLoad;
497
+ }
498
+ if (dispatchActionConfig && dispatchActionConfig.triggerActionsOn.length > 0) {
499
+ res.dispatch_action_config = {
500
+ trigger_actions_on: dispatchActionConfig.triggerActionsOn
501
+ };
502
+ }
503
+ return res;
504
+ };
505
+ var text_default2 = transformTextInput;
506
+
507
+ // src/transformers/input/date-time-picker.ts
508
+ var transformDateTimePicker = (child) => {
509
+ const { actionId, initialDateTime, confirm, focusOnLoad } = child.props;
510
+ warnIfTooLong("DateTimePicker action_id", actionId, 255);
511
+ const res = {
512
+ type: "datetimepicker",
513
+ action_id: actionId
514
+ };
515
+ if (initialDateTime !== void 0) {
516
+ if (!Number.isInteger(initialDateTime)) {
517
+ throw new TypeError("DateTime must be a unix timestamp in seconds.");
518
+ }
519
+ res.initial_date_time = initialDateTime;
520
+ }
521
+ if (confirm) {
522
+ res.confirm = transform(confirm);
523
+ }
524
+ if (focusOnLoad !== void 0) {
525
+ res.focus_on_load = focusOnLoad;
526
+ }
527
+ return res;
528
+ };
529
+ var date_time_picker_default = transformDateTimePicker;
530
+
531
+ // src/transformers/input/date-picker.tsx
532
+ var import_react9 = __toESM(require("react"));
533
+ var isValidDateString = (value) => {
534
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
535
+ if (!match) {
536
+ return false;
537
+ }
538
+ const year = Number(match[1]);
539
+ const month = Number(match[2]);
540
+ const day = Number(match[3]);
541
+ if (month < 1 || month > 12) {
542
+ return false;
543
+ }
544
+ const date = new Date(Date.UTC(year, month - 1, day));
545
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
546
+ };
547
+ var transformDatePicker = (child) => {
548
+ const { actionId, placeholder, initialDate, confirm, focusOnLoad } = child.props;
549
+ warnIfTooLong("DatePicker action_id", actionId, 255);
550
+ if (placeholder) {
551
+ warnIfTooLong("DatePicker placeholder", placeholder, 150);
552
+ }
553
+ const res = {
554
+ type: "datepicker",
555
+ action_id: actionId
556
+ };
557
+ if (placeholder) {
558
+ res.placeholder = transform(/* @__PURE__ */ import_react9.default.createElement(Text, { plainText: true }, placeholder));
559
+ }
560
+ if (initialDate) {
561
+ if (!isValidDateString(initialDate)) {
562
+ throw new Error("Date must be valid and in format YYYY-MM-DD.");
563
+ }
564
+ res.initial_date = initialDate;
565
+ }
566
+ if (confirm) {
567
+ res.confirm = transform(confirm);
568
+ }
569
+ if (focusOnLoad !== void 0) {
570
+ res.focus_on_load = focusOnLoad;
571
+ }
572
+ return res;
573
+ };
574
+ var date_picker_default = transformDatePicker;
575
+
576
+ // src/transformers/input/checkboxes.ts
577
+ var transformCheckboxes = (child) => {
578
+ const { actionId, children, initialOptions, confirm, focusOnLoad } = child.props;
579
+ warnIfTooLong("Checkboxes action_id", actionId, 255);
580
+ let elements = children;
581
+ if (!Array.isArray(elements)) {
582
+ elements = [elements];
583
+ }
584
+ const res = {
585
+ type: "checkboxes",
586
+ action_id: actionId,
587
+ options: elements.map((element) => transform(element))
588
+ };
589
+ if (initialOptions && initialOptions.length > 0) {
590
+ res.initial_options = initialOptions.map((option) => transform(option));
591
+ }
592
+ if (confirm) {
593
+ res.confirm = transform(confirm);
594
+ }
595
+ if (focusOnLoad !== void 0) {
596
+ res.focus_on_load = focusOnLoad;
597
+ }
598
+ return res;
599
+ };
600
+ var checkboxes_default = transformCheckboxes;
601
+
602
+ // src/transformers/input/select.tsx
603
+ var import_react11 = __toESM(require("react"));
604
+
605
+ // src/components/input/select.tsx
606
+ var import_react10 = __toESM(require("react"));
607
+ var selectTypes = {
608
+ STATIC: "static",
609
+ EXTERNAL: "external",
610
+ USER: "user",
611
+ CONVERSATION: "conversation",
612
+ CHANNEL: "channel"
613
+ };
614
+ var Select = class extends import_react10.default.Component {
615
+ };
616
+ Select.slackType = "Select";
617
+
618
+ // src/transformers/input/select.tsx
619
+ var OPTION = "Option";
620
+ var OPTION_GROUP = "OptionGroup";
621
+ var types = {
622
+ [selectTypes.STATIC]: "static_select",
623
+ [selectTypes.EXTERNAL]: "external_select",
624
+ [selectTypes.USER]: "users_select",
625
+ [selectTypes.CONVERSATION]: "conversations_select",
626
+ [selectTypes.CHANNEL]: "channels_select"
627
+ };
628
+ var MULTI_PREFIX = "multi_";
629
+ var normalizeElements = (elements) => {
630
+ if (!elements) {
631
+ return [];
632
+ }
633
+ return Array.isArray(elements) ? elements : [elements];
634
+ };
635
+ var assignStaticOptions = (elements, result) => {
636
+ const elementType = get_type_default(elements[0]);
637
+ if (elements.some((element) => get_type_default(element) !== elementType)) {
638
+ if (elementType === OPTION && elements.some((element) => get_type_default(element) !== OPTION_GROUP)) {
639
+ throw new TypeError("You cannot mix OptionGroup types with Option types in a Select block.");
640
+ } else if (elementType === OPTION_GROUP && elements.some((element) => get_type_default(element) !== OPTION)) {
641
+ throw new TypeError("You cannot mix OptionGroup types with Option types in a Select block.");
642
+ }
643
+ throw new TypeError("Only allowed types are Option OR OptionGroup");
644
+ }
645
+ if (elementType === OPTION) {
646
+ const options = elements;
647
+ result.options = options.map((element) => transform(element));
648
+ } else if (elementType === OPTION_GROUP) {
649
+ const optionGroups = elements;
650
+ result.option_groups = optionGroups.map((element) => transform(element));
651
+ }
652
+ };
653
+ var applyInitialSelections = (type, isMulti, result, initialValues) => {
654
+ const { initialOptions, initialUsers, initialConversations, initialChannels } = initialValues;
655
+ switch (type) {
656
+ case selectTypes.USER: {
657
+ if (initialUsers && initialUsers.length > 0) {
658
+ if (isMulti) {
659
+ result.initial_users = initialUsers;
660
+ } else {
661
+ result.initial_user = initialUsers[0];
662
+ }
663
+ }
664
+ break;
665
+ }
666
+ case selectTypes.CONVERSATION: {
667
+ if (initialConversations && initialConversations.length > 0) {
668
+ if (isMulti) {
669
+ result.initial_conversations = initialConversations;
670
+ } else {
671
+ result.initial_conversation = initialConversations[0];
672
+ }
673
+ }
674
+ break;
675
+ }
676
+ case selectTypes.CHANNEL: {
677
+ if (initialChannels && initialChannels.length > 0) {
678
+ if (isMulti) {
679
+ result.initial_channels = initialChannels;
680
+ } else {
681
+ result.initial_channel = initialChannels[0];
682
+ }
683
+ }
684
+ break;
685
+ }
686
+ case selectTypes.STATIC:
687
+ case selectTypes.EXTERNAL: {
688
+ if (initialOptions && initialOptions.length > 0) {
689
+ const transformedOptions = initialOptions.map((element) => transform(element));
690
+ if (isMulti) {
691
+ result.initial_options = transformedOptions;
692
+ } else {
693
+ result.initial_option = transformedOptions[0];
694
+ }
695
+ }
696
+ break;
697
+ }
698
+ }
699
+ };
700
+ var transformSelect = (child) => {
701
+ const {
702
+ placeholder,
703
+ actionId,
704
+ multi,
705
+ children,
706
+ initialOptions,
707
+ confirm,
708
+ maxSelectedItems,
709
+ type: typeProperty,
710
+ initialUsers,
711
+ initialConversations,
712
+ initialChannels,
713
+ minQueryLength,
714
+ focusOnLoad,
715
+ defaultToCurrentConversation,
716
+ responseUrlEnabled,
717
+ filter
718
+ } = child.props;
719
+ const type = typeProperty != null ? typeProperty : selectTypes.STATIC;
720
+ const typeString = `${multi ? MULTI_PREFIX : ""}${types[type]}`;
721
+ warnIfTooLong("Select action_id", actionId, 255);
722
+ warnIfTooLong("Select placeholder", placeholder, 150);
723
+ const result = {
724
+ type: typeString,
725
+ placeholder: transform(/* @__PURE__ */ import_react11.default.createElement(Text, { plainText: true }, placeholder)),
726
+ action_id: actionId
727
+ };
728
+ const elements = normalizeElements(children);
729
+ if (type === selectTypes.STATIC) {
730
+ assignStaticOptions(elements, result);
731
+ }
732
+ if (confirm) {
733
+ result.confirm = transform(confirm);
734
+ }
735
+ applyInitialSelections(type, Boolean(multi), result, {
736
+ initialOptions,
737
+ initialUsers,
738
+ initialConversations,
739
+ initialChannels
740
+ });
741
+ if (maxSelectedItems) {
742
+ result.max_selected_items = maxSelectedItems;
743
+ }
744
+ if (focusOnLoad !== void 0) {
745
+ result.focus_on_load = focusOnLoad;
746
+ }
747
+ if (type === selectTypes.EXTERNAL && minQueryLength !== void 0) {
748
+ result.min_query_length = minQueryLength;
749
+ }
750
+ if (type === selectTypes.CONVERSATION) {
751
+ if (defaultToCurrentConversation !== void 0) {
752
+ result.default_to_current_conversation = defaultToCurrentConversation;
753
+ }
754
+ if (responseUrlEnabled !== void 0) {
755
+ result.response_url_enabled = responseUrlEnabled;
756
+ }
757
+ if (filter) {
758
+ const filterValue = {};
759
+ if (filter.include && filter.include.length > 0) {
760
+ filterValue.include = filter.include;
761
+ }
762
+ if (filter.excludeExternalSharedChannels !== void 0) {
763
+ filterValue.exclude_external_shared_channels = filter.excludeExternalSharedChannels;
764
+ }
765
+ if (filter.excludeBotUsers !== void 0) {
766
+ filterValue.exclude_bot_users = filter.excludeBotUsers;
767
+ }
768
+ if (Object.keys(filterValue).length > 0) {
769
+ result.filter = filterValue;
770
+ }
771
+ }
772
+ }
773
+ return result;
774
+ };
775
+ var select_default = transformSelect;
776
+
777
+ // src/transformers/input/option.tsx
778
+ var import_react12 = __toESM(require("react"));
779
+ var transformOption = (child) => {
780
+ const { children: text, value, url, description } = child.props;
781
+ warnIfTooLong("Option text", text, 75);
782
+ warnIfTooLong("Option value", value, 75);
783
+ warnIfTooLong("Option description", description, 75);
784
+ const res = {
785
+ text: transform(/* @__PURE__ */ import_react12.default.createElement(Text, { plainText: true }, text)),
786
+ value
787
+ };
788
+ if (description) {
789
+ res.description = transform(/* @__PURE__ */ import_react12.default.createElement(Text, { plainText: true }, description));
790
+ }
791
+ if (url) {
792
+ res.url = url;
793
+ }
794
+ return res;
795
+ };
796
+ var option_default = transformOption;
797
+
798
+ // src/transformers/input/option-group.tsx
799
+ var import_react13 = __toESM(require("react"));
800
+ var transformOptionGroup = (child) => {
801
+ const { label, children } = child.props;
802
+ warnIfTooLong("OptionGroup label", label, 75);
803
+ let options = children;
804
+ if (!Array.isArray(options)) {
805
+ options = [options];
806
+ }
807
+ return {
808
+ label: transform(/* @__PURE__ */ import_react13.default.createElement(Text, { plainText: true }, label)),
809
+ options: options.map((option) => transform(option))
810
+ };
811
+ };
812
+ var option_group_default = transformOptionGroup;
813
+
814
+ // src/transformers/input/overflow.ts
815
+ var transformOverflow = (child) => {
816
+ const { actionId, children, confirm } = child.props;
817
+ warnIfTooLong("Overflow action_id", actionId, 255);
818
+ let elements = children;
819
+ if (!Array.isArray(elements)) {
820
+ elements = [elements];
821
+ }
822
+ const res = {
823
+ type: "overflow",
824
+ action_id: actionId,
825
+ options: elements.map((element) => transform(element))
826
+ };
827
+ if (confirm) {
828
+ res.confirm = transform(confirm);
829
+ }
830
+ return res;
831
+ };
832
+ var overflow_default = transformOverflow;
833
+
834
+ // src/transformers/input/radio-group.ts
835
+ var transformRadioGroup = (child) => {
836
+ const { actionId, children, initialOption, confirm, focusOnLoad } = child.props;
837
+ warnIfTooLong("RadioGroup action_id", actionId, 255);
838
+ let elements = children;
839
+ if (!Array.isArray(elements)) {
840
+ elements = [elements];
841
+ }
842
+ const res = {
843
+ type: "radio_buttons",
844
+ action_id: actionId,
845
+ options: elements.map((element) => transform(element))
846
+ };
847
+ if (initialOption) {
848
+ res.initial_option = transform(initialOption);
849
+ }
850
+ if (confirm) {
851
+ res.confirm = transform(confirm);
852
+ }
853
+ if (focusOnLoad !== void 0) {
854
+ res.focus_on_load = focusOnLoad;
855
+ }
856
+ return res;
857
+ };
858
+ var radio_group_default = transformRadioGroup;
859
+
860
+ // src/transformers/input/time-picker.tsx
861
+ var import_react14 = __toESM(require("react"));
862
+ var isValidTimeString = (value) => {
863
+ const match = /^(\d{2}):(\d{2})$/.exec(value);
864
+ if (!match) {
865
+ return false;
866
+ }
867
+ const hours = Number(match[1]);
868
+ const minutes = Number(match[2]);
869
+ return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59;
870
+ };
871
+ var transformTimePicker = (child) => {
872
+ const { actionId, placeholder, initialTime, confirm, focusOnLoad } = child.props;
873
+ warnIfTooLong("TimePicker action_id", actionId, 255);
874
+ if (placeholder) {
875
+ warnIfTooLong("TimePicker placeholder", placeholder, 150);
876
+ }
877
+ const res = {
878
+ type: "timepicker",
879
+ action_id: actionId
880
+ };
881
+ if (placeholder) {
882
+ res.placeholder = transform(/* @__PURE__ */ import_react14.default.createElement(Text, { plainText: true }, placeholder));
883
+ }
884
+ if (initialTime) {
885
+ if (!isValidTimeString(initialTime)) {
886
+ throw new Error("Time must be valid and in format HH:MM.");
887
+ }
888
+ res.initial_time = initialTime;
889
+ }
890
+ if (confirm) {
891
+ res.confirm = transform(confirm);
892
+ }
893
+ if (focusOnLoad !== void 0) {
894
+ res.focus_on_load = focusOnLoad;
895
+ }
896
+ return res;
897
+ };
898
+ var time_picker_default = transformTimePicker;
899
+
900
+ // src/transformers/rich-text/section.ts
901
+ var transformRichTextSection = (child) => {
902
+ const { children } = child.props;
903
+ return {
904
+ type: "rich_text_section",
905
+ elements: toInlineElements(children)
906
+ };
907
+ };
908
+ var section_default2 = transformRichTextSection;
909
+
910
+ // src/transformers/rich-text/list.ts
911
+ var transformRichTextList = (child) => {
912
+ const { style, children, indent, border } = child.props;
913
+ const res = {
914
+ type: "rich_text_list",
915
+ style,
916
+ elements: toBlockElements(children)
917
+ };
918
+ if (indent !== void 0) {
919
+ res.indent = indent;
920
+ }
921
+ if (border !== void 0) {
922
+ res.border = border;
923
+ }
924
+ return res;
925
+ };
926
+ var list_default = transformRichTextList;
927
+
928
+ // src/transformers/rich-text/quote.ts
929
+ var transformRichTextQuote = (child) => {
930
+ const { children } = child.props;
931
+ return {
932
+ type: "rich_text_quote",
933
+ elements: toInlineElements(children)
934
+ };
935
+ };
936
+ var quote_default = transformRichTextQuote;
937
+
938
+ // src/transformers/rich-text/preformatted.ts
939
+ var transformRichTextPreformatted = (child) => {
940
+ const { children } = child.props;
941
+ return {
942
+ type: "rich_text_preformatted",
943
+ elements: toInlineElements(children)
944
+ };
945
+ };
946
+ var preformatted_default = transformRichTextPreformatted;
947
+
948
+ // src/transformers/rich-text/text.ts
949
+ var transformRichTextText = (child) => {
950
+ const { children, style } = child.props;
951
+ const res = {
952
+ type: "text",
953
+ text: children
954
+ };
955
+ if (style) {
956
+ res.style = style;
957
+ }
958
+ return res;
959
+ };
960
+ var text_default3 = transformRichTextText;
961
+
962
+ // src/transformers/rich-text/link.ts
963
+ var transformRichTextLink = (child) => {
964
+ const { url, children, style } = child.props;
965
+ const res = {
966
+ type: "link",
967
+ url
968
+ };
969
+ if (children) {
970
+ res.text = children;
971
+ }
972
+ if (style) {
973
+ res.style = style;
974
+ }
975
+ return res;
976
+ };
977
+ var link_default = transformRichTextLink;
978
+
979
+ // src/transformers/rich-text/user.ts
980
+ var transformRichTextUser = (child) => {
981
+ const { userId } = child.props;
982
+ return {
983
+ type: "user",
984
+ user_id: userId
985
+ };
986
+ };
987
+ var user_default = transformRichTextUser;
988
+
989
+ // src/transformers/rich-text/channel.ts
990
+ var transformRichTextChannel = (child) => {
991
+ const { channelId } = child.props;
992
+ return {
993
+ type: "channel",
994
+ channel_id: channelId
995
+ };
996
+ };
997
+ var channel_default = transformRichTextChannel;
998
+
999
+ // src/transformers/rich-text/emoji.ts
1000
+ var transformRichTextEmoji = (child) => {
1001
+ const { name } = child.props;
1002
+ return {
1003
+ type: "emoji",
1004
+ name
1005
+ };
1006
+ };
1007
+ var emoji_default = transformRichTextEmoji;
1008
+
1009
+ // src/transformers/rich-text/date.ts
1010
+ var transformRichTextDate = (child) => {
1011
+ const { timestamp, format, fallback, link } = child.props;
1012
+ const res = {
1013
+ type: "date",
1014
+ timestamp,
1015
+ format,
1016
+ fallback
1017
+ };
1018
+ if (link) {
1019
+ res.link = link;
1020
+ }
1021
+ return res;
1022
+ };
1023
+ var date_default = transformRichTextDate;
1024
+
1025
+ // src/transformers/rich-text/broadcast.ts
1026
+ var transformRichTextBroadcast = (child) => {
1027
+ const { range } = child.props;
1028
+ return {
1029
+ type: "broadcast",
1030
+ range
1031
+ };
1032
+ };
1033
+ var broadcast_default = transformRichTextBroadcast;
1034
+
1035
+ // src/transformers/rich-text/user-group.ts
1036
+ var transformRichTextUserGroup = (child) => {
1037
+ const { usergroupId } = child.props;
1038
+ return {
1039
+ type: "usergroup",
1040
+ usergroup_id: usergroupId
1041
+ };
1042
+ };
1043
+ var user_group_default = transformRichTextUserGroup;
1044
+
1045
+ // src/transformers/index.ts
1046
+ var Transformers = {
1047
+ Container: container_default,
1048
+ Section: section_default,
1049
+ Actions: actions_default,
1050
+ Context: context_default,
1051
+ Divider: divider_default,
1052
+ File: file_default,
1053
+ Header: header_default,
1054
+ ImageLayout: image_default2,
1055
+ Input: input_default,
1056
+ RichText: rich_text_default,
1057
+ Video: video_default,
1058
+ Text: text_default,
1059
+ Confirmation: confirmation_default,
1060
+ Button: button_default,
1061
+ Image: image_default,
1062
+ TextInput: text_default2,
1063
+ DateTimePicker: date_time_picker_default,
1064
+ DatePicker: date_picker_default,
1065
+ Checkboxes: checkboxes_default,
1066
+ Select: select_default,
1067
+ Overflow: overflow_default,
1068
+ RadioGroup: radio_group_default,
1069
+ TimePicker: time_picker_default,
1070
+ Option: option_default,
1071
+ OptionGroup: option_group_default,
1072
+ RichTextSection: section_default2,
1073
+ RichTextList: list_default,
1074
+ RichTextQuote: quote_default,
1075
+ RichTextPreformatted: preformatted_default,
1076
+ RichTextText: text_default3,
1077
+ RichTextLink: link_default,
1078
+ RichTextUser: user_default,
1079
+ RichTextChannel: channel_default,
1080
+ RichTextEmoji: emoji_default,
1081
+ RichTextDate: date_default,
1082
+ RichTextBroadcast: broadcast_default,
1083
+ RichTextUserGroup: user_group_default
1084
+ };
1085
+ var transformers_default = Transformers;
1086
+ var transform = (element) => {
1087
+ const type = get_type_default(element);
1088
+ if (!Transformers[type]) {
1089
+ throw new Error(`No transformer exists for type '${type}'`);
1090
+ }
1091
+ return Transformers[type](element);
1092
+ };
1093
+
1094
+ // src/parser/index.ts
1095
+ var normalizeChildren2 = (children) => {
1096
+ const result = [];
1097
+ const stack = Array.isArray(children) ? [...children] : [children];
1098
+ while (stack.length > 0) {
1099
+ const child = stack.shift();
1100
+ if (child === null || child === void 0 || typeof child === "boolean") {
1101
+ continue;
1102
+ }
1103
+ if (Array.isArray(child)) {
1104
+ stack.unshift(...child);
1105
+ continue;
1106
+ }
1107
+ result.push(child);
1108
+ }
1109
+ return result;
1110
+ };
1111
+ var appendTransformed = (value, blocks) => {
1112
+ if (value === null || value === void 0 || typeof value === "boolean") {
1113
+ return;
1114
+ }
1115
+ if (Array.isArray(value)) {
1116
+ for (const item of value) {
1117
+ appendTransformed(item, blocks);
1118
+ }
1119
+ return;
1120
+ }
1121
+ blocks.push(value);
1122
+ };
1123
+ var parseChildren = (children) => {
1124
+ if (typeof children === "string") {
1125
+ return { text: children };
1126
+ }
1127
+ const normalizedChildren = normalizeChildren2(children);
1128
+ const transformedBlocks = [];
1129
+ for (const child of normalizedChildren) {
1130
+ const type = get_type_default(child);
1131
+ const transformer = transformers_default[type];
1132
+ if (transformer) {
1133
+ appendTransformed(transformer(child), transformedBlocks);
1134
+ } else if (type !== "null") {
1135
+ console.warn(`No transformer for child type '${type}' exists and will be ignored.`);
1136
+ }
1137
+ }
1138
+ if (transformedBlocks.length === 0) {
1139
+ return {};
1140
+ }
1141
+ return { blocks: transformedBlocks };
1142
+ };
1143
+ var parser_default = parseChildren;
1144
+
1145
+ // src/renderer/index.ts
1146
+ var render = (element) => {
1147
+ const { props: properties = {} } = element || {};
1148
+ const typeName = get_type_default(element);
1149
+ if (typeName !== "Message") {
1150
+ throw new TypeError("Provided top-level element must be a Message type.");
1151
+ }
1152
+ if (!properties.children) {
1153
+ throw new Error("Cannot render a Message with no children.");
1154
+ }
1155
+ const json = { ...parser_default(properties.children) };
1156
+ if (properties.replyTo) {
1157
+ json.thread_ts = properties.replyTo;
1158
+ }
1159
+ if (properties.markdown !== void 0) {
1160
+ json.mrkdwn = properties.markdown;
1161
+ }
1162
+ json.text = properties.text || "";
1163
+ if (properties.iconEmoji) {
1164
+ json.icon_emoji = properties.iconEmoji;
1165
+ }
1166
+ if (properties.iconUrl) {
1167
+ json.icon_url = properties.iconUrl;
1168
+ }
1169
+ if (properties.parse) {
1170
+ json.parse = properties.parse;
1171
+ }
1172
+ if (properties.username) {
1173
+ json.username = properties.username;
1174
+ }
1175
+ if (properties.asUser) {
1176
+ json.as_user = properties.asUser;
1177
+ }
1178
+ if (properties.replyBroadcast) {
1179
+ json.reply_broadcast = properties.replyBroadcast;
1180
+ }
1181
+ if (properties.unfurlLinks) {
1182
+ json.unfurl_links = properties.unfurlLinks;
1183
+ }
1184
+ if (properties.unfurlMedia !== void 0) {
1185
+ json.unfurl_media = properties.unfurlMedia;
1186
+ }
1187
+ if (properties.color && json.blocks) {
1188
+ json.attachments = [
1189
+ {
1190
+ color: properties.color,
1191
+ blocks: json.blocks
1192
+ }
1193
+ ];
1194
+ delete json.blocks;
1195
+ }
1196
+ if (json.blocks) {
1197
+ warnIfTooMany("Message blocks", json.blocks, 50);
1198
+ }
1199
+ return json;
1200
+ };
1201
+ var renderer_default = render;
1202
+ //# sourceMappingURL=index.cjs.map