slackblock 0.5.0-beta.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 (141) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +16 -6
  3. package/dist/block.cjs +341 -0
  4. package/dist/block.cjs.map +1 -0
  5. package/dist/block.d.mts +412 -0
  6. package/dist/block.d.ts +412 -0
  7. package/dist/block.mjs +268 -0
  8. package/dist/block.mjs.map +1 -0
  9. package/dist/index.cjs +1202 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.mts +6 -0
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.mjs +1170 -0
  14. package/dist/index.mjs.map +1 -0
  15. package/dist/types.d-DgQXbJte.d.mts +296 -0
  16. package/dist/types.d-DgQXbJte.d.ts +296 -0
  17. package/package.json +60 -110
  18. package/blocks.js +0 -12
  19. package/index.js +0 -7
  20. package/lib/components/block/button.js +0 -27
  21. package/lib/components/block/confirmation.js +0 -27
  22. package/lib/components/block/image.js +0 -27
  23. package/lib/components/block/text.js +0 -27
  24. package/lib/components/index.js +0 -42
  25. package/lib/components/input/date-picker.js +0 -27
  26. package/lib/components/input/option-group.js +0 -27
  27. package/lib/components/input/option.js +0 -27
  28. package/lib/components/input/overflow.js +0 -27
  29. package/lib/components/input/radio-group.js +0 -27
  30. package/lib/components/input/select.js +0 -34
  31. package/lib/components/input/text.js +0 -27
  32. package/lib/components/layout/actions.js +0 -27
  33. package/lib/components/layout/container.js +0 -27
  34. package/lib/components/layout/context.js +0 -27
  35. package/lib/components/layout/divider.js +0 -27
  36. package/lib/components/layout/file.js +0 -27
  37. package/lib/components/layout/image.js +0 -27
  38. package/lib/components/layout/input.js +0 -27
  39. package/lib/components/layout/section.js +0 -27
  40. package/lib/components/message.js +0 -27
  41. package/lib/constants/special-types.js +0 -4
  42. package/lib/index.js +0 -7
  43. package/lib/parser/index.js +0 -33
  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 -68
  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 -17
  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/special-types.ts +0 -2
  89. package/src/constants/types.d.ts +0 -93
  90. package/src/index.ts +0 -3
  91. package/src/parser/index.ts +0 -33
  92. package/src/renderer/index.ts +0 -75
  93. package/src/transformers/block/button.tsx +0 -47
  94. package/src/transformers/block/confirmation.tsx +0 -26
  95. package/src/transformers/block/image.ts +0 -18
  96. package/src/transformers/block/text.ts +0 -34
  97. package/src/transformers/index.ts +0 -85
  98. package/src/transformers/input/date-picker.tsx +0 -43
  99. package/src/transformers/input/option-group.tsx +0 -26
  100. package/src/transformers/input/option.tsx +0 -27
  101. package/src/transformers/input/overflow.ts +0 -33
  102. package/src/transformers/input/radio-group.ts +0 -38
  103. package/src/transformers/input/select.tsx +0 -136
  104. package/src/transformers/input/text.tsx +0 -47
  105. package/src/transformers/layout/actions.ts +0 -29
  106. package/src/transformers/layout/container.ts +0 -16
  107. package/src/transformers/layout/context.ts +0 -35
  108. package/src/transformers/layout/divider.ts +0 -20
  109. package/src/transformers/layout/file.ts +0 -24
  110. package/src/transformers/layout/image.tsx +0 -34
  111. package/src/transformers/layout/input.tsx +0 -39
  112. package/src/transformers/layout/section.ts +0 -53
  113. package/src/tsconfig.json +0 -11
  114. package/src/utils/get-type.ts +0 -21
  115. package/src/utils/type-helpers.ts +0 -1
  116. package/test/index.test.tsx +0 -11
  117. package/test/parser/parser.test.tsx +0 -67
  118. package/test/renderer/renderer.test.tsx +0 -250
  119. package/test/transformers/block/button.test.tsx +0 -63
  120. package/test/transformers/block/confirmation.test.tsx +0 -37
  121. package/test/transformers/block/image.test.tsx +0 -20
  122. package/test/transformers/block/text.test.tsx +0 -32
  123. package/test/transformers/input/date-picker.test.tsx +0 -66
  124. package/test/transformers/input/option-group.test.tsx +0 -26
  125. package/test/transformers/input/option.test.tsx +0 -36
  126. package/test/transformers/input/overflow.test.tsx +0 -57
  127. package/test/transformers/input/radio-group.test.tsx +0 -81
  128. package/test/transformers/input/select.test.tsx +0 -249
  129. package/test/transformers/input/text.test.tsx +0 -42
  130. package/test/transformers/layout/actions.test.tsx +0 -33
  131. package/test/transformers/layout/container.test.tsx +0 -34
  132. package/test/transformers/layout/context.test.tsx +0 -43
  133. package/test/transformers/layout/divider.test.tsx +0 -20
  134. package/test/transformers/layout/file.test.tsx +0 -26
  135. package/test/transformers/layout/image.test.tsx +0 -43
  136. package/test/transformers/layout/input.test.tsx +0 -59
  137. package/test/transformers/layout/section.test.tsx +0 -89
  138. package/test/transformers/transformers.test.tsx +0 -46
  139. package/test/tsconfig.json +0 -9
  140. package/test/utils/get-type.test.tsx +0 -26
  141. package/tsconfig.json +0 -14
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ### 1.0.0
4
+ - Modernize tooling (Node 24, pnpm, tsup, Vitest, XO, Husky + lint-staged)
5
+ - Stabilize parser/transformer routing and align output types to serialized JSON
6
+ - Expand Block Kit coverage (header, rich_text, video, checkboxes, time/datetime pickers)
7
+ - Add rich_text helpers and improved select/input features
8
+ - Add validation warnings for Slack limits
9
+
3
10
  ### 0.4.0
