@elastic/isomer-sdk 0.0.0 → 0.2.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/LICENSE.txt +93 -0
- package/NOTICE.txt +1861 -0
- package/README.md +69 -0
- package/THIRD_PARTY_LICENSES.md +957 -0
- package/dist/author/authored_fields.d.ts +153 -0
- package/dist/author/authored_fields.d.ts.map +1 -0
- package/dist/author/authored_fields.js +227 -0
- package/dist/author/authored_fields.js.map +1 -0
- package/dist/author/authoring_input.d.ts +7 -0
- package/dist/author/authoring_input.d.ts.map +1 -0
- package/dist/author/authoring_input.js +60 -0
- package/dist/author/authoring_input.js.map +1 -0
- package/dist/author/authoring_model.d.ts +27 -0
- package/dist/author/authoring_model.d.ts.map +1 -0
- package/dist/author/authoring_model.js +98 -0
- package/dist/author/authoring_model.js.map +1 -0
- package/dist/author/declarations.d.ts +13 -0
- package/dist/author/declarations.d.ts.map +1 -0
- package/dist/author/declarations.js +277 -0
- package/dist/author/declarations.js.map +1 -0
- package/dist/author/index.d.ts +7 -0
- package/dist/author/index.d.ts.map +1 -0
- package/dist/author/index.js +12 -0
- package/dist/author/index.js.map +1 -0
- package/dist/author/jsx.d.ts +21 -0
- package/dist/author/jsx.d.ts.map +1 -0
- package/dist/author/jsx.js +20 -0
- package/dist/author/jsx.js.map +1 -0
- package/dist/author/jsx_shim.d.ts +117 -0
- package/dist/author/jsx_shim.d.ts.map +1 -0
- package/dist/author/jsx_shim.js +270 -0
- package/dist/author/jsx_shim.js.map +1 -0
- package/dist/author/prompt.d.ts +58 -0
- package/dist/author/prompt.d.ts.map +1 -0
- package/dist/author/prompt.js +148 -0
- package/dist/author/prompt.js.map +1 -0
- package/dist/author/schema_to_typescript.d.ts +37 -0
- package/dist/author/schema_to_typescript.d.ts.map +1 -0
- package/dist/author/schema_to_typescript.js +286 -0
- package/dist/author/schema_to_typescript.js.map +1 -0
- package/dist/cjs/author/authored_fields.js +233 -0
- package/dist/cjs/author/authored_fields.js.map +1 -0
- package/dist/cjs/author/authoring_input.js +64 -0
- package/dist/cjs/author/authoring_input.js.map +1 -0
- package/dist/cjs/author/authoring_model.js +104 -0
- package/dist/cjs/author/authoring_model.js.map +1 -0
- package/dist/cjs/author/declarations.js +281 -0
- package/dist/cjs/author/declarations.js.map +1 -0
- package/dist/cjs/author/index.js +25 -0
- package/dist/cjs/author/index.js.map +1 -0
- package/dist/cjs/author/jsx.js +24 -0
- package/dist/cjs/author/jsx.js.map +1 -0
- package/dist/cjs/author/jsx_shim.js +276 -0
- package/dist/cjs/author/jsx_shim.js.map +1 -0
- package/dist/cjs/author/prompt.js +153 -0
- package/dist/cjs/author/prompt.js.map +1 -0
- package/dist/cjs/author/schema_to_typescript.js +295 -0
- package/dist/cjs/author/schema_to_typescript.js.map +1 -0
- package/dist/cjs/composition/action_event.js +9 -0
- package/dist/cjs/composition/action_event.js.map +1 -0
- package/dist/cjs/composition/body_node_base.js +112 -0
- package/dist/cjs/composition/body_node_base.js.map +1 -0
- package/dist/cjs/composition/composition.js +9 -0
- package/dist/cjs/composition/composition.js.map +1 -0
- package/dist/cjs/composition/error.js +73 -0
- package/dist/cjs/composition/error.js.map +1 -0
- package/dist/cjs/composition/index.js +32 -0
- package/dist/cjs/composition/index.js.map +1 -0
- package/dist/cjs/composition/map_nodes.js +85 -0
- package/dist/cjs/composition/map_nodes.js.map +1 -0
- package/dist/cjs/composition/named_color.js +20 -0
- package/dist/cjs/composition/named_color.js.map +1 -0
- package/dist/cjs/composition/node.js +9 -0
- package/dist/cjs/composition/node.js.map +1 -0
- package/dist/cjs/composition/one_line.js +23 -0
- package/dist/cjs/composition/one_line.js.map +1 -0
- package/dist/cjs/composition/structured_value.js +21 -0
- package/dist/cjs/composition/structured_value.js.map +1 -0
- package/dist/cjs/composition/validation_error.js +40 -0
- package/dist/cjs/composition/validation_error.js.map +1 -0
- package/dist/cjs/define/frame.js +31 -0
- package/dist/cjs/define/frame.js.map +1 -0
- package/dist/cjs/define/index.js +31 -0
- package/dist/cjs/define/index.js.map +1 -0
- package/dist/cjs/define/markdown_content.js +12 -0
- package/dist/cjs/define/markdown_content.js.map +1 -0
- package/dist/cjs/define/primitive_example.js +26 -0
- package/dist/cjs/define/primitive_example.js.map +1 -0
- package/dist/cjs/define/primitive_icon.js +17 -0
- package/dist/cjs/define/primitive_icon.js.map +1 -0
- package/dist/cjs/define/primitive_module.js +118 -0
- package/dist/cjs/define/primitive_module.js.map +1 -0
- package/dist/cjs/define/slack_assets.js +9 -0
- package/dist/cjs/define/slack_assets.js.map +1 -0
- package/dist/cjs/define/slack_blocks.js +9 -0
- package/dist/cjs/define/slack_blocks.js.map +1 -0
- package/dist/cjs/define/zod_format.js +122 -0
- package/dist/cjs/define/zod_format.js.map +1 -0
- package/dist/cjs/define/zod_helpers.js +26 -0
- package/dist/cjs/define/zod_helpers.js.map +1 -0
- package/dist/cjs/entries/html.js +12 -0
- package/dist/cjs/entries/html.js.map +1 -0
- package/dist/cjs/entries/index.js +80 -0
- package/dist/cjs/entries/index.js.map +1 -0
- package/dist/cjs/entries/markdown.js +14 -0
- package/dist/cjs/entries/markdown.js.map +1 -0
- package/dist/cjs/entries/react.js +20 -0
- package/dist/cjs/entries/react.js.map +1 -0
- package/dist/cjs/entries/slack.js +25 -0
- package/dist/cjs/entries/slack.js.map +1 -0
- package/dist/cjs/entries/text.js +12 -0
- package/dist/cjs/entries/text.js.map +1 -0
- package/dist/cjs/pack/capabilities.js +40 -0
- package/dist/cjs/pack/capabilities.js.map +1 -0
- package/dist/cjs/pack/compose.js +59 -0
- package/dist/cjs/pack/compose.js.map +1 -0
- package/dist/cjs/pack/enhancements.js +65 -0
- package/dist/cjs/pack/enhancements.js.map +1 -0
- package/dist/cjs/pack/index.js +18 -0
- package/dist/cjs/pack/index.js.map +1 -0
- package/dist/cjs/pack/primitive_pack.js +97 -0
- package/dist/cjs/pack/primitive_pack.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/render/anchors.js +167 -0
- package/dist/cjs/render/anchors.js.map +1 -0
- package/dist/cjs/render/context_view.js +54 -0
- package/dist/cjs/render/context_view.js.map +1 -0
- package/dist/cjs/render/format_display_value.js +143 -0
- package/dist/cjs/render/format_display_value.js.map +1 -0
- package/dist/cjs/render/format_number.js +46 -0
- package/dist/cjs/render/format_number.js.map +1 -0
- package/dist/cjs/render/html/enhancements.js +30 -0
- package/dist/cjs/render/html/enhancements.js.map +1 -0
- package/dist/cjs/render/html/envelope.js +218 -0
- package/dist/cjs/render/html/envelope.js.map +1 -0
- package/dist/cjs/render/html/index.js +12 -0
- package/dist/cjs/render/html/index.js.map +1 -0
- package/dist/cjs/render/index.js +25 -0
- package/dist/cjs/render/index.js.map +1 -0
- package/dist/cjs/render/layout_check.js +133 -0
- package/dist/cjs/render/layout_check.js.map +1 -0
- package/dist/cjs/render/markdown/builder.js +195 -0
- package/dist/cjs/render/markdown/builder.js.map +1 -0
- package/dist/cjs/render/markdown/envelope.js +33 -0
- package/dist/cjs/render/markdown/envelope.js.map +1 -0
- package/dist/cjs/render/markdown/format.js +208 -0
- package/dist/cjs/render/markdown/format.js.map +1 -0
- package/dist/cjs/render/markdown/index.js +15 -0
- package/dist/cjs/render/markdown/index.js.map +1 -0
- package/dist/cjs/render/measure_dom.js +61 -0
- package/dist/cjs/render/measure_dom.js.map +1 -0
- package/dist/cjs/render/payload.js +13 -0
- package/dist/cjs/render/payload.js.map +1 -0
- package/dist/cjs/render/primitive_dispatch.js +173 -0
- package/dist/cjs/render/primitive_dispatch.js.map +1 -0
- package/dist/cjs/render/react/content.js +44 -0
- package/dist/cjs/render/react/content.js.map +1 -0
- package/dist/cjs/render/react/enhancements.js +32 -0
- package/dist/cjs/render/react/enhancements.js.map +1 -0
- package/dist/cjs/render/react/index.js +15 -0
- package/dist/cjs/render/react/index.js.map +1 -0
- package/dist/cjs/render/slack/assets.js +45 -0
- package/dist/cjs/render/slack/assets.js.map +1 -0
- package/dist/cjs/render/slack/blocks.js +80 -0
- package/dist/cjs/render/slack/blocks.js.map +1 -0
- package/dist/cjs/render/slack/envelope.js +551 -0
- package/dist/cjs/render/slack/envelope.js.map +1 -0
- package/dist/cjs/render/slack/format.js +225 -0
- package/dist/cjs/render/slack/format.js.map +1 -0
- package/dist/cjs/render/slack/index.js +30 -0
- package/dist/cjs/render/slack/index.js.map +1 -0
- package/dist/cjs/render/slack/markdown_content.js +409 -0
- package/dist/cjs/render/slack/markdown_content.js.map +1 -0
- package/dist/cjs/render/text/envelope.js +21 -0
- package/dist/cjs/render/text/envelope.js.map +1 -0
- package/dist/cjs/render/text/index.js +12 -0
- package/dist/cjs/render/text/index.js.map +1 -0
- package/dist/cjs/testing/conformance.js +312 -0
- package/dist/cjs/testing/conformance.js.map +1 -0
- package/dist/cjs/testing/icon.js +248 -0
- package/dist/cjs/testing/icon.js.map +1 -0
- package/dist/cjs/testing/index.js +18 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/registration.js +142 -0
- package/dist/cjs/testing/registration.js.map +1 -0
- package/dist/cjs/validate/authoring_schema.js +312 -0
- package/dist/cjs/validate/authoring_schema.js.map +1 -0
- package/dist/cjs/validate/composition_schema.js +135 -0
- package/dist/cjs/validate/composition_schema.js.map +1 -0
- package/dist/cjs/validate/index.js +53 -0
- package/dist/cjs/validate/index.js.map +1 -0
- package/dist/cjs/validate/input_budget.js +156 -0
- package/dist/cjs/validate/input_budget.js.map +1 -0
- package/dist/cjs/validate/json_schema.js +72 -0
- package/dist/cjs/validate/json_schema.js.map +1 -0
- package/dist/cjs/validate/node_issues.js +65 -0
- package/dist/cjs/validate/node_issues.js.map +1 -0
- package/dist/cjs/validate/url.js +116 -0
- package/dist/cjs/validate/url.js.map +1 -0
- package/dist/cjs/validate/validation.js +165 -0
- package/dist/cjs/validate/validation.js.map +1 -0
- package/dist/cjs/validate/value_schemas.js +53 -0
- package/dist/cjs/validate/value_schemas.js.map +1 -0
- package/dist/composition/action_event.d.ts +13 -0
- package/dist/composition/action_event.d.ts.map +1 -0
- package/dist/composition/action_event.js +8 -0
- package/dist/composition/action_event.js.map +1 -0
- package/dist/composition/body_node_base.d.ts +72 -0
- package/dist/composition/body_node_base.d.ts.map +1 -0
- package/dist/composition/body_node_base.js +104 -0
- package/dist/composition/body_node_base.js.map +1 -0
- package/dist/composition/composition.d.ts +71 -0
- package/dist/composition/composition.d.ts.map +1 -0
- package/dist/composition/composition.js +8 -0
- package/dist/composition/composition.js.map +1 -0
- package/dist/composition/error.d.ts +61 -0
- package/dist/composition/error.d.ts.map +1 -0
- package/dist/composition/error.js +69 -0
- package/dist/composition/error.js.map +1 -0
- package/dist/composition/index.d.ts +11 -0
- package/dist/composition/index.d.ts.map +1 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/composition/map_nodes.d.ts +16 -0
- package/dist/composition/map_nodes.d.ts.map +1 -0
- package/dist/composition/map_nodes.js +81 -0
- package/dist/composition/map_nodes.js.map +1 -0
- package/dist/composition/named_color.d.ts +9 -0
- package/dist/composition/named_color.d.ts.map +1 -0
- package/dist/composition/named_color.js +17 -0
- package/dist/composition/named_color.js.map +1 -0
- package/dist/composition/node.d.ts +11 -0
- package/dist/composition/node.d.ts.map +1 -0
- package/dist/composition/node.js +8 -0
- package/dist/composition/node.js.map +1 -0
- package/dist/composition/one_line.d.ts +7 -0
- package/dist/composition/one_line.d.ts.map +1 -0
- package/dist/composition/one_line.js +17 -0
- package/dist/composition/one_line.js.map +1 -0
- package/dist/composition/structured_value.d.ts +27 -0
- package/dist/composition/structured_value.d.ts.map +1 -0
- package/dist/composition/structured_value.js +18 -0
- package/dist/composition/structured_value.js.map +1 -0
- package/dist/composition/validation_error.d.ts +33 -0
- package/dist/composition/validation_error.d.ts.map +1 -0
- package/dist/composition/validation_error.js +35 -0
- package/dist/composition/validation_error.js.map +1 -0
- package/dist/define/frame.d.ts +155 -0
- package/dist/define/frame.d.ts.map +1 -0
- package/dist/define/frame.js +27 -0
- package/dist/define/frame.js.map +1 -0
- package/dist/define/index.d.ts +10 -0
- package/dist/define/index.d.ts.map +1 -0
- package/dist/define/index.js +13 -0
- package/dist/define/index.js.map +1 -0
- package/dist/define/markdown_content.d.ts +15 -0
- package/dist/define/markdown_content.d.ts.map +1 -0
- package/dist/define/markdown_content.js +9 -0
- package/dist/define/markdown_content.js.map +1 -0
- package/dist/define/primitive_example.d.ts +30 -0
- package/dist/define/primitive_example.d.ts.map +1 -0
- package/dist/define/primitive_example.js +21 -0
- package/dist/define/primitive_example.js.map +1 -0
- package/dist/define/primitive_icon.d.ts +11 -0
- package/dist/define/primitive_icon.d.ts.map +1 -0
- package/dist/define/primitive_icon.js +14 -0
- package/dist/define/primitive_icon.js.map +1 -0
- package/dist/define/primitive_module.d.ts +435 -0
- package/dist/define/primitive_module.d.ts.map +1 -0
- package/dist/define/primitive_module.js +112 -0
- package/dist/define/primitive_module.js.map +1 -0
- package/dist/define/slack_assets.d.ts +28 -0
- package/dist/define/slack_assets.d.ts.map +1 -0
- package/dist/define/slack_assets.js +8 -0
- package/dist/define/slack_assets.js.map +1 -0
- package/dist/define/slack_blocks.d.ts +234 -0
- package/dist/define/slack_blocks.d.ts.map +1 -0
- package/dist/define/slack_blocks.js +8 -0
- package/dist/define/slack_blocks.js.map +1 -0
- package/dist/define/zod_format.d.ts +33 -0
- package/dist/define/zod_format.d.ts.map +1 -0
- package/dist/define/zod_format.js +114 -0
- package/dist/define/zod_format.js.map +1 -0
- package/dist/define/zod_helpers.d.ts +10 -0
- package/dist/define/zod_helpers.d.ts.map +1 -0
- package/dist/define/zod_helpers.js +22 -0
- package/dist/define/zod_helpers.js.map +1 -0
- package/dist/entries/html.d.ts +3 -0
- package/dist/entries/html.d.ts.map +1 -0
- package/dist/entries/html.js +8 -0
- package/dist/entries/html.js.map +1 -0
- package/dist/entries/index.d.ts +6 -0
- package/dist/entries/index.d.ts.map +1 -0
- package/dist/entries/index.js +12 -0
- package/dist/entries/index.js.map +1 -0
- package/dist/entries/markdown.d.ts +3 -0
- package/dist/entries/markdown.d.ts.map +1 -0
- package/dist/entries/markdown.js +8 -0
- package/dist/entries/markdown.js.map +1 -0
- package/dist/entries/react.d.ts +5 -0
- package/dist/entries/react.d.ts.map +1 -0
- package/dist/entries/react.js +11 -0
- package/dist/entries/react.js.map +1 -0
- package/dist/entries/slack.d.ts +2 -0
- package/dist/entries/slack.d.ts.map +1 -0
- package/dist/entries/slack.js +8 -0
- package/dist/entries/slack.js.map +1 -0
- package/dist/entries/text.d.ts +2 -0
- package/dist/entries/text.d.ts.map +1 -0
- package/dist/entries/text.js +8 -0
- package/dist/entries/text.js.map +1 -0
- package/dist/pack/capabilities.d.ts +41 -0
- package/dist/pack/capabilities.d.ts.map +1 -0
- package/dist/pack/capabilities.js +36 -0
- package/dist/pack/capabilities.js.map +1 -0
- package/dist/pack/compose.d.ts +24 -0
- package/dist/pack/compose.d.ts.map +1 -0
- package/dist/pack/compose.js +55 -0
- package/dist/pack/compose.js.map +1 -0
- package/dist/pack/enhancements.d.ts +65 -0
- package/dist/pack/enhancements.d.ts.map +1 -0
- package/dist/pack/enhancements.js +59 -0
- package/dist/pack/enhancements.js.map +1 -0
- package/dist/pack/index.d.ts +5 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +11 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/pack/primitive_pack.d.ts +164 -0
- package/dist/pack/primitive_pack.d.ts.map +1 -0
- package/dist/pack/primitive_pack.js +92 -0
- package/dist/pack/primitive_pack.js.map +1 -0
- package/dist/render/anchors.d.ts +82 -0
- package/dist/render/anchors.d.ts.map +1 -0
- package/dist/render/anchors.js +153 -0
- package/dist/render/anchors.js.map +1 -0
- package/dist/render/context_view.d.ts +10 -0
- package/dist/render/context_view.d.ts.map +1 -0
- package/dist/render/context_view.js +49 -0
- package/dist/render/context_view.js.map +1 -0
- package/dist/render/format_display_value.d.ts +20 -0
- package/dist/render/format_display_value.d.ts.map +1 -0
- package/dist/render/format_display_value.js +137 -0
- package/dist/render/format_display_value.js.map +1 -0
- package/dist/render/format_number.d.ts +9 -0
- package/dist/render/format_number.d.ts.map +1 -0
- package/dist/render/format_number.js +42 -0
- package/dist/render/format_number.js.map +1 -0
- package/dist/render/html/enhancements.d.ts +10 -0
- package/dist/render/html/enhancements.d.ts.map +1 -0
- package/dist/render/html/enhancements.js +25 -0
- package/dist/render/html/enhancements.js.map +1 -0
- package/dist/render/html/envelope.d.ts +182 -0
- package/dist/render/html/envelope.d.ts.map +1 -0
- package/dist/render/html/envelope.js +214 -0
- package/dist/render/html/envelope.js.map +1 -0
- package/dist/render/html/index.d.ts +3 -0
- package/dist/render/html/index.d.ts.map +1 -0
- package/dist/render/html/index.js +8 -0
- package/dist/render/html/index.js.map +1 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/layout_check.d.ts +43 -0
- package/dist/render/layout_check.d.ts.map +1 -0
- package/dist/render/layout_check.js +129 -0
- package/dist/render/layout_check.js.map +1 -0
- package/dist/render/markdown/builder.d.ts +46 -0
- package/dist/render/markdown/builder.d.ts.map +1 -0
- package/dist/render/markdown/builder.js +190 -0
- package/dist/render/markdown/builder.js.map +1 -0
- package/dist/render/markdown/envelope.d.ts +20 -0
- package/dist/render/markdown/envelope.d.ts.map +1 -0
- package/dist/render/markdown/envelope.js +29 -0
- package/dist/render/markdown/envelope.js.map +1 -0
- package/dist/render/markdown/format.d.ts +10 -0
- package/dist/render/markdown/format.d.ts.map +1 -0
- package/dist/render/markdown/format.js +202 -0
- package/dist/render/markdown/format.js.map +1 -0
- package/dist/render/markdown/index.d.ts +3 -0
- package/dist/render/markdown/index.d.ts.map +1 -0
- package/dist/render/markdown/index.js +9 -0
- package/dist/render/markdown/index.js.map +1 -0
- package/dist/render/measure_dom.d.ts +10 -0
- package/dist/render/measure_dom.d.ts.map +1 -0
- package/dist/render/measure_dom.js +57 -0
- package/dist/render/measure_dom.js.map +1 -0
- package/dist/render/payload.d.ts +16 -0
- package/dist/render/payload.d.ts.map +1 -0
- package/dist/render/payload.js +9 -0
- package/dist/render/payload.js.map +1 -0
- package/dist/render/primitive_dispatch.d.ts +72 -0
- package/dist/render/primitive_dispatch.d.ts.map +1 -0
- package/dist/render/primitive_dispatch.js +169 -0
- package/dist/render/primitive_dispatch.js.map +1 -0
- package/dist/render/react/content.d.ts +40 -0
- package/dist/render/react/content.d.ts.map +1 -0
- package/dist/render/react/content.js +39 -0
- package/dist/render/react/content.js.map +1 -0
- package/dist/render/react/enhancements.d.ts +15 -0
- package/dist/render/react/enhancements.d.ts.map +1 -0
- package/dist/render/react/enhancements.js +28 -0
- package/dist/render/react/enhancements.js.map +1 -0
- package/dist/render/react/index.d.ts +3 -0
- package/dist/render/react/index.d.ts.map +1 -0
- package/dist/render/react/index.js +9 -0
- package/dist/render/react/index.js.map +1 -0
- package/dist/render/slack/assets.d.ts +16 -0
- package/dist/render/slack/assets.d.ts.map +1 -0
- package/dist/render/slack/assets.js +40 -0
- package/dist/render/slack/assets.js.map +1 -0
- package/dist/render/slack/blocks.d.ts +72 -0
- package/dist/render/slack/blocks.d.ts.map +1 -0
- package/dist/render/slack/blocks.js +77 -0
- package/dist/render/slack/blocks.js.map +1 -0
- package/dist/render/slack/envelope.d.ts +52 -0
- package/dist/render/slack/envelope.d.ts.map +1 -0
- package/dist/render/slack/envelope.js +547 -0
- package/dist/render/slack/envelope.js.map +1 -0
- package/dist/render/slack/format.d.ts +70 -0
- package/dist/render/slack/format.d.ts.map +1 -0
- package/dist/render/slack/format.js +209 -0
- package/dist/render/slack/format.js.map +1 -0
- package/dist/render/slack/index.d.ts +6 -0
- package/dist/render/slack/index.d.ts.map +1 -0
- package/dist/render/slack/index.js +12 -0
- package/dist/render/slack/index.js.map +1 -0
- package/dist/render/slack/markdown_content.d.ts +17 -0
- package/dist/render/slack/markdown_content.d.ts.map +1 -0
- package/dist/render/slack/markdown_content.js +404 -0
- package/dist/render/slack/markdown_content.js.map +1 -0
- package/dist/render/text/envelope.d.ts +15 -0
- package/dist/render/text/envelope.d.ts.map +1 -0
- package/dist/render/text/envelope.js +17 -0
- package/dist/render/text/envelope.js.map +1 -0
- package/dist/render/text/index.d.ts +2 -0
- package/dist/render/text/index.d.ts.map +1 -0
- package/dist/render/text/index.js +8 -0
- package/dist/render/text/index.js.map +1 -0
- package/dist/testing/conformance.d.ts +145 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +303 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/icon.d.ts +11 -0
- package/dist/testing/icon.d.ts.map +1 -0
- package/dist/testing/icon.js +244 -0
- package/dist/testing/icon.js.map +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/registration.d.ts +32 -0
- package/dist/testing/registration.d.ts.map +1 -0
- package/dist/testing/registration.js +105 -0
- package/dist/testing/registration.js.map +1 -0
- package/dist/validate/authoring_schema.d.ts +33 -0
- package/dist/validate/authoring_schema.d.ts.map +1 -0
- package/dist/validate/authoring_schema.js +306 -0
- package/dist/validate/authoring_schema.js.map +1 -0
- package/dist/validate/composition_schema.d.ts +80 -0
- package/dist/validate/composition_schema.d.ts.map +1 -0
- package/dist/validate/composition_schema.js +127 -0
- package/dist/validate/composition_schema.js.map +1 -0
- package/dist/validate/index.d.ts +9 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +15 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/input_budget.d.ts +35 -0
- package/dist/validate/input_budget.d.ts.map +1 -0
- package/dist/validate/input_budget.js +151 -0
- package/dist/validate/input_budget.js.map +1 -0
- package/dist/validate/json_schema.d.ts +32 -0
- package/dist/validate/json_schema.d.ts.map +1 -0
- package/dist/validate/json_schema.js +68 -0
- package/dist/validate/json_schema.js.map +1 -0
- package/dist/validate/node_issues.d.ts +12 -0
- package/dist/validate/node_issues.d.ts.map +1 -0
- package/dist/validate/node_issues.js +61 -0
- package/dist/validate/node_issues.js.map +1 -0
- package/dist/validate/url.d.ts +50 -0
- package/dist/validate/url.d.ts.map +1 -0
- package/dist/validate/url.js +107 -0
- package/dist/validate/url.js.map +1 -0
- package/dist/validate/validation.d.ts +95 -0
- package/dist/validate/validation.d.ts.map +1 -0
- package/dist/validate/validation.js +157 -0
- package/dist/validate/validation.js.map +1 -0
- package/dist/validate/value_schemas.d.ts +53 -0
- package/dist/validate/value_schemas.d.ts.map +1 -0
- package/dist/validate/value_schemas.js +50 -0
- package/dist/validate/value_schemas.js.map +1 -0
- package/package.json +119 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitive_dispatch.js","sourceRoot":"","sources":["../../src/render/primitive_dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport { cloneElement, isValidElement, type ReactNode } from 'react';\n\nimport {\n isVisibleOnSurface,\n type SurfaceName,\n} from '../composition/body_node_base';\nimport { IsomerError } from '../composition/error';\nimport type { ValidationError } from '../composition/validation_error';\nimport type { MarkdownContent } from '../define/markdown_content';\nimport {\n type AnyPrimitiveDefinition,\n type DefaultPackTypes,\n type PackTypes,\n type PrimitiveNode,\n type PrimitiveStyleCollectionContext,\n type ReactContextArg,\n type Renderer,\n type RenderScope,\n type SurfaceMap,\n} from '../define/primitive_module';\nimport { createNodeIssueFormatter } from '../validate/node_issues';\n\nimport { serializeMarkdown } from './markdown/builder';\nimport type { SlackAssetCollector } from './slack/assets';\nimport type { SlackBlock, SlackImageBlock } from './slack/blocks';\nimport { markdownContentToSlackBlocks } from './slack/markdown_content';\n\n/**\n * Renders a node on any surface by looking its `type` up in one flattened\n * inventory.\n *\n * The seam that makes packs composable: a container recurses through the\n * {@link RenderScope} it is passed rather than through its own pack, so a node\n * owned by another pack still renders.\n */\nexport interface PrimitiveDispatcher<\n TNode extends PrimitiveNode,\n T extends PackTypes = DefaultPackTypes,\n> {\n /** Every primitive this dispatcher can reach, across all composed packs. */\n readonly definitions: readonly AnyPrimitiveDefinition[];\n /** Throws for an unknown node type; a missing primitive is a bug, not a degradation. */\n getDefinition(node: TNode): AnyPrimitiveDefinition;\n /** `undefined` when the node is hidden from `surface`, `sanitize` drops it, or the primitive declares no renderer for `surface`. */\n renderOn<S extends SurfaceName>(\n surface: S,\n node: TNode,\n extras: Omit<SurfaceMap<T>[S]['env'], 'scope'>\n ): SurfaceMap<T>[S]['output'] | undefined;\n /** The node's `react` renderer, or `undefined` when it is hidden or has none. `context` may be omitted only when `{}` is a complete context for the pack. */\n renderReact(\n node: TNode,\n ...context: ReactContextArg<T['context']>\n ): ReactNode;\n /** Mutates `styles` with this node's contribution. */\n collectStyles(\n node: TNode,\n styles: T['collector'],\n context: PrimitiveStyleCollectionContext\n ): void;\n /**\n * The node's `react` renderer, gated on `snapshot` visibility and keyed for a\n * frame's sibling list. `key` must be unique among those siblings.\n * `theme` is the frame's resolved palette for this render, or `undefined`\n * outside a frame.\n */\n renderSnapshot(\n node: TNode,\n context: T['context'],\n theme: T['theme'] | undefined,\n key: string\n ): ReactNode;\n /** `''` when the node is hidden from `text` or its primitive declares no `text` renderer. */\n renderText(node: TNode): string;\n /** The node's content serialized as GFM. */\n renderMarkdown(node: TNode): string;\n /** Empty when the node is hidden from `markdown`. */\n renderMarkdownContent(node: TNode): MarkdownContent;\n /**\n * Empty when the node is hidden from `slack`, `sanitize` drops it, or its\n * renderer returns nothing. A node with no `slack` renderer degrades through\n * its markdown; one `isSlackAssetType` names becomes an `image` block when\n * `collector` can allocate.\n */\n renderSlack(\n node: TNode,\n collector?: T['slackCollector']\n ): readonly T['slackBlock'][];\n /** `0` when the node is hidden from `snapshot` or its primitive declares no `metrics.snapshotHeight`. */\n estimateSnapshotHeight(node: TNode): number;\n /**\n * Appends schema failures under `path` to `errors`, each naming `node`'s\n * type, and an unknown key on `node` listing the fields it declares.\n */\n validate(node: TNode, path: string, errors: ValidationError[]): void;\n}\n\n/**\n * Which of a definition's renderers each surface dispatches to.\n *\n * `snapshot` maps to `react`: a rasterizer lays out the pack's DOM tree and\n * stylesheet, so the two surfaces differ only in visibility and in what\n * surrounds them.\n */\nconst RENDERER_FOR_SURFACE = {\n react: 'react',\n snapshot: 'react',\n text: 'text',\n markdown: 'markdown',\n slack: 'slack',\n} as const satisfies Record<\n SurfaceName,\n keyof AnyPrimitiveDefinition['renderers']\n>;\n\n/** Runtime facts {@link createPrimitiveDispatcher} cannot derive from the inventory. */\nexport interface PrimitiveDispatcherOptions {\n /** Names this dispatcher in error messages. */\n label?: string;\n /**\n * Which node types render as a picture rather than as text, so the Slack\n * surface uploads an image instead of degrading to markdown. Supplied by the\n * runtime from each pack's `slackAssetTypes`.\n */\n isSlackAssetType?: ((type: string) => boolean) | undefined;\n}\n\n/**\n * Flattens `definitions` into one type-keyed inventory.\n *\n * Throws on a duplicate `type`: two packs claiming one node type has no correct\n * resolution, so it fails at construction rather than resolving arbitrarily per\n * render.\n */\nexport const createPrimitiveDispatcher = <\n TNode extends PrimitiveNode,\n T extends PackTypes = DefaultPackTypes,\n>(\n definitions: readonly AnyPrimitiveDefinition[],\n options: PrimitiveDispatcherOptions = {}\n): PrimitiveDispatcher<TNode, T> => {\n const { isSlackAssetType } = options;\n const formatIssues = createNodeIssueFormatter(definitions);\n const byType = new Map<string, AnyPrimitiveDefinition>();\n for (const definition of definitions) {\n const existing = byType.get(definition.type);\n if (existing) {\n const label = options.label ? `${options.label}: ` : '';\n throw new IsomerError(\n 'DUPLICATE_PRIMITIVE_TYPE',\n `${label}duplicate primitive type \"${definition.type}\" registered`\n );\n }\n byType.set(definition.type, definition);\n }\n\n const getDefinition = (node: TNode): AnyPrimitiveDefinition => {\n const definition = byType.get(node.type);\n if (!definition) {\n throw new IsomerError(\n 'UNKNOWN_PRIMITIVE_TYPE',\n `Unknown primitive type \"${node.type}\"`\n );\n }\n return definition;\n };\n\n const sanitizeNode = (\n definition: AnyPrimitiveDefinition,\n node: TNode\n ): TNode | null => {\n const sanitize = definition.sanitize as\n ((node: TNode) => TNode | null) | undefined;\n return sanitize ? sanitize(node) : node;\n };\n\n // Assigned after helpers that close over this binding.\n // eslint-disable-next-line prefer-const\n let self: PrimitiveDispatcher<TNode, T>;\n\n const scope = (): RenderScope<T> => self;\n\n const renderOn = <S extends SurfaceName>(\n surface: S,\n node: TNode,\n extras: Omit<SurfaceMap<T>[S]['env'], 'scope'>\n ): SurfaceMap<T>[S]['output'] | undefined => {\n if (!isVisibleOnSurface(node, surface)) {\n return undefined;\n }\n const definition = getDefinition(node);\n const safeNode = sanitizeNode(definition, node);\n return safeNode === null\n ? undefined\n : renderSanitized(surface, definition, safeNode, extras);\n };\n\n // `renderOn` for a node its sanitizer has already run on.\n const renderSanitized = <S extends SurfaceName>(\n surface: S,\n definition: AnyPrimitiveDefinition,\n safeNode: TNode,\n extras: Omit<SurfaceMap<T>[S]['env'], 'scope'>\n ): SurfaceMap<T>[S]['output'] | undefined => {\n const renderer = definition.renderers[RENDERER_FOR_SURFACE[surface]] as\n Renderer<TNode, S, T> | undefined;\n return renderer?.(safeNode, { ...extras, scope: scope() });\n };\n\n const renderMarkdownContent = (node: TNode): MarkdownContent =>\n renderOn('markdown', node, {}) ?? [];\n\n const renderMarkdown = (node: TNode): string =>\n serializeMarkdown(renderMarkdownContent(node));\n\n self = {\n definitions,\n getDefinition,\n renderOn,\n // `{}` only ever runs when the argument was optional, which\n // `ReactContextArg` allows exactly when `{}` is a complete context.\n renderReact: (node, ...context) =>\n renderOn('react', node, {\n context: context[0] ?? {},\n }),\n collectStyles: (node, styles, context) => {\n const definition = getDefinition(node);\n const collectStyles = definition.collectStyles as\n | ((\n node: TNode,\n env: {\n styles: T['collector'];\n context: PrimitiveStyleCollectionContext;\n }\n ) => void)\n | undefined;\n collectStyles?.(node, { styles, context });\n },\n renderSnapshot: (node, context, theme, key) => {\n const rendered = renderOn('snapshot', node, { context, theme });\n // The frame hands these to React as an array; a `key` has to sit on the\n // element itself, since wrapping in a Fragment would hide the single\n // root an image backend lays out from.\n return isValidElement(rendered)\n ? cloneElement(rendered, { key })\n : rendered;\n },\n renderText: (node) => renderOn('text', node, {}) ?? '',\n renderMarkdown,\n renderMarkdownContent,\n renderSlack: (node, collector) => {\n if (!isVisibleOnSurface(node, 'slack')) {\n return [];\n }\n const assets = isSlackAssetCollector(collector) ? collector : undefined;\n if (assets && isSlackAssetType?.(node.type)) {\n const definition = getDefinition(node);\n const safeNode = sanitizeNode(definition, node);\n if (safeNode === null) {\n return [];\n }\n const altText =\n (isVisibleOnSurface(safeNode, 'text') &&\n renderSanitized('text', definition, safeNode, {})) ||\n node.type;\n const ref = assets.allocate(safeNode, altText);\n const block = {\n type: 'image',\n alt_text: altText,\n slack_file: { ref },\n } satisfies SlackImageBlock;\n return asSlackPayload<T['slackBlock']>([block]);\n }\n const definition = getDefinition(node);\n const slackRenderer = definition.renderers.slack as\n Renderer<TNode, 'slack', T> | undefined;\n if (!slackRenderer) {\n // Degrading here rather than in the envelope is what reaches nested\n // children: a container's `slack` renderer recurses through this\n // method, and the envelope only ever sees the container's own output.\n return asSlackPayload<T['slackBlock']>(\n markdownContentToSlackBlocks(renderMarkdownContent(node))\n );\n }\n const safeNode = sanitizeNode(definition, node);\n if (safeNode === null) {\n return [];\n }\n const rendered = slackRenderer(safeNode, {\n ...(collector === undefined ? {} : { collector }),\n scope: scope(),\n });\n return isReadonlyArray(rendered) ? rendered : [rendered];\n },\n estimateSnapshotHeight: (node) => {\n if (!isVisibleOnSurface(node, 'snapshot')) {\n return 0;\n }\n const snapshotHeight = getDefinition(node).metrics?.snapshotHeight as\n ((node: TNode) => number) | undefined;\n return snapshotHeight?.(node) ?? 0;\n },\n validate: (node, path, errors) => {\n const result = getDefinition(node).schema.safeParse(node, {\n reportInput: true,\n });\n if (!result.success) {\n errors.push(...formatIssues([[node, path]], result.error.issues, path));\n }\n },\n };\n return self;\n};\n\nconst isReadonlyArray = <T>(value: T | readonly T[]): value is readonly T[] =>\n Array.isArray(value);\n\n/** The picture swap needs a collector that can allocate; any other collector type skips it. */\nconst isSlackAssetCollector = (value: unknown): value is SlackAssetCollector =>\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { allocate?: unknown }).allocate === 'function';\n\n/** Rebinds checked Block Kit to the erased payload parameter. */\nconst asSlackPayload = <TSlackBlock>(\n blocks: readonly SlackBlock[]\n): readonly TSlackBlock[] => blocks as unknown as readonly TSlackBlock[];\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ReactElement, type ReactNode } from 'react';
|
|
2
|
+
import type { Composition } from '../../composition/index.js';
|
|
3
|
+
import type { RenderTheme } from '../../composition/named_color.js';
|
|
4
|
+
import type { PrimitiveNode, PrimitiveRenderContext } from '../../define/index.js';
|
|
5
|
+
/** A pack's React renderer for one node of its own type. */
|
|
6
|
+
export interface ReactContentDispatcher<TNode extends PrimitiveNode, TContext = PrimitiveRenderContext> {
|
|
7
|
+
/** Must be side-effect free: the HTML surface calls it twice, once to collect styles and once to render. */
|
|
8
|
+
renderReact(node: TNode, context?: TContext): ReactNode;
|
|
9
|
+
}
|
|
10
|
+
/** Options for {@link renderCompositionContent}. */
|
|
11
|
+
export interface ReactContentOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Renders the composition's title and subtitle as the leading `h2` / `p.sub`.
|
|
14
|
+
* Defaults to `true`. Pass `false` when the host already shows the title
|
|
15
|
+
* itself; the title still backs the wrapper's `aria-label`.
|
|
16
|
+
*/
|
|
17
|
+
heading?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A composition's heading and body as React nodes, without the surrounding
|
|
21
|
+
* document or wrapper element.
|
|
22
|
+
*/
|
|
23
|
+
export declare const renderCompositionContent: <TNode extends PrimitiveNode, TContext = PrimitiveRenderContext>(composition: Composition<TNode>, dispatcher: ReactContentDispatcher<TNode, TContext>, context: TContext, { heading }?: ReactContentOptions) => ReactNode;
|
|
24
|
+
/** Options for {@link wrapCompositionContent}. */
|
|
25
|
+
export interface CompositionWrapperOptions {
|
|
26
|
+
/** Adds the `framed` class. Defaults to `true`. */
|
|
27
|
+
framed?: boolean;
|
|
28
|
+
/** Adds the `fluid` class. */
|
|
29
|
+
fluid?: boolean;
|
|
30
|
+
/** Sets `data-theme`; defaults to the composition's `theme`, and `auto` sets nothing so the page's scheme applies. */
|
|
31
|
+
theme?: RenderTheme;
|
|
32
|
+
/** Used only when the composition has neither `meta.ariaLabel` nor a `title`. Defaults to `'View'`. */
|
|
33
|
+
defaultAriaLabel?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The one `.isomer[.framed][.fluid]` `section` every surface wraps rendered
|
|
37
|
+
* content in: the `html` surface's document wrapper and a React host's.
|
|
38
|
+
*/
|
|
39
|
+
export declare const wrapCompositionContent: <TNode extends PrimitiveNode>(content: ReactNode, composition: Composition<TNode>, { framed, fluid, theme, defaultAriaLabel, }?: CompositionWrapperOptions) => ReactElement;
|
|
40
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../src/render/react/content.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE1E,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB,CACrC,KAAK,SAAS,aAAa,EAC3B,QAAQ,GAAG,sBAAsB;IAEjC,4GAA4G;IAC5G,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzD;AAED,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,KAAK,SAAS,aAAa,EAC3B,QAAQ,GAAG,sBAAsB,EAEjC,aAAa,WAAW,CAAC,KAAK,CAAC,EAC/B,YAAY,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,EACnD,SAAS,QAAQ,EACjB,cAAoB,mBAAwB,KAC3C,SAwBA,CAAC;AAkBJ,kDAAkD;AAClD,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sHAAsH;IACtH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,uGAAuG;IACvG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,KAAK,SAAS,aAAa,EAChE,SAAS,SAAS,EAClB,aAAa,WAAW,CAAC,KAAK,CAAC,EAC/B,8CAKG,yBAA8B,KAChC,YAaA,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
import { createElement, Fragment, } from 'react';
|
|
8
|
+
/**
|
|
9
|
+
* A composition's heading and body as React nodes, without the surrounding
|
|
10
|
+
* document or wrapper element.
|
|
11
|
+
*/
|
|
12
|
+
export const renderCompositionContent = (composition, dispatcher, context, { heading = true } = {}) => createElement(Fragment, null, ...[
|
|
13
|
+
heading && composition.title
|
|
14
|
+
? createElement('h2', { key: 'title' }, composition.title)
|
|
15
|
+
: null,
|
|
16
|
+
heading && composition.subtitle
|
|
17
|
+
? createElement('p', { key: 'subtitle', className: 'sub' }, composition.subtitle)
|
|
18
|
+
: null,
|
|
19
|
+
...composition.body.map((node, index) => createElement((RenderedCompositionNode), {
|
|
20
|
+
key: `body-${index}`,
|
|
21
|
+
node,
|
|
22
|
+
context,
|
|
23
|
+
dispatcher,
|
|
24
|
+
})),
|
|
25
|
+
].filter(Boolean));
|
|
26
|
+
const RenderedCompositionNode = ({ node, context, dispatcher, }) => dispatcher.renderReact(node, context);
|
|
27
|
+
/**
|
|
28
|
+
* The one `.isomer[.framed][.fluid]` `section` every surface wraps rendered
|
|
29
|
+
* content in: the `html` surface's document wrapper and a React host's.
|
|
30
|
+
*/
|
|
31
|
+
export const wrapCompositionContent = (content, composition, { framed = true, fluid = false, theme = composition.theme ?? 'auto', defaultAriaLabel = 'View', } = {}) => createElement('section', {
|
|
32
|
+
className: ['isomer', framed ? 'framed' : '', fluid ? 'fluid' : '']
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.join(' '),
|
|
35
|
+
role: 'group',
|
|
36
|
+
'aria-label': composition.meta?.ariaLabel ?? composition.title ?? defaultAriaLabel,
|
|
37
|
+
...(theme === 'auto' ? {} : { 'data-theme': theme }),
|
|
38
|
+
}, content);
|
|
39
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/render/react/content.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,QAAQ,GAGT,MAAM,OAAO,CAAC;AAyBf;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAItC,WAA+B,EAC/B,UAAmD,EACnD,OAAiB,EACjB,EAAE,OAAO,GAAG,IAAI,KAA0B,EAAE,EACjC,EAAE,CACb,aAAa,CACX,QAAQ,EACR,IAAI,EACJ,GAAG;IACD,OAAO,IAAI,WAAW,CAAC,KAAK;QAC1B,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC;QAC1D,CAAC,CAAC,IAAI;IACR,OAAO,IAAI,WAAW,CAAC,QAAQ;QAC7B,CAAC,CAAC,aAAa,CACX,GAAG,EACH,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,EACrC,WAAW,CAAC,QAAQ,CACrB;QACH,CAAC,CAAC,IAAI;IACR,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACtC,aAAa,CAAC,CAAA,uBAAwC,CAAA,EAAE;QACtD,GAAG,EAAE,QAAQ,KAAK,EAAE;QACpB,IAAI;QACJ,OAAO;QACP,UAAU;KACX,CAAC,CACH;CACF,CAAC,MAAM,CAAC,OAAO,CAAC,CAClB,CAAC;AAWJ,MAAM,uBAAuB,GAAG,CAAwC,EACtE,IAAI,EACJ,OAAO,EACP,UAAU,GACoC,EAAa,EAAE,CAC7D,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAcxC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAAkB,EAClB,WAA+B,EAC/B,EACE,MAAM,GAAG,IAAI,EACb,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,MAAM,EACnC,gBAAgB,GAAG,MAAM,MACI,EAAE,EACnB,EAAE,CAChB,aAAa,CACX,SAAS,EACT;IACE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC;IACZ,IAAI,EAAE,OAAO;IACb,YAAY,EACV,WAAW,CAAC,IAAI,EAAE,SAAS,IAAI,WAAW,CAAC,KAAK,IAAI,gBAAgB;IACtE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;CACrD,EACD,OAAO,CACR,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport {\n createElement,\n Fragment,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport type { Composition } from '../../composition';\nimport type { RenderTheme } from '../../composition/named_color';\nimport type { PrimitiveNode, PrimitiveRenderContext } from '../../define';\n\n/** A pack's React renderer for one node of its own type. */\nexport interface ReactContentDispatcher<\n TNode extends PrimitiveNode,\n TContext = PrimitiveRenderContext,\n> {\n /** Must be side-effect free: the HTML surface calls it twice, once to collect styles and once to render. */\n renderReact(node: TNode, context?: TContext): ReactNode;\n}\n\n/** Options for {@link renderCompositionContent}. */\nexport interface ReactContentOptions {\n /**\n * Renders the composition's title and subtitle as the leading `h2` / `p.sub`.\n * Defaults to `true`. Pass `false` when the host already shows the title\n * itself; the title still backs the wrapper's `aria-label`.\n */\n heading?: boolean;\n}\n\n/**\n * A composition's heading and body as React nodes, without the surrounding\n * document or wrapper element.\n */\nexport const renderCompositionContent = <\n TNode extends PrimitiveNode,\n TContext = PrimitiveRenderContext,\n>(\n composition: Composition<TNode>,\n dispatcher: ReactContentDispatcher<TNode, TContext>,\n context: TContext,\n { heading = true }: ReactContentOptions = {}\n): ReactNode =>\n createElement(\n Fragment,\n null,\n ...[\n heading && composition.title\n ? createElement('h2', { key: 'title' }, composition.title)\n : null,\n heading && composition.subtitle\n ? createElement(\n 'p',\n { key: 'subtitle', className: 'sub' },\n composition.subtitle\n )\n : null,\n ...composition.body.map((node, index) =>\n createElement(RenderedCompositionNode<TNode, TContext>, {\n key: `body-${index}`,\n node,\n context,\n dispatcher,\n })\n ),\n ].filter(Boolean)\n );\n\ninterface RenderedCompositionNodeProps<\n TNode extends PrimitiveNode,\n TContext = PrimitiveRenderContext,\n> {\n node: TNode;\n context: TContext;\n dispatcher: ReactContentDispatcher<TNode, TContext>;\n}\n\nconst RenderedCompositionNode = <TNode extends PrimitiveNode, TContext>({\n node,\n context,\n dispatcher,\n}: RenderedCompositionNodeProps<TNode, TContext>): ReactNode =>\n dispatcher.renderReact(node, context);\n\n/** Options for {@link wrapCompositionContent}. */\nexport interface CompositionWrapperOptions {\n /** Adds the `framed` class. Defaults to `true`. */\n framed?: boolean;\n /** Adds the `fluid` class. */\n fluid?: boolean;\n /** Sets `data-theme`; defaults to the composition's `theme`, and `auto` sets nothing so the page's scheme applies. */\n theme?: RenderTheme;\n /** Used only when the composition has neither `meta.ariaLabel` nor a `title`. Defaults to `'View'`. */\n defaultAriaLabel?: string;\n}\n\n/**\n * The one `.isomer[.framed][.fluid]` `section` every surface wraps rendered\n * content in: the `html` surface's document wrapper and a React host's.\n */\nexport const wrapCompositionContent = <TNode extends PrimitiveNode>(\n content: ReactNode,\n composition: Composition<TNode>,\n {\n framed = true,\n fluid = false,\n theme = composition.theme ?? 'auto',\n defaultAriaLabel = 'View',\n }: CompositionWrapperOptions = {}\n): ReactElement =>\n createElement(\n 'section',\n {\n className: ['isomer', framed ? 'framed' : '', fluid ? 'fluid' : '']\n .filter(Boolean)\n .join(' '),\n role: 'group',\n 'aria-label':\n composition.meta?.ariaLabel ?? composition.title ?? defaultAriaLabel,\n ...(theme === 'auto' ? {} : { 'data-theme': theme }),\n },\n content\n );\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ChildNodeWalker } from '../../composition/body_node_base.js';
|
|
2
|
+
import type { PrimitiveNode } from '../../composition/node.js';
|
|
3
|
+
import { type EnhancementDefinition } from '../../pack/enhancements.js';
|
|
4
|
+
/**
|
|
5
|
+
* The `definitions` that apply to `body`, the first of each id and limited to
|
|
6
|
+
* `requested` ids when given, and `context` for a React render of it: carrying
|
|
7
|
+
* their ids as `context.enhancements`, with `context.anchors` on when one
|
|
8
|
+
* declares `anchors: true`. `context` is viewed, not copied, as the HTML
|
|
9
|
+
* surface does.
|
|
10
|
+
*/
|
|
11
|
+
export declare const applyEnhancements: <TContext>(context: TContext, body: readonly PrimitiveNode[], walk: ChildNodeWalker, definitions: readonly EnhancementDefinition[], requested?: readonly string[]) => {
|
|
12
|
+
context: TContext;
|
|
13
|
+
applied: EnhancementDefinition[];
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=enhancements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancements.d.ts","sourceRoot":"","sources":["../../../src/render/react/enhancements.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,yBAAyB,CAAC;AAIjC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,EACxC,SAAS,QAAQ,EACjB,MAAM,SAAS,aAAa,EAAE,EAC9B,MAAM,eAAe,EACrB,aAAa,SAAS,qBAAqB,EAAE,EAC7C,YAAY,SAAS,MAAM,EAAE,KAC5B;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;CAUvD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
import { resolveEnhancements, } from '../../pack/enhancements.js';
|
|
8
|
+
import { withNodeAnchors } from '../anchors.js';
|
|
9
|
+
import { contextWith } from '../context_view.js';
|
|
10
|
+
/**
|
|
11
|
+
* The `definitions` that apply to `body`, the first of each id and limited to
|
|
12
|
+
* `requested` ids when given, and `context` for a React render of it: carrying
|
|
13
|
+
* their ids as `context.enhancements`, with `context.anchors` on when one
|
|
14
|
+
* declares `anchors: true`. `context` is viewed, not copied, as the HTML
|
|
15
|
+
* surface does.
|
|
16
|
+
*/
|
|
17
|
+
export const applyEnhancements = (context, body, walk, definitions, requested) => {
|
|
18
|
+
const applied = resolveEnhancements(body, walk, definitions, requested);
|
|
19
|
+
const ids = new Set(applied.map(({ id }) => id));
|
|
20
|
+
const enhanced = contextWith(context, 'enhancements', ids);
|
|
21
|
+
return {
|
|
22
|
+
context: applied.some(({ anchors }) => anchors)
|
|
23
|
+
? withNodeAnchors(enhanced)
|
|
24
|
+
: enhanced,
|
|
25
|
+
applied,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=enhancements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancements.js","sourceRoot":"","sources":["../../../src/render/react/enhancements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAEL,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAiB,EACjB,IAA8B,EAC9B,IAAqB,EACrB,WAA6C,EAC7C,SAA6B,EAC4B,EAAE;IAC3D,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;YAC7C,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC;YAC3B,CAAC,CAAC,QAAQ;QACZ,OAAO;KACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { ChildNodeWalker } from '../../composition/body_node_base';\nimport type { PrimitiveNode } from '../../composition/node';\nimport {\n type EnhancementDefinition,\n resolveEnhancements,\n} from '../../pack/enhancements';\nimport { withNodeAnchors } from '../anchors';\nimport { contextWith } from '../context_view';\n\n/**\n * The `definitions` that apply to `body`, the first of each id and limited to\n * `requested` ids when given, and `context` for a React render of it: carrying\n * their ids as `context.enhancements`, with `context.anchors` on when one\n * declares `anchors: true`. `context` is viewed, not copied, as the HTML\n * surface does.\n */\nexport const applyEnhancements = <TContext>(\n context: TContext,\n body: readonly PrimitiveNode[],\n walk: ChildNodeWalker,\n definitions: readonly EnhancementDefinition[],\n requested?: readonly string[]\n): { context: TContext; applied: EnhancementDefinition[] } => {\n const applied = resolveEnhancements(body, walk, definitions, requested);\n const ids = new Set(applied.map(({ id }) => id));\n const enhanced = contextWith(context, 'enhancements', ids);\n return {\n context: applied.some(({ anchors }) => anchors)\n ? withNodeAnchors(enhanced)\n : enhanced,\n applied,\n };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/react/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
export { renderCompositionContent, wrapCompositionContent, } from './content.js';
|
|
8
|
+
export { applyEnhancements } from './enhancements.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/react/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type CompositionWrapperOptions,\n type ReactContentDispatcher,\n type ReactContentOptions,\n renderCompositionContent,\n wrapCompositionContent,\n} from './content';\nexport { applyEnhancements } from './enhancements';\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PrimitiveNode } from '../../composition/node.js';
|
|
2
|
+
import type { SlackAssetCollector, SlackAssetRequest } from '../../define/slack_assets.js';
|
|
3
|
+
export type { SlackAssetCollector, SlackAssetRequest };
|
|
4
|
+
/**
|
|
5
|
+
* Whether Slack's servers can fetch `src` themselves: an `https:` URL with a
|
|
6
|
+
* host, so a data URL or a host-relative path has to go through an upload.
|
|
7
|
+
*/
|
|
8
|
+
export declare const isSlackReachableImageUrl: (src: string) => boolean;
|
|
9
|
+
/**
|
|
10
|
+
* A fresh {@link SlackAssetCollector} handing out `{prefix}-0`, `{prefix}-1`,
|
|
11
|
+
* … in allocation order. `prefix` defaults to `asset`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const createSlackAssetCollector: <TNode extends PrimitiveNode = PrimitiveNode>(options?: {
|
|
14
|
+
prefix?: string;
|
|
15
|
+
}) => SlackAssetCollector<TNode>;
|
|
16
|
+
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/render/slack/assets.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAKnC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,KAAG,OACP,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACpC,KAAK,SAAS,aAAa,GAAG,aAAa,EAE3C,UAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,KAChC,mBAAmB,CAAC,KAAK,CAqB3B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
import { SLACK_LIMITS } from './blocks.js';
|
|
8
|
+
import { clampSlackText, isAbsoluteHttpUrl } from './format.js';
|
|
9
|
+
/**
|
|
10
|
+
* Whether Slack's servers can fetch `src` themselves: an `https:` URL with a
|
|
11
|
+
* host, so a data URL or a host-relative path has to go through an upload.
|
|
12
|
+
*/
|
|
13
|
+
export const isSlackReachableImageUrl = (src) => /^https:/i.test(src) && isAbsoluteHttpUrl(src);
|
|
14
|
+
/**
|
|
15
|
+
* A fresh {@link SlackAssetCollector} handing out `{prefix}-0`, `{prefix}-1`,
|
|
16
|
+
* … in allocation order. `prefix` defaults to `asset`.
|
|
17
|
+
*/
|
|
18
|
+
export const createSlackAssetCollector = (options = {}) => {
|
|
19
|
+
const prefix = options.prefix ?? 'asset';
|
|
20
|
+
const requests = [];
|
|
21
|
+
let counter = 0;
|
|
22
|
+
return {
|
|
23
|
+
allocate: (node, altText) => {
|
|
24
|
+
const ref = `${prefix}-${counter}`;
|
|
25
|
+
counter += 1;
|
|
26
|
+
// Clamped at allocation so a host reading `requests` for an upload title
|
|
27
|
+
// sees the same string as the block it accompanies.
|
|
28
|
+
requests.push({
|
|
29
|
+
ref,
|
|
30
|
+
node,
|
|
31
|
+
altText: clampSlackText(altText, SLACK_LIMITS.imageAltTextChars),
|
|
32
|
+
});
|
|
33
|
+
return ref;
|
|
34
|
+
},
|
|
35
|
+
get requests() {
|
|
36
|
+
return requests;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/render/slack/assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAI7D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAW,EAAW,EAAE,CAC/D,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAGvC,UAA+B,EAAE,EACL,EAAE;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IACzC,MAAM,QAAQ,GAA+B,EAAE,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,CAAC;YACb,yEAAyE;YACzE,oDAAoD;YACpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG;gBACH,IAAI;gBACJ,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,iBAAiB,CAAC;aACjE,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { PrimitiveNode } from '../../composition/node';\nimport type {\n SlackAssetCollector,\n SlackAssetRequest,\n} from '../../define/slack_assets';\n\nimport { SLACK_LIMITS } from './blocks';\nimport { clampSlackText, isAbsoluteHttpUrl } from './format';\n\nexport type { SlackAssetCollector, SlackAssetRequest };\n\n/**\n * Whether Slack's servers can fetch `src` themselves: an `https:` URL with a\n * host, so a data URL or a host-relative path has to go through an upload.\n */\nexport const isSlackReachableImageUrl = (src: string): boolean =>\n /^https:/i.test(src) && isAbsoluteHttpUrl(src);\n\n/**\n * A fresh {@link SlackAssetCollector} handing out `{prefix}-0`, `{prefix}-1`,\n * … in allocation order. `prefix` defaults to `asset`.\n */\nexport const createSlackAssetCollector = <\n TNode extends PrimitiveNode = PrimitiveNode,\n>(\n options: { prefix?: string } = {}\n): SlackAssetCollector<TNode> => {\n const prefix = options.prefix ?? 'asset';\n const requests: SlackAssetRequest<TNode>[] = [];\n let counter = 0;\n return {\n allocate: (node, altText) => {\n const ref = `${prefix}-${counter}`;\n counter += 1;\n // Clamped at allocation so a host reading `requests` for an upload title\n // sees the same string as the block it accompanies.\n requests.push({\n ref,\n node,\n altText: clampSlackText(altText, SLACK_LIMITS.imageAltTextChars),\n });\n return ref;\n },\n get requests() {\n return requests;\n },\n };\n};\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export type { SlackActionElement, SlackActionsBlock, SlackBlock, SlackButtonElement, SlackCheckboxesElement, SlackContextBlock, SlackDividerBlock, SlackFileReference, SlackHeaderBlock, SlackHeaderLevel, SlackImageBlock, SlackImageElement, SlackMrkdwnTextObject, SlackMultiStaticSelectElement, SlackOptionGroup, SlackOptionObject, SlackOverflowElement, SlackPlainTextObject, SlackRadioButtonsElement, SlackRawTextElement, SlackRichTextBlock, SlackRichTextBlockElement, SlackRichTextInline, SlackRichTextLink, SlackRichTextList, SlackRichTextPreformatted, SlackRichTextQuote, SlackRichTextSection, SlackRichTextStyle, SlackRichTextTag, SlackRichTextText, SlackSectionAccessory, SlackSectionBlock, SlackStaticSelectElement, SlackTableBlock, SlackTableCell, SlackTableColumnSetting, SlackTagColor, SlackTextObject, SlackVideoBlock, } from '../../define/slack_blocks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Slack's published surface limits, enforced by the renderer so a composition
|
|
4
|
+
* cannot silently trip Slack's validation.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SLACK_LIMITS: {
|
|
7
|
+
readonly blocksPerMessage: 50;
|
|
8
|
+
/** `section.text`. */
|
|
9
|
+
readonly sectionTextChars: 3000;
|
|
10
|
+
/** One entry of `section.fields`. */
|
|
11
|
+
readonly sectionFieldChars: 2000;
|
|
12
|
+
/** One entry of `context.elements`. */
|
|
13
|
+
readonly contextElementChars: 2000;
|
|
14
|
+
/** `header.text`, which is `plain_text`. */
|
|
15
|
+
readonly headerTextChars: 150;
|
|
16
|
+
readonly fieldsPerSection: 10;
|
|
17
|
+
/** Elements per `context` block. */
|
|
18
|
+
readonly contextElements: 10;
|
|
19
|
+
readonly buttonsPerActions: 25;
|
|
20
|
+
/** Slack truncates the top-level `text` fallback in notifications around here. */
|
|
21
|
+
readonly fallbackTextChars: 4000;
|
|
22
|
+
/** `plain_text` option labels (selects, radio, checkboxes, overflow). */
|
|
23
|
+
readonly optionTextChars: 75;
|
|
24
|
+
/** Options per select, or per option group of one. */
|
|
25
|
+
readonly optionsPerSelect: 100;
|
|
26
|
+
/** Options per overflow menu (Slack caps overflow at 5). */
|
|
27
|
+
readonly optionsPerOverflow: 5;
|
|
28
|
+
/** Options per radio button group or checkboxes element. */
|
|
29
|
+
readonly optionsPerChoice: 10;
|
|
30
|
+
/** Option groups per select, each holding up to `optionsPerSelect` options. */
|
|
31
|
+
readonly optionGroupsPerSelect: 100;
|
|
32
|
+
/** An option's `value`, which interactions send back. */
|
|
33
|
+
readonly optionValueChars: 150;
|
|
34
|
+
/** A button's `value`. */
|
|
35
|
+
readonly buttonValueChars: 2000;
|
|
36
|
+
/** A button's or overflow option's `url`. */
|
|
37
|
+
readonly urlChars: 3000;
|
|
38
|
+
/** An interactive element's `action_id`. */
|
|
39
|
+
readonly actionIdChars: 255;
|
|
40
|
+
/** Max indent level for `rich_text_list`. */
|
|
41
|
+
readonly richTextListMaxIndent: 8;
|
|
42
|
+
/**
|
|
43
|
+
* Characters across every table cell in one message. Slack publishes the
|
|
44
|
+
* same 10,000 figure per table and per message, so the message-wide
|
|
45
|
+
* aggregate is the binding one.
|
|
46
|
+
* https://docs.slack.dev/reference/block-kit/blocks/table-block/
|
|
47
|
+
*/
|
|
48
|
+
readonly tableCellCharsPerMessage: 10000;
|
|
49
|
+
/** Rows per `table` block (includes the header row). */
|
|
50
|
+
readonly tableRows: 100;
|
|
51
|
+
/** Cells per `table` row / columns per table. */
|
|
52
|
+
readonly tableColumns: 20;
|
|
53
|
+
/** `image`/image-element `image_url` max length. */
|
|
54
|
+
readonly imageUrlChars: 3000;
|
|
55
|
+
/** `image`/image-element `alt_text` max length. */
|
|
56
|
+
readonly imageAltTextChars: 2000;
|
|
57
|
+
/** `image` block `title`. */
|
|
58
|
+
readonly imageTitleChars: 2000;
|
|
59
|
+
/** `video` block `title`; Slack requires fewer than 200. */
|
|
60
|
+
readonly videoTitleChars: 199;
|
|
61
|
+
/** `video` block `description`; Slack requires fewer than 200. */
|
|
62
|
+
readonly videoDescriptionChars: 199;
|
|
63
|
+
/** `video` block `author_name`; Slack requires fewer than 50. */
|
|
64
|
+
readonly videoAuthorNameChars: 49;
|
|
65
|
+
/** `button` element `text`. */
|
|
66
|
+
readonly buttonTextChars: 75;
|
|
67
|
+
/** Select `placeholder`. */
|
|
68
|
+
readonly placeholderChars: 150;
|
|
69
|
+
/** `option_groups[].label`. */
|
|
70
|
+
readonly optionGroupLabelChars: 75;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../src/render/slack/blocks.ts"],"names":[],"mappings":"AAOA,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,YAAY;;IAEvB,sBAAsB;;IAEtB,qCAAqC;;IAErC,uCAAuC;;IAEvC,4CAA4C;;;IAG5C,oCAAoC;;;IAGpC,kFAAkF;;IAElF,yEAAyE;;IAEzE,sDAAsD;;IAEtD,4DAA4D;;IAE5D,4DAA4D;;IAE5D,+EAA+E;;IAE/E,yDAAyD;;IAEzD,0BAA0B;;IAE1B,6CAA6C;;IAE7C,4CAA4C;;IAE5C,6CAA6C;;IAE7C;;;;;OAKG;;IAEH,wDAAwD;;IAExD,iDAAiD;;IAEjD,oDAAoD;;IAEpD,mDAAmD;;IAEnD,6BAA6B;;IAE7B,4DAA4D;;IAE5D,kEAAkE;;IAElE,iEAAiE;;IAEjE,+BAA+B;;IAE/B,4BAA4B;;IAE5B,+BAA+B;;CAEvB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Slack's published surface limits, enforced by the renderer so a composition
|
|
9
|
+
* cannot silently trip Slack's validation.
|
|
10
|
+
*/
|
|
11
|
+
export const SLACK_LIMITS = {
|
|
12
|
+
blocksPerMessage: 50,
|
|
13
|
+
/** `section.text`. */
|
|
14
|
+
sectionTextChars: 3000,
|
|
15
|
+
/** One entry of `section.fields`. */
|
|
16
|
+
sectionFieldChars: 2000,
|
|
17
|
+
/** One entry of `context.elements`. */
|
|
18
|
+
contextElementChars: 2000,
|
|
19
|
+
/** `header.text`, which is `plain_text`. */
|
|
20
|
+
headerTextChars: 150,
|
|
21
|
+
fieldsPerSection: 10,
|
|
22
|
+
/** Elements per `context` block. */
|
|
23
|
+
contextElements: 10,
|
|
24
|
+
buttonsPerActions: 25,
|
|
25
|
+
/** Slack truncates the top-level `text` fallback in notifications around here. */
|
|
26
|
+
fallbackTextChars: 4000,
|
|
27
|
+
/** `plain_text` option labels (selects, radio, checkboxes, overflow). */
|
|
28
|
+
optionTextChars: 75,
|
|
29
|
+
/** Options per select, or per option group of one. */
|
|
30
|
+
optionsPerSelect: 100,
|
|
31
|
+
/** Options per overflow menu (Slack caps overflow at 5). */
|
|
32
|
+
optionsPerOverflow: 5,
|
|
33
|
+
/** Options per radio button group or checkboxes element. */
|
|
34
|
+
optionsPerChoice: 10,
|
|
35
|
+
/** Option groups per select, each holding up to `optionsPerSelect` options. */
|
|
36
|
+
optionGroupsPerSelect: 100,
|
|
37
|
+
/** An option's `value`, which interactions send back. */
|
|
38
|
+
optionValueChars: 150,
|
|
39
|
+
/** A button's `value`. */
|
|
40
|
+
buttonValueChars: 2000,
|
|
41
|
+
/** A button's or overflow option's `url`. */
|
|
42
|
+
urlChars: 3000,
|
|
43
|
+
/** An interactive element's `action_id`. */
|
|
44
|
+
actionIdChars: 255,
|
|
45
|
+
/** Max indent level for `rich_text_list`. */
|
|
46
|
+
richTextListMaxIndent: 8,
|
|
47
|
+
/**
|
|
48
|
+
* Characters across every table cell in one message. Slack publishes the
|
|
49
|
+
* same 10,000 figure per table and per message, so the message-wide
|
|
50
|
+
* aggregate is the binding one.
|
|
51
|
+
* https://docs.slack.dev/reference/block-kit/blocks/table-block/
|
|
52
|
+
*/
|
|
53
|
+
tableCellCharsPerMessage: 10_000,
|
|
54
|
+
/** Rows per `table` block (includes the header row). */
|
|
55
|
+
tableRows: 100,
|
|
56
|
+
/** Cells per `table` row / columns per table. */
|
|
57
|
+
tableColumns: 20,
|
|
58
|
+
/** `image`/image-element `image_url` max length. */
|
|
59
|
+
imageUrlChars: 3000,
|
|
60
|
+
/** `image`/image-element `alt_text` max length. */
|
|
61
|
+
imageAltTextChars: 2000,
|
|
62
|
+
/** `image` block `title`. */
|
|
63
|
+
imageTitleChars: 2000,
|
|
64
|
+
/** `video` block `title`; Slack requires fewer than 200. */
|
|
65
|
+
videoTitleChars: 199,
|
|
66
|
+
/** `video` block `description`; Slack requires fewer than 200. */
|
|
67
|
+
videoDescriptionChars: 199,
|
|
68
|
+
/** `video` block `author_name`; Slack requires fewer than 50. */
|
|
69
|
+
videoAuthorNameChars: 49,
|
|
70
|
+
/** `button` element `text`. */
|
|
71
|
+
buttonTextChars: 75,
|
|
72
|
+
/** Select `placeholder`. */
|
|
73
|
+
placeholderChars: 150,
|
|
74
|
+
/** `option_groups[].label`. */
|
|
75
|
+
optionGroupLabelChars: 75,
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../src/render/slack/blocks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,gBAAgB,EAAE,EAAE;IACpB,sBAAsB;IACtB,gBAAgB,EAAE,IAAI;IACtB,qCAAqC;IACrC,iBAAiB,EAAE,IAAI;IACvB,uCAAuC;IACvC,mBAAmB,EAAE,IAAI;IACzB,4CAA4C;IAC5C,eAAe,EAAE,GAAG;IACpB,gBAAgB,EAAE,EAAE;IACpB,oCAAoC;IACpC,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,kFAAkF;IAClF,iBAAiB,EAAE,IAAI;IACvB,yEAAyE;IACzE,eAAe,EAAE,EAAE;IACnB,sDAAsD;IACtD,gBAAgB,EAAE,GAAG;IACrB,4DAA4D;IAC5D,kBAAkB,EAAE,CAAC;IACrB,4DAA4D;IAC5D,gBAAgB,EAAE,EAAE;IACpB,+EAA+E;IAC/E,qBAAqB,EAAE,GAAG;IAC1B,yDAAyD;IACzD,gBAAgB,EAAE,GAAG;IACrB,0BAA0B;IAC1B,gBAAgB,EAAE,IAAI;IACtB,6CAA6C;IAC7C,QAAQ,EAAE,IAAI;IACd,4CAA4C;IAC5C,aAAa,EAAE,GAAG;IAClB,6CAA6C;IAC7C,qBAAqB,EAAE,CAAC;IACxB;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM;IAChC,wDAAwD;IACxD,SAAS,EAAE,GAAG;IACd,iDAAiD;IACjD,YAAY,EAAE,EAAE;IAChB,oDAAoD;IACpD,aAAa,EAAE,IAAI;IACnB,mDAAmD;IACnD,iBAAiB,EAAE,IAAI;IACvB,6BAA6B;IAC7B,eAAe,EAAE,IAAI;IACrB,4DAA4D;IAC5D,eAAe,EAAE,GAAG;IACpB,kEAAkE;IAClE,qBAAqB,EAAE,GAAG;IAC1B,iEAAiE;IACjE,oBAAoB,EAAE,EAAE;IACxB,+BAA+B;IAC/B,eAAe,EAAE,EAAE;IACnB,4BAA4B;IAC5B,gBAAgB,EAAE,GAAG;IACrB,+BAA+B;IAC/B,qBAAqB,EAAE,EAAE;CACjB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport type {\n SlackActionElement,\n SlackActionsBlock,\n SlackBlock,\n SlackButtonElement,\n SlackCheckboxesElement,\n SlackContextBlock,\n SlackDividerBlock,\n SlackFileReference,\n SlackHeaderBlock,\n SlackHeaderLevel,\n SlackImageBlock,\n SlackImageElement,\n SlackMrkdwnTextObject,\n SlackMultiStaticSelectElement,\n SlackOptionGroup,\n SlackOptionObject,\n SlackOverflowElement,\n SlackPlainTextObject,\n SlackRadioButtonsElement,\n SlackRawTextElement,\n SlackRichTextBlock,\n SlackRichTextBlockElement,\n SlackRichTextInline,\n SlackRichTextLink,\n SlackRichTextList,\n SlackRichTextPreformatted,\n SlackRichTextQuote,\n SlackRichTextSection,\n SlackRichTextStyle,\n SlackRichTextTag,\n SlackRichTextText,\n SlackSectionAccessory,\n SlackSectionBlock,\n SlackStaticSelectElement,\n SlackTableBlock,\n SlackTableCell,\n SlackTableColumnSetting,\n SlackTagColor,\n SlackTextObject,\n SlackVideoBlock,\n} from '../../define/slack_blocks';\n\n/**\n * Slack's published surface limits, enforced by the renderer so a composition\n * cannot silently trip Slack's validation.\n */\nexport const SLACK_LIMITS = {\n blocksPerMessage: 50,\n /** `section.text`. */\n sectionTextChars: 3000,\n /** One entry of `section.fields`. */\n sectionFieldChars: 2000,\n /** One entry of `context.elements`. */\n contextElementChars: 2000,\n /** `header.text`, which is `plain_text`. */\n headerTextChars: 150,\n fieldsPerSection: 10,\n /** Elements per `context` block. */\n contextElements: 10,\n buttonsPerActions: 25,\n /** Slack truncates the top-level `text` fallback in notifications around here. */\n fallbackTextChars: 4000,\n /** `plain_text` option labels (selects, radio, checkboxes, overflow). */\n optionTextChars: 75,\n /** Options per select, or per option group of one. */\n optionsPerSelect: 100,\n /** Options per overflow menu (Slack caps overflow at 5). */\n optionsPerOverflow: 5,\n /** Options per radio button group or checkboxes element. */\n optionsPerChoice: 10,\n /** Option groups per select, each holding up to `optionsPerSelect` options. */\n optionGroupsPerSelect: 100,\n /** An option's `value`, which interactions send back. */\n optionValueChars: 150,\n /** A button's `value`. */\n buttonValueChars: 2000,\n /** A button's or overflow option's `url`. */\n urlChars: 3000,\n /** An interactive element's `action_id`. */\n actionIdChars: 255,\n /** Max indent level for `rich_text_list`. */\n richTextListMaxIndent: 8,\n /**\n * Characters across every table cell in one message. Slack publishes the\n * same 10,000 figure per table and per message, so the message-wide\n * aggregate is the binding one.\n * https://docs.slack.dev/reference/block-kit/blocks/table-block/\n */\n tableCellCharsPerMessage: 10_000,\n /** Rows per `table` block (includes the header row). */\n tableRows: 100,\n /** Cells per `table` row / columns per table. */\n tableColumns: 20,\n /** `image`/image-element `image_url` max length. */\n imageUrlChars: 3000,\n /** `image`/image-element `alt_text` max length. */\n imageAltTextChars: 2000,\n /** `image` block `title`. */\n imageTitleChars: 2000,\n /** `video` block `title`; Slack requires fewer than 200. */\n videoTitleChars: 199,\n /** `video` block `description`; Slack requires fewer than 200. */\n videoDescriptionChars: 199,\n /** `video` block `author_name`; Slack requires fewer than 50. */\n videoAuthorNameChars: 49,\n /** `button` element `text`. */\n buttonTextChars: 75,\n /** Select `placeholder`. */\n placeholderChars: 150,\n /** `option_groups[].label`. */\n optionGroupLabelChars: 75,\n} as const;\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Composition } from '../../composition/composition.js';
|
|
2
|
+
import type { PrimitiveNode } from '../../define/primitive_module.js';
|
|
3
|
+
import type { MarkdownEnvelopeDispatcher } from '../markdown/envelope.js';
|
|
4
|
+
import { type SlackAssetCollector, type SlackAssetRequest } from './assets.js';
|
|
5
|
+
import { type SlackBlock } from './blocks.js';
|
|
6
|
+
/**
|
|
7
|
+
* Adds Block Kit to {@link MarkdownEnvelopeDispatcher}.
|
|
8
|
+
*
|
|
9
|
+
* `renderSlack` may return no blocks, in which case the node contributes
|
|
10
|
+
* nothing — the envelope spreads what it is given and does not degrade. That is
|
|
11
|
+
* the dispatcher's job: it renders the node's markdown instead. The markdown
|
|
12
|
+
* renderer is what that fallback reads, so it stays required even for a pack
|
|
13
|
+
* with full Slack coverage.
|
|
14
|
+
*/
|
|
15
|
+
export interface SlackEnvelopeDispatcher<TNode extends PrimitiveNode> extends MarkdownEnvelopeDispatcher<TNode> {
|
|
16
|
+
/** `collector` is absent unless the caller opted into asset collection, so a renderer must still degrade an image it cannot upload. */
|
|
17
|
+
renderSlack(node: TNode, collector?: SlackAssetCollector): readonly SlackBlock[];
|
|
18
|
+
}
|
|
19
|
+
/** Options for {@link renderSlackEnvelope}. */
|
|
20
|
+
export interface SlackEnvelopeOptions {
|
|
21
|
+
/** Renders the composition's title and subtitle, in the blocks and the fallback `text`. Defaults to `true`. Pass `false` when the host already shows the title, or the body opens with its own. */
|
|
22
|
+
heading?: boolean;
|
|
23
|
+
/** Fallback `text` summary shown in notifications and previews, as `mrkdwn`; defaults to the text render, escaped. */
|
|
24
|
+
text?: string;
|
|
25
|
+
/** Whether to collect image upload requests alongside the blocks. */
|
|
26
|
+
collectAssets?: boolean;
|
|
27
|
+
/** Prefix for allocated asset refs; defaults to `asset`. Distinct prefixes keep merged inventories unique. */
|
|
28
|
+
assetPrefix?: string;
|
|
29
|
+
}
|
|
30
|
+
/** What {@link renderSlackEnvelope} returns: one `chat.postMessage` payload. */
|
|
31
|
+
export interface SlackEnvelopeResult {
|
|
32
|
+
/** Fallback text for the message. */
|
|
33
|
+
text: string;
|
|
34
|
+
/** Block Kit blocks, fitted to Slack's limits. */
|
|
35
|
+
blocks: SlackBlock[];
|
|
36
|
+
/** Images referenced by `blocks` that the host must upload first. */
|
|
37
|
+
assets: SlackAssetRequest[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The composition as a `chat.postMessage` payload: notification `text`, blocks,
|
|
41
|
+
* and the images the host must upload first.
|
|
42
|
+
*
|
|
43
|
+
* Degradation for a node with no `slack` renderer is the dispatcher's, which
|
|
44
|
+
* has to own it to reach a child nested inside a container. The result is
|
|
45
|
+
* fitted to Slack's limits — text is clamped, blocks past a count limit and
|
|
46
|
+
* `rich_text` elements past a section's limit split, tables past a table limit
|
|
47
|
+
* or the message's cell budget become rich text, spacers and then whole blocks
|
|
48
|
+
* are dropped — so the output is always postable. `assets` stays empty
|
|
49
|
+
* unless `collectAssets` is set.
|
|
50
|
+
*/
|
|
51
|
+
export declare const renderSlackEnvelope: <TNode extends PrimitiveNode>(composition: Composition<TNode>, dispatcher: SlackEnvelopeDispatcher<TNode>, options?: SlackEnvelopeOptions) => SlackEnvelopeResult;
|
|
52
|
+
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/render/slack/envelope.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAGL,KAAK,UAAU,EAahB,MAAM,UAAU,CAAC;AAUlB;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB,CACtC,KAAK,SAAS,aAAa,CAC3B,SAAQ,0BAA0B,CAAC,KAAK,CAAC;IACzC,uIAAuI;IACvI,WAAW,CACT,IAAI,EAAE,KAAK,EACX,SAAS,CAAC,EAAE,mBAAmB,GAC9B,SAAS,UAAU,EAAE,CAAC;CAC1B;AAED,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,mMAAmM;IACnM,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sHAAsH;IACtH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,SAAS,aAAa,EAC7D,aAAa,WAAW,CAAC,KAAK,CAAC,EAC/B,YAAY,uBAAuB,CAAC,KAAK,CAAC,EAC1C,UAAS,oBAAyB,KACjC,mBA2CF,CAAC"}
|