@elastic/isomer-sdk 0.2.0 → 0.3.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 +1 -0
- package/dist/cjs/composition/error.js.map +1 -1
- package/dist/cjs/composition/structured_value.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/entries/index.js +3 -2
- package/dist/cjs/entries/index.js.map +1 -1
- package/dist/cjs/entries/markdown.js +2 -1
- package/dist/cjs/entries/markdown.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/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 +3 -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/react/content.js +3 -1
- package/dist/cjs/render/react/content.js.map +1 -1
- package/dist/cjs/render/slack/markdown_content.js +7 -1
- package/dist/cjs/render/slack/markdown_content.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 +1 -0
- package/dist/composition/error.d.ts.map +1 -1
- package/dist/composition/error.js +1 -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/primitive_module.d.ts +7 -0
- 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/entries/index.d.ts +1 -1
- package/dist/entries/index.d.ts.map +1 -1
- package/dist/entries/index.js +1 -1
- 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/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/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 +1 -0
- package/dist/render/markdown/index.d.ts.map +1 -1
- package/dist/render/markdown/index.js +1 -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/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/slack/markdown_content.d.ts.map +1 -1
- package/dist/render/slack/markdown_content.js +7 -1
- package/dist/render/slack/markdown_content.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 +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown_content.js","sourceRoot":"","sources":["../../../src/render/slack/markdown_content.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// Markdown to Block Kit, read from the tree rather than re-parsed line by\n// line. Rich text carries formatting as style flags beside literal text, so\n// nothing is escaped and nesting survives exactly.\n\nimport type {\n Blockquote,\n Definition,\n FootnoteDefinition,\n List,\n ListItem,\n Nodes,\n Paragraph,\n PhrasingContent,\n RootContent,\n Table,\n} from 'mdast';\n\nimport type { MarkdownContent } from '../../define/markdown_content';\nimport { markdownBlocks, VERBATIM_TYPE } from '../markdown/builder';\nimport { parseGfmBlocks } from '../markdown/format';\n\nimport {\n SLACK_LIMITS,\n type SlackBlock,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextSection,\n type SlackRichTextStyle,\n type SlackTableBlock,\n type SlackTableCell,\n} from './blocks';\nimport { clampSlackText, slackLinkUrl } from './format';\n\nconst footnoteLabel = ({\n identifier,\n label,\n}: Pick<FootnoteDefinition, 'identifier' | 'label'>): string =>\n `[^${label ?? identifier}]`;\n\nconst plainText = (node: Nodes): string => {\n if ('value' in node) {\n return node.value;\n }\n if (node.type === 'image') {\n return node.alt ?? '';\n }\n if (node.type === 'footnoteReference') {\n return footnoteLabel(node);\n }\n return 'children' in node ? node.children.map(plainText).join('') : '';\n};\n\nconst styled = (style: SlackRichTextStyle): SlackRichTextStyle | undefined =>\n Object.keys(style).length === 0 ? undefined : style;\n\nconst textElement = (\n text: string,\n style: SlackRichTextStyle\n): SlackRichTextInline[] => {\n const withStyle = styled(style);\n return text === ''\n ? []\n : [{ type: 'text', text, ...(withStyle ? { style: withStyle } : {}) }];\n};\n\n// One link element per styled run of the label, so its formatting survives;\n// an empty label is a bare link. A URL Slack cannot link leaves the label.\nconst linkRuns = (\n href: string,\n runs: SlackRichTextInline[],\n style: SlackRichTextStyle\n): SlackRichTextInline[] => {\n const url = slackLinkUrl(href);\n if (url === null) {\n return runs;\n }\n if (runs.length === 0) {\n const withStyle = styled(style);\n return [{ type: 'link', url, ...(withStyle ? { style: withStyle } : {}) }];\n }\n return runs.map((run) =>\n run.type === 'text' ? { ...run, type: 'link', url } : run\n );\n};\n\nconst inline = (\n nodes: readonly PhrasingContent[],\n style: SlackRichTextStyle = {}\n): SlackRichTextInline[] =>\n nodes.flatMap((node): SlackRichTextInline[] => {\n switch (node.type) {\n case 'strong':\n return inline(node.children, { ...style, bold: true });\n case 'emphasis':\n return inline(node.children, { ...style, italic: true });\n case 'delete':\n return inline(node.children, { ...style, strike: true });\n case 'inlineCode':\n return textElement(node.value, { ...style, code: true });\n case 'link':\n return linkRuns(node.url, inline(node.children, style), style);\n // Slack draws no inline image, so it links to the source.\n case 'image':\n return linkRuns(node.url, textElement(node.alt ?? '', style), style);\n case 'break':\n return textElement('\\n', style);\n default:\n return textElement(plainText(node), style);\n }\n });\n\nconst inlineText = (element: SlackRichTextInline): string =>\n element.type === 'link' ? (element.text ?? element.url) : element.text;\n\n// The envelope leaves rich text alone, so a section keeps to the budget of a\n// `section` block's text.\nconst clampInline = (\n elements: readonly SlackRichTextInline[],\n budget: number = SLACK_LIMITS.sectionTextChars\n): SlackRichTextInline[] => {\n const kept: SlackRichTextInline[] = [];\n let spent = 0;\n for (const element of elements) {\n const length = inlineText(element).length;\n const rest = budget - spent;\n if (length <= rest) {\n kept.push(element);\n spent += length;\n continue;\n }\n const text = rest > 0 ? clampSlackText(inlineText(element), rest) : '';\n if (text !== '') {\n kept.push({ ...element, text });\n }\n break;\n }\n return kept;\n};\n\nconst section = (elements: SlackRichTextInline[]): SlackRichTextSection[] => {\n const clamped = clampInline(elements);\n return clamped.length === 0\n ? []\n : [{ type: 'rich_text_section', elements: clamped }];\n};\n\ntype Piece = SlackRichTextBlockElement | SlackBlock;\n\nconst isElement = (piece: Piece): piece is SlackRichTextBlockElement =>\n piece.type.startsWith('rich_text_');\n\n// Blocks a rich-text list item holds as lines of its text.\nconst ITEM_LINES: ReadonlySet<string> = new Set([\n 'paragraph',\n 'heading',\n 'code',\n 'html',\n]);\n\nconst childInline = (\n child: ListItem['children'][number]\n): SlackRichTextInline[] =>\n 'children' in child\n ? inline(\n child.children as PhrasingContent[],\n child.type === 'heading' ? { bold: true } : {}\n )\n : textElement(\n plainText(child),\n child.type === 'code' ? { code: true } : {}\n );\n\n// A quote holds its blocks at one level.\nconst unquoted = (node: RootContent): RootContent[] =>\n node.type === 'blockquote' ? node.children.flatMap(unquoted) : [node];\n\n// An item's children are read in order. Its lines of text share one bullet; a\n// nested list follows at the next indent; any other block, such as a table,\n// follows on its own; what the item holds after either follows unbulleted,\n// since a Slack list item cannot resume; and the list resumes at its next\n// number. A task item's first line leads with its box.\nconst listPieces = (list: List, indent: number): Piece[] => {\n const style = list.ordered ? 'ordered' : 'bullet';\n const out: Piece[] = [];\n let current: SlackRichTextSection[] = [];\n let number = list.start ?? 1;\n let offset = number - 1;\n const flush = (): void => {\n if (current.length > 0) {\n out.push({\n type: 'rich_text_list',\n style,\n ...(indent > 0 ? { indent } : {}),\n // A list starting at 0 would need a negative offset, which Slack\n // may reject along with the whole message; it starts at 1 instead.\n ...(list.ordered && offset > 0 ? { offset } : {}),\n elements: current,\n });\n }\n current = [];\n offset = number - 1;\n };\n for (const item of list.children) {\n let runs: SlackRichTextInline[] = [];\n let numbered = false;\n let box =\n typeof item.checked === 'boolean'\n ? textElement(item.checked ? '☑ ' : '☐ ', {})\n : [];\n const emit = (): void => {\n const sections = section(runs);\n runs = [];\n if (sections.length === 0) {\n return;\n }\n if (numbered) {\n flush();\n out.push(...sections);\n } else {\n current.push(...sections);\n number += 1;\n numbered = true;\n }\n };\n for (const child of item.children.flatMap(\n unquoted\n ) as ListItem['children']) {\n if (ITEM_LINES.has(child.type)) {\n runs.push(\n ...(runs.length > 0 ? textElement('\\n', {}) : box),\n ...childInline(child)\n );\n box = [];\n continue;\n }\n const pieces =\n child.type === 'list'\n ? listPieces(\n child,\n Math.min(indent + 1, SLACK_LIMITS.richTextListMaxIndent)\n )\n : blockPieces(child);\n if (pieces.length > 0) {\n emit();\n flush();\n out.push(...pieces);\n }\n }\n emit();\n }\n flush();\n return out;\n};\n\nconst tableCell = (cell: PhrasingContent[]): SlackTableCell => {\n const elements = inline(cell);\n const plain = elements.every(\n (element) => element.type === 'text' && element.style === undefined\n );\n return plain\n ? { type: 'raw_text', text: cell.map(plainText).join('') }\n : {\n type: 'rich_text',\n elements: section(elements),\n };\n};\n\n// Slack rejects a row with no cells, so such rows are dropped, and a table\n// whose header has none prints nothing.\nconst tableBlock = (table: Table): SlackTableBlock[] => {\n const rows = table.children\n .slice(0, SLACK_LIMITS.tableRows)\n .map((row) =>\n row.children\n .slice(0, SLACK_LIMITS.tableColumns)\n .map((cell) => tableCell(cell.children))\n );\n const [header] = rows;\n if (header === undefined || header.length === 0) {\n return [];\n }\n return [\n {\n type: 'table',\n rows: rows.filter((cells) => cells.length > 0),\n column_settings: header.map((_cell, index) => ({\n align: table.align?.[index] ?? 'left',\n is_wrapped: true,\n })),\n },\n ];\n};\n\n// A footnote's label leads its first paragraph.\nconst footnotePieces = ({\n children,\n ...footnote\n}: FootnoteDefinition): Piece[] => {\n const [first, ...rest] = children;\n const label: PhrasingContent = {\n type: 'text',\n value: `${footnoteLabel(footnote)}: `,\n };\n const lead: Paragraph = {\n type: 'paragraph',\n children: [label, ...(first?.type === 'paragraph' ? first.children : [])],\n };\n return [lead, ...(first?.type === 'paragraph' ? rest : children)].flatMap(\n blockPieces\n );\n};\n\nconst borderedElement = (\n element: SlackRichTextBlockElement\n): SlackRichTextBlockElement => {\n switch (element.type) {\n case 'rich_text_list':\n case 'rich_text_preformatted':\n return { ...element, border: 1 };\n case 'rich_text_section':\n return { type: 'rich_text_quote', elements: element.elements };\n default:\n return element;\n }\n};\n\n// What a quote holds besides text keeps a quote's border; a table or divider\n// has none.\nconst bordered = (piece: Piece): Piece =>\n isElement(piece) ? borderedElement(piece) : piece;\n\n// A quote is one level, nested quotes spread into it: its text as\n// `rich_text_quote`, and any other block it holds with a border.\nconst quotePieces = (quote: Blockquote): Piece[] => {\n const out: Piece[] = [];\n let runs: SlackRichTextInline[] = [];\n const flush = (): void => {\n const elements = clampInline(runs);\n runs = [];\n if (elements.length > 0) {\n out.push({ type: 'rich_text_quote', elements });\n }\n };\n for (const child of quote.children.flatMap(unquoted)) {\n if (child.type === 'paragraph' || child.type === 'heading') {\n const line = childInline(child);\n runs.push(\n ...(runs.length > 0 && line.length > 0 ? textElement('\\n', {}) : []),\n ...line\n );\n } else {\n const pieces = blockPieces(child);\n if (pieces.length > 0) {\n flush();\n out.push(...pieces.map(bordered));\n }\n }\n }\n flush();\n return out;\n};\n\nconst blockPieces = (node: RootContent): Piece[] => {\n switch (node.type) {\n case 'paragraph':\n case 'html':\n return section(childInline(node));\n case 'heading':\n return section(inline(node.children, { bold: true }));\n case 'code':\n return node.value === ''\n ? []\n : [\n {\n type: 'rich_text_preformatted',\n elements: textElement(\n clampSlackText(node.value, SLACK_LIMITS.sectionTextChars),\n {}\n ),\n },\n ];\n case 'list':\n return listPieces(node, 0);\n case 'blockquote':\n return quotePieces(node);\n case 'table':\n return tableBlock(node);\n case 'thematicBreak':\n return [{ type: 'divider' }];\n case 'footnoteDefinition':\n return footnotePieces(node);\n default:\n return [];\n }\n};\n\n// Each reference resolved to its document's first definition.\nconst withReferences = (blocks: readonly RootContent[]): RootContent[] => {\n const definitions = new Map<string, Definition>();\n const collect = (node: Nodes): void => {\n if (node.type === 'definition' && !definitions.has(node.identifier)) {\n definitions.set(node.identifier, node);\n }\n if ('children' in node) {\n node.children.forEach(collect);\n }\n };\n blocks.forEach(collect);\n if (definitions.size === 0) {\n return [...blocks];\n }\n const resolve = (node: Nodes): Nodes => {\n switch (node.type) {\n case 'linkReference':\n return {\n type: 'link',\n url: definitions.get(node.identifier)?.url ?? '',\n children: node.children.map(resolve) as PhrasingContent[],\n };\n case 'imageReference':\n return {\n type: 'image',\n url: definitions.get(node.identifier)?.url ?? '',\n alt: node.alt ?? null,\n };\n default:\n return 'children' in node\n ? ({ ...node, children: node.children.map(resolve) } as Nodes)\n : node;\n }\n };\n return blocks.map(resolve) as RootContent[];\n};\n\nconst lines = (text: string): string => text.replace(/\\r\\n?/g, '\\n');\n\nconst literalParagraphs = (text: string): RootContent[] =>\n lines(text)\n .split(/\\n[ \\t]*\\n/)\n .filter((paragraph) => paragraph.trim() !== '')\n .map((paragraph) => ({\n type: 'paragraph',\n children: [{ type: 'text', value: paragraph.trim() }],\n }));\n\n// Source past the parse budget prints as its literal paragraphs.\nconst gfmBlocks = (gfm: string): RootContent[] => {\n const parsed = parseGfmBlocks(lines(gfm)) as RootContent[] | null;\n return parsed === null ? literalParagraphs(gfm) : withReferences(parsed);\n};\n\n// Markdown printed as written is read as the GFM it holds; authored source\n// that sanitizing left inert is never parsed.\nconst expanded = (node: Nodes): Nodes[] => {\n if ((node.type as string) === VERBATIM_TYPE) {\n const { value, source } = node as unknown as {\n value: string;\n source?: string;\n };\n return source === undefined ? gfmBlocks(value) : literalParagraphs(source);\n }\n return 'children' in node\n ? [{ ...node, children: node.children.flatMap(expanded) } as Nodes]\n : [node];\n};\n\nconst toSlackBlocks = (nodes: readonly RootContent[]): SlackBlock[] => {\n const blocks: SlackBlock[] = [];\n let elements: SlackRichTextBlockElement[] = [];\n const flush = (): void => {\n if (elements.length > 0) {\n // A section followed by another ends in a line break, so paragraphs\n // never run together.\n blocks.push({\n type: 'rich_text',\n elements: elements.map((element, index) =>\n element.type === 'rich_text_section' &&\n elements[index + 1]?.type === 'rich_text_section'\n ? {\n ...element,\n elements: [\n ...clampInline(\n element.elements,\n SLACK_LIMITS.sectionTextChars - 1\n ),\n { type: 'text', text: '\\n' },\n ],\n }\n : element\n ),\n });\n }\n elements = [];\n };\n for (const node of nodes) {\n for (const piece of blockPieces(node)) {\n if (isElement(piece)) {\n elements.push(piece);\n } else {\n flush();\n blocks.push(piece);\n }\n }\n }\n flush();\n return blocks;\n};\n\n/**\n * Builder content as Block Kit: paragraphs, headings, lists, quotes, and code\n * as `rich_text`, tables as `table` blocks, and thematic breaks as `divider`\n * blocks. A quote is one level, and inside a list item its blocks are the\n * item's. A run of rich-text blocks shares one `rich_text` block. Source from\n * `md.authored` is parsed as GFM and translated the same way.\n */\nexport const markdownContentToSlackBlocks = (\n content: MarkdownContent\n): SlackBlock[] =>\n toSlackBlocks(\n (markdownBlocks(content) as RootContent[]).flatMap(\n expanded\n ) as RootContent[]\n );\n\n/**\n * GFM as Block Kit, parsed as CommonMark with GFM and translated as\n * {@link markdownContentToSlackBlocks} translates builder content. Source past\n * the parse budget that `md.authored` applies prints as literal paragraphs.\n */\nexport const gfmToSlackBlocks = (gfm: string): SlackBlock[] =>\n toSlackBlocks(gfmBlocks(gfm));\n"]}
|
|
1
|
+
{"version":3,"file":"markdown_content.js","sourceRoot":"","sources":["../../../src/render/slack/markdown_content.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// Markdown to Block Kit, read from the tree rather than re-parsed line by\n// line. Rich text carries formatting as style flags beside literal text, so\n// nothing is escaped and nesting survives exactly.\n\nimport type {\n Blockquote,\n Definition,\n FootnoteDefinition,\n List,\n ListItem,\n Nodes,\n Paragraph,\n PhrasingContent,\n RootContent,\n Table,\n} from 'mdast';\n\nimport type { MarkdownContent } from '../../define/markdown_content';\nimport { markdownBlocks, VERBATIM_TYPE } from '../markdown/builder';\nimport { parseGfmBlocks } from '../markdown/format';\n\nimport {\n SLACK_LIMITS,\n type SlackBlock,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextSection,\n type SlackRichTextStyle,\n type SlackTableBlock,\n type SlackTableCell,\n} from './blocks';\nimport { clampSlackText, slackLinkUrl } from './format';\n\nconst footnoteLabel = ({\n identifier,\n label,\n}: Pick<FootnoteDefinition, 'identifier' | 'label'>): string =>\n `[^${label ?? identifier}]`;\n\nconst plainText = (node: Nodes): string => {\n if ('value' in node) {\n return node.value;\n }\n if (node.type === 'image') {\n return node.alt ?? '';\n }\n if (node.type === 'footnoteReference') {\n return footnoteLabel(node);\n }\n return 'children' in node ? node.children.map(plainText).join('') : '';\n};\n\nconst styled = (style: SlackRichTextStyle): SlackRichTextStyle | undefined =>\n Object.keys(style).length === 0 ? undefined : style;\n\nconst textElement = (\n text: string,\n style: SlackRichTextStyle\n): SlackRichTextInline[] => {\n const withStyle = styled(style);\n return text === ''\n ? []\n : [{ type: 'text', text, ...(withStyle ? { style: withStyle } : {}) }];\n};\n\n// One link element per styled run of the label, so its formatting survives;\n// an empty label is a bare link. A URL Slack cannot link leaves the label.\nconst linkRuns = (\n href: string,\n runs: SlackRichTextInline[],\n style: SlackRichTextStyle\n): SlackRichTextInline[] => {\n const url = slackLinkUrl(href);\n if (url === null) {\n return runs;\n }\n if (runs.length === 0) {\n const withStyle = styled(style);\n return [{ type: 'link', url, ...(withStyle ? { style: withStyle } : {}) }];\n }\n return runs.map((run) =>\n run.type === 'text' ? { ...run, type: 'link', url } : run\n );\n};\n\nconst inline = (\n nodes: readonly PhrasingContent[],\n style: SlackRichTextStyle = {}\n): SlackRichTextInline[] =>\n nodes.flatMap((node): SlackRichTextInline[] => {\n switch (node.type) {\n case 'strong':\n return inline(node.children, { ...style, bold: true });\n case 'emphasis':\n return inline(node.children, { ...style, italic: true });\n case 'delete':\n return inline(node.children, { ...style, strike: true });\n case 'inlineCode':\n return textElement(node.value, { ...style, code: true });\n case 'link':\n return linkRuns(node.url, inline(node.children, style), style);\n // Slack draws no inline image, so it links to the source.\n case 'image':\n return linkRuns(node.url, textElement(node.alt ?? '', style), style);\n case 'break':\n return textElement('\\n', style);\n default:\n return textElement(plainText(node), style);\n }\n });\n\nconst inlineText = (element: SlackRichTextInline): string =>\n element.type === 'link' ? (element.text ?? element.url) : element.text;\n\n// The envelope leaves rich text alone, so a section keeps to the budget of a\n// `section` block's text.\nconst clampInline = (\n elements: readonly SlackRichTextInline[],\n budget: number = SLACK_LIMITS.sectionTextChars\n): SlackRichTextInline[] => {\n const kept: SlackRichTextInline[] = [];\n let spent = 0;\n for (const element of elements) {\n const length = inlineText(element).length;\n const rest = budget - spent;\n if (length <= rest) {\n kept.push(element);\n spent += length;\n continue;\n }\n const text = rest > 0 ? clampSlackText(inlineText(element), rest) : '';\n if (text !== '') {\n kept.push({ ...element, text });\n }\n break;\n }\n return kept;\n};\n\nconst section = (elements: SlackRichTextInline[]): SlackRichTextSection[] => {\n const clamped = clampInline(elements);\n return clamped.length === 0\n ? []\n : [{ type: 'rich_text_section', elements: clamped }];\n};\n\ntype Piece = SlackRichTextBlockElement | SlackBlock;\n\nconst isElement = (piece: Piece): piece is SlackRichTextBlockElement =>\n piece.type.startsWith('rich_text_');\n\n// Blocks a rich-text list item holds as lines of its text.\nconst ITEM_LINES: ReadonlySet<string> = new Set([\n 'paragraph',\n 'heading',\n 'code',\n 'html',\n]);\n\nconst childInline = (\n child: ListItem['children'][number]\n): SlackRichTextInline[] =>\n 'children' in child\n ? inline(\n child.children as PhrasingContent[],\n child.type === 'heading' ? { bold: true } : {}\n )\n : textElement(\n plainText(child),\n child.type === 'code' ? { code: true } : {}\n );\n\n// A quote holds its blocks at one level.\nconst unquoted = (node: RootContent): RootContent[] =>\n node.type === 'blockquote' ? node.children.flatMap(unquoted) : [node];\n\n// An item's children are read in order. Its lines of text share one bullet; a\n// nested list follows at the next indent; any other block, such as a table,\n// follows on its own; what the item holds after either follows unbulleted,\n// since a Slack list item cannot resume; and the list resumes at its next\n// number. An empty item keeps its number, so the list resumes past it. A task\n// item's first line leads with its box.\nconst listPieces = (list: List, indent: number): Piece[] => {\n const style = list.ordered ? 'ordered' : 'bullet';\n const out: Piece[] = [];\n let current: SlackRichTextSection[] = [];\n let number = list.start ?? 1;\n let offset = number - 1;\n const flush = (): void => {\n if (current.length > 0) {\n out.push({\n type: 'rich_text_list',\n style,\n ...(indent > 0 ? { indent } : {}),\n // A list starting at 0 would need a negative offset, which Slack\n // may reject along with the whole message; it starts at 1 instead.\n ...(list.ordered && offset > 0 ? { offset } : {}),\n elements: current,\n });\n }\n current = [];\n offset = number - 1;\n };\n for (const item of list.children) {\n let runs: SlackRichTextInline[] = [];\n let numbered = false;\n let box =\n typeof item.checked === 'boolean'\n ? textElement(item.checked ? '☑ ' : '☐ ', {})\n : [];\n const emit = (): void => {\n const sections = section(runs);\n runs = [];\n if (sections.length === 0) {\n return;\n }\n if (numbered) {\n flush();\n out.push(...sections);\n } else {\n current.push(...sections);\n number += 1;\n numbered = true;\n }\n };\n for (const child of item.children.flatMap(\n unquoted\n ) as ListItem['children']) {\n if (ITEM_LINES.has(child.type)) {\n runs.push(\n ...(runs.length > 0 ? textElement('\\n', {}) : box),\n ...childInline(child)\n );\n box = [];\n continue;\n }\n const pieces =\n child.type === 'list'\n ? listPieces(\n child,\n Math.min(indent + 1, SLACK_LIMITS.richTextListMaxIndent)\n )\n : blockPieces(child);\n if (pieces.length > 0) {\n emit();\n flush();\n out.push(...pieces);\n }\n }\n emit();\n if (item.children.length === 0) {\n flush();\n number += 1;\n offset = number - 1;\n }\n }\n flush();\n return out;\n};\n\nconst tableCell = (cell: PhrasingContent[]): SlackTableCell => {\n const elements = inline(cell);\n const plain = elements.every(\n (element) => element.type === 'text' && element.style === undefined\n );\n return plain\n ? { type: 'raw_text', text: cell.map(plainText).join('') }\n : {\n type: 'rich_text',\n elements: section(elements),\n };\n};\n\n// Slack rejects a row with no cells, so such rows are dropped, and a table\n// whose header has none prints nothing.\nconst tableBlock = (table: Table): SlackTableBlock[] => {\n const rows = table.children\n .slice(0, SLACK_LIMITS.tableRows)\n .map((row) =>\n row.children\n .slice(0, SLACK_LIMITS.tableColumns)\n .map((cell) => tableCell(cell.children))\n );\n const [header] = rows;\n if (header === undefined || header.length === 0) {\n return [];\n }\n return [\n {\n type: 'table',\n rows: rows.filter((cells) => cells.length > 0),\n column_settings: header.map((_cell, index) => ({\n align: table.align?.[index] ?? 'left',\n is_wrapped: true,\n })),\n },\n ];\n};\n\n// A footnote's label leads its first paragraph.\nconst footnotePieces = ({\n children,\n ...footnote\n}: FootnoteDefinition): Piece[] => {\n const [first, ...rest] = children;\n const label: PhrasingContent = {\n type: 'text',\n value: `${footnoteLabel(footnote)}: `,\n };\n const lead: Paragraph = {\n type: 'paragraph',\n children: [label, ...(first?.type === 'paragraph' ? first.children : [])],\n };\n return [lead, ...(first?.type === 'paragraph' ? rest : children)].flatMap(\n blockPieces\n );\n};\n\nconst borderedElement = (\n element: SlackRichTextBlockElement\n): SlackRichTextBlockElement => {\n switch (element.type) {\n case 'rich_text_list':\n case 'rich_text_preformatted':\n return { ...element, border: 1 };\n case 'rich_text_section':\n return { type: 'rich_text_quote', elements: element.elements };\n default:\n return element;\n }\n};\n\n// What a quote holds besides text keeps a quote's border; a table or divider\n// has none.\nconst bordered = (piece: Piece): Piece =>\n isElement(piece) ? borderedElement(piece) : piece;\n\n// A quote is one level, nested quotes spread into it: its text as\n// `rich_text_quote`, and any other block it holds with a border.\nconst quotePieces = (quote: Blockquote): Piece[] => {\n const out: Piece[] = [];\n let runs: SlackRichTextInline[] = [];\n const flush = (): void => {\n const elements = clampInline(runs);\n runs = [];\n if (elements.length > 0) {\n out.push({ type: 'rich_text_quote', elements });\n }\n };\n for (const child of quote.children.flatMap(unquoted)) {\n if (child.type === 'paragraph' || child.type === 'heading') {\n const line = childInline(child);\n runs.push(\n ...(runs.length > 0 && line.length > 0 ? textElement('\\n', {}) : []),\n ...line\n );\n } else {\n const pieces = blockPieces(child);\n if (pieces.length > 0) {\n flush();\n out.push(...pieces.map(bordered));\n }\n }\n }\n flush();\n return out;\n};\n\nconst blockPieces = (node: RootContent): Piece[] => {\n switch (node.type) {\n case 'paragraph':\n case 'html':\n return section(childInline(node));\n case 'heading':\n return section(inline(node.children, { bold: true }));\n case 'code':\n return node.value === ''\n ? []\n : [\n {\n type: 'rich_text_preformatted',\n elements: textElement(\n clampSlackText(node.value, SLACK_LIMITS.sectionTextChars),\n {}\n ),\n },\n ];\n case 'list':\n return listPieces(node, 0);\n case 'blockquote':\n return quotePieces(node);\n case 'table':\n return tableBlock(node);\n case 'thematicBreak':\n return [{ type: 'divider' }];\n case 'footnoteDefinition':\n return footnotePieces(node);\n default:\n return [];\n }\n};\n\n// Each reference resolved to its document's first definition.\nconst withReferences = (blocks: readonly RootContent[]): RootContent[] => {\n const definitions = new Map<string, Definition>();\n const collect = (node: Nodes): void => {\n if (node.type === 'definition' && !definitions.has(node.identifier)) {\n definitions.set(node.identifier, node);\n }\n if ('children' in node) {\n node.children.forEach(collect);\n }\n };\n blocks.forEach(collect);\n if (definitions.size === 0) {\n return [...blocks];\n }\n const resolve = (node: Nodes): Nodes => {\n switch (node.type) {\n case 'linkReference':\n return {\n type: 'link',\n url: definitions.get(node.identifier)?.url ?? '',\n children: node.children.map(resolve) as PhrasingContent[],\n };\n case 'imageReference':\n return {\n type: 'image',\n url: definitions.get(node.identifier)?.url ?? '',\n alt: node.alt ?? null,\n };\n default:\n return 'children' in node\n ? ({ ...node, children: node.children.map(resolve) } as Nodes)\n : node;\n }\n };\n return blocks.map(resolve) as RootContent[];\n};\n\nconst lines = (text: string): string => text.replace(/\\r\\n?/g, '\\n');\n\nconst literalParagraphs = (text: string): RootContent[] =>\n lines(text)\n .split(/\\n[ \\t]*\\n/)\n .filter((paragraph) => paragraph.trim() !== '')\n .map((paragraph) => ({\n type: 'paragraph',\n children: [{ type: 'text', value: paragraph.trim() }],\n }));\n\n// Source past the parse budget prints as its literal paragraphs.\nconst gfmBlocks = (gfm: string): RootContent[] => {\n const parsed = parseGfmBlocks(lines(gfm)) as RootContent[] | null;\n return parsed === null ? literalParagraphs(gfm) : withReferences(parsed);\n};\n\n// Markdown printed as written is read as the GFM it holds; authored source\n// that sanitizing left inert is never parsed.\nconst expanded = (node: Nodes): Nodes[] => {\n if ((node.type as string) === VERBATIM_TYPE) {\n const { value, source } = node as unknown as {\n value: string;\n source?: string;\n };\n return source === undefined ? gfmBlocks(value) : literalParagraphs(source);\n }\n return 'children' in node\n ? [{ ...node, children: node.children.flatMap(expanded) } as Nodes]\n : [node];\n};\n\nconst toSlackBlocks = (nodes: readonly RootContent[]): SlackBlock[] => {\n const blocks: SlackBlock[] = [];\n let elements: SlackRichTextBlockElement[] = [];\n const flush = (): void => {\n if (elements.length > 0) {\n // A section followed by another ends in a line break, so paragraphs\n // never run together.\n blocks.push({\n type: 'rich_text',\n elements: elements.map((element, index) =>\n element.type === 'rich_text_section' &&\n elements[index + 1]?.type === 'rich_text_section'\n ? {\n ...element,\n elements: [\n ...clampInline(\n element.elements,\n SLACK_LIMITS.sectionTextChars - 1\n ),\n { type: 'text', text: '\\n' },\n ],\n }\n : element\n ),\n });\n }\n elements = [];\n };\n for (const node of nodes) {\n for (const piece of blockPieces(node)) {\n if (isElement(piece)) {\n elements.push(piece);\n } else {\n flush();\n blocks.push(piece);\n }\n }\n }\n flush();\n return blocks;\n};\n\n/**\n * Builder content as Block Kit: paragraphs, headings, lists, quotes, and code\n * as `rich_text`, tables as `table` blocks, and thematic breaks as `divider`\n * blocks. A quote is one level, and inside a list item its blocks are the\n * item's. A run of rich-text blocks shares one `rich_text` block. Source from\n * `md.authored` is parsed as GFM and translated the same way.\n */\nexport const markdownContentToSlackBlocks = (\n content: MarkdownContent\n): SlackBlock[] =>\n toSlackBlocks(\n (markdownBlocks(content) as RootContent[]).flatMap(\n expanded\n ) as RootContent[]\n );\n\n/**\n * GFM as Block Kit, parsed as CommonMark with GFM and translated as\n * {@link markdownContentToSlackBlocks} translates builder content. Source past\n * the parse budget that `md.authored` applies prints as literal paragraphs.\n */\nexport const gfmToSlackBlocks = (gfm: string): SlackBlock[] =>\n toSlackBlocks(gfmBlocks(gfm));\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json_schema.d.ts","sourceRoot":"","sources":["../../src/validate/json_schema.ts"],"names":[],"mappings":"AAOA,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAEtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAOzE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,sDAAsD;AACtD,MAAM,WAAW,4BAA4B;IAC3C,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GACrC,aAAa,SAAS,sBAAsB,EAAE,EAC9C,UAAS,4BAAiC,KACzC,
|
|
1
|
+
{"version":3,"file":"json_schema.d.ts","sourceRoot":"","sources":["../../src/validate/json_schema.ts"],"names":[],"mappings":"AAOA,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAEtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAOzE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,sDAAsD;AACtD,MAAM,WAAW,4BAA4B;IAC3C,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GACrC,aAAa,SAAS,sBAAsB,EAAE,EAC9C,UAAS,4BAAiC,KACzC,UAgEF,CAAC"}
|
|
@@ -26,18 +26,25 @@ export const buildCompositionJsonSchema = (definitions, options = {}) => {
|
|
|
26
26
|
// registration is recorded: a schema named twice (an `extraDefs` entry that
|
|
27
27
|
// is also a member) must restore its original entry, not the first id.
|
|
28
28
|
const previous = new Map();
|
|
29
|
-
const registerId = (schema, id) => {
|
|
29
|
+
const registerId = (schema, id, description) => {
|
|
30
30
|
if (!previous.has(schema)) {
|
|
31
31
|
previous.set(schema, z.globalRegistry.get(schema));
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
const current = z.globalRegistry.get(schema);
|
|
34
|
+
z.globalRegistry.add(schema, {
|
|
35
|
+
...current,
|
|
36
|
+
id,
|
|
37
|
+
...(description === undefined ? {} : { description }),
|
|
38
|
+
});
|
|
34
39
|
};
|
|
35
40
|
registerId(bodyNodeSchema, 'bodyNode');
|
|
36
41
|
for (const extra of options.extraDefs ?? []) {
|
|
37
42
|
registerId(extra.schema, extra.id);
|
|
38
43
|
}
|
|
44
|
+
// `schemaFor` returns a new schema, so the description is taken from the catalog.
|
|
45
|
+
const described = new Map(definitions.map(({ type, catalog }) => [type, catalog.description]));
|
|
39
46
|
for (const [type, schema] of members) {
|
|
40
|
-
registerId(schema, type);
|
|
47
|
+
registerId(schema, type, described.get(type));
|
|
41
48
|
}
|
|
42
49
|
try {
|
|
43
50
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json_schema.js","sourceRoot":"","sources":["../../src/validate/json_schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAgB,MAAM,KAAK,CAAC;AAItC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAqB9B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,WAA8C,EAC9C,UAAwC,EAAE,EAC9B,EAAE;IACd,qEAAqE;IACrE,sDAAsD;IACtD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC7C,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;IAErE,sEAAsE;IACtE,2EAA2E;IAC3E,wEAAwE;IACxE,qEAAqE;IACrE,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"json_schema.js","sourceRoot":"","sources":["../../src/validate/json_schema.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 { z, type ZodType } from 'zod';\n\nimport type { AnyPrimitiveDefinition } from '../define/primitive_module';\n\nimport {\n buildCompositionSchema,\n resolveVocabulary,\n} from './composition_schema';\n\ntype JsonSchema = Record<string, unknown>;\n\n/** Options for {@link buildCompositionJsonSchema}. */\nexport interface CompositionJsonSchemaOptions {\n /** Base URI for the emitted schema, which `$ref`s resolve against. */\n $id?: string;\n /** Reaches the model, so it keeps the word \"view\". Defaults to `'View'`. */\n title?: string;\n /** Reaches the model too, so write it as guidance rather than as a type note. */\n description?: string;\n /**\n * Extra schemas to name in `$defs`, for types a pack references by `$ref`.\n * Each `id` becomes the `$defs` key, so it must be unique.\n */\n extraDefs?: readonly { schema: ZodType; id: string }[];\n /** `ref` gives a repeated schema its own `$def`; `inline` repeats it. Defaults to `ref`. */\n reused?: 'ref' | 'inline';\n}\n\n/**\n * Projects the composition schema to JSON Schema draft 2020-12, for hosts\n * that validate outside TypeScript.\n *\n * `$defs` are named per primitive type, plus `bodyNode` for the union.\n * Agent-facing prompt text uses `buildAuthoringJsonSchema` instead.\n */\nexport const buildCompositionJsonSchema = (\n definitions: readonly AnyPrimitiveDefinition[],\n options: CompositionJsonSchemaOptions = {}\n): JsonSchema => {\n // Members, not `definition.schema`: a container's member is built by\n // `schemaFor`, and the registry is keyed on identity.\n const composed = resolveVocabulary(definitions);\n const { bodyNodeSchema, members } = composed;\n const compositionSchema = buildCompositionSchema({ bodyNodeSchema });\n\n // `metadata` replaces `z.toJSONSchema`'s default registry rather than\n // extending it, and `z.globalRegistry` is where every `.describe()` lives,\n // so ids are added to the global registry for the duration of this call\n // and the prior entries restored in `finally`. Only a schema's first\n // registration is recorded: a schema named twice (an `extraDefs` entry that\n // is also a member) must restore its original entry, not the first id.\n const previous = new Map<ZodType, unknown>();\n const registerId = (\n schema: ZodType,\n id: string,\n description?: string\n ): void => {\n if (!previous.has(schema)) {\n previous.set(schema, z.globalRegistry.get(schema));\n }\n const current = z.globalRegistry.get(schema);\n z.globalRegistry.add(schema, {\n ...current,\n id,\n ...(description === undefined ? {} : { description }),\n });\n };\n registerId(bodyNodeSchema, 'bodyNode');\n for (const extra of options.extraDefs ?? []) {\n registerId(extra.schema, extra.id);\n }\n // `schemaFor` returns a new schema, so the description is taken from the catalog.\n const described = new Map(\n definitions.map(({ type, catalog }) => [type, catalog.description])\n );\n for (const [type, schema] of members) {\n registerId(schema, type, described.get(type));\n }\n try {\n return {\n ...z.toJSONSchema(compositionSchema, {\n target: 'draft-2020-12',\n metadata: z.globalRegistry,\n reused: options.reused ?? 'ref',\n cycles: 'ref',\n unrepresentable: 'any',\n }),\n ...(options.$id ? { $id: options.$id } : {}),\n title: options.title ?? 'View',\n description:\n options.description ??\n 'A compact view that may include registered primitives.',\n };\n } finally {\n for (const [schema, entry] of previous) {\n if (entry === undefined) {\n z.globalRegistry.remove(schema);\n } else {\n z.globalRegistry.add(schema, entry as never);\n }\n }\n }\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/validate/url.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/validate/url.ts"],"names":[],"mappings":"AAwEA;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IACgB,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IACgB,CAAC;AAEzE,gFAAgF;AAChF,eAAO,MAAM,4BAA4B,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAGpE,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAG7D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,sDACoB,CAAC;AAEtD,uEAAuE;AACvE,eAAO,MAAM,cAAc,0DAC8B,CAAC;AAE1D,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,8DAAoC,CAAC;AAEzE,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,kEAA8B,CAAC;AAE7D,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAYD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GAAI,UAAS,gBAAqB,4BAM1D,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,UAAS,gBAAqB,4BAMpD,CAAC"}
|
package/dist/validate/url.js
CHANGED
|
@@ -20,8 +20,9 @@ const NAMED_REFERENCES = {
|
|
|
20
20
|
// named ones that spell a scheme, path, or tag character.
|
|
21
21
|
const CHARACTER_REFERENCE_RE = /&(?:#x([0-9a-f]+);?|#([0-9]+);?|(bsol|colon|gt|lt|newline|sol|tab);)/gi;
|
|
22
22
|
const decodeReference = (match, hex, decimal, name) => {
|
|
23
|
-
if (name)
|
|
23
|
+
if (name) {
|
|
24
24
|
return NAMED_REFERENCES[name.toLowerCase()] ?? match;
|
|
25
|
+
}
|
|
25
26
|
const codePoint = Number.parseInt(hex ?? decimal ?? '', hex ? 16 : 10);
|
|
26
27
|
return codePoint > 0 && codePoint <= 0x10ffff
|
|
27
28
|
? String.fromCodePoint(codePoint)
|
package/dist/validate/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/validate/url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,0EAA0E;AAC1E,6EAA6E;AAE7E,MAAM,gBAAgB,GAAqC;IACzD,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,GAAG;IACV,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,IAAI;CACV,CAAC;AAEF,4EAA4E;AAC5E,0DAA0D;AAC1D,MAAM,sBAAsB,GAC1B,wEAAwE,CAAC;AAE3E,MAAM,eAAe,GAAG,CACtB,KAAa,EACb,GAAuB,EACvB,OAA2B,EAC3B,IAAwB,EAChB,EAAE;IACV,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/validate/url.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 { requiredString } from '../define/zod_helpers';\n\n// The one URL trust policy every URL-bearing field goes through, as a Zod\n// refinement and again as render-time sanitization. See `docs/url-trust.md`.\n\nconst NAMED_REFERENCES: Readonly<Record<string, string>> = {\n bsol: '\\\\',\n colon: ':',\n gt: '>',\n lt: '<',\n newline: '\\n',\n sol: '/',\n tab: '\\t',\n};\n\n// Numeric references, which browsers decode without a trailing `;`, and the\n// named ones that spell a scheme, path, or tag character.\nconst CHARACTER_REFERENCE_RE =\n /&(?:#x([0-9a-f]+);?|#([0-9]+);?|(bsol|colon|gt|lt|newline|sol|tab);)/gi;\n\nconst decodeReference = (\n match: string,\n hex: string | undefined,\n decimal: string | undefined,\n name: string | undefined\n): string => {\n if (name) {\n return NAMED_REFERENCES[name.toLowerCase()] ?? match;\n }\n const codePoint = Number.parseInt(hex ?? decimal ?? '', hex ? 16 : 10);\n return codePoint > 0 && codePoint <= 0x10ffff\n ? String.fromCodePoint(codePoint)\n : '\\ufffd';\n};\n\n// The control characters browsers drop when parsing a URL.\nconst stripControls = (value: string): string =>\n // eslint-disable-next-line no-control-regex -- stripping control characters is the point.\n value.replace(/[\\u0000-\\u001f\\u007f]/g, '').trim();\n\n// The URL as a sink sees it: references decoded once, then controls stripped,\n// so an obfuscated scheme is checked as it would act. Only the decision reads\n// it; the policy returns the authored value, since a consumer that decodes\n// again must decode what was checked, not a decoded copy.\nconst decisionForm = (value: string): string =>\n stripControls(value.replace(CHARACTER_REFERENCE_RE, decodeReference));\n\n// `<` and `>` must be percent-encoded in a URL, so their unencoded presence\n// means the value is malformed or a parser-confusion attempt (an unterminated\n// `<dest` would otherwise read as a relative path). Reject rather than strip.\nconst HAS_ANGLE_BRACKET_RE = /[<>]/;\nconst HAS_SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i;\nconst NAVIGATION_SCHEME_RE = /^(?:https?|mailto):/i;\nconst ASSET_SCHEME_RE = /^(?:https?:|data:image\\/)/i;\n// `//host` — and the `\\` variants browsers fold into `/` — resolve against the\n// current protocol onto a foreign host, so they are not relative paths.\nconst PROTOCOL_RELATIVE_RE = /^[/\\\\][/\\\\]/;\n\n// Whether a URL in decision form passes, given which schemes are allowed.\nconst passes = (decided: string, schemes: RegExp): boolean =>\n decided !== '' &&\n !PROTOCOL_RELATIVE_RE.test(decided) &&\n !HAS_ANGLE_BRACKET_RE.test(decided) &&\n (!HAS_SCHEME_RE.test(decided) || schemes.test(decided));\n\n/**\n * Returns the URL, trimmed and with control characters stripped, when it\n * satisfies the navigation policy (`https:` / `http:` / `mailto:` / relative\n * path), `null` otherwise.\n */\nexport const sanitizeNavigationHref = (href: string): string | null =>\n passes(decisionForm(href), NAVIGATION_SCHEME_RE) ? stripControls(href) : null;\n\n/**\n * Returns the URL, trimmed and with control characters stripped, when it\n * satisfies the asset policy (`https:` / `http:` / relative path /\n * `data:image/*`), `null` otherwise.\n */\nexport const sanitizeAssetUrl = (url: string): string | null =>\n passes(decisionForm(url), ASSET_SCHEME_RE) ? stripControls(url) : null;\n\n/** Checks a Markdown parser's decoded destination without decoding it again. */\nexport const sanitizeParsedNavigationHref = (href: string): string | null => {\n const normalized = stripControls(href);\n return passes(normalized, NAVIGATION_SCHEME_RE) ? normalized : null;\n};\n\n/** Checks a Markdown parser's decoded image destination. */\nexport const sanitizeParsedAssetUrl = (url: string): string | null => {\n const normalized = stripControls(url);\n return passes(normalized, ASSET_SCHEME_RE) ? normalized : null;\n};\n\n/**\n * Render-time replacement for a navigation href that failed the policy: an\n * inert same-document link, so the label stays visible without a destination.\n */\nexport const BLOCKED_HREF = '#';\n\n/** What {@link navigationHref} accepts, for a field description to state. */\nexport const NAVIGATION_HREF_RULE =\n 'an https, http, or mailto URL, or a relative path';\n\n/** What {@link assetUrl} accepts, for a field description to state. */\nexport const ASSET_URL_RULE =\n 'an https, http, or data:image URL, or a relative path';\n\n/** Validation message for {@link navigationHref}. */\nexport const NAVIGATION_HREF_MESSAGE = `must be ${NAVIGATION_HREF_RULE}`;\n\n/** Validation message for {@link assetUrl}. */\nexport const ASSET_URL_MESSAGE = `must be ${ASSET_URL_RULE}`;\n\n/** Options for {@link navigationHref} and {@link assetUrl}. */\nexport interface UrlSchemaOptions {\n /** Longest accepted value, in characters. */\n max?: number;\n}\n\nconst urlSchema = (\n passes: (value: string) => boolean,\n rule: string,\n message: string,\n { max }: UrlSchemaOptions\n) =>\n (max === undefined ? requiredString() : requiredString().max(max))\n .refine(passes, { error: message })\n .describe(`${rule[0]!.toUpperCase()}${rule.slice(1)}.`);\n\n/**\n * Zod schema for an `href`-like field: the validation layer of the two-layer\n * policy, paired with {@link sanitizeNavigationHref} at render time.\n *\n * Its description states the rule, since a refinement's message does not\n * reach the authoring JSON Schema. A field that describes itself should end\n * with {@link NAVIGATION_HREF_RULE} so the model still reads it.\n */\nexport const navigationHref = (options: UrlSchemaOptions = {}) =>\n urlSchema(\n (value) => sanitizeNavigationHref(value) !== null,\n NAVIGATION_HREF_RULE,\n NAVIGATION_HREF_MESSAGE,\n options\n );\n\n/**\n * Zod schema for a `src`-like field, paired with {@link sanitizeAssetUrl} at\n * render time. Describes itself as {@link navigationHref} does, with\n * {@link ASSET_URL_RULE}.\n */\nexport const assetUrl = (options: UrlSchemaOptions = {}) =>\n urlSchema(\n (value) => sanitizeAssetUrl(value) !== null,\n ASSET_URL_RULE,\n ASSET_URL_MESSAGE,\n options\n );\n"]}
|
package/package.json
CHANGED