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.
- package/CHANGELOG.md +33 -26
- package/LICENSE +21 -21
- package/README.md +95 -85
- package/dist/block.cjs +341 -0
- package/dist/block.cjs.map +1 -0
- package/dist/block.d.mts +412 -0
- package/dist/block.d.ts +412 -0
- package/dist/block.mjs +268 -0
- package/dist/block.mjs.map +1 -0
- package/dist/index.cjs +1202 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.mjs +1170 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d-DgQXbJte.d.mts +296 -0
- package/dist/types.d-DgQXbJte.d.ts +296 -0
- package/package.json +85 -135
- package/blocks.js +0 -12
- package/index.js +0 -7
- package/lib/components/block/button.js +0 -27
- package/lib/components/block/confirmation.js +0 -27
- package/lib/components/block/image.js +0 -27
- package/lib/components/block/text.js +0 -27
- package/lib/components/index.js +0 -42
- package/lib/components/input/date-picker.js +0 -27
- package/lib/components/input/option-group.js +0 -27
- package/lib/components/input/option.js +0 -27
- package/lib/components/input/overflow.js +0 -27
- package/lib/components/input/radio-group.js +0 -27
- package/lib/components/input/select.js +0 -34
- package/lib/components/input/text.js +0 -27
- package/lib/components/layout/actions.js +0 -27
- package/lib/components/layout/container.js +0 -27
- package/lib/components/layout/context.js +0 -27
- package/lib/components/layout/divider.js +0 -27
- package/lib/components/layout/file.js +0 -27
- package/lib/components/layout/image.js +0 -27
- package/lib/components/layout/input.js +0 -27
- package/lib/components/layout/section.js +0 -27
- package/lib/components/message.js +0 -27
- package/lib/index.js +0 -7
- package/lib/parser/index.js +0 -32
- package/lib/renderer/index.js +0 -71
- package/lib/transformers/block/button.js +0 -29
- package/lib/transformers/block/confirmation.js +0 -18
- package/lib/transformers/block/image.js +0 -10
- package/lib/transformers/block/text.js +0 -16
- package/lib/transformers/index.js +0 -54
- package/lib/transformers/input/date-picker.js +0 -30
- package/lib/transformers/input/option-group.js +0 -19
- package/lib/transformers/input/option.js +0 -19
- package/lib/transformers/input/overflow.js +0 -19
- package/lib/transformers/input/radio-group.js +0 -22
- package/lib/transformers/input/select.js +0 -84
- package/lib/transformers/input/text.js +0 -31
- package/lib/transformers/layout/actions.js +0 -18
- package/lib/transformers/layout/container.js +0 -11
- package/lib/transformers/layout/context.js +0 -18
- package/lib/transformers/layout/divider.js +0 -10
- package/lib/transformers/layout/file.js +0 -14
- package/lib/transformers/layout/image.js +0 -23
- package/lib/transformers/layout/input.js +0 -26
- package/lib/transformers/layout/section.js +0 -31
- package/lib/utils/get-type.js +0 -16
- package/lib/utils/type-helpers.js +0 -2
- package/src/components/block/button.tsx +0 -20
- package/src/components/block/confirmation.tsx +0 -19
- package/src/components/block/image.tsx +0 -8
- package/src/components/block/text.tsx +0 -10
- package/src/components/index.ts +0 -23
- package/src/components/input/date-picker.tsx +0 -11
- package/src/components/input/option-group.tsx +0 -9
- package/src/components/input/option.tsx +0 -9
- package/src/components/input/overflow.tsx +0 -12
- package/src/components/input/radio-group.tsx +0 -13
- package/src/components/input/select.tsx +0 -36
- package/src/components/input/text.tsx +0 -12
- package/src/components/layout/actions.tsx +0 -9
- package/src/components/layout/container.tsx +0 -9
- package/src/components/layout/context.tsx +0 -12
- package/src/components/layout/divider.tsx +0 -7
- package/src/components/layout/file.tsx +0 -8
- package/src/components/layout/image.tsx +0 -10
- package/src/components/layout/input.tsx +0 -12
- package/src/components/layout/section.tsx +0 -15
- package/src/components/message.tsx +0 -20
- package/src/constants/types.d.ts +0 -93
- package/src/index.ts +0 -3
- package/src/parser/index.ts +0 -32
- package/src/renderer/index.ts +0 -75
- package/src/transformers/block/button.tsx +0 -47
- package/src/transformers/block/confirmation.tsx +0 -26
- package/src/transformers/block/image.ts +0 -18
- package/src/transformers/block/text.ts +0 -34
- package/src/transformers/index.ts +0 -65
- package/src/transformers/input/date-picker.tsx +0 -43
- package/src/transformers/input/option-group.tsx +0 -26
- package/src/transformers/input/option.tsx +0 -27
- package/src/transformers/input/overflow.ts +0 -33
- package/src/transformers/input/radio-group.ts +0 -38
- package/src/transformers/input/select.tsx +0 -136
- package/src/transformers/input/text.tsx +0 -47
- package/src/transformers/layout/actions.ts +0 -29
- package/src/transformers/layout/container.ts +0 -16
- package/src/transformers/layout/context.ts +0 -35
- package/src/transformers/layout/divider.ts +0 -20
- package/src/transformers/layout/file.ts +0 -24
- package/src/transformers/layout/image.tsx +0 -34
- package/src/transformers/layout/input.tsx +0 -39
- package/src/transformers/layout/section.ts +0 -53
- package/src/tsconfig.json +0 -11
- package/src/utils/get-type.ts +0 -20
- package/src/utils/type-helpers.ts +0 -1
- package/test/index.test.tsx +0 -11
- package/test/parser/parser.test.tsx +0 -67
- package/test/renderer/renderer.test.tsx +0 -138
- package/test/transformers/block/button.test.tsx +0 -63
- package/test/transformers/block/confirmation.test.tsx +0 -37
- package/test/transformers/block/image.test.tsx +0 -20
- package/test/transformers/block/text.test.tsx +0 -32
- package/test/transformers/input/date-picker.test.tsx +0 -66
- package/test/transformers/input/option-group.test.tsx +0 -26
- package/test/transformers/input/option.test.tsx +0 -36
- package/test/transformers/input/overflow.test.tsx +0 -57
- package/test/transformers/input/radio-group.test.tsx +0 -81
- package/test/transformers/input/select.test.tsx +0 -249
- package/test/transformers/input/text.test.tsx +0 -42
- package/test/transformers/layout/actions.test.tsx +0 -33
- package/test/transformers/layout/container.test.tsx +0 -34
- package/test/transformers/layout/context.test.tsx +0 -43
- package/test/transformers/layout/divider.test.tsx +0 -20
- package/test/transformers/layout/file.test.tsx +0 -26
- package/test/transformers/layout/image.test.tsx +0 -43
- package/test/transformers/layout/input.test.tsx +0 -59
- package/test/transformers/layout/section.test.tsx +0 -89
- package/test/tsconfig.json +0 -9
- package/test/utils/get-type.test.tsx +0 -21
- 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
|