@elastic/isomer-sdk 0.2.0 → 0.4.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/NOTICE.txt +0 -286
- package/THIRD_PARTY_LICENSES.md +1 -885
- package/dist/author/authored_fields.d.ts +37 -12
- package/dist/author/authored_fields.d.ts.map +1 -1
- package/dist/author/authored_fields.js +45 -69
- package/dist/author/authored_fields.js.map +1 -1
- package/dist/author/authoring_input.d.ts.map +1 -1
- package/dist/author/authoring_input.js +12 -6
- package/dist/author/authoring_input.js.map +1 -1
- package/dist/author/authoring_model.d.ts +8 -2
- package/dist/author/authoring_model.d.ts.map +1 -1
- package/dist/author/authoring_model.js +67 -23
- package/dist/author/authoring_model.js.map +1 -1
- package/dist/author/declarations.d.ts.map +1 -1
- package/dist/author/declarations.js +45 -34
- package/dist/author/declarations.js.map +1 -1
- package/dist/author/index.d.ts +2 -1
- package/dist/author/index.d.ts.map +1 -1
- package/dist/author/index.js +2 -1
- package/dist/author/index.js.map +1 -1
- package/dist/author/jsx_shim.d.ts +49 -30
- package/dist/author/jsx_shim.d.ts.map +1 -1
- package/dist/author/jsx_shim.js +131 -40
- package/dist/author/jsx_shim.js.map +1 -1
- package/dist/author/print_jsx.d.ts +19 -0
- package/dist/author/print_jsx.d.ts.map +1 -0
- package/dist/author/print_jsx.js +372 -0
- package/dist/author/print_jsx.js.map +1 -0
- package/dist/author/prompt.d.ts +2 -2
- package/dist/author/prompt.d.ts.map +1 -1
- package/dist/author/prompt.js +7 -2
- package/dist/author/prompt.js.map +1 -1
- package/dist/author/schema_to_typescript.d.ts.map +1 -1
- package/dist/author/schema_to_typescript.js +6 -3
- package/dist/author/schema_to_typescript.js.map +1 -1
- package/dist/cjs/author/authored_fields.js +47 -70
- package/dist/cjs/author/authored_fields.js.map +1 -1
- package/dist/cjs/author/authoring_input.js +12 -6
- package/dist/cjs/author/authoring_input.js.map +1 -1
- package/dist/cjs/author/authoring_model.js +69 -24
- package/dist/cjs/author/authoring_model.js.map +1 -1
- package/dist/cjs/author/declarations.js +44 -33
- package/dist/cjs/author/declarations.js.map +1 -1
- package/dist/cjs/author/index.js +5 -1
- package/dist/cjs/author/index.js.map +1 -1
- package/dist/cjs/author/jsx_shim.js +130 -39
- package/dist/cjs/author/jsx_shim.js.map +1 -1
- package/dist/cjs/author/print_jsx.js +378 -0
- package/dist/cjs/author/print_jsx.js.map +1 -0
- package/dist/cjs/author/prompt.js +7 -2
- package/dist/cjs/author/prompt.js.map +1 -1
- package/dist/cjs/author/schema_to_typescript.js +6 -3
- package/dist/cjs/author/schema_to_typescript.js.map +1 -1
- package/dist/cjs/composition/error.js +2 -0
- package/dist/cjs/composition/error.js.map +1 -1
- package/dist/cjs/composition/structured_value.js.map +1 -1
- package/dist/cjs/define/index.js.map +1 -1
- package/dist/cjs/define/primitive_module.js +10 -4
- package/dist/cjs/define/primitive_module.js.map +1 -1
- package/dist/cjs/define/slack_blocks.js.map +1 -1
- package/dist/cjs/entries/index.js +5 -2
- package/dist/cjs/entries/index.js.map +1 -1
- package/dist/cjs/entries/markdown.js +3 -1
- package/dist/cjs/entries/markdown.js.map +1 -1
- package/dist/cjs/entries/react.js +2 -1
- package/dist/cjs/entries/react.js.map +1 -1
- package/dist/cjs/entries/slack.js +5 -1
- package/dist/cjs/entries/slack.js.map +1 -1
- package/dist/cjs/pack/enhancements.js.map +1 -1
- package/dist/cjs/pack/index.js +2 -1
- package/dist/cjs/pack/index.js.map +1 -1
- package/dist/cjs/pack/primitive_pack.js +14 -4
- package/dist/cjs/pack/primitive_pack.js.map +1 -1
- package/dist/cjs/render/format_number.js +2 -1
- package/dist/cjs/render/format_number.js.map +1 -1
- package/dist/cjs/render/html/envelope.js +12 -6
- package/dist/cjs/render/html/envelope.js.map +1 -1
- package/dist/cjs/render/markdown/blocks.js +82 -0
- package/dist/cjs/render/markdown/blocks.js.map +1 -0
- package/dist/cjs/render/markdown/builder.js +6 -2
- package/dist/cjs/render/markdown/builder.js.map +1 -1
- package/dist/cjs/render/markdown/format.js +46 -24
- package/dist/cjs/render/markdown/format.js.map +1 -1
- package/dist/cjs/render/markdown/host_tags.js +67 -0
- package/dist/cjs/render/markdown/host_tags.js.map +1 -0
- package/dist/cjs/render/markdown/index.js +5 -1
- package/dist/cjs/render/markdown/index.js.map +1 -1
- package/dist/cjs/render/markdown/split.js +325 -0
- package/dist/cjs/render/markdown/split.js.map +1 -0
- package/dist/cjs/render/primitive_dispatch.js +36 -6
- package/dist/cjs/render/primitive_dispatch.js.map +1 -1
- package/dist/cjs/render/react/content.js +3 -1
- package/dist/cjs/render/react/content.js.map +1 -1
- package/dist/cjs/render/react/index.js +3 -1
- package/dist/cjs/render/react/index.js.map +1 -1
- package/dist/cjs/render/react/markdown_content.js +143 -0
- package/dist/cjs/render/react/markdown_content.js.map +1 -0
- package/dist/cjs/render/slack/blocks.js +7 -0
- package/dist/cjs/render/slack/blocks.js.map +1 -1
- package/dist/cjs/render/slack/container.js +62 -0
- package/dist/cjs/render/slack/container.js.map +1 -0
- package/dist/cjs/render/slack/envelope.js +70 -14
- package/dist/cjs/render/slack/envelope.js.map +1 -1
- package/dist/cjs/render/slack/format.js +56 -6
- package/dist/cjs/render/slack/format.js.map +1 -1
- package/dist/cjs/render/slack/index.js +7 -1
- package/dist/cjs/render/slack/index.js.map +1 -1
- package/dist/cjs/render/slack/markdown_content.js +36 -77
- package/dist/cjs/render/slack/markdown_content.js.map +1 -1
- package/dist/cjs/render/slack/unmodeled.js +38 -0
- package/dist/cjs/render/slack/unmodeled.js.map +1 -0
- package/dist/cjs/testing/conformance.js +15 -1
- package/dist/cjs/testing/conformance.js.map +1 -1
- package/dist/cjs/testing/index.js +2 -1
- package/dist/cjs/testing/index.js.map +1 -1
- package/dist/cjs/validate/json_schema.js +10 -3
- package/dist/cjs/validate/json_schema.js.map +1 -1
- package/dist/cjs/validate/url.js +2 -1
- package/dist/cjs/validate/url.js.map +1 -1
- package/dist/composition/error.d.ts +2 -0
- package/dist/composition/error.d.ts.map +1 -1
- package/dist/composition/error.js +2 -0
- package/dist/composition/error.js.map +1 -1
- package/dist/composition/structured_value.d.ts +3 -3
- package/dist/composition/structured_value.d.ts.map +1 -1
- package/dist/composition/structured_value.js.map +1 -1
- package/dist/define/index.d.ts +1 -1
- package/dist/define/index.d.ts.map +1 -1
- package/dist/define/index.js.map +1 -1
- package/dist/define/primitive_module.d.ts +14 -5
- package/dist/define/primitive_module.d.ts.map +1 -1
- package/dist/define/primitive_module.js +10 -4
- package/dist/define/primitive_module.js.map +1 -1
- package/dist/define/slack_blocks.d.ts +31 -1
- package/dist/define/slack_blocks.d.ts.map +1 -1
- package/dist/define/slack_blocks.js.map +1 -1
- package/dist/entries/index.d.ts +2 -2
- package/dist/entries/index.d.ts.map +1 -1
- package/dist/entries/index.js +2 -2
- package/dist/entries/index.js.map +1 -1
- package/dist/entries/markdown.d.ts +1 -1
- package/dist/entries/markdown.d.ts.map +1 -1
- package/dist/entries/markdown.js +1 -1
- package/dist/entries/markdown.js.map +1 -1
- package/dist/entries/react.d.ts +1 -1
- package/dist/entries/react.d.ts.map +1 -1
- package/dist/entries/react.js +1 -1
- package/dist/entries/react.js.map +1 -1
- package/dist/entries/slack.d.ts +1 -1
- package/dist/entries/slack.d.ts.map +1 -1
- package/dist/entries/slack.js +1 -1
- package/dist/entries/slack.js.map +1 -1
- package/dist/pack/enhancements.d.ts +4 -0
- package/dist/pack/enhancements.d.ts.map +1 -1
- package/dist/pack/enhancements.js.map +1 -1
- package/dist/pack/index.d.ts +1 -1
- package/dist/pack/index.d.ts.map +1 -1
- package/dist/pack/index.js +1 -1
- package/dist/pack/index.js.map +1 -1
- package/dist/pack/primitive_pack.d.ts +3 -1
- package/dist/pack/primitive_pack.d.ts.map +1 -1
- package/dist/pack/primitive_pack.js +13 -3
- package/dist/pack/primitive_pack.js.map +1 -1
- package/dist/render/format_number.d.ts.map +1 -1
- package/dist/render/format_number.js +2 -1
- package/dist/render/format_number.js.map +1 -1
- package/dist/render/html/envelope.js +12 -6
- package/dist/render/html/envelope.js.map +1 -1
- package/dist/render/markdown/blocks.d.ts +6 -0
- package/dist/render/markdown/blocks.d.ts.map +1 -0
- package/dist/render/markdown/blocks.js +77 -0
- package/dist/render/markdown/blocks.js.map +1 -0
- package/dist/render/markdown/builder.d.ts +3 -0
- package/dist/render/markdown/builder.d.ts.map +1 -1
- package/dist/render/markdown/builder.js +3 -1
- package/dist/render/markdown/builder.js.map +1 -1
- package/dist/render/markdown/format.d.ts +2 -0
- package/dist/render/markdown/format.d.ts.map +1 -1
- package/dist/render/markdown/format.js +42 -22
- package/dist/render/markdown/format.js.map +1 -1
- package/dist/render/markdown/host_tags.d.ts +14 -0
- package/dist/render/markdown/host_tags.d.ts.map +1 -0
- package/dist/render/markdown/host_tags.js +63 -0
- package/dist/render/markdown/host_tags.js.map +1 -0
- package/dist/render/markdown/index.d.ts +2 -0
- package/dist/render/markdown/index.d.ts.map +1 -1
- package/dist/render/markdown/index.js +2 -0
- package/dist/render/markdown/index.js.map +1 -1
- package/dist/render/markdown/split.d.ts +32 -0
- package/dist/render/markdown/split.d.ts.map +1 -0
- package/dist/render/markdown/split.js +321 -0
- package/dist/render/markdown/split.js.map +1 -0
- package/dist/render/primitive_dispatch.d.ts +4 -2
- package/dist/render/primitive_dispatch.d.ts.map +1 -1
- package/dist/render/primitive_dispatch.js +36 -6
- package/dist/render/primitive_dispatch.js.map +1 -1
- package/dist/render/react/content.d.ts +1 -1
- package/dist/render/react/content.d.ts.map +1 -1
- package/dist/render/react/content.js +3 -1
- package/dist/render/react/content.js.map +1 -1
- package/dist/render/react/index.d.ts +1 -0
- package/dist/render/react/index.d.ts.map +1 -1
- package/dist/render/react/index.js +1 -0
- package/dist/render/react/index.js.map +1 -1
- package/dist/render/react/markdown_content.d.ts +9 -0
- package/dist/render/react/markdown_content.d.ts.map +1 -0
- package/dist/render/react/markdown_content.js +139 -0
- package/dist/render/react/markdown_content.js.map +1 -0
- package/dist/render/slack/blocks.d.ts +8 -1
- package/dist/render/slack/blocks.d.ts.map +1 -1
- package/dist/render/slack/blocks.js +7 -0
- package/dist/render/slack/blocks.js.map +1 -1
- package/dist/render/slack/container.d.ts +25 -0
- package/dist/render/slack/container.d.ts.map +1 -0
- package/dist/render/slack/container.js +55 -0
- package/dist/render/slack/container.js.map +1 -0
- package/dist/render/slack/envelope.d.ts +6 -4
- package/dist/render/slack/envelope.d.ts.map +1 -1
- package/dist/render/slack/envelope.js +71 -15
- package/dist/render/slack/envelope.js.map +1 -1
- package/dist/render/slack/format.d.ts +15 -3
- package/dist/render/slack/format.d.ts.map +1 -1
- package/dist/render/slack/format.js +54 -5
- package/dist/render/slack/format.js.map +1 -1
- package/dist/render/slack/index.d.ts +4 -2
- package/dist/render/slack/index.d.ts.map +1 -1
- package/dist/render/slack/index.js +2 -0
- package/dist/render/slack/index.js.map +1 -1
- package/dist/render/slack/markdown_content.d.ts +3 -2
- package/dist/render/slack/markdown_content.d.ts.map +1 -1
- package/dist/render/slack/markdown_content.js +27 -68
- package/dist/render/slack/markdown_content.js.map +1 -1
- package/dist/render/slack/unmodeled.d.ts +16 -0
- package/dist/render/slack/unmodeled.d.ts.map +1 -0
- package/dist/render/slack/unmodeled.js +32 -0
- package/dist/render/slack/unmodeled.js.map +1 -0
- package/dist/testing/conformance.d.ts +3 -1
- package/dist/testing/conformance.d.ts.map +1 -1
- package/dist/testing/conformance.js +14 -0
- package/dist/testing/conformance.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/validate/json_schema.d.ts.map +1 -1
- package/dist/validate/json_schema.js +10 -3
- package/dist/validate/json_schema.js.map +1 -1
- package/dist/validate/url.d.ts.map +1 -1
- package/dist/validate/url.js +2 -1
- package/dist/validate/url.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../../src/render/slack/envelope.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 type { Composition } from '../../composition/composition';\nimport type { PrimitiveNode } from '../../define/primitive_module';\nimport type { MarkdownEnvelopeDispatcher } from '../markdown/envelope';\nimport { renderTextEnvelope } from '../text/envelope';\n\nimport {\n createSlackAssetCollector,\n type SlackAssetCollector,\n type SlackAssetRequest,\n} from './assets';\nimport {\n SLACK_LIMITS,\n type SlackActionElement,\n type SlackBlock,\n type SlackContextBlock,\n type SlackHeaderBlock,\n type SlackMrkdwnTextObject,\n type SlackOptionObject,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextSection,\n type SlackRichTextText,\n type SlackSectionBlock,\n type SlackTableBlock,\n type SlackTableCell,\n type SlackTextObject,\n} from './blocks';\nimport {\n clampMrkdwn,\n clampSlackText,\n cutSlackValue,\n escapeMrkdwn,\n formatHeaderText,\n italic,\n} from './format';\n\n/**\n * Adds Block Kit to {@link MarkdownEnvelopeDispatcher}.\n *\n * `renderSlack` may return no blocks, in which case the node contributes\n * nothing — the envelope spreads what it is given and does not degrade. That is\n * the dispatcher's job: it renders the node's markdown instead. The markdown\n * renderer is what that fallback reads, so it stays required even for a pack\n * with full Slack coverage.\n */\nexport interface SlackEnvelopeDispatcher<\n TNode extends PrimitiveNode,\n> extends MarkdownEnvelopeDispatcher<TNode> {\n /** `collector` is absent unless the caller opted into asset collection, so a renderer must still degrade an image it cannot upload. */\n renderSlack(\n node: TNode,\n collector?: SlackAssetCollector\n ): readonly SlackBlock[];\n}\n\n/** Options for {@link renderSlackEnvelope}. */\nexport interface SlackEnvelopeOptions {\n /** 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. */\n heading?: boolean;\n /** Fallback `text` summary shown in notifications and previews, as `mrkdwn`; defaults to the text render, escaped. */\n text?: string;\n /** Whether to collect image upload requests alongside the blocks. */\n collectAssets?: boolean;\n /** Prefix for allocated asset refs; defaults to `asset`. Distinct prefixes keep merged inventories unique. */\n assetPrefix?: string;\n}\n\n/** What {@link renderSlackEnvelope} returns: one `chat.postMessage` payload. */\nexport interface SlackEnvelopeResult {\n /** Fallback text for the message. */\n text: string;\n /** Block Kit blocks, fitted to Slack's limits. */\n blocks: SlackBlock[];\n /** Images referenced by `blocks` that the host must upload first. */\n assets: SlackAssetRequest[];\n}\n\n/**\n * The composition as a `chat.postMessage` payload: notification `text`, blocks,\n * and the images the host must upload first.\n *\n * Degradation for a node with no `slack` renderer is the dispatcher's, which\n * has to own it to reach a child nested inside a container. The result is\n * fitted to Slack's limits — text is clamped, blocks past a count limit and\n * `rich_text` elements past a section's limit split, tables past a table limit\n * or the message's cell budget become rich text, spacers and then whole blocks\n * are dropped — so the output is always postable. `assets` stays empty\n * unless `collectAssets` is set.\n */\nexport const renderSlackEnvelope = <TNode extends PrimitiveNode>(\n composition: Composition<TNode>,\n dispatcher: SlackEnvelopeDispatcher<TNode>,\n options: SlackEnvelopeOptions = {}\n): SlackEnvelopeResult => {\n const blocks: SlackBlock[] = [];\n // The collector is opt-in: without it, charts keep their markdown/text\n // degradation and non-reachable images degrade to a link/text section, so\n // default output is safe for callers that cannot upload files.\n const collector = options.collectAssets\n ? createSlackAssetCollector(\n options.assetPrefix === undefined ? {} : { prefix: options.assetPrefix }\n )\n : undefined;\n\n const { heading = true } = options;\n if (heading && composition.title) {\n blocks.push(headerBlock(composition.title, 1));\n }\n if (heading && composition.subtitle) {\n blocks.push(contextBlock([escapeMrkdwn(composition.subtitle)]));\n }\n for (const node of composition.body) {\n blocks.push(...dispatcher.renderSlack(node, collector).flatMap(fitBlock));\n }\n\n // Split after the rhythm, so the fragments of one block read as one.\n const rhythm = applySectionRhythm(\n coalesceFieldSections(enforceTableLimits(blocks))\n ).flatMap(splitBlockCounts);\n const budgeted = enforceBlockBudget(rhythm);\n // Only ask the host to upload assets whose placeholder block survived the\n // budget; blocks elided by `enforceBlockBudget` are never posted, so\n // uploading their files would be wasted (and orphaned) work.\n const keptRefs = collectSlackFileRefs(budgeted);\n\n return {\n text: clampMrkdwn(\n options.text ??\n escapeMrkdwn(renderTextEnvelope(composition, dispatcher, { heading })),\n SLACK_LIMITS.fallbackTextChars\n ),\n blocks: budgeted,\n assets: collector\n ? collector.requests.filter((request) => keptRefs.has(request.ref))\n : [],\n };\n};\n\nconst clampText = <TText extends SlackTextObject>(\n text: TText,\n max: number\n): TText =>\n text.text.length <= max\n ? text\n : {\n ...text,\n text: (text.type === 'mrkdwn' ? clampMrkdwn : clampSlackText)(\n text.text,\n max\n ),\n };\n\nconst fitsImageUrl = ({ image_url }: { image_url?: string }): boolean =>\n image_url === undefined || image_url.length <= SLACK_LIMITS.imageUrlChars;\n\nconst clampAlt = <TImage extends { alt_text: string }>(\n image: TImage\n): TImage =>\n image.alt_text.length <= SLACK_LIMITS.imageAltTextChars\n ? image\n : {\n ...image,\n alt_text: clampSlackText(\n image.alt_text,\n SLACK_LIMITS.imageAltTextChars\n ),\n };\n\n// A cut URL would point somewhere else, so one past the limit is dropped.\nconst withoutLongUrl = <T extends { url?: string }>(element: T): T => {\n if (\n element.url === undefined ||\n element.url.length <= SLACK_LIMITS.urlChars\n ) {\n return element;\n }\n const { url: _dropped, ...rest } = element;\n return rest as T;\n};\n\nconst optionValue = (value: string): string =>\n cutSlackValue(value, SLACK_LIMITS.optionValueChars);\n\nconst clampOption = (option: SlackOptionObject): SlackOptionObject =>\n withoutLongUrl({\n ...option,\n text: clampText(option.text, SLACK_LIMITS.optionTextChars),\n value: optionValue(option.value),\n ...(option.description && {\n description: clampText(option.description, SLACK_LIMITS.optionTextChars),\n }),\n });\n\nconst clampControl = (element: SlackActionElement): SlackActionElement => {\n const actionId =\n element.action_id === undefined\n ? {}\n : {\n action_id: cutSlackValue(\n element.action_id,\n SLACK_LIMITS.actionIdChars\n ),\n };\n if (element.type === 'button') {\n return withoutLongUrl({\n ...element,\n ...actionId,\n text: clampText(element.text, SLACK_LIMITS.buttonTextChars),\n ...(element.value !== undefined && {\n value: cutSlackValue(element.value, SLACK_LIMITS.buttonValueChars),\n }),\n });\n }\n const menu = { ...element, ...actionId };\n const maxOptions =\n menu.type === 'overflow'\n ? SLACK_LIMITS.optionsPerOverflow\n : menu.type === 'radio_buttons' || menu.type === 'checkboxes'\n ? SLACK_LIMITS.optionsPerChoice\n : SLACK_LIMITS.optionsPerSelect;\n if (menu.options) {\n menu.options = menu.options.slice(0, maxOptions).map(clampOption);\n }\n if ('placeholder' in menu && menu.placeholder) {\n menu.placeholder = clampText(\n menu.placeholder,\n SLACK_LIMITS.placeholderChars\n );\n }\n if ('option_groups' in menu && menu.option_groups) {\n menu.option_groups = menu.option_groups\n .slice(0, SLACK_LIMITS.optionGroupsPerSelect)\n .map((group) => ({\n ...group,\n label: clampText(group.label, SLACK_LIMITS.optionGroupLabelChars),\n options: group.options.slice(0, maxOptions).map(clampOption),\n }));\n }\n // Slack requires an initial option to equal one it emits, so each is\n // replaced by the emitted option of the same value, or dropped.\n const emitted = new Map(\n [\n ...(menu.options ?? []),\n ...(('option_groups' in menu && menu.option_groups) || []).flatMap(\n ({ options }) => options\n ),\n ].map((option) => [option.value, option])\n );\n if ('initial_option' in menu && menu.initial_option) {\n const match = emitted.get(optionValue(menu.initial_option.value));\n if (match) {\n menu.initial_option = match;\n } else {\n delete menu.initial_option;\n }\n }\n if ('initial_options' in menu && menu.initial_options) {\n const matches = menu.initial_options.flatMap(({ value }) => {\n const match = emitted.get(optionValue(value));\n return match ? [match] : [];\n });\n if (matches.length > 0) {\n menu.initial_options = matches;\n } else {\n delete menu.initial_options;\n }\n }\n return menu;\n};\n\nconst chunks = <T>(items: readonly T[], size: number): T[][] =>\n Array.from({ length: Math.ceil(items.length / size) }, (_, index) =>\n items.slice(index * size, (index + 1) * size)\n );\n\n// Splits a block past a count limit into blocks of its type. Only the first\n// keeps a `block_id`, which Slack requires to be unique.\nconst splitBlockCounts = (block: SlackBlock): SlackBlock[] => {\n switch (block.type) {\n case 'context':\n return chunks(block.elements, SLACK_LIMITS.contextElements).map(\n (elements, index) =>\n index === 0 ? { ...block, elements } : { type: 'context', elements }\n );\n case 'actions':\n return chunks(block.elements, SLACK_LIMITS.buttonsPerActions).map(\n (elements, index) =>\n index === 0 ? { ...block, elements } : { type: 'actions', elements }\n );\n case 'section': {\n if (\n !block.fields ||\n block.fields.length <= SLACK_LIMITS.fieldsPerSection\n ) {\n return [block];\n }\n return chunks(block.fields, SLACK_LIMITS.fieldsPerSection).map(\n (fields, index) =>\n index === 0 ? { ...block, fields } : { type: 'section', fields }\n );\n }\n default:\n return [block];\n }\n};\n\n// An image whose URL Slack would reject leaves its alt text.\nconst fitImageUrls = (block: SlackBlock): SlackBlock[] => {\n switch (block.type) {\n case 'image':\n return fitsImageUrl(block)\n ? [block]\n : block.alt_text\n ? [contextBlock([escapeMrkdwn(block.alt_text)])]\n : [];\n case 'context':\n return [\n {\n ...block,\n elements: block.elements.flatMap((element) =>\n element.type !== 'image' || fitsImageUrl(element)\n ? [element]\n : element.alt_text\n ? [{ type: 'mrkdwn', text: escapeMrkdwn(element.alt_text) }]\n : []\n ),\n },\n ];\n case 'section': {\n if (block.accessory?.type !== 'image' || fitsImageUrl(block.accessory)) {\n return [block];\n }\n const { accessory, ...rest } = block;\n return accessory.alt_text\n ? [rest, contextBlock([escapeMrkdwn(accessory.alt_text)])]\n : [rest];\n }\n default:\n return [block];\n }\n};\n\nconst fitBlock = (block: SlackBlock): SlackBlock[] =>\n fitImageUrls(block).map(clampBlockText);\n\n// Pack renderers build their own blocks, and one overlong text makes Slack\n// reject the whole message.\nconst clampBlockText = (block: SlackBlock): SlackBlock => {\n switch (block.type) {\n case 'header':\n return {\n ...block,\n text: clampText(block.text, SLACK_LIMITS.headerTextChars),\n };\n case 'section':\n return {\n ...block,\n ...(block.text && {\n text: clampText(block.text, SLACK_LIMITS.sectionTextChars),\n }),\n ...(block.fields && {\n fields: block.fields.map((field) =>\n clampText(field, SLACK_LIMITS.sectionFieldChars)\n ),\n }),\n ...(block.accessory && {\n accessory:\n block.accessory.type === 'image'\n ? clampAlt(block.accessory)\n : clampControl(block.accessory),\n }),\n };\n case 'rich_text':\n return {\n ...block,\n elements: block.elements.flatMap(splitRichTextElement),\n };\n case 'context':\n return {\n ...block,\n elements: block.elements.map((element) =>\n element.type === 'image'\n ? clampAlt(element)\n : clampText(element, SLACK_LIMITS.contextElementChars)\n ),\n };\n case 'image':\n return {\n ...clampAlt(block),\n ...(block.title && {\n title: clampText(block.title, SLACK_LIMITS.imageTitleChars),\n }),\n };\n case 'video':\n return {\n ...block,\n title: clampText(block.title, SLACK_LIMITS.videoTitleChars),\n ...(block.description && {\n description: clampText(\n block.description,\n SLACK_LIMITS.videoDescriptionChars\n ),\n }),\n ...(block.author_name !== undefined && {\n author_name: clampSlackText(\n block.author_name,\n SLACK_LIMITS.videoAuthorNameChars\n ),\n }),\n };\n case 'actions':\n return { ...block, elements: block.elements.map(clampControl) };\n default:\n return block;\n }\n};\n\nconst collectSlackFileRefs = (\n blocks: readonly SlackBlock[]\n): ReadonlySet<string> => {\n const refs = new Set<string>();\n for (const block of blocks) {\n if (block.type === 'image' && block.slack_file?.ref !== undefined) {\n refs.add(block.slack_file.ref);\n }\n }\n return refs;\n};\n\nconst headerBlock = (\n title: string,\n level?: SlackHeaderBlock['level']\n): SlackHeaderBlock => ({\n type: 'header',\n text: { type: 'plain_text', text: formatHeaderText(title), emoji: true },\n ...(level !== undefined ? { level } : {}),\n});\n\nconst contextBlock = (lines: ReadonlyArray<string>): SlackContextBlock => ({\n type: 'context',\n elements: lines\n .filter((line): line is string => line !== undefined && line.length > 0)\n .map((text) => ({\n type: 'mrkdwn',\n text: clampMrkdwn(text, SLACK_LIMITS.contextElementChars),\n })),\n});\n\nconst SLACK_SPACER_TEXT = ' ';\n\nconst slackSpacerBlock = (): SlackSectionBlock => ({\n type: 'section',\n text: { type: 'mrkdwn', text: SLACK_SPACER_TEXT },\n});\n\nconst isSpacer = (block: SlackBlock): boolean =>\n block.type === 'section' &&\n block.text?.type === 'mrkdwn' &&\n block.text.text === SLACK_SPACER_TEXT &&\n block.fields === undefined &&\n block.accessory === undefined;\n\nconst isFieldsOnly = (\n block: SlackBlock\n): block is SlackSectionBlock & { fields: SlackMrkdwnTextObject[] } =>\n block.type === 'section' &&\n (block.fields?.length ?? 0) > 0 &&\n block.text === undefined &&\n block.accessory === undefined;\n\nconst isContent = (block: SlackBlock): boolean =>\n block.type !== 'header' &&\n block.type !== 'divider' &&\n block.type !== 'actions' &&\n block.type !== 'context' &&\n !isSpacer(block);\n\n// Consecutive 1-field sections pack into Slack's two-column `fields` grid.\n// A section that already has 2+ fields is a finished batch (e.g. a\n// description list) and is left alone.\nconst coalesceFieldSections = (blocks: readonly SlackBlock[]): SlackBlock[] => {\n const out: SlackBlock[] = [];\n let index = 0;\n while (index < blocks.length) {\n const block = blocks[index]!;\n if (isFieldsOnly(block) && block.fields?.length === 1) {\n const fields = [...block.fields];\n index += 1;\n while (index < blocks.length) {\n const next = blocks[index]!;\n if (\n !isFieldsOnly(next) ||\n next.fields.length !== 1 ||\n fields.length >= SLACK_LIMITS.fieldsPerSection\n ) {\n break;\n }\n fields.push(...next.fields);\n index += 1;\n }\n out.push({ type: 'section', fields });\n continue;\n }\n out.push(block);\n index += 1;\n }\n return out;\n};\n\n// Divider before every section heading (and trailing actions) after the\n// composition title; spacer after each content run except a table already\n// about to be followed by a divider. Consecutive field-only sections are\n// not spaced — they read as one grid.\nconst applySectionRhythm = (blocks: readonly SlackBlock[]): SlackBlock[] => {\n if (blocks.length === 0) {\n return [];\n }\n const out: SlackBlock[] = [];\n for (let index = 0; index < blocks.length; index += 1) {\n const block = blocks[index]!;\n const prev = out[out.length - 1];\n const needsDividerBefore =\n (block.type === 'header' && out.length > 0) || block.type === 'actions';\n if (needsDividerBefore && prev && prev.type !== 'divider') {\n if (isContent(prev) && prev.type !== 'table') {\n out.push(slackSpacerBlock());\n }\n out.push({ type: 'divider' });\n }\n out.push(block);\n if (isContent(block) && index + 1 < blocks.length) {\n const next = blocks[index + 1]!;\n if (isContent(next) && !(isFieldsOnly(block) && isFieldsOnly(next))) {\n out.push(slackSpacerBlock());\n }\n }\n }\n return out;\n};\n\nconst truncateWithNotice = (blocks: SlackBlock[]): SlackBlock[] => {\n const kept = blocks.slice(0, SLACK_LIMITS.blocksPerMessage - 1);\n const dropped = blocks.length - kept.length;\n kept.push(\n contextBlock([\n italic(`+${dropped} more blocks elided to fit Slack's limit.`),\n ])\n );\n return kept;\n};\n\nconst richTextInlineText = (inline: SlackRichTextInline): string =>\n inline.type === 'link' ? (inline.text ?? inline.url) : inline.text;\n\nconst richTextElementText = (element: SlackRichTextBlockElement): string =>\n element.type === 'rich_text_list'\n ? element.elements.map(richTextElementText).join('')\n : element.elements.map(richTextInlineText).join('');\n\nconst tableCellText = (cell: SlackTableCell): string =>\n cell.type === 'raw_text'\n ? cell.text\n : cell.elements.map(richTextElementText).join('');\n\nconst tableCharCount = (block: SlackTableBlock): number =>\n block.rows.reduce(\n (total, row) =>\n total + row.reduce((sum, cell) => sum + tableCellText(cell).length, 0),\n 0\n );\n\nconst textRun = (text: string): SlackRichTextText => ({ type: 'text', text });\n\nconst richSection = (\n elements: SlackRichTextInline[]\n): SlackRichTextSection => ({ type: 'rich_text_section', elements });\n\nconst rowBreak = (): SlackRichTextSection => richSection([textRun('\\n')]);\n\nconst cellElements = (\n cell: SlackTableCell | undefined\n): SlackRichTextBlockElement[] => {\n if (cell?.type === 'rich_text') {\n return cell.elements.filter(({ elements }) => elements.length > 0);\n }\n return cell?.text ? [richSection([textRun(cell.text)])] : [];\n};\n\nconst boldInline = (inline: SlackRichTextInline): SlackRichTextInline => ({\n ...inline,\n style: { ...inline.style, bold: true },\n});\n\nconst boldElement = (\n element: SlackRichTextBlockElement\n): SlackRichTextBlockElement =>\n element.type === 'rich_text_list'\n ? {\n ...element,\n elements: element.elements.map((item) => ({\n ...item,\n elements: item.elements.map(boldInline),\n })),\n }\n : { ...element, elements: element.elements.map(boldInline) };\n\nconst isBlank = (cell: SlackTableCell | undefined): boolean =>\n cell === undefined || tableCellText(cell).trim() === '';\n\n// A one-section heading leads its cell as `heading: `; any other heading keeps\n// its blocks, bold, above the cell. A blank heading leaves the cell alone.\nconst columnElements = (\n heading: SlackTableCell | undefined,\n cell: SlackTableCell | undefined\n): SlackRichTextBlockElement[] => {\n const body = cellElements(cell);\n if (isBlank(heading)) {\n return body;\n }\n const head = cellElements(heading);\n const [only] = head;\n if (head.length !== 1 || only?.type !== 'rich_text_section') {\n return [...head.map(boldElement), ...body];\n }\n const lead = [...only.elements.map(boldInline), textRun(': ')];\n const [first, ...rest] = body;\n return first?.type === 'rich_text_section'\n ? [richSection([...lead, ...first.elements]), ...rest]\n : [richSection(lead), ...body];\n};\n\nconst endsLine = (element: SlackRichTextBlockElement): boolean =>\n /[\\n\\r\\u2028\\u2029]$/u.test(richTextElementText(element));\n\n// Slack runs adjacent sections together, so a section followed by another ends\n// its line unless its rendered text already does.\nconst breakSections = (\n elements: readonly SlackRichTextBlockElement[]\n): SlackRichTextBlockElement[] =>\n elements.map((element, index) =>\n element.type === 'rich_text_section' &&\n elements[index + 1]?.type === 'rich_text_section' &&\n !endsLine(element)\n ? richSection([...element.elements, textRun('\\n')])\n : element\n );\n\n// Graphemes, and the code points of any grapheme past `max`.\nconst textUnits = (text: string, max: number): string[] =>\n Array.from(\n new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text),\n ({ segment }) => (segment.length > max ? Array.from(segment) : [segment])\n ).flat();\n\n/**\n * A section, quote, or preformatted element past `sectionTextChars` as adjacent ones of its type, with nothing added between them; a list comes back as is.\n * A link or tag no longer than that stays whole; anything longer splits at grapheme boundaries into inlines of its own type, a link's label (or URL) across links to the same URL.\n */\nconst splitRichTextElement = (\n element: SlackRichTextBlockElement\n): SlackRichTextBlockElement[] => {\n const max = SLACK_LIMITS.sectionTextChars;\n if (\n element.type === 'rich_text_list' ||\n richTextElementText(element).length <= max\n ) {\n return [element];\n }\n const chunks: SlackRichTextInline[][] = [];\n let chunk: SlackRichTextInline[] = [];\n let room: number = max;\n const flush = (): void => {\n if (chunk.length > 0) {\n chunks.push(chunk);\n }\n chunk = [];\n room = max;\n };\n for (const inline of element.elements) {\n const whole = richTextInlineText(inline);\n if (inline.type !== 'text' && whole.length <= max) {\n if (whole.length > room) {\n flush();\n }\n chunk.push(inline);\n room -= whole.length;\n continue;\n }\n let text = '';\n for (const unit of textUnits(whole, max)) {\n if (text.length + unit.length > room) {\n if (text) {\n chunk.push({ ...inline, text });\n }\n flush();\n text = '';\n }\n text += unit;\n }\n if (text) {\n chunk.push({ ...inline, text });\n room -= text.length;\n }\n }\n flush();\n return chunks.map((elements) => ({ ...element, elements }));\n};\n\n// A table Slack would reject is replaced by one `rich_text` block. Each row's\n// columns run `heading: cell` to the wider of the header and the row, and a\n// blank section parts the rows. A cell keeps its inlines, styles, and blocks; a\n// table whose rows past the header have no cells prints its headings, and one\n// with nothing to print is dropped.\nconst degradeTable = ({\n rows: [header = [], ...body],\n}: SlackTableBlock): SlackBlock[] => {\n const rows = body.filter((row) => row.length > 0);\n const pieces =\n rows.length === 0\n ? [\n header\n .filter((heading) => !isBlank(heading))\n .flatMap((heading) => cellElements(heading).map(boldElement)),\n ]\n : rows.map((row) =>\n Array.from(\n { length: Math.max(header.length, row.length) },\n (_, column) => columnElements(header[column], row[column])\n ).flat()\n );\n const elements = pieces\n .filter((piece) => piece.length > 0)\n .flatMap((piece, index) => (index > 0 ? [rowBreak(), ...piece] : piece));\n return elements.length === 0\n ? []\n : [\n {\n type: 'rich_text',\n elements: breakSections(elements).flatMap(splitRichTextElement),\n },\n ];\n};\n\nconst fitsTableShape = ({ rows }: SlackTableBlock): boolean =>\n rows.length > 0 &&\n rows.length <= SLACK_LIMITS.tableRows &&\n rows.every(\n (row) => row.length > 0 && row.length <= SLACK_LIMITS.tableColumns\n );\n\n// Slack counts table cell characters across the whole message, not per block,\n// so a composition whose tables individually fit can still be rejected. In\n// document order, a table is kept if its shape fits and its cells fit what the\n// kept ones left.\nconst enforceTableLimits = (blocks: readonly SlackBlock[]): SlackBlock[] => {\n let spent = 0;\n return blocks.flatMap((block) => {\n if (block.type !== 'table') {\n return [block];\n }\n const cost = tableCharCount(block);\n if (\n fitsTableShape(block) &&\n spent + cost <= SLACK_LIMITS.tableCellCharsPerMessage\n ) {\n spent += cost;\n return [block];\n }\n return degradeTable(block);\n });\n};\n\nconst enforceBlockBudget = (blocks: SlackBlock[]): SlackBlock[] => {\n if (blocks.length <= SLACK_LIMITS.blocksPerMessage) {\n return blocks;\n }\n const trimmed = [...blocks];\n for (\n let index = trimmed.length - 1;\n index >= 0 && trimmed.length > SLACK_LIMITS.blocksPerMessage;\n index -= 1\n ) {\n if (isSpacer(trimmed[index]!)) {\n trimmed.splice(index, 1);\n }\n }\n if (trimmed.length <= SLACK_LIMITS.blocksPerMessage) {\n return trimmed;\n }\n return truncateWithNotice(trimmed);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../../src/render/slack/envelope.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 type { Composition } from '../../composition/composition';\nimport type { PrimitiveNode } from '../../define/primitive_module';\nimport type { MarkdownEnvelopeDispatcher } from '../markdown/envelope';\nimport { renderTextEnvelope } from '../text/envelope';\n\nimport {\n createSlackAssetCollector,\n type SlackAssetCollector,\n type SlackAssetRequest,\n} from './assets';\nimport {\n SLACK_LIMITS,\n type SlackActionElement,\n type SlackBlock,\n type SlackContainerBlock,\n type SlackContextBlock,\n type SlackHeaderBlock,\n type SlackMrkdwnTextObject,\n type SlackOptionObject,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextSection,\n type SlackRichTextText,\n type SlackSectionBlock,\n type SlackTableBlock,\n type SlackTableCell,\n type SlackTextObject,\n} from './blocks';\nimport { containerWithChildren, isContainer } from './container';\nimport {\n assertSlackBaseUrl,\n clampMrkdwn,\n clampSlackText,\n cutSlackValue,\n escapeMrkdwn,\n formatHeaderText,\n italic,\n type SlackLinkOptions,\n} from './format';\nimport { isUnmodeledSlackBlock } from './unmodeled';\n\n/**\n * Adds Block Kit to {@link MarkdownEnvelopeDispatcher}.\n *\n * `renderSlack` may return no blocks, in which case the node contributes\n * nothing — the envelope spreads what it is given and does not degrade. That is\n * the dispatcher's job: it renders the node's markdown instead. The markdown\n * renderer is what that fallback reads, so it stays required even for a pack\n * with full Slack coverage.\n */\nexport interface SlackEnvelopeDispatcher<\n TNode extends PrimitiveNode,\n> extends MarkdownEnvelopeDispatcher<TNode> {\n /** `collector` is absent unless the caller opted into asset collection, so a renderer must still degrade an image it cannot upload. */\n renderSlack(\n node: TNode,\n collector?: SlackAssetCollector,\n options?: SlackLinkOptions\n ): readonly SlackBlock[];\n}\n\n/** Options for {@link renderSlackEnvelope}. */\nexport interface SlackEnvelopeOptions extends SlackLinkOptions {\n /** 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. */\n heading?: boolean;\n /** Fallback `text` summary shown in notifications and previews, as `mrkdwn`; defaults to the text render, escaped. */\n text?: string;\n /** Whether to collect image upload requests alongside the blocks. */\n collectAssets?: boolean;\n /** Prefix for allocated asset refs; defaults to `asset`. Distinct prefixes keep merged inventories unique. */\n assetPrefix?: string;\n}\n\n/** What {@link renderSlackEnvelope} returns: one `chat.postMessage` payload. */\nexport interface SlackEnvelopeResult {\n /** Fallback text for the message. */\n text: string;\n /** Block Kit blocks, fitted to Slack's limits. */\n blocks: SlackBlock[];\n /** Images referenced by `blocks` that the host must upload first. */\n assets: SlackAssetRequest[];\n}\n\n/**\n * The composition as a `chat.postMessage` payload: notification `text`, blocks,\n * and the images the host must upload first.\n *\n * Degradation for a node with no `slack` renderer is the dispatcher's, which\n * has to own it to reach a child nested inside a container. The result is\n * fitted to Slack's limits — text is clamped, blocks past a count limit and\n * `rich_text` elements past a section's limit split, tables past a table limit\n * or the message's cell budget become rich text, spacers and then whole blocks\n * are dropped — so the output is always postable, except for a block from\n * `unmodeledSlackBlock` or of a type Isomer does not model, which passes\n * through unfitted. `assets` stays empty unless `collectAssets` is set.\n */\nexport const renderSlackEnvelope = <TNode extends PrimitiveNode>(\n composition: Composition<TNode>,\n dispatcher: SlackEnvelopeDispatcher<TNode>,\n options: SlackEnvelopeOptions = {}\n): SlackEnvelopeResult => {\n const blocks: SlackBlock[] = [];\n // The collector is opt-in: without it, charts keep their markdown/text\n // degradation and non-reachable images degrade to a link/text section, so\n // default output is safe for callers that cannot upload files.\n const collector = options.collectAssets\n ? createSlackAssetCollector(\n options.assetPrefix === undefined ? {} : { prefix: options.assetPrefix }\n )\n : undefined;\n\n const { heading = true, baseUrl } = options;\n assertSlackBaseUrl(baseUrl);\n if (heading && composition.title) {\n blocks.push(headerBlock(composition.title, 1));\n }\n if (heading && composition.subtitle) {\n blocks.push(contextBlock([escapeMrkdwn(composition.subtitle)]));\n }\n const linkOptions = baseUrl === undefined ? {} : { baseUrl };\n for (const node of composition.body) {\n blocks.push(\n ...dispatcher.renderSlack(node, collector, linkOptions).flatMap(fitBlock)\n );\n }\n\n // Split after the rhythm, so the fragments of one block read as one.\n const rhythm = applySectionRhythm(\n coalesceFieldSections(enforceTableLimits(blocks))\n ).flatMap(splitBlockCounts);\n const budgeted = enforceBlockBudget(rhythm);\n // Only ask the host to upload assets whose placeholder block survived the\n // budget; blocks elided by `enforceBlockBudget` are never posted, so\n // uploading their files would be wasted (and orphaned) work.\n const keptRefs = collectSlackFileRefs(budgeted);\n\n return {\n text: clampMrkdwn(\n options.text ??\n escapeMrkdwn(renderTextEnvelope(composition, dispatcher, { heading })),\n SLACK_LIMITS.fallbackTextChars\n ),\n blocks: budgeted,\n assets: collector\n ? collector.requests.filter((request) => keptRefs.has(request.ref))\n : [],\n };\n};\n\nconst clampText = <TText extends SlackTextObject>(\n text: TText,\n max: number\n): TText =>\n text.text.length <= max\n ? text\n : {\n ...text,\n text: (text.type === 'mrkdwn' ? clampMrkdwn : clampSlackText)(\n text.text,\n max\n ),\n };\n\nconst fitsImageUrl = ({ image_url }: { image_url?: string }): boolean =>\n image_url === undefined || image_url.length <= SLACK_LIMITS.imageUrlChars;\n\nconst clampAlt = <TImage extends { alt_text: string }>(\n image: TImage\n): TImage =>\n image.alt_text.length <= SLACK_LIMITS.imageAltTextChars\n ? image\n : {\n ...image,\n alt_text: clampSlackText(\n image.alt_text,\n SLACK_LIMITS.imageAltTextChars\n ),\n };\n\n// A cut URL would point somewhere else, so one past the limit is dropped.\nconst withoutLongUrl = <T extends { url?: string }>(element: T): T => {\n if (\n element.url === undefined ||\n element.url.length <= SLACK_LIMITS.urlChars\n ) {\n return element;\n }\n const { url: _dropped, ...rest } = element;\n return rest as T;\n};\n\nconst optionValue = (value: string): string =>\n cutSlackValue(value, SLACK_LIMITS.optionValueChars);\n\nconst clampOption = (option: SlackOptionObject): SlackOptionObject =>\n withoutLongUrl({\n ...option,\n text: clampText(option.text, SLACK_LIMITS.optionTextChars),\n value: optionValue(option.value),\n ...(option.description && {\n description: clampText(option.description, SLACK_LIMITS.optionTextChars),\n }),\n });\n\nconst clampControl = (element: SlackActionElement): SlackActionElement => {\n const actionId =\n element.action_id === undefined\n ? {}\n : {\n action_id: cutSlackValue(\n element.action_id,\n SLACK_LIMITS.actionIdChars\n ),\n };\n if (element.type === 'button') {\n return withoutLongUrl({\n ...element,\n ...actionId,\n text: clampText(element.text, SLACK_LIMITS.buttonTextChars),\n ...(element.value !== undefined && {\n value: cutSlackValue(element.value, SLACK_LIMITS.buttonValueChars),\n }),\n });\n }\n const menu = { ...element, ...actionId };\n const maxOptions =\n menu.type === 'overflow'\n ? SLACK_LIMITS.optionsPerOverflow\n : menu.type === 'radio_buttons' || menu.type === 'checkboxes'\n ? SLACK_LIMITS.optionsPerChoice\n : SLACK_LIMITS.optionsPerSelect;\n if (menu.options) {\n menu.options = menu.options.slice(0, maxOptions).map(clampOption);\n }\n if ('placeholder' in menu && menu.placeholder) {\n menu.placeholder = clampText(\n menu.placeholder,\n SLACK_LIMITS.placeholderChars\n );\n }\n if ('option_groups' in menu && menu.option_groups) {\n menu.option_groups = menu.option_groups\n .slice(0, SLACK_LIMITS.optionGroupsPerSelect)\n .map((group) => ({\n ...group,\n label: clampText(group.label, SLACK_LIMITS.optionGroupLabelChars),\n options: group.options.slice(0, maxOptions).map(clampOption),\n }));\n }\n // Slack requires an initial option to equal one it emits, so each is\n // replaced by the emitted option of the same value, or dropped.\n const emitted = new Map(\n [\n ...(menu.options ?? []),\n ...(('option_groups' in menu && menu.option_groups) || []).flatMap(\n ({ options }) => options\n ),\n ].map((option) => [option.value, option])\n );\n if ('initial_option' in menu && menu.initial_option) {\n const match = emitted.get(optionValue(menu.initial_option.value));\n if (match) {\n menu.initial_option = match;\n } else {\n delete menu.initial_option;\n }\n }\n if ('initial_options' in menu && menu.initial_options) {\n const matches = menu.initial_options.flatMap(({ value }) => {\n const match = emitted.get(optionValue(value));\n return match ? [match] : [];\n });\n if (matches.length > 0) {\n menu.initial_options = matches;\n } else {\n delete menu.initial_options;\n }\n }\n return menu;\n};\n\nconst chunks = <T>(items: readonly T[], size: number): T[][] =>\n Array.from({ length: Math.ceil(items.length / size) }, (_, index) =>\n items.slice(index * size, (index + 1) * size)\n );\n\n// Splits a block past a count limit into blocks of its type. Only the first\n// keeps a `block_id`, which Slack requires to be unique.\nconst splitBlockCounts = (block: SlackBlock): SlackBlock[] => {\n if (isUnmodeledSlackBlock(block)) {\n return [block];\n }\n switch (block.type) {\n case 'container':\n return containerWithChildren(\n block,\n block.child_blocks.flatMap(splitBlockCounts)\n );\n case 'context':\n return chunks(block.elements, SLACK_LIMITS.contextElements).map(\n (elements, index) =>\n index === 0 ? { ...block, elements } : { type: 'context', elements }\n );\n case 'actions':\n return chunks(block.elements, SLACK_LIMITS.buttonsPerActions).map(\n (elements, index) =>\n index === 0 ? { ...block, elements } : { type: 'actions', elements }\n );\n case 'section': {\n if (\n !block.fields ||\n block.fields.length <= SLACK_LIMITS.fieldsPerSection\n ) {\n return [block];\n }\n return chunks(block.fields, SLACK_LIMITS.fieldsPerSection).map(\n (fields, index) =>\n index === 0 ? { ...block, fields } : { type: 'section', fields }\n );\n }\n default:\n return [block];\n }\n};\n\n// An image whose URL Slack would reject leaves its alt text.\nconst fitImageUrls = (block: SlackBlock): SlackBlock[] => {\n switch (block.type) {\n case 'image':\n return fitsImageUrl(block)\n ? [block]\n : block.alt_text\n ? [contextBlock([escapeMrkdwn(block.alt_text)])]\n : [];\n case 'context':\n return [\n {\n ...block,\n elements: block.elements.flatMap((element) =>\n element.type !== 'image' || fitsImageUrl(element)\n ? [element]\n : element.alt_text\n ? [{ type: 'mrkdwn', text: escapeMrkdwn(element.alt_text) }]\n : []\n ),\n },\n ];\n case 'section': {\n if (block.accessory?.type !== 'image' || fitsImageUrl(block.accessory)) {\n return [block];\n }\n const { accessory, ...rest } = block;\n return accessory.alt_text\n ? [rest, contextBlock([escapeMrkdwn(accessory.alt_text)])]\n : [rest];\n }\n default:\n return [block];\n }\n};\n\nconst fitBlock = (block: SlackBlock): SlackBlock[] => {\n if (isUnmodeledSlackBlock(block)) {\n return [block];\n }\n return block.type === 'container'\n ? fitContainer(block)\n : fitImageUrls(block).map(clampBlockText);\n};\n\nconst fitContainer = (container: SlackContainerBlock): SlackBlock[] => {\n const { title, rich_text_title, subtitle, icon, child_blocks } = container;\n const fitted: SlackContainerBlock = {\n ...container,\n ...(title && {\n title: clampText(title, SLACK_LIMITS.containerTitleChars),\n }),\n ...(rich_text_title && {\n rich_text_title: {\n ...rich_text_title,\n elements: rich_text_title.elements.flatMap(splitRichTextElement),\n },\n }),\n ...(subtitle && {\n subtitle: clampText(subtitle, SLACK_LIMITS.containerSubtitleChars),\n }),\n };\n if (icon && fitsImageUrl(icon)) {\n fitted.icon = clampAlt(icon);\n } else {\n delete fitted.icon;\n }\n return containerWithChildren(fitted, child_blocks.flatMap(fitBlock));\n};\n\n// Pack renderers build their own blocks, and one overlong text makes Slack\n// reject the whole message.\nconst clampBlockText = (block: SlackBlock): SlackBlock => {\n switch (block.type) {\n case 'header':\n return {\n ...block,\n text: clampText(block.text, SLACK_LIMITS.headerTextChars),\n };\n case 'section':\n return {\n ...block,\n ...(block.text && {\n text: clampText(block.text, SLACK_LIMITS.sectionTextChars),\n }),\n ...(block.fields && {\n fields: block.fields.map((field) =>\n clampText(field, SLACK_LIMITS.sectionFieldChars)\n ),\n }),\n ...(block.accessory && {\n accessory:\n block.accessory.type === 'image'\n ? clampAlt(block.accessory)\n : clampControl(block.accessory),\n }),\n };\n case 'rich_text':\n return {\n ...block,\n elements: block.elements.flatMap(splitRichTextElement),\n };\n case 'context':\n return {\n ...block,\n elements: block.elements.map((element) =>\n element.type === 'image'\n ? clampAlt(element)\n : clampText(element, SLACK_LIMITS.contextElementChars)\n ),\n };\n case 'image':\n return {\n ...clampAlt(block),\n ...(block.title && {\n title: clampText(block.title, SLACK_LIMITS.imageTitleChars),\n }),\n };\n case 'video':\n return {\n ...block,\n title: clampText(block.title, SLACK_LIMITS.videoTitleChars),\n ...(block.description && {\n description: clampText(\n block.description,\n SLACK_LIMITS.videoDescriptionChars\n ),\n }),\n ...(block.author_name !== undefined && {\n author_name: clampSlackText(\n block.author_name,\n SLACK_LIMITS.videoAuthorNameChars\n ),\n }),\n };\n case 'actions':\n return { ...block, elements: block.elements.map(clampControl) };\n default:\n return block;\n }\n};\n\nconst collectSlackFileRefs = (\n blocks: readonly SlackBlock[]\n): ReadonlySet<string> => {\n const refs = new Set<string>();\n const visit = (block: SlackBlock): void => {\n if (block.type === 'image' && block.slack_file?.ref !== undefined) {\n refs.add(block.slack_file.ref);\n } else if (isContainer(block)) {\n block.child_blocks.forEach(visit);\n }\n };\n blocks.forEach(visit);\n return refs;\n};\n\nconst headerBlock = (\n title: string,\n level?: SlackHeaderBlock['level']\n): SlackHeaderBlock => ({\n type: 'header',\n text: { type: 'plain_text', text: formatHeaderText(title), emoji: true },\n ...(level !== undefined ? { level } : {}),\n});\n\nconst contextBlock = (lines: ReadonlyArray<string>): SlackContextBlock => ({\n type: 'context',\n elements: lines\n .filter((line): line is string => line !== undefined && line.length > 0)\n .map((text) => ({\n type: 'mrkdwn',\n text: clampMrkdwn(text, SLACK_LIMITS.contextElementChars),\n })),\n});\n\nconst SLACK_SPACER_TEXT = ' ';\n\nconst slackSpacerBlock = (): SlackSectionBlock => ({\n type: 'section',\n text: { type: 'mrkdwn', text: SLACK_SPACER_TEXT },\n});\n\nconst isSpacer = (block: SlackBlock): boolean =>\n !isUnmodeledSlackBlock(block) &&\n block.type === 'section' &&\n block.text?.type === 'mrkdwn' &&\n block.text.text === SLACK_SPACER_TEXT &&\n block.fields === undefined &&\n block.accessory === undefined;\n\nconst isFieldsOnly = (\n block: SlackBlock\n): block is SlackSectionBlock & { fields: SlackMrkdwnTextObject[] } =>\n !isUnmodeledSlackBlock(block) &&\n block.type === 'section' &&\n (block.fields?.length ?? 0) > 0 &&\n block.text === undefined &&\n block.accessory === undefined;\n\n// A container sets itself apart, so no spacer goes beside it.\nconst isContent = (block: SlackBlock): boolean =>\n block.type !== 'container' &&\n block.type !== 'header' &&\n block.type !== 'divider' &&\n block.type !== 'actions' &&\n block.type !== 'context' &&\n !isSpacer(block);\n\n// Consecutive 1-field sections pack into Slack's two-column `fields` grid.\n// A section that already has 2+ fields is a finished batch (e.g. a\n// description list) and is left alone.\nconst coalesceFieldSections = (blocks: readonly SlackBlock[]): SlackBlock[] => {\n const out: SlackBlock[] = [];\n let index = 0;\n while (index < blocks.length) {\n const block = blocks[index]!;\n if (isFieldsOnly(block) && block.fields?.length === 1) {\n const fields = [...block.fields];\n index += 1;\n while (index < blocks.length) {\n const next = blocks[index]!;\n if (\n !isFieldsOnly(next) ||\n next.fields.length !== 1 ||\n fields.length >= SLACK_LIMITS.fieldsPerSection\n ) {\n break;\n }\n fields.push(...next.fields);\n index += 1;\n }\n out.push({ type: 'section', fields });\n continue;\n }\n out.push(\n ...(isContainer(block)\n ? containerWithChildren(\n block,\n coalesceFieldSections(block.child_blocks)\n )\n : [block])\n );\n index += 1;\n }\n return out;\n};\n\n// Divider before every section heading (and trailing actions) after the\n// composition title; spacer after each content run except a table already\n// about to be followed by a divider. Consecutive field-only sections are\n// not spaced — they read as one grid.\nconst applySectionRhythm = (blocks: readonly SlackBlock[]): SlackBlock[] => {\n if (blocks.length === 0) {\n return [];\n }\n const out: SlackBlock[] = [];\n for (let index = 0; index < blocks.length; index += 1) {\n const block = blocks[index]!;\n const prev = out[out.length - 1];\n const needsDividerBefore =\n (block.type === 'header' && out.length > 0) || block.type === 'actions';\n if (needsDividerBefore && prev && prev.type !== 'divider') {\n if (isContent(prev) && prev.type !== 'table') {\n out.push(slackSpacerBlock());\n }\n out.push({ type: 'divider' });\n }\n out.push(block);\n if (isContent(block) && index + 1 < blocks.length) {\n const next = blocks[index + 1]!;\n if (isContent(next) && !(isFieldsOnly(block) && isFieldsOnly(next))) {\n out.push(slackSpacerBlock());\n }\n }\n }\n return out;\n};\n\nconst truncateWithNotice = (blocks: SlackBlock[]): SlackBlock[] => {\n const kept = blocks.slice(0, SLACK_LIMITS.blocksPerMessage - 1);\n const dropped = blocks.length - kept.length;\n kept.push(\n contextBlock([\n italic(`+${dropped} more blocks elided to fit Slack's limit.`),\n ])\n );\n return kept;\n};\n\nconst richTextInlineText = (inline: SlackRichTextInline): string =>\n inline.type === 'link' ? (inline.text ?? inline.url) : inline.text;\n\nconst richTextElementText = (element: SlackRichTextBlockElement): string =>\n element.type === 'rich_text_list'\n ? element.elements.map(richTextElementText).join('')\n : element.elements.map(richTextInlineText).join('');\n\nconst tableCellText = (cell: SlackTableCell): string =>\n cell.type === 'raw_text'\n ? cell.text\n : cell.elements.map(richTextElementText).join('');\n\nconst tableCharCount = (block: SlackTableBlock): number =>\n block.rows.reduce(\n (total, row) =>\n total + row.reduce((sum, cell) => sum + tableCellText(cell).length, 0),\n 0\n );\n\nconst textRun = (text: string): SlackRichTextText => ({ type: 'text', text });\n\nconst richSection = (\n elements: SlackRichTextInline[]\n): SlackRichTextSection => ({ type: 'rich_text_section', elements });\n\nconst rowBreak = (): SlackRichTextSection => richSection([textRun('\\n')]);\n\nconst cellElements = (\n cell: SlackTableCell | undefined\n): SlackRichTextBlockElement[] => {\n if (cell?.type === 'rich_text') {\n return cell.elements.filter(({ elements }) => elements.length > 0);\n }\n return cell?.text ? [richSection([textRun(cell.text)])] : [];\n};\n\nconst boldInline = (inline: SlackRichTextInline): SlackRichTextInline => ({\n ...inline,\n style: { ...inline.style, bold: true },\n});\n\nconst boldElement = (\n element: SlackRichTextBlockElement\n): SlackRichTextBlockElement =>\n element.type === 'rich_text_list'\n ? {\n ...element,\n elements: element.elements.map((item) => ({\n ...item,\n elements: item.elements.map(boldInline),\n })),\n }\n : { ...element, elements: element.elements.map(boldInline) };\n\nconst isBlank = (cell: SlackTableCell | undefined): boolean =>\n cell === undefined || tableCellText(cell).trim() === '';\n\n// A one-section heading leads its cell as `heading: `; any other heading keeps\n// its blocks, bold, above the cell. A blank heading leaves the cell alone.\nconst columnElements = (\n heading: SlackTableCell | undefined,\n cell: SlackTableCell | undefined\n): SlackRichTextBlockElement[] => {\n const body = cellElements(cell);\n if (isBlank(heading)) {\n return body;\n }\n const head = cellElements(heading);\n const [only] = head;\n if (head.length !== 1 || only?.type !== 'rich_text_section') {\n return [...head.map(boldElement), ...body];\n }\n const lead = [...only.elements.map(boldInline), textRun(': ')];\n const [first, ...rest] = body;\n return first?.type === 'rich_text_section'\n ? [richSection([...lead, ...first.elements]), ...rest]\n : [richSection(lead), ...body];\n};\n\nconst endsLine = (element: SlackRichTextBlockElement): boolean =>\n /[\\n\\r\\u2028\\u2029]$/u.test(richTextElementText(element));\n\n// Slack runs adjacent sections together, so a section followed by another ends\n// its line unless its rendered text already does.\nconst breakSections = (\n elements: readonly SlackRichTextBlockElement[]\n): SlackRichTextBlockElement[] =>\n elements.map((element, index) =>\n element.type === 'rich_text_section' &&\n elements[index + 1]?.type === 'rich_text_section' &&\n !endsLine(element)\n ? richSection([...element.elements, textRun('\\n')])\n : element\n );\n\n// Graphemes, and the code points of any grapheme past `max`.\nconst textUnits = (text: string, max: number): string[] =>\n Array.from(\n new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text),\n ({ segment }) => (segment.length > max ? Array.from(segment) : [segment])\n ).flat();\n\n/**\n * A section, quote, or preformatted element past `sectionTextChars` as adjacent ones of its type, with nothing added between them; a list comes back as is.\n * A link or tag no longer than that stays whole; anything longer splits at grapheme boundaries into inlines of its own type, a link's label (or URL) across links to the same URL.\n */\nconst splitRichTextElement = (\n element: SlackRichTextBlockElement\n): SlackRichTextBlockElement[] => {\n const max = SLACK_LIMITS.sectionTextChars;\n if (\n element.type === 'rich_text_list' ||\n richTextElementText(element).length <= max\n ) {\n return [element];\n }\n const chunks: SlackRichTextInline[][] = [];\n let chunk: SlackRichTextInline[] = [];\n let room: number = max;\n const flush = (): void => {\n if (chunk.length > 0) {\n chunks.push(chunk);\n }\n chunk = [];\n room = max;\n };\n for (const inline of element.elements) {\n const whole = richTextInlineText(inline);\n if (inline.type !== 'text' && whole.length <= max) {\n if (whole.length > room) {\n flush();\n }\n chunk.push(inline);\n room -= whole.length;\n continue;\n }\n let text = '';\n for (const unit of textUnits(whole, max)) {\n if (text.length + unit.length > room) {\n if (text) {\n chunk.push({ ...inline, text });\n }\n flush();\n text = '';\n }\n text += unit;\n }\n if (text) {\n chunk.push({ ...inline, text });\n room -= text.length;\n }\n }\n flush();\n return chunks.map((elements) => ({ ...element, elements }));\n};\n\n// A table Slack would reject is replaced by one `rich_text` block. Each row's\n// columns run `heading: cell` to the wider of the header and the row, and a\n// blank section parts the rows. A cell keeps its inlines, styles, and blocks; a\n// table whose rows past the header have no cells prints its headings, and one\n// with nothing to print is dropped.\nconst degradeTable = ({\n rows: [header = [], ...body],\n}: SlackTableBlock): SlackBlock[] => {\n const rows = body.filter((row) => row.length > 0);\n const pieces =\n rows.length === 0\n ? [\n header\n .filter((heading) => !isBlank(heading))\n .flatMap((heading) => cellElements(heading).map(boldElement)),\n ]\n : rows.map((row) =>\n Array.from(\n { length: Math.max(header.length, row.length) },\n (_, column) => columnElements(header[column], row[column])\n ).flat()\n );\n const elements = pieces\n .filter((piece) => piece.length > 0)\n .flatMap((piece, index) => (index > 0 ? [rowBreak(), ...piece] : piece));\n return elements.length === 0\n ? []\n : [\n {\n type: 'rich_text',\n elements: breakSections(elements).flatMap(splitRichTextElement),\n },\n ];\n};\n\nconst fitsTableShape = ({ rows }: SlackTableBlock): boolean =>\n rows.length > 0 &&\n rows.length <= SLACK_LIMITS.tableRows &&\n rows.every(\n (row) => row.length > 0 && row.length <= SLACK_LIMITS.tableColumns\n );\n\n// Slack counts table cell characters across the whole message, not per block,\n// so a composition whose tables individually fit can still be rejected. In\n// document order, a table is kept if its shape fits and its cells fit what the\n// kept ones left.\nconst enforceTableLimits = (blocks: readonly SlackBlock[]): SlackBlock[] => {\n let spent = 0;\n const fit = (block: SlackBlock): SlackBlock[] => {\n if (isContainer(block)) {\n return containerWithChildren(block, block.child_blocks.flatMap(fit));\n }\n if (block.type !== 'table' || isUnmodeledSlackBlock(block)) {\n return [block];\n }\n const cost = tableCharCount(block);\n if (\n fitsTableShape(block) &&\n spent + cost <= SLACK_LIMITS.tableCellCharsPerMessage\n ) {\n spent += cost;\n return [block];\n }\n return degradeTable(block);\n };\n return blocks.flatMap(fit);\n};\n\nconst enforceBlockBudget = (blocks: SlackBlock[]): SlackBlock[] => {\n if (blocks.length <= SLACK_LIMITS.blocksPerMessage) {\n return blocks;\n }\n const trimmed = [...blocks];\n for (\n let index = trimmed.length - 1;\n index >= 0 && trimmed.length > SLACK_LIMITS.blocksPerMessage;\n index -= 1\n ) {\n if (isSpacer(trimmed[index]!)) {\n trimmed.splice(index, 1);\n }\n }\n if (trimmed.length <= SLACK_LIMITS.blocksPerMessage) {\n return trimmed;\n }\n return truncateWithNotice(trimmed);\n};\n"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 2.0.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.formatHeaderText = exports.cutSlackValue = exports.clampMrkdwn = exports.clampSlackText = exports.link = exports.slackLinkUrl = exports.isAbsoluteHttpUrl = exports.codeBlock = exports.code = exports.strike = exports.italic = exports.bold = exports.escapeMrkdwn = void 0;
|
|
9
|
+
exports.formatHeaderText = exports.cutSlackValue = exports.clampMrkdwn = exports.clampSlackText = exports.link = exports.slackLinkUrl = exports.assertSlackBaseUrl = exports.isAbsoluteHttpUrl = exports.codeBlock = exports.code = exports.strike = exports.italic = exports.bold = exports.escapeMrkdwn = void 0;
|
|
10
10
|
// Slack mrkdwn helpers.
|
|
11
11
|
//
|
|
12
12
|
// Slack uses a flavour of Markdown called "mrkdwn" that differs from CommonMark
|
|
@@ -17,6 +17,7 @@ exports.formatHeaderText = exports.cutSlackValue = exports.clampMrkdwn = exports
|
|
|
17
17
|
// would parse as auto-link with no label.
|
|
18
18
|
//
|
|
19
19
|
// See https://api.slack.com/reference/surfaces/formatting
|
|
20
|
+
const error_1 = require("../../composition/error");
|
|
20
21
|
const url_1 = require("../../validate/url");
|
|
21
22
|
const blocks_1 = require("./blocks");
|
|
22
23
|
const MRKDWN_ESCAPES = {
|
|
@@ -119,17 +120,66 @@ const isMailtoUrl = (url) => {
|
|
|
119
120
|
.split(',')
|
|
120
121
|
.every((recipient) => isMailbox(decoded(recipient) ?? '')));
|
|
121
122
|
};
|
|
123
|
+
// Parsed rather than checked as written: a base is only resolved against, so
|
|
124
|
+
// a default port or an uppercase host is fine.
|
|
125
|
+
const isSlackBaseUrl = (baseUrl) => {
|
|
126
|
+
let parsed;
|
|
127
|
+
try {
|
|
128
|
+
parsed = new URL(baseUrl);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return ((parsed.protocol === 'http:' || parsed.protocol === 'https:') &&
|
|
134
|
+
parsed.username === '' &&
|
|
135
|
+
parsed.password === '' &&
|
|
136
|
+
(DNS_NAME_RE.test(parsed.hostname) || IPV6_HOST_RE.test(parsed.hostname)));
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Throws `INVALID_BASE_URL` unless `baseUrl` is absent or an `http:` or
|
|
140
|
+
* `https:` URL with a DNS or IPv6 host and no credentials.
|
|
141
|
+
*/
|
|
142
|
+
const assertSlackBaseUrl = (baseUrl) => {
|
|
143
|
+
if (baseUrl !== undefined && !isSlackBaseUrl(baseUrl)) {
|
|
144
|
+
throw new error_1.IsomerError('INVALID_BASE_URL', `Slack baseUrl must be an absolute http or https URL without credentials, got "${baseUrl}"`);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
exports.assertSlackBaseUrl = assertSlackBaseUrl;
|
|
148
|
+
const HAS_SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i;
|
|
149
|
+
// A relative path resolved onto the base's origin, or `null` when it would
|
|
150
|
+
// leave that origin. A fragment, `BLOCKED_HREF` included, names a place in a
|
|
151
|
+
// document Slack does not show, so it never resolves.
|
|
152
|
+
const resolvedOnBase = (url, baseUrl) => {
|
|
153
|
+
if (url.startsWith('#') || HAS_SCHEME_RE.test(url)) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
let resolved;
|
|
157
|
+
try {
|
|
158
|
+
resolved = new URL(url, baseUrl);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
return resolved.origin === new URL(baseUrl).origin ? resolved.href : null;
|
|
164
|
+
};
|
|
122
165
|
/**
|
|
123
166
|
* `href` when {@link sanitizeNavigationHref} passes it and it is an `http:` or
|
|
124
167
|
* `https:` URL with a host, or a `mailto:` of well-formed mailboxes; `null`
|
|
125
|
-
* otherwise. Slack has no page to resolve a relative URL against
|
|
168
|
+
* otherwise. Slack has no page to resolve a relative URL against, so one links
|
|
169
|
+
* only when `baseUrl` is given, resolved onto its origin; a fragment, such as
|
|
170
|
+
* `BLOCKED_HREF`, never resolves.
|
|
126
171
|
*/
|
|
127
|
-
const slackLinkUrl = (href) => {
|
|
172
|
+
const slackLinkUrl = (href, baseUrl) => {
|
|
173
|
+
(0, exports.assertSlackBaseUrl)(baseUrl);
|
|
128
174
|
const url = (0, url_1.sanitizeNavigationHref)(href);
|
|
129
175
|
if (url === null) {
|
|
130
176
|
return null;
|
|
131
177
|
}
|
|
132
|
-
|
|
178
|
+
if ((0, exports.isAbsoluteHttpUrl)(url) || isMailtoUrl(url)) {
|
|
179
|
+
return url;
|
|
180
|
+
}
|
|
181
|
+
const resolved = baseUrl === undefined ? null : resolvedOnBase(url, baseUrl);
|
|
182
|
+
return resolved === null ? null : (0, exports.slackLinkUrl)(resolved);
|
|
133
183
|
};
|
|
134
184
|
exports.slackLinkUrl = slackLinkUrl;
|
|
135
185
|
/**
|
|
@@ -140,8 +190,8 @@ exports.slackLinkUrl = slackLinkUrl;
|
|
|
140
190
|
* early. A URL {@link slackLinkUrl} rejects degrades to plain escaped text
|
|
141
191
|
* with no link.
|
|
142
192
|
*/
|
|
143
|
-
const link = (url, label) => {
|
|
144
|
-
const sanitized = (0, exports.slackLinkUrl)(url);
|
|
193
|
+
const link = (url, label, baseUrl) => {
|
|
194
|
+
const sanitized = (0, exports.slackLinkUrl)(url, baseUrl);
|
|
145
195
|
if (!sanitized) {
|
|
146
196
|
return (0, exports.escapeMrkdwn)(label ?? url);
|
|
147
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/render/slack/format.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\n// Slack mrkdwn helpers.\n//\n// Slack uses a flavour of Markdown called \"mrkdwn\" that differs from CommonMark\n// in subtle ways: links are `<url|label>`, code uses single backticks (or\n// fenced ```` ``` ```` blocks), and `&`, `<`, `>` must be HTML-escaped inside\n// any text element. These helpers centralize the escaping so primitive\n// renderers cannot accidentally emit a literal `<https://...>` that Slack\n// would parse as auto-link with no label.\n//\n// See https://api.slack.com/reference/surfaces/formatting\n\nimport { sanitizeNavigationHref } from '../../validate/url';\n\nimport { SLACK_LIMITS } from './blocks';\n\nconst MRKDWN_ESCAPES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n};\n\n/**\n * Escapes the three characters Slack treats as HTML in `mrkdwn` text.\n *\n * The formatting markers (`*`, `_`, `~`, `` ` ``) are left intact so callers\n * can compose markdown with them. Wrap text in {@link code} when literal\n * asterisks are needed.\n */\nexport const escapeMrkdwn = (value: string): string =>\n value.replace(/[&<>]/g, (match) => MRKDWN_ESCAPES[match] ?? match);\n\n/** `text` escaped and wrapped in mrkdwn bold markers. */\nexport const bold = (text: string): string => `*${escapeMrkdwn(text)}*`;\n/** `text` escaped and wrapped in mrkdwn italic markers. */\nexport const italic = (text: string): string => `_${escapeMrkdwn(text)}_`;\n/** `text` escaped and wrapped in mrkdwn strikethrough markers. */\nexport const strike = (text: string): string => `~${escapeMrkdwn(text)}~`;\n\n/**\n * Inline code span. Contents are not mrkdwn-escaped, since `<` and friends are\n * literal inside a code span; only embedded backticks are demoted, to a\n * modifier letter that cannot close the span.\n */\nexport const code = (text: string): string =>\n `\\`${text.replace(/`/g, '\\u02CB')}\\``;\n\n/**\n * Fenced code block. Slack honours the triple-backtick fence but not a language\n * hint. Embedded triple-backticks are demoted with a zero-width joiner so they\n * cannot terminate the block early.\n */\nexport const codeBlock = (text: string): string =>\n `\\`\\`\\`\\n${text.replace(/```/g, '``\\u200d`')}\\n\\`\\`\\``;\n\nconst URL_PARTS_RE = /^([a-z][a-z0-9+.-]*:(?:\\/\\/[^/?#]*)?)(.*)$/is;\n// Letter, digit, and hyphen labels, with an optional DNS root dot.\nconst DNS_NAME_RE =\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\\.?$/i;\nconst IPV6_HOST_RE = /^\\[[0-9a-f:.]+\\]$/i;\n\nconst MALFORMED_ESCAPE_RE = /%(?![0-9a-f]{2})/i;\n\n// `url` parsed, when its escapes are well formed and `URL` prints it as\n// written up to the case of its scheme and authority and a `/` for an empty\n// path.\nconst parsedAsWritten = (url: string): URL | null => {\n if (MALFORMED_ESCAPE_RE.test(url)) {\n return null;\n }\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const [, prefix, rest] = URL_PARTS_RE.exec(url) ?? [];\n const [, printedPrefix, printedRest] = URL_PARTS_RE.exec(parsed.href) ?? [];\n return prefix !== undefined &&\n prefix.toLowerCase() === printedPrefix?.toLowerCase() &&\n (printedRest === rest || printedRest === `/${rest}`)\n ? parsed\n : null;\n};\n\n/**\n * Whether `url` is an `http:` or `https:` URL with a DNS or IPv6 host that\n * `URL` prints as written, so nothing it repairs or encodes, such as a\n * backslash, whitespace, or non-ASCII, passes.\n */\nexport const isAbsoluteHttpUrl = (url: string): boolean => {\n const parsed = parsedAsWritten(url);\n return (\n (parsed?.protocol === 'http:' || parsed?.protocol === 'https:') &&\n (DNS_NAME_RE.test(parsed.hostname) || IPV6_HOST_RE.test(parsed.hostname))\n );\n};\n\n// RFC 5322 dot-atom text, less `/`, `?`, `#`, and `%`.\nconst LOCAL_PART_RE =\n /^[a-z0-9!$&'*+=^_`{|}~-]+(?:\\.[a-z0-9!$&'*+=^_`{|}~-]+)*$/i;\n\nconst isMailbox = (recipient: string): boolean => {\n const at = recipient.lastIndexOf('@');\n return (\n at > 0 &&\n LOCAL_PART_RE.test(recipient.slice(0, at)) &&\n DNS_NAME_RE.test(recipient.slice(at + 1))\n );\n};\n\nconst decoded = (value: string): string | null => {\n try {\n return decodeURIComponent(value);\n } catch {\n return null;\n }\n};\n\n// Every comma-separated recipient before the query or fragment is a mailbox.\nconst isMailtoUrl = (url: string): boolean => {\n const [, recipients] = /^mailto:([^?#]*)/i.exec(url) ?? [];\n return (\n recipients !== undefined &&\n parsedAsWritten(url) !== null &&\n recipients\n .split(',')\n .every((recipient) => isMailbox(decoded(recipient) ?? ''))\n );\n};\n\n/**\n * `href` when {@link sanitizeNavigationHref} passes it and it is an `http:` or\n * `https:` URL with a host, or a `mailto:` of well-formed mailboxes; `null`\n * otherwise. Slack has no page to resolve a relative URL against.\n */\nexport const slackLinkUrl = (href: string): string | null => {\n const url = sanitizeNavigationHref(href);\n if (url === null) {\n return null;\n }\n return isAbsoluteHttpUrl(url) || isMailtoUrl(url) ? url : null;\n};\n\n/**\n * Slack mrkdwn link, `<url|label>`, or a bare `<url>` when `label` is omitted.\n *\n * URL and label are both escaped so `&` and `>` cannot break Slack's link\n * parser, and a `|` in the URL is percent-encoded so it cannot end the URL\n * early. A URL {@link slackLinkUrl} rejects degrades to plain escaped text\n * with no link.\n */\nexport const link = (url: string, label?: string): string => {\n const sanitized = slackLinkUrl(url);\n if (!sanitized) {\n return escapeMrkdwn(label ?? url);\n }\n const safeUrl = escapeMrkdwn(sanitized).replaceAll('|', '%7C');\n if (!label) {\n return `<${safeUrl}>`;\n }\n return `<${safeUrl}|${escapeMrkdwn(label)}>`;\n};\n\n/**\n * Truncates `value` to `max` UTF-16 code units at a grapheme boundary,\n * appending an ellipsis when it had to cut. Pass a `SLACK_LIMITS` constant as\n * the budget.\n */\nexport const clampSlackText = (value: string, max: number): string => {\n if (value.length <= max) {\n return value;\n }\n const budget = max <= 1 ? max : max - 1;\n let end = 0;\n for (const { index, segment } of new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n }).segment(value)) {\n if (index + segment.length > budget) {\n break;\n }\n end = index + segment.length;\n }\n const head = value.slice(0, end);\n return max <= 1 ? head : `${head.trimEnd()}…`;\n};\n\n// A `<…>` link or mention and an entity, each matched where it starts.\nconst LINK_TOKEN_RE = /<[^<>\\n]*>/y;\nconst ENTITY_TOKEN_RE = /&(?:amp|lt|gt);/y;\n\n// The end of the token `re` matches at `index`, or `undefined`.\nconst tokenEnd = (\n value: string,\n re: RegExp,\n index: number\n): number | undefined => {\n re.lastIndex = index;\n return re.test(value) ? re.lastIndex : undefined;\n};\n\n/**\n * {@link clampSlackText} for `mrkdwn`: never cuts inside a `<…>` link or\n * mention or an entity. Formatting marks are left as they fall; Slack prints an\n * unclosed one as written.\n */\nexport const clampMrkdwn = (value: string, max: number): string => {\n const clamped = clampSlackText(value, max);\n if (clamped === value || max <= 1) {\n return clamped;\n }\n // Entity first: a link holds no `<` of its own, so stepping back to its\n // start cannot land inside an entity, while the reverse could.\n let cut = clamped.length - 1;\n const entity = value.lastIndexOf('&', cut - 1);\n if (entity !== -1 && (tokenEnd(value, ENTITY_TOKEN_RE, entity) ?? 0) > cut) {\n cut = entity;\n }\n const link = value.lastIndexOf('<', cut - 1);\n if (link !== -1 && (tokenEnd(value, LINK_TOKEN_RE, link) ?? 0) > cut) {\n cut = link;\n }\n return `${value.slice(0, cut).trimEnd()}…`;\n};\n\n/**\n * `value` cut to `max` UTF-16 code units, never through a surrogate pair. For\n * opaque values a host reads back, which an ellipsis would change.\n */\nexport const cutSlackValue = (value: string, max: number): string => {\n const cut = value.slice(0, max);\n return /[\\ud800-\\udbff]$/.test(cut) ? cut.slice(0, -1) : cut;\n};\n\n/**\n * Collapses whitespace and clamps to `SLACK_LIMITS.headerTextChars`. Header\n * text is `plain_text`, so no markdown survives — do not pre-format it.\n */\nexport const formatHeaderText = (value: string): string =>\n clampSlackText(\n value.replace(/\\s+/g, ' ').trim(),\n SLACK_LIMITS.headerTextChars\n );\n"]}
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/render/slack/format.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\n// Slack mrkdwn helpers.\n//\n// Slack uses a flavour of Markdown called \"mrkdwn\" that differs from CommonMark\n// in subtle ways: links are `<url|label>`, code uses single backticks (or\n// fenced ```` ``` ```` blocks), and `&`, `<`, `>` must be HTML-escaped inside\n// any text element. These helpers centralize the escaping so primitive\n// renderers cannot accidentally emit a literal `<https://...>` that Slack\n// would parse as auto-link with no label.\n//\n// See https://api.slack.com/reference/surfaces/formatting\n\nimport { IsomerError } from '../../composition/error';\nimport { sanitizeNavigationHref } from '../../validate/url';\n\nimport { SLACK_LIMITS } from './blocks';\n\nconst MRKDWN_ESCAPES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n};\n\n/**\n * Escapes the three characters Slack treats as HTML in `mrkdwn` text.\n *\n * The formatting markers (`*`, `_`, `~`, `` ` ``) are left intact so callers\n * can compose markdown with them. Wrap text in {@link code} when literal\n * asterisks are needed.\n */\nexport const escapeMrkdwn = (value: string): string =>\n value.replace(/[&<>]/g, (match) => MRKDWN_ESCAPES[match] ?? match);\n\n/** `text` escaped and wrapped in mrkdwn bold markers. */\nexport const bold = (text: string): string => `*${escapeMrkdwn(text)}*`;\n/** `text` escaped and wrapped in mrkdwn italic markers. */\nexport const italic = (text: string): string => `_${escapeMrkdwn(text)}_`;\n/** `text` escaped and wrapped in mrkdwn strikethrough markers. */\nexport const strike = (text: string): string => `~${escapeMrkdwn(text)}~`;\n\n/**\n * Inline code span. Contents are not mrkdwn-escaped, since `<` and friends are\n * literal inside a code span; only embedded backticks are demoted, to a\n * modifier letter that cannot close the span.\n */\nexport const code = (text: string): string =>\n `\\`${text.replace(/`/g, '\\u02CB')}\\``;\n\n/**\n * Fenced code block. Slack honours the triple-backtick fence but not a language\n * hint. Embedded triple-backticks are demoted with a zero-width joiner so they\n * cannot terminate the block early.\n */\nexport const codeBlock = (text: string): string =>\n `\\`\\`\\`\\n${text.replace(/```/g, '``\\u200d`')}\\n\\`\\`\\``;\n\nconst URL_PARTS_RE = /^([a-z][a-z0-9+.-]*:(?:\\/\\/[^/?#]*)?)(.*)$/is;\n// Letter, digit, and hyphen labels, with an optional DNS root dot.\nconst DNS_NAME_RE =\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\\.?$/i;\nconst IPV6_HOST_RE = /^\\[[0-9a-f:.]+\\]$/i;\n\nconst MALFORMED_ESCAPE_RE = /%(?![0-9a-f]{2})/i;\n\n// `url` parsed, when its escapes are well formed and `URL` prints it as\n// written up to the case of its scheme and authority and a `/` for an empty\n// path.\nconst parsedAsWritten = (url: string): URL | null => {\n if (MALFORMED_ESCAPE_RE.test(url)) {\n return null;\n }\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const [, prefix, rest] = URL_PARTS_RE.exec(url) ?? [];\n const [, printedPrefix, printedRest] = URL_PARTS_RE.exec(parsed.href) ?? [];\n return prefix !== undefined &&\n prefix.toLowerCase() === printedPrefix?.toLowerCase() &&\n (printedRest === rest || printedRest === `/${rest}`)\n ? parsed\n : null;\n};\n\n/**\n * Whether `url` is an `http:` or `https:` URL with a DNS or IPv6 host that\n * `URL` prints as written, so nothing it repairs or encodes, such as a\n * backslash, whitespace, or non-ASCII, passes.\n */\nexport const isAbsoluteHttpUrl = (url: string): boolean => {\n const parsed = parsedAsWritten(url);\n return (\n (parsed?.protocol === 'http:' || parsed?.protocol === 'https:') &&\n (DNS_NAME_RE.test(parsed.hostname) || IPV6_HOST_RE.test(parsed.hostname))\n );\n};\n\n// RFC 5322 dot-atom text, less `/`, `?`, `#`, and `%`.\nconst LOCAL_PART_RE =\n /^[a-z0-9!$&'*+=^_`{|}~-]+(?:\\.[a-z0-9!$&'*+=^_`{|}~-]+)*$/i;\n\nconst isMailbox = (recipient: string): boolean => {\n const at = recipient.lastIndexOf('@');\n return (\n at > 0 &&\n LOCAL_PART_RE.test(recipient.slice(0, at)) &&\n DNS_NAME_RE.test(recipient.slice(at + 1))\n );\n};\n\nconst decoded = (value: string): string | null => {\n try {\n return decodeURIComponent(value);\n } catch {\n return null;\n }\n};\n\n// Every comma-separated recipient before the query or fragment is a mailbox.\nconst isMailtoUrl = (url: string): boolean => {\n const [, recipients] = /^mailto:([^?#]*)/i.exec(url) ?? [];\n return (\n recipients !== undefined &&\n parsedAsWritten(url) !== null &&\n recipients\n .split(',')\n .every((recipient) => isMailbox(decoded(recipient) ?? ''))\n );\n};\n\n/** Where Slack output's relative links resolve. */\nexport interface SlackLinkOptions {\n /** Absolute `http(s)` URL a relative link resolves against; without it, a relative link prints its label. */\n baseUrl?: string;\n}\n\n// Parsed rather than checked as written: a base is only resolved against, so\n// a default port or an uppercase host is fine.\nconst isSlackBaseUrl = (baseUrl: string): boolean => {\n let parsed: URL;\n try {\n parsed = new URL(baseUrl);\n } catch {\n return false;\n }\n return (\n (parsed.protocol === 'http:' || parsed.protocol === 'https:') &&\n parsed.username === '' &&\n parsed.password === '' &&\n (DNS_NAME_RE.test(parsed.hostname) || IPV6_HOST_RE.test(parsed.hostname))\n );\n};\n\n/**\n * Throws `INVALID_BASE_URL` unless `baseUrl` is absent or an `http:` or\n * `https:` URL with a DNS or IPv6 host and no credentials.\n */\nexport const assertSlackBaseUrl = (baseUrl: string | undefined): void => {\n if (baseUrl !== undefined && !isSlackBaseUrl(baseUrl)) {\n throw new IsomerError(\n 'INVALID_BASE_URL',\n `Slack baseUrl must be an absolute http or https URL without credentials, got \"${baseUrl}\"`\n );\n }\n};\n\nconst HAS_SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i;\n\n// A relative path resolved onto the base's origin, or `null` when it would\n// leave that origin. A fragment, `BLOCKED_HREF` included, names a place in a\n// document Slack does not show, so it never resolves.\nconst resolvedOnBase = (url: string, baseUrl: string): string | null => {\n if (url.startsWith('#') || HAS_SCHEME_RE.test(url)) {\n return null;\n }\n let resolved: URL;\n try {\n resolved = new URL(url, baseUrl);\n } catch {\n return null;\n }\n return resolved.origin === new URL(baseUrl).origin ? resolved.href : null;\n};\n\n/**\n * `href` when {@link sanitizeNavigationHref} passes it and it is an `http:` or\n * `https:` URL with a host, or a `mailto:` of well-formed mailboxes; `null`\n * otherwise. Slack has no page to resolve a relative URL against, so one links\n * only when `baseUrl` is given, resolved onto its origin; a fragment, such as\n * `BLOCKED_HREF`, never resolves.\n */\nexport const slackLinkUrl = (href: string, baseUrl?: string): string | null => {\n assertSlackBaseUrl(baseUrl);\n const url = sanitizeNavigationHref(href);\n if (url === null) {\n return null;\n }\n if (isAbsoluteHttpUrl(url) || isMailtoUrl(url)) {\n return url;\n }\n const resolved = baseUrl === undefined ? null : resolvedOnBase(url, baseUrl);\n return resolved === null ? null : slackLinkUrl(resolved);\n};\n\n/**\n * Slack mrkdwn link, `<url|label>`, or a bare `<url>` when `label` is omitted.\n *\n * URL and label are both escaped so `&` and `>` cannot break Slack's link\n * parser, and a `|` in the URL is percent-encoded so it cannot end the URL\n * early. A URL {@link slackLinkUrl} rejects degrades to plain escaped text\n * with no link.\n */\nexport const link = (url: string, label?: string, baseUrl?: string): string => {\n const sanitized = slackLinkUrl(url, baseUrl);\n if (!sanitized) {\n return escapeMrkdwn(label ?? url);\n }\n const safeUrl = escapeMrkdwn(sanitized).replaceAll('|', '%7C');\n if (!label) {\n return `<${safeUrl}>`;\n }\n return `<${safeUrl}|${escapeMrkdwn(label)}>`;\n};\n\n/**\n * Truncates `value` to `max` UTF-16 code units at a grapheme boundary,\n * appending an ellipsis when it had to cut. Pass a `SLACK_LIMITS` constant as\n * the budget.\n */\nexport const clampSlackText = (value: string, max: number): string => {\n if (value.length <= max) {\n return value;\n }\n const budget = max <= 1 ? max : max - 1;\n let end = 0;\n for (const { index, segment } of new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n }).segment(value)) {\n if (index + segment.length > budget) {\n break;\n }\n end = index + segment.length;\n }\n const head = value.slice(0, end);\n return max <= 1 ? head : `${head.trimEnd()}…`;\n};\n\n// A `<…>` link or mention and an entity, each matched where it starts.\nconst LINK_TOKEN_RE = /<[^<>\\n]*>/y;\nconst ENTITY_TOKEN_RE = /&(?:amp|lt|gt);/y;\n\n// The end of the token `re` matches at `index`, or `undefined`.\nconst tokenEnd = (\n value: string,\n re: RegExp,\n index: number\n): number | undefined => {\n re.lastIndex = index;\n return re.test(value) ? re.lastIndex : undefined;\n};\n\n/**\n * {@link clampSlackText} for `mrkdwn`: never cuts inside a `<…>` link or\n * mention or an entity. Formatting marks are left as they fall; Slack prints an\n * unclosed one as written.\n */\nexport const clampMrkdwn = (value: string, max: number): string => {\n const clamped = clampSlackText(value, max);\n if (clamped === value || max <= 1) {\n return clamped;\n }\n // Entity first: a link holds no `<` of its own, so stepping back to its\n // start cannot land inside an entity, while the reverse could.\n let cut = clamped.length - 1;\n const entity = value.lastIndexOf('&', cut - 1);\n if (entity !== -1 && (tokenEnd(value, ENTITY_TOKEN_RE, entity) ?? 0) > cut) {\n cut = entity;\n }\n const link = value.lastIndexOf('<', cut - 1);\n if (link !== -1 && (tokenEnd(value, LINK_TOKEN_RE, link) ?? 0) > cut) {\n cut = link;\n }\n return `${value.slice(0, cut).trimEnd()}…`;\n};\n\n/**\n * `value` cut to `max` UTF-16 code units, never through a surrogate pair. For\n * opaque values a host reads back, which an ellipsis would change.\n */\nexport const cutSlackValue = (value: string, max: number): string => {\n const cut = value.slice(0, max);\n return /[\\ud800-\\udbff]$/.test(cut) ? cut.slice(0, -1) : cut;\n};\n\n/**\n * Collapses whitespace and clamps to `SLACK_LIMITS.headerTextChars`. Header\n * text is `plain_text`, so no markdown survives — do not pre-format it.\n */\nexport const formatHeaderText = (value: string): string =>\n clampSlackText(\n value.replace(/\\s+/g, ' ').trim(),\n SLACK_LIMITS.headerTextChars\n );\n"]}
|
|
@@ -6,12 +6,14 @@
|
|
|
6
6
|
* 2.0.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.markdownContentToSlackBlocks = exports.strike = exports.slackLinkUrl = exports.link = exports.italic = exports.isAbsoluteHttpUrl = exports.escapeMrkdwn = exports.codeBlock = exports.code = exports.clampSlackText = exports.bold = exports.renderSlackEnvelope = exports.SLACK_LIMITS = exports.isSlackReachableImageUrl = exports.createSlackAssetCollector = void 0;
|
|
9
|
+
exports.unmodeledSlackBlock = exports.isUnmodeledSlackBlock = exports.isModeledSlackBlockType = exports.markdownContentToSlackBlocks = exports.strike = exports.slackLinkUrl = exports.link = exports.italic = exports.isAbsoluteHttpUrl = exports.escapeMrkdwn = exports.codeBlock = exports.code = exports.clampSlackText = exports.bold = exports.renderSlackEnvelope = exports.slackContainer = exports.SLACK_LIMITS = exports.isSlackReachableImageUrl = exports.createSlackAssetCollector = void 0;
|
|
10
10
|
var assets_1 = require("./assets");
|
|
11
11
|
Object.defineProperty(exports, "createSlackAssetCollector", { enumerable: true, get: function () { return assets_1.createSlackAssetCollector; } });
|
|
12
12
|
Object.defineProperty(exports, "isSlackReachableImageUrl", { enumerable: true, get: function () { return assets_1.isSlackReachableImageUrl; } });
|
|
13
13
|
var blocks_1 = require("./blocks");
|
|
14
14
|
Object.defineProperty(exports, "SLACK_LIMITS", { enumerable: true, get: function () { return blocks_1.SLACK_LIMITS; } });
|
|
15
|
+
var container_1 = require("./container");
|
|
16
|
+
Object.defineProperty(exports, "slackContainer", { enumerable: true, get: function () { return container_1.slackContainer; } });
|
|
15
17
|
var envelope_1 = require("./envelope");
|
|
16
18
|
Object.defineProperty(exports, "renderSlackEnvelope", { enumerable: true, get: function () { return envelope_1.renderSlackEnvelope; } });
|
|
17
19
|
var format_1 = require("./format");
|
|
@@ -27,4 +29,8 @@ Object.defineProperty(exports, "slackLinkUrl", { enumerable: true, get: function
|
|
|
27
29
|
Object.defineProperty(exports, "strike", { enumerable: true, get: function () { return format_1.strike; } });
|
|
28
30
|
var markdown_content_1 = require("./markdown_content");
|
|
29
31
|
Object.defineProperty(exports, "markdownContentToSlackBlocks", { enumerable: true, get: function () { return markdown_content_1.markdownContentToSlackBlocks; } });
|
|
32
|
+
var unmodeled_1 = require("./unmodeled");
|
|
33
|
+
Object.defineProperty(exports, "isModeledSlackBlockType", { enumerable: true, get: function () { return unmodeled_1.isModeledSlackBlockType; } });
|
|
34
|
+
Object.defineProperty(exports, "isUnmodeledSlackBlock", { enumerable: true, get: function () { return unmodeled_1.isUnmodeledSlackBlock; } });
|
|
35
|
+
Object.defineProperty(exports, "unmodeledSlackBlock", { enumerable: true, get: function () { return unmodeled_1.unmodeledSlackBlock; } });
|
|
30
36
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/render/slack/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAKkB;AAFhB,mHAAA,yBAAyB,OAAA;AACzB,kHAAA,wBAAwB,OAAA;AAE1B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/render/slack/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAKkB;AAFhB,mHAAA,yBAAyB,OAAA;AACzB,kHAAA,wBAAwB,OAAA;AAE1B,mCA4CkB;AADhB,sGAAA,YAAY,OAAA;AAEd,yCAAyE;AAApC,2GAAA,cAAc,OAAA;AACnD,uCAKoB;AADlB,+GAAA,mBAAmB,OAAA;AAGrB,mCAYkB;AAVhB,8FAAA,IAAI,OAAA;AACJ,wGAAA,cAAc,OAAA;AACd,8FAAA,IAAI,OAAA;AACJ,mGAAA,SAAS,OAAA;AACT,sGAAA,YAAY,OAAA;AACZ,2GAAA,iBAAiB,OAAA;AACjB,gGAAA,MAAM,OAAA;AACN,8FAAA,IAAI,OAAA;AACJ,sGAAA,YAAY,OAAA;AACZ,gGAAA,MAAM,OAAA;AAGR,uDAAkE;AAAzD,gIAAA,4BAA4B,OAAA;AAErC,yCAIqB;AAHnB,oHAAA,uBAAuB,OAAA;AACvB,kHAAA,qBAAqB,OAAA;AACrB,gHAAA,mBAAmB,OAAA","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 SlackAssetCollector,\n type SlackAssetRequest,\n createSlackAssetCollector,\n isSlackReachableImageUrl,\n} from './assets';\nexport {\n type SlackActionElement,\n type SlackActionsBlock,\n type SlackBlock,\n type SlackButtonElement,\n type SlackCheckboxesElement,\n type SlackContainerBlock,\n type SlackContainerChildBlock,\n type SlackContextBlock,\n type SlackDividerBlock,\n type SlackFileReference,\n type SlackHeaderBlock,\n type SlackHeaderLevel,\n type SlackImageBlock,\n type SlackImageElement,\n type SlackMrkdwnTextObject,\n type SlackMultiStaticSelectElement,\n type SlackOptionGroup,\n type SlackOptionObject,\n type SlackOverflowElement,\n type SlackPlainTextObject,\n type SlackRadioButtonsElement,\n type SlackRawTextElement,\n type SlackRichTextBlock,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextLink,\n type SlackRichTextList,\n type SlackRichTextPreformatted,\n type SlackRichTextQuote,\n type SlackRichTextSection,\n type SlackRichTextStyle,\n type SlackRichTextTag,\n type SlackRichTextText,\n type SlackSectionAccessory,\n type SlackSectionBlock,\n type SlackStaticSelectElement,\n type SlackTableBlock,\n type SlackTableCell,\n type SlackTableColumnSetting,\n type SlackTagColor,\n type SlackTextObject,\n type SlackVideoBlock,\n SLACK_LIMITS,\n} from './blocks';\nexport { type SlackContainerOptions, slackContainer } from './container';\nexport {\n type SlackEnvelopeDispatcher,\n type SlackEnvelopeOptions,\n type SlackEnvelopeResult,\n renderSlackEnvelope,\n} from './envelope';\n\nexport {\n type SlackLinkOptions,\n bold,\n clampSlackText,\n code,\n codeBlock,\n escapeMrkdwn,\n isAbsoluteHttpUrl,\n italic,\n link,\n slackLinkUrl,\n strike,\n} from './format';\n\nexport { markdownContentToSlackBlocks } from './markdown_content';\n\nexport {\n isModeledSlackBlockType,\n isUnmodeledSlackBlock,\n unmodeledSlackBlock,\n} from './unmodeled';\n"]}
|