4
11
  - Allow for `<Section/>` blocks to have `null` components (useful for conditional renders)
5
12
 
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # SlackBlock
2
- React-based Slack message renderer
2
+ JSX-based Slack message renderer
3
3
 
4
4
  [![CircleCI](https://circleci.com/gh/kolyaventuri/block/tree/master.svg?style=svg)](https://circleci.com/gh/kolyaventuri/block/tree/master)
5
5
 
6
6
  ## What
7
- A message builder for Slack bots, using JSX / React syntax. Generally follows the [Block Kit](https://api.slack.com/block-kit) naming and options
7
+ A message builder for Slack bots, using JSX with a React-compatible API. Generally follows the [Block Kit](https://api.slack.com/block-kit) naming and options.
8
8
 
9
9
  ## Getting started
10
- Install the library with `npm i slackblock`
10
+ Install the library with your package manager, for example `pnpm add slackblock`.
11
11
 
12
12
  - Import the renderer with `import render from 'slackblock';`
13
13
  - Import the top level `Message` block, along with any blocks you need from `import { Message, Section, Text, ... } from 'slackblock/block';`
@@ -32,7 +32,7 @@ console.log(message);
32
32
  {
33
33
  "type": "section",
34
34
  "text": {
35
- "text": "plain_text",
35
+ "type": "plain_text",
36
36
  "text": "Hello"
37
37
  },
38
38
  "fields": [
@@ -66,7 +66,8 @@ const message = render(
66
66
 
67
67
  ## Things to note
68
68
  - The outputted message only needs to have your `token` and desired `channel_id` added, and it will be ready to send to the slack API!
69
- - There is current _very little to no_ input validation. Non-recognized blocks will be ignored, but Slack will be the ultimate decider if your message is valid. Validation is on the roadmap.
69
+ - React is a peer dependency and used only as a JSX runtime (no DOM renderer required).
70
+ - There is limited input validation (for example, date/time formats and select constraints). Warnings are emitted for common Slack limits (IDs, text lengths, block counts). Non-recognized blocks will be ignored, but Slack will be the ultimate decider if your message is valid. Validation is on the roadmap.
70
71
  - There is currently almost no documentation. This will be resolved, but in general...
71
72
  - If a Slack message wants a property in format `foo_bar`, you will add it as a `fooBar` property in your message(ex: `<Element fooBar='blah'/>`)
72
73
  - If a component such as a `<Section/>` wants fields which seem like children, they probably are for the sake of rendering. This is especially important with `select` menus, as your `<Option/>` tags will be passed as children
@@ -78,8 +79,17 @@ const message = render(
78
79
  </Select>
79
80
  ```
80
81
 
82
+ ## Supported blocks and elements
83
+ Blocks: `Message` (top-level), `Section`, `Actions`, `Context`, `Divider`, `File`, `Image` (block), `Header`, `Input`, `RichText`, `Video`.
84
+
85
+ Elements: `Text`, `Image` (element), `Button`, `Confirmation`, `Select`, `Option`, `OptionGroup`, `Overflow`, `RadioGroup`, `Checkboxes`, `DatePicker`, `TimePicker`, `DateTimePicker`, `TextInput`.
86
+
87
+ Rich text helpers: `RichTextSection`, `RichTextList`, `RichTextQuote`, `RichTextPreformatted`, `RichTextText`, `RichTextLink`, `RichTextUser`, `RichTextChannel`, `RichTextEmoji`, `RichTextDate`, `RichTextBroadcast`, `RichTextUserGroup`.
88
+
89
+ Field support highlights: `select` filters/min query length, `option` description, `focusOnLoad` for inputs, `dispatchActionConfig` for text inputs, and `accessibilityLabel` on buttons.
90
+
81
91
 
82
92
  ## TODO
83
93
  - Add real documentation
84
- - Expose types
85
94
  - Add validation
95
+ - Add richer rich_text validation
package/dist/block.cjs ADDED
@@ -0,0 +1,341 @@
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/block.ts
30
+ var block_exports = {};
31
+ __export(block_exports, {
32
+ Actions: () => Actions,
33
+ Button: () => Button,
34
+ Checkboxes: () => Checkboxes,
35
+ Confirmation: () => Confirmation,
36
+ Container: () => Container,
37
+ Context: () => Context,
38
+ DatePicker: () => DatePicker,
39
+ DateTimePicker: () => DateTimePicker,
40
+ Divider: () => Divider,
41
+ File: () => File,
42
+ Header: () => Header,
43
+ Image: () => Image,
44
+ ImageLayout: () => Image2,
45
+ Input: () => Input,
46
+ Message: () => Message,
47
+ Option: () => Option,
48
+ OptionGroup: () => OptionGroup,
49
+ Overflow: () => Overflow,
50
+ RadioGroup: () => RadioGroup,
51
+ RichText: () => RichText,
52
+ RichTextBroadcast: () => RichTextBroadcast,
53
+ RichTextChannel: () => RichTextChannel,
54
+ RichTextDate: () => RichTextDate,
55
+ RichTextEmoji: () => RichTextEmoji,
56
+ RichTextLink: () => RichTextLink,
57
+ RichTextList: () => RichTextList,
58
+ RichTextPreformatted: () => RichTextPreformatted,
59
+ RichTextQuote: () => RichTextQuote,
60
+ RichTextSection: () => RichTextSection,
61
+ RichTextText: () => RichTextText,
62
+ RichTextUser: () => RichTextUser,
63
+ RichTextUserGroup: () => RichTextUserGroup,
64
+ Section: () => Section,
65
+ Select: () => Select,
66
+ Text: () => Text,
67
+ TextInput: () => TextInput,
68
+ TimePicker: () => TimePicker,
69
+ Video: () => Video
70
+ });
71
+ module.exports = __toCommonJS(block_exports);
72
+
73
+ // src/components/message.tsx
74
+ var import_react = __toESM(require("react"));
75
+ var Message = class extends import_react.default.Component {
76
+ };
77
+ Message.slackType = "Message";
78
+
79
+ // src/components/block/button.tsx
80
+ var import_react2 = __toESM(require("react"));
81
+ var Button = class extends import_react2.default.Component {
82
+ };
83
+ Button.slackType = "Button";
84
+
85
+ // src/components/block/confirmation.tsx
86
+ var import_react3 = __toESM(require("react"));
87
+ var Confirmation = class extends import_react3.default.Component {
88
+ };
89
+ Confirmation.slackType = "Confirmation";
90
+
91
+ // src/components/block/image.tsx
92
+ var import_react4 = __toESM(require("react"));
93
+ var Image = class extends import_react4.default.Component {
94
+ };
95
+ Image.slackType = "Image";
96
+
97
+ // src/components/block/text.tsx
98
+ var import_react5 = __toESM(require("react"));
99
+ var Text = class extends import_react5.default.Component {
100
+ };
101
+ Text.slackType = "Text";
102
+
103
+ // src/components/input/date-picker.tsx
104
+ var import_react6 = __toESM(require("react"));
105
+ var DatePicker = class extends import_react6.default.Component {
106
+ };
107
+ DatePicker.slackType = "DatePicker";
108
+
109
+ // src/components/input/date-time-picker.tsx
110
+ var import_react7 = __toESM(require("react"));
111
+ var DateTimePicker = class extends import_react7.default.Component {
112
+ };
113
+ DateTimePicker.slackType = "DateTimePicker";
114
+
115
+ // src/components/input/checkboxes.tsx
116
+ var import_react8 = __toESM(require("react"));
117
+ var Checkboxes = class extends import_react8.default.Component {
118
+ };
119
+ Checkboxes.slackType = "Checkboxes";
120
+
121
+ // src/components/input/option-group.tsx
122
+ var import_react9 = __toESM(require("react"));
123
+ var OptionGroup = class extends import_react9.default.Component {
124
+ };
125
+ OptionGroup.slackType = "OptionGroup";
126
+
127
+ // src/components/input/option.tsx
128
+ var import_react10 = __toESM(require("react"));
129
+ var Option = class extends import_react10.default.Component {
130
+ };
131
+ Option.slackType = "Option";
132
+
133
+ // src/components/input/overflow.tsx
134
+ var import_react11 = __toESM(require("react"));
135
+ var Overflow = class extends import_react11.default.Component {
136
+ };
137
+ Overflow.slackType = "Overflow";
138
+
139
+ // src/components/input/radio-group.tsx
140
+ var import_react12 = __toESM(require("react"));
141
+ var RadioGroup = class extends import_react12.default.Component {
142
+ };
143
+ RadioGroup.slackType = "RadioGroup";
144
+
145
+ // src/components/input/select.tsx
146
+ var import_react13 = __toESM(require("react"));
147
+ var Select = class extends import_react13.default.Component {
148
+ };
149
+ Select.slackType = "Select";
150
+
151
+ // src/components/input/text.tsx
152
+ var import_react14 = __toESM(require("react"));
153
+ var TextInput = class extends import_react14.default.Component {
154
+ };
155
+ TextInput.slackType = "TextInput";
156
+
157
+ // src/components/input/time-picker.tsx
158
+ var import_react15 = __toESM(require("react"));
159
+ var TimePicker = class extends import_react15.default.Component {
160
+ };
161
+ TimePicker.slackType = "TimePicker";
162
+
163
+ // src/components/layout/actions.tsx
164
+ var import_react16 = __toESM(require("react"));
165
+ var Actions = class extends import_react16.default.Component {
166
+ };
167
+ Actions.slackType = "Actions";
168
+
169
+ // src/components/layout/context.tsx
170
+ var import_react17 = __toESM(require("react"));
171
+ var Context = class extends import_react17.default.Component {
172
+ };
173
+ Context.slackType = "Context";
174
+
175
+ // src/components/layout/divider.tsx
176
+ var import_react18 = __toESM(require("react"));
177
+ var Divider = class extends import_react18.default.Component {
178
+ };
179
+ Divider.slackType = "Divider";
180
+
181
+ // src/components/layout/file.tsx
182
+ var import_react19 = __toESM(require("react"));
183
+ var File = class extends import_react19.default.Component {
184
+ };
185
+ File.slackType = "File";
186
+
187
+ // src/components/layout/header.tsx
188
+ var import_react20 = __toESM(require("react"));
189
+ var Header = class extends import_react20.default.Component {
190
+ };
191
+ Header.slackType = "Header";
192
+
193
+ // src/components/layout/image.tsx
194
+ var import_react21 = __toESM(require("react"));
195
+ var Image2 = class extends import_react21.default.Component {
196
+ };
197
+ Image2.slackType = "ImageLayout";
198
+
199
+ // src/components/layout/input.tsx
200
+ var import_react22 = __toESM(require("react"));
201
+ var Input = class extends import_react22.default.Component {
202
+ };
203
+ Input.slackType = "Input";
204
+
205
+ // src/components/layout/rich-text.tsx
206
+ var import_react23 = __toESM(require("react"));
207
+ var RichText = class extends import_react23.default.Component {
208
+ };
209
+ RichText.slackType = "RichText";
210
+
211
+ // src/components/layout/section.tsx
212
+ var import_react24 = __toESM(require("react"));
213
+ var Section = class extends import_react24.default.Component {
214
+ };
215
+ Section.slackType = "Section";
216
+
217
+ // src/components/layout/container.tsx
218
+ var import_react25 = __toESM(require("react"));
219
+ var Container = class extends import_react25.default.Component {
220
+ };
221
+ Container.slackType = "Container";
222
+
223
+ // src/components/layout/video.tsx
224
+ var import_react26 = __toESM(require("react"));
225
+ var Video = class extends import_react26.default.Component {
226
+ };
227
+ Video.slackType = "Video";
228
+
229
+ // src/components/rich-text/section.tsx
230
+ var import_react27 = __toESM(require("react"));
231
+ var RichTextSection = class extends import_react27.default.Component {
232
+ };
233
+ RichTextSection.slackType = "RichTextSection";
234
+
235
+ // src/components/rich-text/list.tsx
236
+ var import_react28 = __toESM(require("react"));
237
+ var RichTextList = class extends import_react28.default.Component {
238
+ };
239
+ RichTextList.slackType = "RichTextList";
240
+
241
+ // src/components/rich-text/quote.tsx
242
+ var import_react29 = __toESM(require("react"));
243
+ var RichTextQuote = class extends import_react29.default.Component {
244
+ };
245
+ RichTextQuote.slackType = "RichTextQuote";
246
+
247
+ // src/components/rich-text/preformatted.tsx
248
+ var import_react30 = __toESM(require("react"));
249
+ var RichTextPreformatted = class extends import_react30.default.Component {
250
+ };
251
+ RichTextPreformatted.slackType = "RichTextPreformatted";
252
+
253
+ // src/components/rich-text/text.tsx
254
+ var import_react31 = __toESM(require("react"));
255
+ var RichTextText = class extends import_react31.default.Component {
256
+ };
257
+ RichTextText.slackType = "RichTextText";
258
+
259
+ // src/components/rich-text/link.tsx
260
+ var import_react32 = __toESM(require("react"));
261
+ var RichTextLink = class extends import_react32.default.Component {
262
+ };
263
+ RichTextLink.slackType = "RichTextLink";
264
+
265
+ // src/components/rich-text/user.tsx
266
+ var import_react33 = __toESM(require("react"));
267
+ var RichTextUser = class extends import_react33.default.Component {
268
+ };
269
+ RichTextUser.slackType = "RichTextUser";
270
+
271
+ // src/components/rich-text/channel.tsx
272
+ var import_react34 = __toESM(require("react"));
273
+ var RichTextChannel = class extends import_react34.default.Component {
274
+ };
275
+ RichTextChannel.slackType = "RichTextChannel";
276
+
277
+ // src/components/rich-text/emoji.tsx
278
+ var import_react35 = __toESM(require("react"));
279
+ var RichTextEmoji = class extends import_react35.default.Component {
280
+ };
281
+ RichTextEmoji.slackType = "RichTextEmoji";
282
+
283
+ // src/components/rich-text/date.tsx
284
+ var import_react36 = __toESM(require("react"));
285
+ var RichTextDate = class extends import_react36.default.Component {
286
+ };
287
+ RichTextDate.slackType = "RichTextDate";
288
+
289
+ // src/components/rich-text/broadcast.tsx
290
+ var import_react37 = __toESM(require("react"));
291
+ var RichTextBroadcast = class extends import_react37.default.Component {
292
+ };
293
+ RichTextBroadcast.slackType = "RichTextBroadcast";
294
+
295
+ // src/components/rich-text/user-group.tsx
296
+ var import_react38 = __toESM(require("react"));
297
+ var RichTextUserGroup = class extends import_react38.default.Component {
298
+ };
299
+ RichTextUserGroup.slackType = "RichTextUserGroup";
300
+ // Annotate the CommonJS export names for ESM import in node:
301
+ 0 && (module.exports = {
302
+ Actions,
303
+ Button,
304
+ Checkboxes,
305
+ Confirmation,
306
+ Container,
307
+ Context,
308
+ DatePicker,
309
+ DateTimePicker,
310
+ Divider,
311
+ File,
312
+ Header,
313
+ Image,
314
+ ImageLayout,
315
+ Input,
316
+ Message,
317
+ Option,
318
+ OptionGroup,
319
+ Overflow,
320
+ RadioGroup,
321
+ RichText,
322
+ RichTextBroadcast,
323
+ RichTextChannel,
324
+ RichTextDate,
325
+ RichTextEmoji,
326
+ RichTextLink,
327
+ RichTextList,
328
+ RichTextPreformatted,
329
+ RichTextQuote,
330
+ RichTextSection,
331
+ RichTextText,
332
+ RichTextUser,
333
+ RichTextUserGroup,
334
+ Section,
335
+ Select,
336
+ Text,
337
+ TextInput,
338
+ TimePicker,
339
+ Video
340
+ });
341
+ //# sourceMappingURL=block.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/block.ts","../src/components/message.tsx","../src/components/block/button.tsx","../src/components/block/confirmation.tsx","../src/components/block/image.tsx","../src/components/block/text.tsx","../src/components/input/date-picker.tsx","../src/components/input/date-time-picker.tsx","../src/components/input/checkboxes.tsx","../src/components/input/option-group.tsx","../src/components/input/option.tsx","../src/components/input/overflow.tsx","../src/components/input/radio-group.tsx","../src/components/input/select.tsx","../src/components/input/text.tsx","../src/components/input/time-picker.tsx","../src/components/layout/actions.tsx","../src/components/layout/context.tsx","../src/components/layout/divider.tsx","../src/components/layout/file.tsx","../src/components/layout/header.tsx","../src/components/layout/image.tsx","../src/components/layout/input.tsx","../src/components/layout/rich-text.tsx","../src/components/layout/section.tsx","../src/components/layout/container.tsx","../src/components/layout/video.tsx","../src/components/rich-text/section.tsx","../src/components/rich-text/list.tsx","../src/components/rich-text/quote.tsx","../src/components/rich-text/preformatted.tsx","../src/components/rich-text/text.tsx","../src/components/rich-text/link.tsx","../src/components/rich-text/user.tsx","../src/components/rich-text/channel.tsx","../src/components/rich-text/emoji.tsx","../src/components/rich-text/date.tsx","../src/components/rich-text/broadcast.tsx","../src/components/rich-text/user-group.tsx"],"sourcesContent":["export * from './components';\n","import React from 'react';\n\nimport {type Element} from '../constants/types';\n\ntype Properties = {\n children: string | Element | Element[];\n text?: string;\n asUser?: boolean;\n iconEmoji?: string;\n iconUrl?: string;\n markdown?: boolean;\n parse?: 'full' | 'none';\n replyBroadcast?: boolean;\n replyTo?: string;\n unfurlLinks?: boolean;\n unfurlMedia?: boolean;\n username?: string;\n color?: string;\n};\n\nexport default class Message extends React.Component<Properties> {\n static slackType = 'Message';\n}\n","import React from 'react';\n\nimport type Confirmation from './confirmation';\n\ntype TopProperties = {\n children: string;\n actionId: string;\n url?: string;\n value?: string;\n style?: 'primary' | 'danger';\n accessibilityLabel?: string;\n};\n\nexport type ButtonProps = TopProperties & {\n confirm?: React.ReactElement<Confirmation>;\n};\n\ntype Properties = ButtonProps;\n\nexport default class Button extends React.Component<Properties> {\n static slackType = 'Button';\n}\n","import React from 'react';\n\nimport type Text from './text';\n\ntype TopProperties = {\n title: string;\n confirm: string;\n deny: string;\n};\n\n/* This is a dumb workaround to merging props */\nexport type ConfirmationProps = TopProperties & {\n children: React.ReactElement<Text>;\n};\n\ntype Properties = ConfirmationProps;\n\nexport default class Confirmation extends React.Component<Properties> {\n static slackType = 'Confirmation';\n}\n","import React from 'react';\n\nexport type Props = {\n url: string;\n alt: string;\n};\n\nexport default class Image extends React.Component<Props> {\n static slackType = 'Image';\n}\n","import React from 'react';\n\nexport type Props = {\n children: string;\n plainText?: boolean;\n emoji?: boolean;\n verbatim?: boolean;\n};\n\nexport default class Text extends React.Component<Props> {\n static slackType = 'Text';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\n\nexport type Props = {\n actionId: string;\n placeholder?: string;\n initialDate?: string;\n confirm?: React.ReactElement<Confirmation>;\n focusOnLoad?: boolean;\n};\n\nexport default class DatePicker extends React.Component<Props> {\n static slackType = 'DatePicker';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\n\nexport type Props = {\n actionId: string;\n initialDateTime?: number;\n confirm?: React.ReactElement<Confirmation>;\n focusOnLoad?: boolean;\n};\n\nexport default class DateTimePicker extends React.Component<Props> {\n static slackType = 'DateTimePicker';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nimport type Option from './option';\n\nexport type Props = {\n actionId: string;\n children: SingleOrArray<React.ReactElement<Option>>;\n initialOptions?: Array<React.ReactElement<Option>>;\n confirm?: React.ReactElement<Confirmation>;\n focusOnLoad?: boolean;\n};\n\nexport default class Checkboxes extends React.Component<Props> {\n static slackType = 'Checkboxes';\n}\n","import React from 'react';\n\nimport type Option from './option';\n\nexport type Props = {\n label: string;\n children: React.ReactElement<Option> | Array<React.ReactElement<Option>>;\n};\n\nexport default class OptionGroup extends React.Component<Props> {\n static slackType = 'OptionGroup';\n}\n","import React from 'react';\n\nexport type Props = {\n children: string;\n value: string;\n url?: string;\n description?: string;\n};\n\nexport default class Option extends React.Component<Props> {\n static slackType = 'Option';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nimport type Option from './option';\n\nexport type Props = {\n actionId: string;\n children: SingleOrArray<React.ReactElement<Option>>;\n confirm?: React.ReactElement<Confirmation>;\n};\n\nexport default class Overflow extends React.Component<Props> {\n static slackType = 'Overflow';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nimport type Option from './option';\n\nexport type Props = {\n actionId: string;\n children: SingleOrArray<React.ReactElement<Option>>;\n initialOption?: React.ReactElement<Option>;\n confirm?: React.ReactElement<Confirmation>;\n focusOnLoad?: boolean;\n};\n\nexport default class RadioGroup extends React.Component<Props> {\n static slackType = 'RadioGroup';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nimport type Option from './option';\nimport type OptionGroup from './option-group';\n\nexport const selectTypes = {\n STATIC: 'static',\n EXTERNAL: 'external',\n USER: 'user',\n CONVERSATION: 'conversation',\n CHANNEL: 'channel',\n} as const;\n\ntype SelectType = typeof selectTypes[keyof typeof selectTypes];\n\ntype ConversationFilter = {\n include?: Array<'im' | 'mpim' | 'private' | 'public'>;\n excludeExternalSharedChannels?: boolean;\n excludeBotUsers?: boolean;\n};\n\nexport type Props = {\n placeholder: string;\n actionId: string;\n type?: SelectType;\n multi?: boolean;\n children?: SingleOrArray<React.ReactElement<Option>> | SingleOrArray<React.ReactElement<OptionGroup>>;\n initialOptions?: Array<React.ReactElement<Option>>;\n confirm?: React.ReactElement<Confirmation>;\n maxSelectedItems?: number;\n minQueryLength?: number;\n focusOnLoad?: boolean;\n initialUsers?: string[];\n initialConversations?: string[];\n initialChannels?: string[];\n defaultToCurrentConversation?: boolean;\n responseUrlEnabled?: boolean;\n filter?: ConversationFilter;\n};\n\nexport default class Select extends React.Component<Props> {\n static slackType = 'Select';\n}\n","import React from 'react';\n\nexport type Props = {\n actionId: string;\n placeholder?: string;\n initial?: string;\n multiline?: boolean;\n minLength?: number;\n maxLength?: number;\n focusOnLoad?: boolean;\n dispatchActionConfig?: {\n triggerActionsOn: Array<'on_enter_pressed' | 'on_character_entered'>;\n };\n};\n\nexport default class TextInput extends React.Component<Props> {\n static slackType = 'TextInput';\n}\n","import React from 'react';\n\nimport type Confirmation from '../block/confirmation';\n\nexport type Props = {\n actionId: string;\n placeholder?: string;\n initialTime?: string;\n confirm?: React.ReactElement<Confirmation>;\n focusOnLoad?: boolean;\n};\n\nexport default class TimePicker extends React.Component<Props> {\n static slackType = 'TimePicker';\n}\n","import React from 'react';\n\nimport {type InteractiveBlockElement} from '../../constants/types';\n\nexport type Props = {\n children: InteractiveBlockElement | InteractiveBlockElement[];\n blockId?: string;\n};\n\nexport default class Actions extends React.Component<Props> {\n static slackType = 'Actions';\n}\n","import React from 'react';\n\nimport type Text from '../block/text';\nimport type Image from '../block/image';\n\nexport type ImageOrText = React.ReactElement<Text> | React.ReactElement<Image>;\n\nexport type Props = {\n children: ImageOrText | ImageOrText[];\n blockId?: string;\n};\n\nexport default class Context extends React.Component<Props> {\n static slackType = 'Context';\n}\n","import React from 'react';\n\nexport type Props = {\n blockId?: string;\n};\n\nexport default class Divider extends React.Component<Props> {\n static slackType = 'Divider';\n}\n","import React from 'react';\n\nexport type Props = {\n externalId: string;\n blockId?: string;\n};\n\nexport default class File extends React.Component<Props> {\n static slackType = 'File';\n}\n","import React from 'react';\n\nexport type Props = {\n text: string;\n blockId?: string;\n emoji?: boolean;\n};\n\nexport default class Header extends React.Component<Props> {\n static slackType = 'Header';\n}\n","import React from 'react';\n\nexport type Props = {\n url: string;\n alt: string;\n title?: string;\n blockId?: string;\n};\n\nexport default class Image extends React.Component<Props> {\n static slackType = 'ImageLayout';\n}\n","import React from 'react';\n\nimport {type InputBlockElement} from '../../constants/types';\n\nexport type Props = {\n label: string;\n element: InputBlockElement;\n hint?: string;\n optional?: boolean;\n blockId?: string;\n};\n\nexport default class Input extends React.Component<Props> {\n static slackType = 'Input';\n}\n","import React from 'react';\n\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nexport type RichTextElement = Record<string, any>;\n\nexport type Props = {\n elements?: RichTextElement[];\n children?: SingleOrArray<React.ReactElement | string>;\n blockId?: string;\n};\n\nexport default class RichText extends React.Component<Props> {\n static slackType = 'RichText';\n}\n","import React from 'react';\n\nimport type Text from '../block/text';\nimport {type BlockElement} from '../../constants/types';\n\ntype TextElement = React.ReactElement<Text>;\n\nexport type Props = {\n text: React.ReactElement<Text>;\n blockId?: string;\n children?: TextElement | TextElement[];\n accessory?: BlockElement;\n};\n\nexport default class Section extends React.Component<Props> {\n static slackType = 'Section';\n}\n\n","import React from 'react';\n\nimport {type SingleOrArray} from '../../utils/type-helpers';\nimport {type Child} from '../../constants/types';\n\nexport type Props = {\n children: SingleOrArray<Child>;\n};\n\nexport default class Container extends React.Component<Props> {\n static slackType = 'Container';\n}\n","import React from 'react';\n\nexport type Props = {\n title: string;\n videoUrl: string;\n thumbnailUrl: string;\n altText: string;\n titleUrl?: string;\n description?: string;\n authorName?: string;\n providerName?: string;\n providerIconUrl?: string;\n blockId?: string;\n};\n\nexport default class Video extends React.Component<Props> {\n static slackType = 'Video';\n}\n","import React from 'react';\n\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nexport type Props = {\n children: SingleOrArray<React.ReactElement | string>;\n};\n\nexport default class RichTextSection extends React.Component<Props> {\n static slackType = 'RichTextSection';\n}\n","import React from 'react';\n\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nimport {type RichTextListStyle} from './types';\n\nexport type Props = {\n style: RichTextListStyle;\n children: SingleOrArray<React.ReactElement | string>;\n indent?: number;\n border?: number;\n};\n\nexport default class RichTextList extends React.Component<Props> {\n static slackType = 'RichTextList';\n}\n","import React from 'react';\n\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nexport type Props = {\n children: SingleOrArray<React.ReactElement | string>;\n};\n\nexport default class RichTextQuote extends React.Component<Props> {\n static slackType = 'RichTextQuote';\n}\n","import React from 'react';\n\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nexport type Props = {\n children: SingleOrArray<React.ReactElement | string>;\n};\n\nexport default class RichTextPreformatted extends React.Component<Props> {\n static slackType = 'RichTextPreformatted';\n}\n","import React from 'react';\n\nimport {type RichTextStyle} from './types';\n\nexport type Props = {\n children: string;\n style?: RichTextStyle;\n};\n\nexport default class RichTextText extends React.Component<Props> {\n static slackType = 'RichTextText';\n}\n","import React from 'react';\n\nimport {type RichTextStyle} from './types';\n\nexport type Props = {\n url: string;\n children?: string;\n style?: RichTextStyle;\n};\n\nexport default class RichTextLink extends React.Component<Props> {\n static slackType = 'RichTextLink';\n}\n","import React from 'react';\n\nexport type Props = {\n userId: string;\n};\n\nexport default class RichTextUser extends React.Component<Props> {\n static slackType = 'RichTextUser';\n}\n","import React from 'react';\n\nexport type Props = {\n channelId: string;\n};\n\nexport default class RichTextChannel extends React.Component<Props> {\n static slackType = 'RichTextChannel';\n}\n","import React from 'react';\n\nexport type Props = {\n name: string;\n};\n\nexport default class RichTextEmoji extends React.Component<Props> {\n static slackType = 'RichTextEmoji';\n}\n","import React from 'react';\n\nexport type Props = {\n timestamp: number;\n format: string;\n fallback: string;\n link?: string;\n};\n\nexport default class RichTextDate extends React.Component<Props> {\n static slackType = 'RichTextDate';\n}\n","import React from 'react';\n\nimport {type RichTextBroadcastRange} from './types';\n\nexport type Props = {\n range: RichTextBroadcastRange;\n};\n\nexport default class RichTextBroadcast extends React.Component<Props> {\n static slackType = 'RichTextBroadcast';\n}\n","import React from 'react';\n\nexport type Props = {\n usergroupId: string;\n};\n\nexport default class RichTextUserGroup extends React.Component<Props> {\n static slackType = 'RichTextUserGroup';\n}\n"],"mappings":"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","names":["Image","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","Image","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React"]}