@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":"envelope.js","sourceRoot":"","sources":["../../../src/render/html/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 { createElement, Fragment, type ReactNode } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport {\n type Comment as JavaScriptComment,\n type Node as JavaScriptNode,\n parse,\n} from 'acorn';\n\nimport {\n type ChildNodeWalker,\n createChildNodeWalker,\n} from '../../composition/body_node_base';\nimport type { Composition } from '../../composition/composition';\nimport type { RenderTheme } from '../../composition/named_color';\nimport type { ValidationError } from '../../composition/validation_error';\nimport type {\n AnyPrimitiveDefinition,\n PrimitiveNode,\n PrimitiveStyleCollectionContext,\n PrimitiveStyleCollector,\n StyledRenderContext,\n StyleHandle,\n} from '../../define/primitive_module';\nimport {\n EMBEDDED_SCRIPT_ATTRIBUTE,\n resolveEnhancements,\n scopeScript,\n} from '../../pack/enhancements';\nimport {\n type CheckedValidationResult,\n compositionToRender,\n createCompositionValidator,\n enforceValidationMode,\n type ValidationErrorMode,\n} from '../../validate/validation';\nimport { withAnchors } from '../anchors';\nimport { contextWith } from '../context_view';\nimport { byteLength, type PayloadMeasurement } from '../payload';\nimport {\n type ReactContentDispatcher,\n renderCompositionContent,\n wrapCompositionContent,\n} from '../react/content';\n\nimport {\n embedScript,\n type EnhancementDefinition,\n enhancementScript,\n} from './enhancements';\n\n/** Knobs for the HTML surface. Every field defaults, so `{}` is valid. */\nexport interface HTMLRenderOptions {\n /** Overrides {@link Composition.theme}; `auto` when neither is set. */\n theme?: RenderTheme;\n /** Drops whitespace between tags that spans a line break, leaving `<pre>`, `<script>`, `<style>`, and `<textarea>` content intact. Defaults to `true`. */\n minify?: boolean;\n /** Adds the `fluid` wrapper class and reaches the pack as {@link PrimitiveStyleCollectionContext.fluid}; the adapter decides what it changes. */\n fluid?: boolean;\n /** Adds the `framed` wrapper class the adapter styles as a frame. Defaults to `true`. */\n framed?: boolean;\n /**\n * Renders the composition's title and subtitle. Defaults to `true`. Set\n * `false` when the embedding host already shows the title itself — the title\n * still backs the wrapper's `aria-label`.\n */\n heading?: boolean;\n /** Whether the collected CSS is inlined as a `<style>` element. Defaults to `'inline'`. */\n css?: 'inline' | 'separate';\n /**\n * Who runs the enhancement script. Defaults to `'embedded'`: `html` carries\n * a `<script>` that finds its own `.isomer` section when the page parses it.\n *\n * `'embedded'` never runs inside a shadow root, or anywhere the host inserts\n * `html` itself (`innerHTML`, a React tree). Use `'host'` there: `html`\n * carries no `<script>`, and the host calls `runEnhancementScript(js,\n * section)` after inserting it.\n */\n scripts?: 'embedded' | 'host';\n /** Defaults to collecting into {@link HTMLRenderResult.validationErrors}; `'throw'` raises instead. Input the budget refused raises in either mode. */\n onValidationError?: ValidationErrorMode;\n /** Opt-in by {@link EnhancementDefinition.id}. One whose content gate does not match the body is dropped. */\n enhancements?: readonly string[];\n /** `true` renders node anchors whether or not an enhancement asks for them, e.g. for tests. `false` cannot turn off anchors an enhancement needs. */\n anchors?: boolean;\n /**\n * Resolves `light-dark(…)` in the stylesheet to one scheme's value. A browser\n * resolves it itself; an image is one static frame, so the `snapshot` surface sets\n * it.\n */\n scheme?: 'light' | 'dark';\n}\n\n/**\n * One rendered HTML payload.\n *\n * `body` is the primitive markup alone; `html` adds the wrapper element, on\n * the default `css: 'inline'` a `<style>`, and on the default\n * `scripts: 'embedded'` a `<script>`. `css` and `js` are populated either way.\n * `validationErrors` are the messages that survived\n * {@link HTMLRenderOptions.onValidationError}.\n */\nexport interface HTMLRenderResult {\n html: string;\n css: string;\n /**\n * The enhancement script as a function body over `root`, or `''`. Under\n * `scripts: 'embedded'` the `<script>` in `html` wraps the same body; under\n * `'host'` the host runs it with `runEnhancementScript`. It is never a\n * complete script on its own.\n */\n js: string;\n body: string;\n measurement: PayloadMeasurement;\n validationErrors: ValidationError[];\n}\n\n/**\n * A pack's HTML entry point: the React renderer plus the style pass that runs\n * ahead of it.\n */\nexport interface HTMLRenderDispatcher<\n TNode extends PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n> extends ReactContentDispatcher<TNode, TContext> {\n /** The whole composition's inventory: a child walker built from one pack's definitions cannot descend into another pack's container. */\n readonly definitions: readonly AnyPrimitiveDefinition[];\n /** One node's style pass, driven by {@link HTMLStyleAdapter.collectViewStyles} rather than called by the sdk. */\n collectStyles(\n node: TNode,\n collector: TCollector,\n context: PrimitiveStyleCollectionContext\n ): void;\n}\n\n/**\n * The composition's child walker and the enhancements every loaded pack\n * declared. Threaded into the style adapter so content-gating can see a\n * table nested inside a container from another package.\n */\nexport interface HTMLEnhancementScope {\n walk: ChildNodeWalker;\n definitions: readonly EnhancementDefinition[];\n}\n\n/**\n * How a pack turns its nodes into CSS. Optional overall — without an adapter\n * the render still produces markup, just with no class names and an empty\n * `TContext`.\n */\nexport interface HTMLStyleAdapter<\n TNode extends PrimitiveNode = PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n> {\n /**\n * Names the collector shape {@link HTMLStyleAdapter.createCollector} returns, so a runtime can\n * reject a pack whose `collectStyles` hooks were written against a different one.\n */\n styleCollector?: string;\n /** One collector per render, shared by every other hook here and by both render passes. */\n createCollector(options: HTMLRenderOptions): TCollector;\n /**\n * Settles options that depend on the composition, before anything reads them.\n *\n * Needed by an adapter whose look is chosen per render: deciding `framed`\n * from the body has to happen before the wrapper class is written, not while\n * CSS is collected.\n */\n resolveOptions?(\n composition: Composition<TNode>,\n options: HTMLRenderOptions\n ): HTMLRenderOptions;\n /**\n * The `.isomer` / `.isomer.framed` / `.isomer.fluid` rules around a rendered composition.\n * Named for the wrapper rather than the frame, which the sdk reserves for the\n * document a snapshot is drawn inside.\n */\n collectWrapperStyles?(\n collector: TCollector,\n options: HTMLRenderOptions\n ): void;\n /** Walks the body into the collector, usually through {@link HTMLRenderDispatcher.collectStyles}. Runs before any markup exists. */\n collectViewStyles?(\n composition: Composition<TNode>,\n dispatcher: HTMLRenderDispatcher<TNode, TCollector, TContext>,\n collector: TCollector,\n context: PrimitiveStyleCollectionContext,\n options: HTMLRenderOptions,\n scope: HTMLEnhancementScope\n ): void;\n /** Runs once the collection pass has rendered the body, for styles only a renderer can discover. That markup is discarded. */\n collectAfterRender?(\n composition: Composition<TNode>,\n collector: TCollector,\n options: HTMLRenderOptions\n ): void;\n /**\n * Builds the render context handed to every `react` renderer. Called once\n * per pass, so an adapter that behaves differently while collecting returns\n * a different context then. Must be complete, because `TContext` is the\n * pack's own type. The sdk never writes to it: whether renderers anchor\n * is the surface's decision, whatever the context's `anchors` says.\n */\n createRenderContext(\n collector: TCollector,\n options: HTMLRenderOptions\n ): TContext;\n /** The collected CSS as text, with no `<style>` wrapper; the sdk adds one when `css` is `'inline'`. */\n renderStyles(collector: TCollector, options: HTMLRenderOptions): string;\n /**\n * Whether `handle` belongs to this adapter's stylesheet.\n *\n * Unused on a lone adapter. A runtime composing several packs' adapters\n * routes each handle to its owner, so CSS is neither duplicated nor\n * rendered against the wrong theme. An adapter that cannot answer this\n * cannot be combined with another.\n */\n ownsHandle?(handle: StyleHandle): boolean;\n /**\n * Appended after {@link HTMLDispatcherRenderOptions.scriptText} into the\n * render's one script. A function body with `root` in scope, under the same\n * rules as {@link EnhancementDefinition.script}.\n */\n getScriptText?(\n composition: Composition<TNode>,\n options: HTMLRenderOptions,\n scope: HTMLEnhancementScope\n ): string;\n}\n\n/** What {@link renderHTMLWithDispatcher} needs beyond the composition. */\nexport interface HTMLDispatcherRenderOptions<\n TNode extends PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n> {\n dispatcher: HTMLRenderDispatcher<TNode, TCollector, TContext>;\n /** Runs once before rendering, which draws the composition it returns; {@link HTMLRenderOptions.onValidationError} decides what becomes of its errors. Defaults to `createCompositionValidator(dispatcher.definitions)`. */\n validate?: (\n composition: Composition<TNode>\n ) => CheckedValidationResult<TNode>;\n options?: HTMLRenderOptions;\n /** Used only when the composition has neither `meta.ariaLabel` nor a `title`. Defaults to `'View'`. */\n defaultAriaLabel?: string;\n styleAdapter?: HTMLStyleAdapter<TNode, TCollector, TContext>;\n /**\n * Emitted unescaped ahead of {@link HTMLStyleAdapter.getScriptText}. A\n * function body with `root` in scope, under the same rules as\n * {@link EnhancementDefinition.script}.\n */\n scriptText?: string;\n /**\n * Progressive enhancements declared by the packs this render was composed\n * from. The render resolves {@link HTMLRenderOptions.enhancements} against\n * them once, hands every renderer the set as `context.enhancements`, and\n * emits each resolved one's script.\n */\n enhancementDefinitions?: readonly EnhancementDefinition[];\n}\n\n/**\n * Renders a composition to standalone HTML: the wrapper element, the pack's\n * markup, and its CSS either inlined or returned separately.\n *\n * Runs the pack twice when a style adapter is present — once to collect\n * styles, once with the render context those styles produced — so a\n * `renderReact` implementation must be free of side effects.\n */\nexport const renderHTMLWithDispatcher = <\n TNode extends PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n>(\n input: Composition<TNode>,\n {\n dispatcher,\n validate = createCompositionValidator<TNode>(dispatcher.definitions),\n options: rawOptions = {},\n defaultAriaLabel = 'View',\n styleAdapter,\n scriptText = '',\n enhancementDefinitions = [],\n }: HTMLDispatcherRenderOptions<TNode, TCollector, TContext>\n): HTMLRenderResult => {\n const validation = validate(input);\n const composition = compositionToRender(validation);\n // Resolved before the validation mode is read, so an adapter can derive\n // `onValidationError`.\n const options =\n styleAdapter?.resolveOptions?.(composition, rawOptions) ?? rawOptions;\n enforceValidationMode(validation, options.onValidationError);\n const framed = options.framed ?? true;\n const heading = options.heading ?? true;\n const theme = options.theme ?? composition.theme ?? 'auto';\n const cssMode = options.css ?? 'inline';\n const scriptsMode = options.scripts ?? 'embedded';\n const styleState = styleAdapter?.createCollector(options);\n const enhancementScope: HTMLEnhancementScope = {\n walk: createChildNodeWalker(dispatcher.definitions),\n definitions: enhancementDefinitions,\n };\n const applied = resolveEnhancements(\n composition.body,\n enhancementScope.walk,\n enhancementDefinitions,\n options.enhancements ?? []\n );\n const enhancements: ReadonlySet<string> = new Set(\n applied.map(({ id }) => id)\n );\n const anchors =\n options.anchors === true || applied.some(({ anchors }) => anchors);\n const enhanced = (context: TContext): TContext =>\n contextWith(context, 'enhancements', enhancements);\n\n if (styleState) {\n styleAdapter?.collectWrapperStyles?.(styleState, options);\n styleAdapter?.collectViewStyles?.(\n composition,\n dispatcher,\n styleState,\n { fluid: Boolean(options.fluid) },\n options,\n enhancementScope\n );\n const collectionContext = enhanced(\n styleAdapter?.createRenderContext(styleState, options) as TContext\n );\n withAnchors(anchors, () =>\n renderToStaticMarkup(\n createElement(() =>\n renderCompositionContent(composition, dispatcher, collectionContext, {\n heading,\n })\n )\n )\n );\n styleAdapter?.collectAfterRender?.(composition, styleState, options);\n }\n\n const renderContext = enhanced(\n styleState && styleAdapter\n ? styleAdapter.createRenderContext(styleState, options)\n : // No adapter means no class names and no css vars to resolve.\n ({} as TContext)\n );\n const cssText =\n styleState && styleAdapter\n ? styleAdapter.renderStyles(styleState, options)\n : '';\n const adapterScriptText =\n styleAdapter?.getScriptText?.(composition, options, enhancementScope) ?? '';\n const js = [\n ...[scriptText, adapterScriptText].filter(Boolean).map(scopeScript),\n enhancementScript(applied),\n ]\n .filter(Boolean)\n .join('\\n');\n const embeddedScript =\n js && scriptsMode === 'embedded' ? embedScript(js) : '';\n const body = withAnchors(anchors, () =>\n renderToStaticMarkup(\n createElement(() =>\n renderCompositionContent(composition, dispatcher, renderContext, {\n heading,\n })\n )\n )\n );\n const inlineCss = cssMode === 'inline' ? embedCss(cssText) : '';\n const inlineJs = embeddedScript ? embedJs(embeddedScript) : '';\n const raw = renderToStaticMarkup(\n createElement(RenderedHtmlView<TNode>, {\n composition,\n theme,\n fluid: Boolean(options.fluid),\n framed,\n styleText: inlineCss || undefined,\n scriptText: inlineJs || undefined,\n defaultAriaLabel,\n body,\n })\n );\n const html = options.minify === false ? raw : minifyHtml(raw);\n\n // Inline payloads are measured as emitted, escapes included.\n const inlineCssBytes = byteLength(inlineCss);\n const inlineJsBytes = byteLength(inlineJs);\n const separateCssBytes = cssMode === 'inline' ? 0 : byteLength(cssText);\n const separateJsBytes = embeddedScript ? 0 : byteLength(js);\n\n return {\n html,\n css: cssText,\n js,\n body,\n measurement: {\n html: byteLength(html) - inlineCssBytes - inlineJsBytes,\n css: inlineCssBytes + separateCssBytes,\n js: inlineJsBytes + separateJsBytes,\n total: byteLength(html) + separateCssBytes + separateJsBytes,\n },\n validationErrors: validation.errors,\n };\n};\n\ninterface RenderedHtmlViewProps<TNode extends PrimitiveNode> {\n composition: Composition<TNode>;\n theme: RenderTheme;\n fluid: boolean;\n framed: boolean;\n styleText?: string | undefined;\n scriptText?: string | undefined;\n defaultAriaLabel: string;\n body: string;\n}\n\n// Only `</style` ends a `<style>`. `\\/` is a CSS escape for `/`, so a string\n// holding it keeps its value.\nconst embedCss = (css: string): string => css.replace(/<\\/(?=style)/gi, '<\\\\/');\n\ninterface ScriptNode extends JavaScriptNode {\n tag: ScriptNode;\n quasi: ScriptNode;\n quasis: ScriptNode[];\n expressions: ScriptNode[];\n value: { raw: string; cooked: string | null };\n name?: string;\n}\n\n// Tagged templates observe raw spelling and reuse the same frozen object per site.\nconst embedJs = (js: string): string => {\n if (!/<\\/script|<!--/i.test(js)) return js;\n const comments: JavaScriptComment[] = [];\n const tree = parse(js, { ecmaVersion: 'latest', onComment: comments });\n const sites: ScriptNode[] = [];\n const identifiers = new Set<string>();\n const pending: JavaScriptNode[] = [tree];\n while (pending.length) {\n const node = pending.pop()! as ScriptNode;\n if (node.type === 'Identifier' && node.name) identifiers.add(node.name);\n if (\n node.type === 'TaggedTemplateExpression' &&\n node.quasi.quasis.some(({ value: { raw } }) =>\n /<\\/script|<!--/i.test(raw)\n )\n )\n sites.push(node);\n for (const value of Object.values(node)) {\n for (const child of Array.isArray(value) ? value : [value]) {\n if (\n child &&\n typeof child === 'object' &&\n 'type' in child &&\n 'start' in child\n ) {\n pending.push(child as JavaScriptNode);\n }\n }\n }\n }\n sites.sort((a, b) => a.start - b.start);\n let prefix = '__isomerTemplate';\n while ([...identifiers].some((name) => name.startsWith(prefix)))\n prefix += '_';\n const literal = (value: string | null): string =>\n value === null ? 'void 0' : JSON.stringify(value).replace(/</g, '\\\\u003c');\n const rewrite = (start: number, end: number): string => {\n let cursor = start;\n let result = '';\n const edits = [\n ...sites.map((site, index) => ({\n ...site,\n index,\n comment: undefined as string | undefined,\n })),\n ...comments\n .filter(({ start }) => /^(?:<!--|-->)/.test(js.slice(start, start + 4)))\n .map((comment) => ({ ...comment, index: -1, comment: comment.value })),\n ].sort((a, b) => a.start - b.start);\n for (const edit of edits) {\n if (edit.start < cursor || edit.end > end) continue;\n result += js.slice(cursor, edit.start);\n if (edit.comment !== undefined) {\n result += `//${edit.comment}`;\n } else {\n const site = sites[edit.index]!;\n const {\n tag,\n quasi: { quasis, expressions },\n } = site;\n const cooked = quasis\n .map(({ value }) => literal(value.cooked))\n .join(',');\n const raw = quasis.map(({ value }) => literal(value.raw)).join(',');\n const cache = `${prefix}${edit.index}`;\n const template = `${cache} ??= ${prefix}Freeze(${prefix}Define([${cooked}], 'raw', {value:${prefix}Freeze([${raw}])}))`;\n const args = expressions.map((expression) =>\n rewrite(expression.start, expression.end)\n );\n result += `(${rewrite(tag.start, tag.end)})(${template}${args.map((arg) => `,(${arg})`).join('')})`;\n }\n cursor = edit.end;\n }\n return result + js.slice(cursor, end);\n };\n const rewritten = rewrite(0, js.length);\n const scoped = sites.length\n ? `(function(){const ${prefix}Freeze=Object.freeze,${prefix}Define=Object.defineProperty;let ${sites.map((_site, index) => `${prefix}${index}`).join(',')};\\n${rewritten}\\n})();`\n : rewritten;\n return scoped\n .replace(/<\\/(?=script)/gi, '<\\\\/')\n .replace(/<!--/g, (_match, at: number, source: string) =>\n escapedBy(source, at) ? 'x3C!--' : '\\\\x3C!--'\n );\n};\n\nconst escapedBy = (source: string, at: number): boolean => {\n let slashes = 0;\n while (source[at - slashes - 1] === '\\\\') slashes += 1;\n return slashes % 2 === 1;\n};\n\nconst RenderedHtmlView = <TNode extends PrimitiveNode>({\n composition,\n theme,\n fluid,\n framed,\n styleText,\n scriptText,\n defaultAriaLabel,\n body,\n}: RenderedHtmlViewProps<TNode>): ReactNode =>\n wrapCompositionContent(\n createElement(\n Fragment,\n null,\n styleText\n ? createElement('style', {\n key: 'style',\n dangerouslySetInnerHTML: { __html: styleText },\n })\n : null,\n createElement('div', {\n key: 'body',\n dangerouslySetInnerHTML: { __html: body },\n }),\n scriptText\n ? createElement('script', {\n key: 'script',\n [EMBEDDED_SCRIPT_ATTRIBUTE]: '',\n dangerouslySetInnerHTML: { __html: scriptText },\n })\n : null\n ),\n composition,\n { framed, fluid, theme, defaultAriaLabel }\n );\n\n// Whitespace inside `pre`, `script`, `style`, and `textarea` is content, so\n// those elements match whole and pass through. Elsewhere only whitespace\n// spanning a line break is collapsed: a single space between inline elements\n// (`<b>a</b> <i>b</i>`) is authored content.\nconst MINIFY_RE =\n /<(pre|script|style|textarea)[\\s>][\\s\\S]*?(?:<\\/\\1\\s*>|$)|(?<=>)\\s+(?=<)/gi;\n\nconst minifyHtml = (value: string): string =>\n value\n .replace(MINIFY_RE, (match, element: string | undefined) =>\n element || !match.includes('\\n') ? match : ''\n )\n .trim();\n"]}
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../src/render/html/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 { createElement, Fragment, type ReactNode } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport {\n type Comment as JavaScriptComment,\n type Node as JavaScriptNode,\n parse,\n} from 'acorn';\n\nimport {\n type ChildNodeWalker,\n createChildNodeWalker,\n} from '../../composition/body_node_base';\nimport type { Composition } from '../../composition/composition';\nimport type { RenderTheme } from '../../composition/named_color';\nimport type { ValidationError } from '../../composition/validation_error';\nimport type {\n AnyPrimitiveDefinition,\n PrimitiveNode,\n PrimitiveStyleCollectionContext,\n PrimitiveStyleCollector,\n StyledRenderContext,\n StyleHandle,\n} from '../../define/primitive_module';\nimport {\n EMBEDDED_SCRIPT_ATTRIBUTE,\n resolveEnhancements,\n scopeScript,\n} from '../../pack/enhancements';\nimport {\n type CheckedValidationResult,\n compositionToRender,\n createCompositionValidator,\n enforceValidationMode,\n type ValidationErrorMode,\n} from '../../validate/validation';\nimport { withAnchors } from '../anchors';\nimport { contextWith } from '../context_view';\nimport { byteLength, type PayloadMeasurement } from '../payload';\nimport {\n type ReactContentDispatcher,\n renderCompositionContent,\n wrapCompositionContent,\n} from '../react/content';\n\nimport {\n embedScript,\n type EnhancementDefinition,\n enhancementScript,\n} from './enhancements';\n\n/** Knobs for the HTML surface. Every field defaults, so `{}` is valid. */\nexport interface HTMLRenderOptions {\n /** Overrides {@link Composition.theme}; `auto` when neither is set. */\n theme?: RenderTheme;\n /** Drops whitespace between tags that spans a line break, leaving `<pre>`, `<script>`, `<style>`, and `<textarea>` content intact. Defaults to `true`. */\n minify?: boolean;\n /** Adds the `fluid` wrapper class and reaches the pack as {@link PrimitiveStyleCollectionContext.fluid}; the adapter decides what it changes. */\n fluid?: boolean;\n /** Adds the `framed` wrapper class the adapter styles as a frame. Defaults to `true`. */\n framed?: boolean;\n /**\n * Renders the composition's title and subtitle. Defaults to `true`. Set\n * `false` when the embedding host already shows the title itself — the title\n * still backs the wrapper's `aria-label`.\n */\n heading?: boolean;\n /** Whether the collected CSS is inlined as a `<style>` element. Defaults to `'inline'`. */\n css?: 'inline' | 'separate';\n /**\n * Who runs the enhancement script. Defaults to `'embedded'`: `html` carries\n * a `<script>` that finds its own `.isomer` section when the page parses it.\n *\n * `'embedded'` never runs inside a shadow root, or anywhere the host inserts\n * `html` itself (`innerHTML`, a React tree). Use `'host'` there: `html`\n * carries no `<script>`, and the host calls `runEnhancementScript(js,\n * section)` after inserting it.\n */\n scripts?: 'embedded' | 'host';\n /** Defaults to collecting into {@link HTMLRenderResult.validationErrors}; `'throw'` raises instead. Input the budget refused raises in either mode. */\n onValidationError?: ValidationErrorMode;\n /** Opt-in by {@link EnhancementDefinition.id}. One whose content gate does not match the body is dropped. */\n enhancements?: readonly string[];\n /** `true` renders node anchors whether or not an enhancement asks for them, e.g. for tests. `false` cannot turn off anchors an enhancement needs. */\n anchors?: boolean;\n /**\n * Resolves `light-dark(…)` in the stylesheet to one scheme's value. A browser\n * resolves it itself; an image is one static frame, so the `snapshot` surface sets\n * it.\n */\n scheme?: 'light' | 'dark';\n}\n\n/**\n * One rendered HTML payload.\n *\n * `body` is the primitive markup alone; `html` adds the wrapper element, on\n * the default `css: 'inline'` a `<style>`, and on the default\n * `scripts: 'embedded'` a `<script>`. `css` and `js` are populated either way.\n * `validationErrors` are the messages that survived\n * {@link HTMLRenderOptions.onValidationError}.\n */\nexport interface HTMLRenderResult {\n html: string;\n css: string;\n /**\n * The enhancement script as a function body over `root`, or `''`. Under\n * `scripts: 'embedded'` the `<script>` in `html` wraps the same body; under\n * `'host'` the host runs it with `runEnhancementScript`. It is never a\n * complete script on its own.\n */\n js: string;\n body: string;\n measurement: PayloadMeasurement;\n validationErrors: ValidationError[];\n}\n\n/**\n * A pack's HTML entry point: the React renderer plus the style pass that runs\n * ahead of it.\n */\nexport interface HTMLRenderDispatcher<\n TNode extends PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n> extends ReactContentDispatcher<TNode, TContext> {\n /** The whole composition's inventory: a child walker built from one pack's definitions cannot descend into another pack's container. */\n readonly definitions: readonly AnyPrimitiveDefinition[];\n /** One node's style pass, driven by {@link HTMLStyleAdapter.collectViewStyles} rather than called by the sdk. */\n collectStyles(\n node: TNode,\n collector: TCollector,\n context: PrimitiveStyleCollectionContext\n ): void;\n}\n\n/**\n * The composition's child walker and the enhancements every loaded pack\n * declared. Threaded into the style adapter so content-gating can see a\n * table nested inside a container from another package.\n */\nexport interface HTMLEnhancementScope {\n walk: ChildNodeWalker;\n definitions: readonly EnhancementDefinition[];\n}\n\n/**\n * How a pack turns its nodes into CSS. Optional overall — without an adapter\n * the render still produces markup, just with no class names and an empty\n * `TContext`.\n */\nexport interface HTMLStyleAdapter<\n TNode extends PrimitiveNode = PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n> {\n /**\n * Names the collector shape {@link HTMLStyleAdapter.createCollector} returns, so a runtime can\n * reject a pack whose `collectStyles` hooks were written against a different one.\n */\n styleCollector?: string;\n /** One collector per render, shared by every other hook here and by both render passes. */\n createCollector(options: HTMLRenderOptions): TCollector;\n /**\n * Settles options that depend on the composition, before anything reads them.\n *\n * Needed by an adapter whose look is chosen per render: deciding `framed`\n * from the body has to happen before the wrapper class is written, not while\n * CSS is collected.\n */\n resolveOptions?(\n composition: Composition<TNode>,\n options: HTMLRenderOptions\n ): HTMLRenderOptions;\n /**\n * The `.isomer` / `.isomer.framed` / `.isomer.fluid` rules around a rendered composition.\n * Named for the wrapper rather than the frame, which the sdk reserves for the\n * document a snapshot is drawn inside.\n */\n collectWrapperStyles?(\n collector: TCollector,\n options: HTMLRenderOptions\n ): void;\n /** Walks the body into the collector, usually through {@link HTMLRenderDispatcher.collectStyles}. Runs before any markup exists. */\n collectViewStyles?(\n composition: Composition<TNode>,\n dispatcher: HTMLRenderDispatcher<TNode, TCollector, TContext>,\n collector: TCollector,\n context: PrimitiveStyleCollectionContext,\n options: HTMLRenderOptions,\n scope: HTMLEnhancementScope\n ): void;\n /** Runs once the collection pass has rendered the body, for styles only a renderer can discover. That markup is discarded. */\n collectAfterRender?(\n composition: Composition<TNode>,\n collector: TCollector,\n options: HTMLRenderOptions\n ): void;\n /**\n * Builds the render context handed to every `react` renderer. Called once\n * per pass, so an adapter that behaves differently while collecting returns\n * a different context then. Must be complete, because `TContext` is the\n * pack's own type. The sdk never writes to it: whether renderers anchor\n * is the surface's decision, whatever the context's `anchors` says.\n */\n createRenderContext(\n collector: TCollector,\n options: HTMLRenderOptions\n ): TContext;\n /** The collected CSS as text, with no `<style>` wrapper; the sdk adds one when `css` is `'inline'`. */\n renderStyles(collector: TCollector, options: HTMLRenderOptions): string;\n /**\n * Whether `handle` belongs to this adapter's stylesheet.\n *\n * Unused on a lone adapter. A runtime composing several packs' adapters\n * routes each handle to its owner, so CSS is neither duplicated nor\n * rendered against the wrong theme. An adapter that cannot answer this\n * cannot be combined with another.\n */\n ownsHandle?(handle: StyleHandle): boolean;\n /**\n * Appended after {@link HTMLDispatcherRenderOptions.scriptText} into the\n * render's one script. A function body with `root` in scope, under the same\n * rules as {@link EnhancementDefinition.script}.\n */\n getScriptText?(\n composition: Composition<TNode>,\n options: HTMLRenderOptions,\n scope: HTMLEnhancementScope\n ): string;\n}\n\n/** What {@link renderHTMLWithDispatcher} needs beyond the composition. */\nexport interface HTMLDispatcherRenderOptions<\n TNode extends PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n> {\n dispatcher: HTMLRenderDispatcher<TNode, TCollector, TContext>;\n /** Runs once before rendering, which draws the composition it returns; {@link HTMLRenderOptions.onValidationError} decides what becomes of its errors. Defaults to `createCompositionValidator(dispatcher.definitions)`. */\n validate?: (\n composition: Composition<TNode>\n ) => CheckedValidationResult<TNode>;\n options?: HTMLRenderOptions;\n /** Used only when the composition has neither `meta.ariaLabel` nor a `title`. Defaults to `'View'`. */\n defaultAriaLabel?: string;\n styleAdapter?: HTMLStyleAdapter<TNode, TCollector, TContext>;\n /**\n * Emitted unescaped ahead of {@link HTMLStyleAdapter.getScriptText}. A\n * function body with `root` in scope, under the same rules as\n * {@link EnhancementDefinition.script}.\n */\n scriptText?: string;\n /**\n * Progressive enhancements declared by the packs this render was composed\n * from. The render resolves {@link HTMLRenderOptions.enhancements} against\n * them once, hands every renderer the set as `context.enhancements`, and\n * emits each resolved one's script.\n */\n enhancementDefinitions?: readonly EnhancementDefinition[];\n}\n\n/**\n * Renders a composition to standalone HTML: the wrapper element, the pack's\n * markup, and its CSS either inlined or returned separately.\n *\n * Runs the pack twice when a style adapter is present — once to collect\n * styles, once with the render context those styles produced — so a\n * `renderReact` implementation must be free of side effects.\n */\nexport const renderHTMLWithDispatcher = <\n TNode extends PrimitiveNode,\n TCollector extends PrimitiveStyleCollector = PrimitiveStyleCollector,\n TContext = StyledRenderContext,\n>(\n input: Composition<TNode>,\n {\n dispatcher,\n validate = createCompositionValidator<TNode>(dispatcher.definitions),\n options: rawOptions = {},\n defaultAriaLabel = 'View',\n styleAdapter,\n scriptText = '',\n enhancementDefinitions = [],\n }: HTMLDispatcherRenderOptions<TNode, TCollector, TContext>\n): HTMLRenderResult => {\n const validation = validate(input);\n const composition = compositionToRender(validation);\n // Resolved before the validation mode is read, so an adapter can derive\n // `onValidationError`.\n const options =\n styleAdapter?.resolveOptions?.(composition, rawOptions) ?? rawOptions;\n enforceValidationMode(validation, options.onValidationError);\n const framed = options.framed ?? true;\n const heading = options.heading ?? true;\n const theme = options.theme ?? composition.theme ?? 'auto';\n const cssMode = options.css ?? 'inline';\n const scriptsMode = options.scripts ?? 'embedded';\n const styleState = styleAdapter?.createCollector(options);\n const enhancementScope: HTMLEnhancementScope = {\n walk: createChildNodeWalker(dispatcher.definitions),\n definitions: enhancementDefinitions,\n };\n const applied = resolveEnhancements(\n composition.body,\n enhancementScope.walk,\n enhancementDefinitions,\n options.enhancements ?? []\n );\n const enhancements: ReadonlySet<string> = new Set(\n applied.map(({ id }) => id)\n );\n const anchors =\n options.anchors === true || applied.some(({ anchors }) => anchors);\n const enhanced = (context: TContext): TContext =>\n contextWith(context, 'enhancements', enhancements);\n\n if (styleState) {\n styleAdapter?.collectWrapperStyles?.(styleState, options);\n styleAdapter?.collectViewStyles?.(\n composition,\n dispatcher,\n styleState,\n { fluid: Boolean(options.fluid) },\n options,\n enhancementScope\n );\n const collectionContext = enhanced(\n styleAdapter?.createRenderContext(styleState, options) as TContext\n );\n withAnchors(anchors, () =>\n renderToStaticMarkup(\n createElement(() =>\n renderCompositionContent(composition, dispatcher, collectionContext, {\n heading,\n })\n )\n )\n );\n styleAdapter?.collectAfterRender?.(composition, styleState, options);\n }\n\n const renderContext = enhanced(\n styleState && styleAdapter\n ? styleAdapter.createRenderContext(styleState, options)\n : // No adapter means no class names and no css vars to resolve.\n ({} as TContext)\n );\n const cssText =\n styleState && styleAdapter\n ? styleAdapter.renderStyles(styleState, options)\n : '';\n const adapterScriptText =\n styleAdapter?.getScriptText?.(composition, options, enhancementScope) ?? '';\n const js = [\n ...[scriptText, adapterScriptText].filter(Boolean).map(scopeScript),\n enhancementScript(applied),\n ]\n .filter(Boolean)\n .join('\\n');\n const embeddedScript =\n js && scriptsMode === 'embedded' ? embedScript(js) : '';\n const body = withAnchors(anchors, () =>\n renderToStaticMarkup(\n createElement(() =>\n renderCompositionContent(composition, dispatcher, renderContext, {\n heading,\n })\n )\n )\n );\n const inlineCss = cssMode === 'inline' ? embedCss(cssText) : '';\n const inlineJs = embeddedScript ? embedJs(embeddedScript) : '';\n const raw = renderToStaticMarkup(\n createElement(RenderedHtmlView<TNode>, {\n composition,\n theme,\n fluid: Boolean(options.fluid),\n framed,\n styleText: inlineCss || undefined,\n scriptText: inlineJs || undefined,\n defaultAriaLabel,\n body,\n })\n );\n const html = options.minify === false ? raw : minifyHtml(raw);\n\n // Inline payloads are measured as emitted, escapes included.\n const inlineCssBytes = byteLength(inlineCss);\n const inlineJsBytes = byteLength(inlineJs);\n const separateCssBytes = cssMode === 'inline' ? 0 : byteLength(cssText);\n const separateJsBytes = embeddedScript ? 0 : byteLength(js);\n\n return {\n html,\n css: cssText,\n js,\n body,\n measurement: {\n html: byteLength(html) - inlineCssBytes - inlineJsBytes,\n css: inlineCssBytes + separateCssBytes,\n js: inlineJsBytes + separateJsBytes,\n total: byteLength(html) + separateCssBytes + separateJsBytes,\n },\n validationErrors: validation.errors,\n };\n};\n\ninterface RenderedHtmlViewProps<TNode extends PrimitiveNode> {\n composition: Composition<TNode>;\n theme: RenderTheme;\n fluid: boolean;\n framed: boolean;\n styleText?: string | undefined;\n scriptText?: string | undefined;\n defaultAriaLabel: string;\n body: string;\n}\n\n// Only `</style` ends a `<style>`. `\\/` is a CSS escape for `/`, so a string\n// holding it keeps its value.\nconst embedCss = (css: string): string => css.replace(/<\\/(?=style)/gi, '<\\\\/');\n\ninterface ScriptNode extends JavaScriptNode {\n tag: ScriptNode;\n quasi: ScriptNode;\n quasis: ScriptNode[];\n expressions: ScriptNode[];\n value: { raw: string; cooked: string | null };\n name?: string;\n}\n\n// Tagged templates observe raw spelling and reuse the same frozen object per site.\nconst embedJs = (js: string): string => {\n if (!/<\\/script|<!--/i.test(js)) {\n return js;\n }\n const comments: JavaScriptComment[] = [];\n const tree = parse(js, { ecmaVersion: 'latest', onComment: comments });\n const sites: ScriptNode[] = [];\n const identifiers = new Set<string>();\n const pending: JavaScriptNode[] = [tree];\n while (pending.length) {\n const node = pending.pop()! as ScriptNode;\n if (node.type === 'Identifier' && node.name) {\n identifiers.add(node.name);\n }\n if (\n node.type === 'TaggedTemplateExpression' &&\n node.quasi.quasis.some(({ value: { raw } }) =>\n /<\\/script|<!--/i.test(raw)\n )\n ) {\n sites.push(node);\n }\n for (const value of Object.values(node)) {\n for (const child of Array.isArray(value) ? value : [value]) {\n if (\n child &&\n typeof child === 'object' &&\n 'type' in child &&\n 'start' in child\n ) {\n pending.push(child as JavaScriptNode);\n }\n }\n }\n }\n sites.sort((a, b) => a.start - b.start);\n let prefix = '__isomerTemplate';\n while ([...identifiers].some((name) => name.startsWith(prefix))) {\n prefix += '_';\n }\n const literal = (value: string | null): string =>\n value === null ? 'void 0' : JSON.stringify(value).replace(/</g, '\\\\u003c');\n const rewrite = (start: number, end: number): string => {\n let cursor = start;\n let result = '';\n const edits = [\n ...sites.map((site, index) => ({\n ...site,\n index,\n comment: undefined as string | undefined,\n })),\n ...comments\n .filter(({ start }) => /^(?:<!--|-->)/.test(js.slice(start, start + 4)))\n .map((comment) => ({ ...comment, index: -1, comment: comment.value })),\n ].sort((a, b) => a.start - b.start);\n for (const edit of edits) {\n if (edit.start < cursor || edit.end > end) {\n continue;\n }\n result += js.slice(cursor, edit.start);\n if (edit.comment !== undefined) {\n result += `//${edit.comment}`;\n } else {\n const site = sites[edit.index]!;\n const {\n tag,\n quasi: { quasis, expressions },\n } = site;\n const cooked = quasis\n .map(({ value }) => literal(value.cooked))\n .join(',');\n const raw = quasis.map(({ value }) => literal(value.raw)).join(',');\n const cache = `${prefix}${edit.index}`;\n const template = `${cache} ??= ${prefix}Freeze(${prefix}Define([${cooked}], 'raw', {value:${prefix}Freeze([${raw}])}))`;\n const args = expressions.map((expression) =>\n rewrite(expression.start, expression.end)\n );\n result += `(${rewrite(tag.start, tag.end)})(${template}${args.map((arg) => `,(${arg})`).join('')})`;\n }\n cursor = edit.end;\n }\n return result + js.slice(cursor, end);\n };\n const rewritten = rewrite(0, js.length);\n const scoped = sites.length\n ? `(function(){const ${prefix}Freeze=Object.freeze,${prefix}Define=Object.defineProperty;let ${sites.map((_site, index) => `${prefix}${index}`).join(',')};\\n${rewritten}\\n})();`\n : rewritten;\n return scoped\n .replace(/<\\/(?=script)/gi, '<\\\\/')\n .replace(/<!--/g, (_match, at: number, source: string) =>\n escapedBy(source, at) ? 'x3C!--' : '\\\\x3C!--'\n );\n};\n\nconst escapedBy = (source: string, at: number): boolean => {\n let slashes = 0;\n while (source[at - slashes - 1] === '\\\\') {\n slashes += 1;\n }\n return slashes % 2 === 1;\n};\n\nconst RenderedHtmlView = <TNode extends PrimitiveNode>({\n composition,\n theme,\n fluid,\n framed,\n styleText,\n scriptText,\n defaultAriaLabel,\n body,\n}: RenderedHtmlViewProps<TNode>): ReactNode =>\n wrapCompositionContent(\n createElement(\n Fragment,\n null,\n styleText\n ? createElement('style', {\n key: 'style',\n dangerouslySetInnerHTML: { __html: styleText },\n })\n : null,\n createElement('div', {\n key: 'body',\n dangerouslySetInnerHTML: { __html: body },\n }),\n scriptText\n ? createElement('script', {\n key: 'script',\n [EMBEDDED_SCRIPT_ATTRIBUTE]: '',\n dangerouslySetInnerHTML: { __html: scriptText },\n })\n : null\n ),\n composition,\n { framed, fluid, theme, defaultAriaLabel }\n );\n\n// Whitespace inside `pre`, `script`, `style`, and `textarea` is content, so\n// those elements match whole and pass through. Elsewhere only whitespace\n// spanning a line break is collapsed: a single space between inline elements\n// (`<b>a</b> <i>b</i>`) is authored content.\nconst MINIFY_RE =\n /<(pre|script|style|textarea)[\\s>][\\s\\S]*?(?:<\\/\\1\\s*>|$)|(?<=>)\\s+(?=<)/gi;\n\nconst minifyHtml = (value: string): string =>\n value\n .replace(MINIFY_RE, (match, element: string | undefined) =>\n element || !match.includes('\\n') ? match : ''\n )\n .trim();\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type MarkdownBlock, type MarkdownContent, type MarkdownInline, type MarkdownInlineInput } from '../../define/markdown_content.js';
|
|
2
2
|
/** The node type of Markdown printed as written. */
|
|
3
3
|
export declare const VERBATIM_TYPE = "isomerVerbatim";
|
|
4
|
+
export declare const verbatim: (markdown: string, source?: string) => MarkdownBlock;
|
|
4
5
|
/**
|
|
5
6
|
* Builds Markdown as content rather than strings, so escaping follows where
|
|
6
7
|
* each value lands. Links and images apply the URL policy in
|
|
@@ -39,6 +40,8 @@ export declare const md: {
|
|
|
39
40
|
/** Authored Markdown source, after {@link sanitizeAuthoredSource}; whitespace-only source is dropped. */
|
|
40
41
|
authored: (source: string) => MarkdownContent;
|
|
41
42
|
};
|
|
43
|
+
/** Parsed mdast blocks as GFM, unsanitized, for `md.authored` to sanitize as it sanitizes source. */
|
|
44
|
+
export declare const printParsed: (nodes: readonly unknown[]) => string;
|
|
42
45
|
/** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */
|
|
43
46
|
export declare const markdownBlocks: (content: MarkdownContent) => readonly unknown[];
|
|
44
47
|
/** `content` as GFM, without a trailing line break. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/builder.ts"],"names":[],"mappings":"AA6BA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AAYvC,oDAAoD;AACpD,eAAO,MAAM,aAAa,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/builder.ts"],"names":[],"mappings":"AA6BA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AAYvC,oDAAoD;AACpD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAqF9C,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,aAK/B,CAAC;AAe/B;;;;;;;;GAQG;AACH,eAAO,MAAM,EAAE;kBACC,MAAM,KAAG,cAAc;0BACf,mBAAmB,EAAE,KAAG,cAAc;4BAEpC,mBAAmB,EAAE,KAAG,cAAc;kBAEhD,MAAM,KAAG,cAAc;kBAK5B,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,QACrD,MAAM,KACX,cAAc;iBAMJ,MAAM,OAAO,MAAM,KAAG,cAAc;IAMjD,4NAA4N;iBACjN,cAAc;6BACA,mBAAmB,EAAE,KAAG,aAAa;qBAGrD,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eACf,mBAAmB,EAAE,KACjC,aAAa;IAEhB,mFAAmF;8BACzD,eAAe,EAAE,KAAG,eAAe;IAS7D;;;;OAIG;kBAEM,SAAS,CAAC,mBAAmB,GAAG,eAAe,CAAC,EAAE,uBAC7B;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAChE,aAAa;IAehB,+EAA+E;qBAEpE,SAAS,CAAC,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,CAAC,EAAE,QACpE,SAAS,CAAC,SAAS,CACvB,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,CACrD,EAAE,CAAC,EAAE,KACL,aAAa;IAWhB,uCAAuC;uBACpB,MAAM,aAAa,MAAM,KAAG,aAAa;IAS5D,yGAAyG;uBACtF,MAAM,KAAG,eAAe;CAO5C,CAAC;AA+CF,qGAAqG;AACrG,eAAO,MAAM,WAAW,GAAI,OAAO,SAAS,OAAO,EAAE,KAAG,MAIlC,CAAC;AAEvB,qFAAqF;AACrF,eAAO,MAAM,cAAc,GAAI,SAAS,eAAe,KAAG,SAAS,OAAO,EACpD,CAAC;AAEvB,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,KAAG,MAI1D,CAAC"}
|
|
@@ -58,7 +58,7 @@ const isListStart = (start, count) => start !== undefined &&
|
|
|
58
58
|
// would add blank lines between blocks. `source` is the authored text when
|
|
59
59
|
// sanitizing degraded it to inert text, whose escapes only Markdown resolves;
|
|
60
60
|
// surfaces that print literal text read it instead.
|
|
61
|
-
const verbatim = (markdown, source) => block({
|
|
61
|
+
export const verbatim = (markdown, source) => block({
|
|
62
62
|
type: VERBATIM_TYPE,
|
|
63
63
|
value: markdown.trimEnd(),
|
|
64
64
|
...(source === undefined ? {} : { source }),
|
|
@@ -183,6 +183,8 @@ const OPTIONS = {
|
|
|
183
183
|
extensions: [gfmToMarkdown({ tablePipeAlign: false })],
|
|
184
184
|
handlers: handlers,
|
|
185
185
|
};
|
|
186
|
+
/** Parsed mdast blocks as GFM, unsanitized, for `md.authored` to sanitize as it sanitizes source. */
|
|
187
|
+
export const printParsed = (nodes) => toMarkdown({ type: 'root', children: nodes }, { ...OPTIONS, handlers: {} }).replace(/\n$/, '');
|
|
186
188
|
/** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */
|
|
187
189
|
export const markdownBlocks = (content) => rootContent(content);
|
|
188
190
|
/** `content` as GFM, without a trailing line break. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/render/markdown/builder.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// Builder content is mdast under a brand. Every mdast type stays inside this\n// module, so no emitted declaration names one.\n\nimport type {\n Blockquote,\n Definition,\n Image,\n Link,\n ListItem,\n PhrasingContent,\n RootContent,\n TableRow,\n} from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport {\n defaultHandlers,\n type Handle,\n type Options,\n toMarkdown,\n} from 'mdast-util-to-markdown';\n\nimport { oneLine } from '../../composition/one_line';\nimport {\n type MarkdownBlock,\n type MarkdownContent,\n markdownContent,\n type MarkdownInline,\n type MarkdownInlineInput,\n} from '../../define/markdown_content';\nimport {\n BLOCKED_HREF,\n sanitizeAssetUrl,\n sanitizeNavigationHref,\n} from '../../validate/url';\n\nimport { sanitizeAuthoredSource } from './format';\n\n// A fence-info string only allows word-ish tokens; anything else would\n// terminate the fence early or inject markdown.\nconst FENCE_INFO_RE = /^[\\w+#.-]+$/;\n/** The node type of Markdown printed as written. */\nexport const VERBATIM_TYPE = 'isomerVerbatim';\n\nconst inline = (node: PhrasingContent): MarkdownInline =>\n Object.assign(node, { [markdownContent]: 'inline' as const });\n\nconst block = (node: RootContent): MarkdownBlock =>\n Object.assign(node, { [markdownContent]: 'block' as const });\n\nconst isContentList = (\n content: MarkdownInline | MarkdownContent\n): content is readonly MarkdownContent[] => Array.isArray(content);\n\nconst isInlineList = (\n label: MarkdownInlineInput | readonly MarkdownInlineInput[]\n): label is readonly MarkdownInlineInput[] => Array.isArray(label);\n\nconst phrasing = (input: MarkdownInlineInput): PhrasingContent =>\n typeof input === 'string'\n ? { type: 'text', value: oneLine(input) }\n : (input as unknown as PhrasingContent);\n\nconst emptyText = (): PhrasingContent => ({ type: 'text', value: '' });\n\nconst isEmptyText = (node: PhrasingContent): boolean =>\n node.type === 'text' && node.value === '';\n\n// A break at either edge prints as a literal `\\` or loose markers.\nconst withoutEdgeBreaks = (\n inputs: readonly MarkdownInlineInput[]\n): PhrasingContent[] => {\n const children = inputs.map(phrasing).filter((node) => !isEmptyText(node));\n let start = 0;\n let end = children.length;\n while (start < end && children[start]!.type === 'break') {\n start += 1;\n }\n while (end > start && children[end - 1]!.type === 'break') {\n end -= 1;\n }\n return children.slice(start, end);\n};\n\n// Only a paragraph breaks a line: a heading with one turns setext, and the\n// Slack fallback reads a line at a time.\nconst inlineChildren = (\n inputs: readonly MarkdownInlineInput[]\n): PhrasingContent[] =>\n withoutEdgeBreaks(inputs).map((node) =>\n node.type === 'break' ? { type: 'text', value: ' ' } : node\n );\n\nconst rootContent = (content: MarkdownContent): RootContent[] =>\n isContentList(content)\n ? content.flatMap(rootContent)\n : [content as unknown as RootContent];\n\nconst isInlineInput = (\n item: MarkdownInlineInput | MarkdownContent\n): item is MarkdownInlineInput =>\n typeof item === 'string' ||\n (!isContentList(item) && item[markdownContent] === 'inline');\n\nconst itemContent = (\n item: MarkdownInlineInput | MarkdownContent\n): ListItem['children'] =>\n isInlineInput(item)\n ? [{ type: 'paragraph', children: withoutEdgeBreaks([item]) }]\n : (rootContent(item) as ListItem['children']);\n\n// GFM reads a list number of at most nine digits, so the last item's must fit.\nconst MAX_LIST_NUMBER = 999_999_999;\n\nconst isListStart = (\n start: number | undefined,\n count: number\n): start is number =>\n start !== undefined &&\n Number.isInteger(start) &&\n start >= 0 &&\n start + Math.max(count - 1, 0) <= MAX_LIST_NUMBER;\n\n// Printed as written, for Markdown that is already safe. Trailing whitespace\n// would add blank lines between blocks. `source` is the authored text when\n// sanitizing degraded it to inert text, whose escapes only Markdown resolves;\n// surfaces that print literal text read it instead.\nconst verbatim = (markdown: string, source?: string): MarkdownBlock =>\n block({\n type: VERBATIM_TYPE,\n value: markdown.trimEnd(),\n ...(source === undefined ? {} : { source }),\n } as unknown as RootContent);\n\n// An empty wrapper prints its markers alone: `****` reads as a thematic break.\nconst wrapper = (\n type: 'strong' | 'emphasis',\n inputs: MarkdownInlineInput[]\n): MarkdownInline => {\n const children = inlineChildren(inputs);\n return inline(children.length === 0 ? emptyText() : { type, children });\n};\n\nconst inlineRuns = (\n runs: MarkdownInlineInput | readonly MarkdownInlineInput[]\n): PhrasingContent[] => inlineChildren(isInlineList(runs) ? runs : [runs]);\n\n/**\n * Builds Markdown as content rather than strings, so escaping follows where\n * each value lands. Links and images apply the URL policy in\n * `src/validate/url.ts`: a blocked link keeps its label on\n * {@link BLOCKED_HREF}, and a blocked image degrades to its alt text.\n *\n * @example\n * md.list(rows.map((row) => md.paragraph(md.strong(row.label), ': ', row.value)))\n */\nexport const md = {\n text: (value: string): MarkdownInline => inline(phrasing(value)),\n strong: (...children: MarkdownInlineInput[]): MarkdownInline =>\n wrapper('strong', children),\n emphasis: (...children: MarkdownInlineInput[]): MarkdownInline =>\n wrapper('emphasis', children),\n code: (value: string): MarkdownInline =>\n inline(\n value === '' ? emptyText() : { type: 'inlineCode', value: oneLine(value) }\n ),\n link: (\n label: MarkdownInlineInput | readonly MarkdownInlineInput[],\n href: string\n ): MarkdownInline =>\n inline({\n type: 'link',\n url: sanitizeNavigationHref(href) ?? BLOCKED_HREF,\n children: inlineRuns(label),\n }),\n image: (alt: string, src: string): MarkdownInline => {\n const url = sanitizeAssetUrl(src);\n return url === null\n ? inline(phrasing(alt))\n : inline({ type: 'image', url, alt: oneLine(alt) });\n },\n /** A hard line break, printed as a backslash before the line ending. Inside a heading, strong, emphasis, link label, or table cell it is a space; at the start or end of any of these, or of a paragraph, it is dropped. */\n break: (): MarkdownInline => inline({ type: 'break' }),\n paragraph: (...children: MarkdownInlineInput[]): MarkdownBlock =>\n block({ type: 'paragraph', children: withoutEdgeBreaks(children) }),\n heading: (\n depth: 1 | 2 | 3 | 4 | 5 | 6,\n ...children: MarkdownInlineInput[]\n ): MarkdownBlock =>\n block({ type: 'heading', depth, children: inlineChildren(children) }),\n /** A quote with no blocks, such as one holding only a hidden child, is dropped. */\n blockquote: (...children: MarkdownContent[]): MarkdownContent => {\n const content = rootContent(children);\n return content.length === 0\n ? []\n : block({\n type: 'blockquote',\n children: content as Blockquote['children'],\n });\n },\n /**\n * An item that is inline input becomes one paragraph; one with no blocks,\n * such as a hidden child, is dropped. A `start` that would print a marker\n * GFM does not read as a list number is ignored.\n */\n list: (\n items: readonly (MarkdownInlineInput | MarkdownContent)[],\n { ordered = false, start }: { ordered?: boolean; start?: number } = {}\n ): MarkdownBlock => {\n const children = items.flatMap((item): ListItem[] => {\n const content = itemContent(item);\n return content.length === 0\n ? []\n : [{ type: 'listItem', spread: false, children: content }];\n });\n return block({\n type: 'list',\n ordered,\n ...(isListStart(start, children.length) ? { start } : {}),\n spread: false,\n children,\n });\n },\n /** A cell is one inline run or several. GFM trims a cell's edge whitespace. */\n table: (\n columns: readonly (MarkdownInlineInput | readonly MarkdownInlineInput[])[],\n rows: readonly (readonly (\n MarkdownInlineInput | readonly MarkdownInlineInput[]\n )[])[]\n ): MarkdownBlock =>\n block({\n type: 'table',\n children: [columns, ...rows].map((cells): TableRow => ({\n type: 'tableRow',\n children: cells.map((cell) => ({\n type: 'tableCell',\n children: inlineRuns(cell),\n })),\n })),\n }),\n /** An unsafe `language` is dropped. */\n codeBlock: (value: string, language?: string): MarkdownBlock =>\n block({\n type: 'code',\n lang:\n language !== undefined && FENCE_INFO_RE.test(language)\n ? language\n : null,\n value,\n }),\n /** Authored Markdown source, after {@link sanitizeAuthoredSource}; whitespace-only source is dropped. */\n authored: (source: string): MarkdownContent => {\n if (source.trim() === '') {\n return [];\n }\n const { markdown, inert } = sanitizeAuthoredSource(source);\n return verbatim(markdown, inert ? source : undefined);\n },\n};\n\nconst asText: Handle = (\n node: { value?: string; alt?: string | null },\n ...rest\n) =>\n defaultHandlers.text(\n { type: 'text', value: node.value ?? node.alt ?? '' },\n ...rest\n );\n\n// The URL policy again at serialization, for content built outside `md`.\nconst handlers: Record<string, Handle> = {\n link: (node: Link, ...rest) =>\n defaultHandlers.link(\n { ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF },\n ...rest\n ),\n definition: (node: Definition, ...rest) =>\n defaultHandlers.definition(\n { ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF },\n ...rest\n ),\n image: (node: Image, ...rest) => {\n const url = sanitizeAssetUrl(node.url);\n return url === null\n ? asText(node, ...rest)\n : defaultHandlers.image({ ...node, url }, ...rest);\n },\n html: asText,\n [VERBATIM_TYPE]: (node: { value: string }) => node.value,\n};\n\nconst OPTIONS: Options = {\n bullet: '-',\n // With `*`, emphasis around strong prints `***x***`, which the Slack\n // fallback cannot split. `_` costs character references around emphasis\n // inside a word.\n emphasis: '_',\n fence: '`',\n listItemIndent: 'one',\n rule: '-',\n strong: '*',\n extensions: [gfmToMarkdown({ tablePipeAlign: false })],\n handlers: handlers as Options['handlers'],\n};\n\n/** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */\nexport const markdownBlocks = (content: MarkdownContent): readonly unknown[] =>\n rootContent(content);\n\n/** `content` as GFM, without a trailing line break. */\nexport const serializeMarkdown = (content: MarkdownContent): string =>\n toMarkdown({ type: 'root', children: rootContent(content) }, OPTIONS).replace(\n /\\n$/,\n ''\n );\n"]}
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/render/markdown/builder.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// Builder content is mdast under a brand. Every mdast type stays inside this\n// module, so no emitted declaration names one.\n\nimport type {\n Blockquote,\n Definition,\n Image,\n Link,\n ListItem,\n PhrasingContent,\n RootContent,\n TableRow,\n} from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport {\n defaultHandlers,\n type Handle,\n type Options,\n toMarkdown,\n} from 'mdast-util-to-markdown';\n\nimport { oneLine } from '../../composition/one_line';\nimport {\n type MarkdownBlock,\n type MarkdownContent,\n markdownContent,\n type MarkdownInline,\n type MarkdownInlineInput,\n} from '../../define/markdown_content';\nimport {\n BLOCKED_HREF,\n sanitizeAssetUrl,\n sanitizeNavigationHref,\n} from '../../validate/url';\n\nimport { sanitizeAuthoredSource } from './format';\n\n// A fence-info string only allows word-ish tokens; anything else would\n// terminate the fence early or inject markdown.\nconst FENCE_INFO_RE = /^[\\w+#.-]+$/;\n/** The node type of Markdown printed as written. */\nexport const VERBATIM_TYPE = 'isomerVerbatim';\n\nconst inline = (node: PhrasingContent): MarkdownInline =>\n Object.assign(node, { [markdownContent]: 'inline' as const });\n\nconst block = (node: RootContent): MarkdownBlock =>\n Object.assign(node, { [markdownContent]: 'block' as const });\n\nconst isContentList = (\n content: MarkdownInline | MarkdownContent\n): content is readonly MarkdownContent[] => Array.isArray(content);\n\nconst isInlineList = (\n label: MarkdownInlineInput | readonly MarkdownInlineInput[]\n): label is readonly MarkdownInlineInput[] => Array.isArray(label);\n\nconst phrasing = (input: MarkdownInlineInput): PhrasingContent =>\n typeof input === 'string'\n ? { type: 'text', value: oneLine(input) }\n : (input as unknown as PhrasingContent);\n\nconst emptyText = (): PhrasingContent => ({ type: 'text', value: '' });\n\nconst isEmptyText = (node: PhrasingContent): boolean =>\n node.type === 'text' && node.value === '';\n\n// A break at either edge prints as a literal `\\` or loose markers.\nconst withoutEdgeBreaks = (\n inputs: readonly MarkdownInlineInput[]\n): PhrasingContent[] => {\n const children = inputs.map(phrasing).filter((node) => !isEmptyText(node));\n let start = 0;\n let end = children.length;\n while (start < end && children[start]!.type === 'break') {\n start += 1;\n }\n while (end > start && children[end - 1]!.type === 'break') {\n end -= 1;\n }\n return children.slice(start, end);\n};\n\n// Only a paragraph breaks a line: a heading with one turns setext, and the\n// Slack fallback reads a line at a time.\nconst inlineChildren = (\n inputs: readonly MarkdownInlineInput[]\n): PhrasingContent[] =>\n withoutEdgeBreaks(inputs).map((node) =>\n node.type === 'break' ? { type: 'text', value: ' ' } : node\n );\n\nconst rootContent = (content: MarkdownContent): RootContent[] =>\n isContentList(content)\n ? content.flatMap(rootContent)\n : [content as unknown as RootContent];\n\nconst isInlineInput = (\n item: MarkdownInlineInput | MarkdownContent\n): item is MarkdownInlineInput =>\n typeof item === 'string' ||\n (!isContentList(item) && item[markdownContent] === 'inline');\n\nconst itemContent = (\n item: MarkdownInlineInput | MarkdownContent\n): ListItem['children'] =>\n isInlineInput(item)\n ? [{ type: 'paragraph', children: withoutEdgeBreaks([item]) }]\n : (rootContent(item) as ListItem['children']);\n\n// GFM reads a list number of at most nine digits, so the last item's must fit.\nconst MAX_LIST_NUMBER = 999_999_999;\n\nconst isListStart = (\n start: number | undefined,\n count: number\n): start is number =>\n start !== undefined &&\n Number.isInteger(start) &&\n start >= 0 &&\n start + Math.max(count - 1, 0) <= MAX_LIST_NUMBER;\n\n// Printed as written, for Markdown that is already safe. Trailing whitespace\n// would add blank lines between blocks. `source` is the authored text when\n// sanitizing degraded it to inert text, whose escapes only Markdown resolves;\n// surfaces that print literal text read it instead.\nexport const verbatim = (markdown: string, source?: string): MarkdownBlock =>\n block({\n type: VERBATIM_TYPE,\n value: markdown.trimEnd(),\n ...(source === undefined ? {} : { source }),\n } as unknown as RootContent);\n\n// An empty wrapper prints its markers alone: `****` reads as a thematic break.\nconst wrapper = (\n type: 'strong' | 'emphasis',\n inputs: MarkdownInlineInput[]\n): MarkdownInline => {\n const children = inlineChildren(inputs);\n return inline(children.length === 0 ? emptyText() : { type, children });\n};\n\nconst inlineRuns = (\n runs: MarkdownInlineInput | readonly MarkdownInlineInput[]\n): PhrasingContent[] => inlineChildren(isInlineList(runs) ? runs : [runs]);\n\n/**\n * Builds Markdown as content rather than strings, so escaping follows where\n * each value lands. Links and images apply the URL policy in\n * `src/validate/url.ts`: a blocked link keeps its label on\n * {@link BLOCKED_HREF}, and a blocked image degrades to its alt text.\n *\n * @example\n * md.list(rows.map((row) => md.paragraph(md.strong(row.label), ': ', row.value)))\n */\nexport const md = {\n text: (value: string): MarkdownInline => inline(phrasing(value)),\n strong: (...children: MarkdownInlineInput[]): MarkdownInline =>\n wrapper('strong', children),\n emphasis: (...children: MarkdownInlineInput[]): MarkdownInline =>\n wrapper('emphasis', children),\n code: (value: string): MarkdownInline =>\n inline(\n value === '' ? emptyText() : { type: 'inlineCode', value: oneLine(value) }\n ),\n link: (\n label: MarkdownInlineInput | readonly MarkdownInlineInput[],\n href: string\n ): MarkdownInline =>\n inline({\n type: 'link',\n url: sanitizeNavigationHref(href) ?? BLOCKED_HREF,\n children: inlineRuns(label),\n }),\n image: (alt: string, src: string): MarkdownInline => {\n const url = sanitizeAssetUrl(src);\n return url === null\n ? inline(phrasing(alt))\n : inline({ type: 'image', url, alt: oneLine(alt) });\n },\n /** A hard line break, printed as a backslash before the line ending. Inside a heading, strong, emphasis, link label, or table cell it is a space; at the start or end of any of these, or of a paragraph, it is dropped. */\n break: (): MarkdownInline => inline({ type: 'break' }),\n paragraph: (...children: MarkdownInlineInput[]): MarkdownBlock =>\n block({ type: 'paragraph', children: withoutEdgeBreaks(children) }),\n heading: (\n depth: 1 | 2 | 3 | 4 | 5 | 6,\n ...children: MarkdownInlineInput[]\n ): MarkdownBlock =>\n block({ type: 'heading', depth, children: inlineChildren(children) }),\n /** A quote with no blocks, such as one holding only a hidden child, is dropped. */\n blockquote: (...children: MarkdownContent[]): MarkdownContent => {\n const content = rootContent(children);\n return content.length === 0\n ? []\n : block({\n type: 'blockquote',\n children: content as Blockquote['children'],\n });\n },\n /**\n * An item that is inline input becomes one paragraph; one with no blocks,\n * such as a hidden child, is dropped. A `start` that would print a marker\n * GFM does not read as a list number is ignored.\n */\n list: (\n items: readonly (MarkdownInlineInput | MarkdownContent)[],\n { ordered = false, start }: { ordered?: boolean; start?: number } = {}\n ): MarkdownBlock => {\n const children = items.flatMap((item): ListItem[] => {\n const content = itemContent(item);\n return content.length === 0\n ? []\n : [{ type: 'listItem', spread: false, children: content }];\n });\n return block({\n type: 'list',\n ordered,\n ...(isListStart(start, children.length) ? { start } : {}),\n spread: false,\n children,\n });\n },\n /** A cell is one inline run or several. GFM trims a cell's edge whitespace. */\n table: (\n columns: readonly (MarkdownInlineInput | readonly MarkdownInlineInput[])[],\n rows: readonly (readonly (\n MarkdownInlineInput | readonly MarkdownInlineInput[]\n )[])[]\n ): MarkdownBlock =>\n block({\n type: 'table',\n children: [columns, ...rows].map((cells): TableRow => ({\n type: 'tableRow',\n children: cells.map((cell) => ({\n type: 'tableCell',\n children: inlineRuns(cell),\n })),\n })),\n }),\n /** An unsafe `language` is dropped. */\n codeBlock: (value: string, language?: string): MarkdownBlock =>\n block({\n type: 'code',\n lang:\n language !== undefined && FENCE_INFO_RE.test(language)\n ? language\n : null,\n value,\n }),\n /** Authored Markdown source, after {@link sanitizeAuthoredSource}; whitespace-only source is dropped. */\n authored: (source: string): MarkdownContent => {\n if (source.trim() === '') {\n return [];\n }\n const { markdown, inert } = sanitizeAuthoredSource(source);\n return verbatim(markdown, inert ? source : undefined);\n },\n};\n\nconst asText: Handle = (\n node: { value?: string; alt?: string | null },\n ...rest\n) =>\n defaultHandlers.text(\n { type: 'text', value: node.value ?? node.alt ?? '' },\n ...rest\n );\n\n// The URL policy again at serialization, for content built outside `md`.\nconst handlers: Record<string, Handle> = {\n link: (node: Link, ...rest) =>\n defaultHandlers.link(\n { ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF },\n ...rest\n ),\n definition: (node: Definition, ...rest) =>\n defaultHandlers.definition(\n { ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF },\n ...rest\n ),\n image: (node: Image, ...rest) => {\n const url = sanitizeAssetUrl(node.url);\n return url === null\n ? asText(node, ...rest)\n : defaultHandlers.image({ ...node, url }, ...rest);\n },\n html: asText,\n [VERBATIM_TYPE]: (node: { value: string }) => node.value,\n};\n\nconst OPTIONS: Options = {\n bullet: '-',\n // With `*`, emphasis around strong prints `***x***`, which the Slack\n // fallback cannot split. `_` costs character references around emphasis\n // inside a word.\n emphasis: '_',\n fence: '`',\n listItemIndent: 'one',\n rule: '-',\n strong: '*',\n extensions: [gfmToMarkdown({ tablePipeAlign: false })],\n handlers: handlers as Options['handlers'],\n};\n\n/** Parsed mdast blocks as GFM, unsanitized, for `md.authored` to sanitize as it sanitizes source. */\nexport const printParsed = (nodes: readonly unknown[]): string =>\n toMarkdown(\n { type: 'root', children: nodes as RootContent[] },\n { ...OPTIONS, handlers: {} }\n ).replace(/\\n$/, '');\n\n/** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */\nexport const markdownBlocks = (content: MarkdownContent): readonly unknown[] =>\n rootContent(content);\n\n/** `content` as GFM, without a trailing line break. */\nexport const serializeMarkdown = (content: MarkdownContent): string =>\n toMarkdown({ type: 'root', children: rootContent(content) }, OPTIONS).replace(\n /\\n$/,\n ''\n );\n"]}
|
|
@@ -7,4 +7,6 @@ export declare const sanitizeAuthoredSource: (markdown: string) => {
|
|
|
7
7
|
};
|
|
8
8
|
/** Sanitizes GFM destinations and HTML; excessive syntax or length degrades to inert text. */
|
|
9
9
|
export declare const sanitizeMarkdownSource: (markdown: string) => string;
|
|
10
|
+
export declare const inert: (markdown: string) => string;
|
|
11
|
+
export declare const exceedsParseBudget: (markdown: string) => boolean;
|
|
10
12
|
//# sourceMappingURL=format.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/format.ts"],"names":[],"mappings":"AAsDA,wJAAwJ;AACxJ,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,SAAS,OAAO,EAAE,GAAG,IAYtE,CAAC;AAiJF,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,KACf;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAqBpC,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,sBAAsB,GAAI,UAAU,MAAM,KAAG,MACf,CAAC;AAG5C,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,KAAG,MACmB,CAAC;AAY7D,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,OAgBrD,CAAC"}
|
|
@@ -15,10 +15,12 @@ const escapeLinkLabel = (label) => label.replace(/[[\]\\]/g, '\\$&');
|
|
|
15
15
|
// early or read as a link title. `encodeURIComponent` leaves `(` and `)`
|
|
16
16
|
// unescaped by spec, so those two are mapped by hand.
|
|
17
17
|
const escapeLinkDestination = (href) => href.replace(/[()\s\\]/g, (char) => {
|
|
18
|
-
if (char === '(')
|
|
18
|
+
if (char === '(') {
|
|
19
19
|
return '%28';
|
|
20
|
-
|
|
20
|
+
}
|
|
21
|
+
if (char === ')') {
|
|
21
22
|
return '%29';
|
|
23
|
+
}
|
|
22
24
|
return encodeURIComponent(char);
|
|
23
25
|
});
|
|
24
26
|
const escapeParsedDestination = (href) => escapeLinkDestination(href.replace(/&/g, '&'));
|
|
@@ -29,14 +31,16 @@ const parse = (source) => fromMarkdown(source, (parseOptions ??= {
|
|
|
29
31
|
}));
|
|
30
32
|
/** `markdown` as flat GFM mdast blocks, typed `unknown` so no declaration names mdast; `null` past the parse budget or the parser's recursion depth. */
|
|
31
33
|
export const parseGfmBlocks = (markdown) => {
|
|
32
|
-
if (exceedsParseBudget(markdown))
|
|
34
|
+
if (exceedsParseBudget(markdown)) {
|
|
33
35
|
return null;
|
|
36
|
+
}
|
|
34
37
|
try {
|
|
35
38
|
return parse(markdown).children;
|
|
36
39
|
}
|
|
37
40
|
catch (error) {
|
|
38
|
-
if (!(error instanceof RangeError))
|
|
41
|
+
if (!(error instanceof RangeError)) {
|
|
39
42
|
throw error;
|
|
43
|
+
}
|
|
40
44
|
return null;
|
|
41
45
|
}
|
|
42
46
|
};
|
|
@@ -59,8 +63,9 @@ const sanitizePass = (source) => {
|
|
|
59
63
|
if (node.type === 'definition' && !definitions.has(node.identifier)) {
|
|
60
64
|
definitions.set(node.identifier, node);
|
|
61
65
|
}
|
|
62
|
-
if ('children' in node)
|
|
66
|
+
if ('children' in node) {
|
|
63
67
|
pending.push(...[...node.children].reverse());
|
|
68
|
+
}
|
|
64
69
|
}
|
|
65
70
|
const slice = (node) => {
|
|
66
71
|
const range = offsets(node);
|
|
@@ -71,8 +76,9 @@ const sanitizePass = (source) => {
|
|
|
71
76
|
let cursor = start;
|
|
72
77
|
for (const child of children) {
|
|
73
78
|
const range = offsets(child);
|
|
74
|
-
if (!range)
|
|
79
|
+
if (!range) {
|
|
75
80
|
continue;
|
|
81
|
+
}
|
|
76
82
|
out += source.slice(cursor, range[0]) + emit(child);
|
|
77
83
|
cursor = range[1];
|
|
78
84
|
}
|
|
@@ -92,8 +98,9 @@ const sanitizePass = (source) => {
|
|
|
92
98
|
case 'definition': {
|
|
93
99
|
const safe = sanitizeParsedNavigationHref(node.url) ??
|
|
94
100
|
sanitizeParsedAssetUrl(node.url);
|
|
95
|
-
if (safe === node.url)
|
|
101
|
+
if (safe === node.url) {
|
|
96
102
|
return undefined;
|
|
103
|
+
}
|
|
97
104
|
const title = node.title ? ` ${escapeTitle(node.title)}` : '';
|
|
98
105
|
return `[${node.label ?? node.identifier}]: ${safe === null ? BLOCKED_HREF : escapeParsedDestination(safe)}${title}`;
|
|
99
106
|
}
|
|
@@ -113,10 +120,12 @@ const sanitizePass = (source) => {
|
|
|
113
120
|
}
|
|
114
121
|
case 'image': {
|
|
115
122
|
const safe = sanitizeParsedAssetUrl(node.url);
|
|
116
|
-
if (safe === null)
|
|
123
|
+
if (safe === null) {
|
|
117
124
|
return escapeLinkLabel(node.alt ?? '');
|
|
118
|
-
|
|
125
|
+
}
|
|
126
|
+
if (safe === node.url) {
|
|
119
127
|
return undefined;
|
|
128
|
+
}
|
|
120
129
|
const title = node.title ? ` ${escapeTitle(node.title)}` : '';
|
|
121
130
|
return `}${title})`;
|
|
122
131
|
}
|
|
@@ -127,12 +136,15 @@ const sanitizePass = (source) => {
|
|
|
127
136
|
return safe === null ? raw.slice(1, -1) : undefined;
|
|
128
137
|
}
|
|
129
138
|
// A GFM literal (`www.x.com`) is http(s) or mailto by construction.
|
|
130
|
-
if (!raw.startsWith('['))
|
|
139
|
+
if (!raw.startsWith('[')) {
|
|
131
140
|
return undefined;
|
|
132
|
-
|
|
141
|
+
}
|
|
142
|
+
if (safe === null) {
|
|
133
143
|
return emitLabel(node);
|
|
134
|
-
|
|
144
|
+
}
|
|
145
|
+
if (safe === node.url) {
|
|
135
146
|
return undefined;
|
|
147
|
+
}
|
|
136
148
|
const title = node.title ? ` ${escapeTitle(node.title)}` : '';
|
|
137
149
|
return `[${emitLabel(node)}](${escapeParsedDestination(safe)}${title})`;
|
|
138
150
|
}
|
|
@@ -142,11 +154,13 @@ const sanitizePass = (source) => {
|
|
|
142
154
|
};
|
|
143
155
|
const emit = (node) => {
|
|
144
156
|
const replaced = rewrite(node);
|
|
145
|
-
if (replaced !== undefined)
|
|
157
|
+
if (replaced !== undefined) {
|
|
146
158
|
return replaced;
|
|
159
|
+
}
|
|
147
160
|
const range = offsets(node);
|
|
148
|
-
if (!range)
|
|
161
|
+
if (!range) {
|
|
149
162
|
return '';
|
|
163
|
+
}
|
|
150
164
|
return 'children' in node
|
|
151
165
|
? emitChildren(range[0], range[1], node.children)
|
|
152
166
|
: source.slice(...range);
|
|
@@ -162,40 +176,46 @@ export const sanitizeAuthoredSource = (markdown) => {
|
|
|
162
176
|
try {
|
|
163
177
|
for (let pass = 0; pass < MAX_PASSES; pass++) {
|
|
164
178
|
const next = sanitizePass(current);
|
|
165
|
-
if (next === current)
|
|
179
|
+
if (next === current) {
|
|
166
180
|
return { markdown: current, inert: false };
|
|
181
|
+
}
|
|
167
182
|
current = next;
|
|
168
183
|
}
|
|
169
184
|
}
|
|
170
185
|
catch (error) {
|
|
171
186
|
// The parser recurses per nesting level, so inline nesting deep enough
|
|
172
187
|
// to exhaust the stack lands here.
|
|
173
|
-
if (!(error instanceof RangeError))
|
|
188
|
+
if (!(error instanceof RangeError)) {
|
|
174
189
|
throw error;
|
|
190
|
+
}
|
|
175
191
|
}
|
|
176
192
|
return { markdown: inert(current), inert: true };
|
|
177
193
|
};
|
|
178
194
|
/** Sanitizes GFM destinations and HTML; excessive syntax or length degrades to inert text. */
|
|
179
195
|
export const sanitizeMarkdownSource = (markdown) => sanitizeAuthoredSource(markdown).markdown;
|
|
180
196
|
// No link, image, definition, or tag can survive without `[` or `<`.
|
|
181
|
-
const inert = (markdown) => markdown.replace(/[[\]\\]/g, '\\$&').replace(/</g, '<');
|
|
197
|
+
export const inert = (markdown) => markdown.replace(/[[\]\\]/g, '\\$&').replace(/</g, '<');
|
|
182
198
|
// GFM parsing is superlinear for some delimiter runs, even without nesting.
|
|
183
199
|
const LINE_PREFIX_RE = /^(?:[ \t>]|[-*+](?=[ \t])|\d{1,9}[.)](?=[ \t]))+/gm;
|
|
184
200
|
const MAX_LINE_PREFIX = 256;
|
|
185
|
-
|
|
201
|
+
// An escaped punctuation character opens nothing, so `\*` counts as one.
|
|
202
|
+
const INLINE_DELIMITER_RE = /\\[!-/:-@[-`{-~]|[[\]*`~<>|\\]|(?<![\p{L}\p{N}])_|_(?![\p{L}\p{N}])/gu;
|
|
186
203
|
const MAX_INLINE_DELIMITERS = 2048;
|
|
187
204
|
const MAX_PARSE_LENGTH = 16_384;
|
|
188
|
-
const exceedsParseBudget = (markdown) => {
|
|
189
|
-
if (markdown.length > MAX_PARSE_LENGTH)
|
|
205
|
+
export const exceedsParseBudget = (markdown) => {
|
|
206
|
+
if (markdown.length > MAX_PARSE_LENGTH) {
|
|
190
207
|
return true;
|
|
208
|
+
}
|
|
191
209
|
for (const [prefix] of markdown.matchAll(LINE_PREFIX_RE)) {
|
|
192
|
-
if (prefix.length > MAX_LINE_PREFIX)
|
|
210
|
+
if (prefix.length > MAX_LINE_PREFIX) {
|
|
193
211
|
return true;
|
|
212
|
+
}
|
|
194
213
|
}
|
|
195
214
|
let delimiters = 0;
|
|
196
215
|
for (const _ of markdown.matchAll(INLINE_DELIMITER_RE)) {
|
|
197
|
-
if (++delimiters > MAX_INLINE_DELIMITERS)
|
|
216
|
+
if (++delimiters > MAX_INLINE_DELIMITERS) {
|
|
198
217
|
return true;
|
|
218
|
+
}
|
|
199
219
|
}
|
|
200
220
|
return false;
|
|
201
221
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/render/markdown/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// Authored Markdown source made safe to print, for `md.authored`, and the GFM\n// parse it shares with the Slack fallback.\n\nimport type { Definition, Nodes, Parents, Root } from 'mdast';\nimport { fromMarkdown } from 'mdast-util-from-markdown';\nimport { gfmFromMarkdown } from 'mdast-util-gfm';\nimport { gfm } from 'micromark-extension-gfm';\n\nimport {\n BLOCKED_HREF,\n sanitizeParsedAssetUrl,\n sanitizeParsedNavigationHref,\n} from '../../validate/url';\n\n// Escapes label characters that could close a `[...]` early and smuggle in a\n// hostile destination of their own.\nconst escapeLinkLabel = (label: string): string =>\n label.replace(/[[\\]\\\\]/g, '\\\\$&');\n\n// Percent-encodes destination characters that would terminate the `(...)`\n// early or read as a link title. `encodeURIComponent` leaves `(` and `)`\n// unescaped by spec, so those two are mapped by hand.\nconst escapeLinkDestination = (href: string): string =>\n href.replace(/[()\\s\\\\]/g, (char) => {\n if (char === '(') return '%28';\n if (char === ')') return '%29';\n return encodeURIComponent(char);\n });\n\nconst escapeParsedDestination = (href: string): string =>\n escapeLinkDestination(href.replace(/&/g, '&'));\n\nlet parseOptions: Parameters<typeof fromMarkdown>[1] | undefined;\n\nconst parse = (source: string): Root =>\n fromMarkdown(\n source,\n (parseOptions ??= {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n })\n );\n\n/** `markdown` as flat GFM mdast blocks, typed `unknown` so no declaration names mdast; `null` past the parse budget or the parser's recursion depth. */\nexport const parseGfmBlocks = (markdown: string): readonly unknown[] | null => {\n if (exceedsParseBudget(markdown)) return null;\n try {\n return parse(markdown).children;\n } catch (error) {\n if (!(error instanceof RangeError)) throw error;\n return null;\n }\n};\n\n// Each pass can expose a new sink (an escaped HTML block reveals the Markdown\n// inside it; a blocked link's label may close an outer `](`), so passes repeat\n// until the source is stable.\nconst MAX_PASSES = 16;\n\nconst escapeTitle = (title: string): string =>\n `\"${title.replace(/[\"\\\\]/g, '\\\\$&')}\"`;\n\nconst offsets = (node: Nodes): [number, number] | undefined => {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n return start === undefined || end === undefined ? undefined : [start, end];\n};\n\nconst sanitizePass = (source: string): string => {\n const root = parse(source);\n const definitions = new Map<string, Definition>();\n const pending: Nodes[] = [...root.children].reverse();\n while (pending.length) {\n const node = pending.pop()!;\n if (node.type === 'definition' && !definitions.has(node.identifier)) {\n definitions.set(node.identifier, node);\n }\n if ('children' in node) pending.push(...[...node.children].reverse());\n }\n\n const slice = (node: Nodes): string => {\n const range = offsets(node);\n return range ? source.slice(...range) : '';\n };\n\n const emitChildren = (\n start: number,\n end: number,\n children: readonly Nodes[]\n ): string => {\n let out = '';\n let cursor = start;\n for (const child of children) {\n const range = offsets(child);\n if (!range) continue;\n out += source.slice(cursor, range[0]) + emit(child);\n cursor = range[1];\n }\n return out + source.slice(cursor, end);\n };\n\n const emitLabel = (node: Parents): string => {\n const first = node.children[0];\n const last = node.children[node.children.length - 1];\n const from = first && offsets(first);\n const to = last && offsets(last);\n return from && to ? emitChildren(from[0], to[1], node.children) : '';\n };\n\n const rewrite = (node: Nodes): string | undefined => {\n switch (node.type) {\n case 'html':\n return slice(node).replace(/</g, '<');\n case 'definition': {\n const safe =\n sanitizeParsedNavigationHref(node.url) ??\n sanitizeParsedAssetUrl(node.url);\n if (safe === node.url) return undefined;\n const title = node.title ? ` ${escapeTitle(node.title)}` : '';\n return `[${node.label ?? node.identifier}]: ${\n safe === null ? BLOCKED_HREF : escapeParsedDestination(safe)\n }${title}`;\n }\n case 'imageReference': {\n const definition = definitions.get(node.identifier);\n return definition && sanitizeParsedAssetUrl(definition.url) === null\n ? escapeLinkLabel(node.alt ?? '')\n : undefined;\n }\n case 'linkReference': {\n const definition = definitions.get(node.identifier);\n return definition &&\n sanitizeParsedNavigationHref(definition.url) === null &&\n sanitizeParsedAssetUrl(definition.url) !== null\n ? emitLabel(node)\n : undefined;\n }\n case 'image': {\n const safe = sanitizeParsedAssetUrl(node.url);\n if (safe === null) return escapeLinkLabel(node.alt ?? '');\n if (safe === node.url) return undefined;\n const title = node.title ? ` ${escapeTitle(node.title)}` : '';\n return `}${title})`;\n }\n case 'link': {\n const raw = slice(node);\n const safe = sanitizeParsedNavigationHref(node.url);\n if (raw.startsWith('<')) {\n return safe === null ? raw.slice(1, -1) : undefined;\n }\n // A GFM literal (`www.x.com`) is http(s) or mailto by construction.\n if (!raw.startsWith('[')) return undefined;\n if (safe === null) return emitLabel(node);\n if (safe === node.url) return undefined;\n const title = node.title ? ` ${escapeTitle(node.title)}` : '';\n return `[${emitLabel(node)}](${escapeParsedDestination(safe)}${title})`;\n }\n default:\n return undefined;\n }\n };\n\n const emit = (node: Nodes): string => {\n const replaced = rewrite(node);\n if (replaced !== undefined) return replaced;\n const range = offsets(node);\n if (!range) return '';\n return 'children' in node\n ? emitChildren(range[0], range[1], node.children)\n : source.slice(...range);\n };\n\n return emitChildren(0, source.length, root.children);\n};\n\n/** {@link sanitizeMarkdownSource}'s result, and whether it degraded to inert text. */\nexport const sanitizeAuthoredSource = (\n markdown: string\n): { markdown: string; inert: boolean } => {\n if (exceedsParseBudget(markdown)) {\n return { markdown: inert(markdown), inert: true };\n }\n let current = markdown;\n try {\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const next = sanitizePass(current);\n if (next === current) return { markdown: current, inert: false };\n current = next;\n }\n } catch (error) {\n // The parser recurses per nesting level, so inline nesting deep enough\n // to exhaust the stack lands here.\n if (!(error instanceof RangeError)) throw error;\n }\n return { markdown: inert(current), inert: true };\n};\n\n/** Sanitizes GFM destinations and HTML; excessive syntax or length degrades to inert text. */\nexport const sanitizeMarkdownSource = (markdown: string): string =>\n sanitizeAuthoredSource(markdown).markdown;\n\n// No link, image, definition, or tag can survive without `[` or `<`.\nconst inert = (markdown: string): string =>\n markdown.replace(/[[\\]\\\\]/g, '\\\\$&').replace(/</g, '<');\n\n// GFM parsing is superlinear for some delimiter runs, even without nesting.\nconst LINE_PREFIX_RE = /^(?:[ \\t>]|[-*+](?=[ \\t])|\\d{1,9}[.)](?=[ \\t]))+/gm;\nconst MAX_LINE_PREFIX = 256;\nconst INLINE_DELIMITER_RE =\n /[[\\]*`~<>|\\\\]|(?<![\\p{L}\\p{N}])_|_(?![\\p{L}\\p{N}])/gu;\nconst MAX_INLINE_DELIMITERS = 2048;\n\nconst MAX_PARSE_LENGTH = 16_384;\n\nconst exceedsParseBudget = (markdown: string): boolean => {\n if (markdown.length > MAX_PARSE_LENGTH) return true;\n for (const [prefix] of markdown.matchAll(LINE_PREFIX_RE)) {\n if (prefix.length > MAX_LINE_PREFIX) return true;\n }\n let delimiters = 0;\n for (const _ of markdown.matchAll(INLINE_DELIMITER_RE)) {\n if (++delimiters > MAX_INLINE_DELIMITERS) return true;\n }\n return false;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/render/markdown/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// Authored Markdown source made safe to print, for `md.authored`, and the GFM\n// parse it shares with the Slack fallback.\n\nimport type { Definition, Nodes, Parents, Root } from 'mdast';\nimport { fromMarkdown } from 'mdast-util-from-markdown';\nimport { gfmFromMarkdown } from 'mdast-util-gfm';\nimport { gfm } from 'micromark-extension-gfm';\n\nimport {\n BLOCKED_HREF,\n sanitizeParsedAssetUrl,\n sanitizeParsedNavigationHref,\n} from '../../validate/url';\n\n// Escapes label characters that could close a `[...]` early and smuggle in a\n// hostile destination of their own.\nconst escapeLinkLabel = (label: string): string =>\n label.replace(/[[\\]\\\\]/g, '\\\\$&');\n\n// Percent-encodes destination characters that would terminate the `(...)`\n// early or read as a link title. `encodeURIComponent` leaves `(` and `)`\n// unescaped by spec, so those two are mapped by hand.\nconst escapeLinkDestination = (href: string): string =>\n href.replace(/[()\\s\\\\]/g, (char) => {\n if (char === '(') {\n return '%28';\n }\n if (char === ')') {\n return '%29';\n }\n return encodeURIComponent(char);\n });\n\nconst escapeParsedDestination = (href: string): string =>\n escapeLinkDestination(href.replace(/&/g, '&'));\n\nlet parseOptions: Parameters<typeof fromMarkdown>[1] | undefined;\n\nconst parse = (source: string): Root =>\n fromMarkdown(\n source,\n (parseOptions ??= {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n })\n );\n\n/** `markdown` as flat GFM mdast blocks, typed `unknown` so no declaration names mdast; `null` past the parse budget or the parser's recursion depth. */\nexport const parseGfmBlocks = (markdown: string): readonly unknown[] | null => {\n if (exceedsParseBudget(markdown)) {\n return null;\n }\n try {\n return parse(markdown).children;\n } catch (error) {\n if (!(error instanceof RangeError)) {\n throw error;\n }\n return null;\n }\n};\n\n// Each pass can expose a new sink (an escaped HTML block reveals the Markdown\n// inside it; a blocked link's label may close an outer `](`), so passes repeat\n// until the source is stable.\nconst MAX_PASSES = 16;\n\nconst escapeTitle = (title: string): string =>\n `\"${title.replace(/[\"\\\\]/g, '\\\\$&')}\"`;\n\nconst offsets = (node: Nodes): [number, number] | undefined => {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n return start === undefined || end === undefined ? undefined : [start, end];\n};\n\nconst sanitizePass = (source: string): string => {\n const root = parse(source);\n const definitions = new Map<string, Definition>();\n const pending: Nodes[] = [...root.children].reverse();\n while (pending.length) {\n const node = pending.pop()!;\n if (node.type === 'definition' && !definitions.has(node.identifier)) {\n definitions.set(node.identifier, node);\n }\n if ('children' in node) {\n pending.push(...[...node.children].reverse());\n }\n }\n\n const slice = (node: Nodes): string => {\n const range = offsets(node);\n return range ? source.slice(...range) : '';\n };\n\n const emitChildren = (\n start: number,\n end: number,\n children: readonly Nodes[]\n ): string => {\n let out = '';\n let cursor = start;\n for (const child of children) {\n const range = offsets(child);\n if (!range) {\n continue;\n }\n out += source.slice(cursor, range[0]) + emit(child);\n cursor = range[1];\n }\n return out + source.slice(cursor, end);\n };\n\n const emitLabel = (node: Parents): string => {\n const first = node.children[0];\n const last = node.children[node.children.length - 1];\n const from = first && offsets(first);\n const to = last && offsets(last);\n return from && to ? emitChildren(from[0], to[1], node.children) : '';\n };\n\n const rewrite = (node: Nodes): string | undefined => {\n switch (node.type) {\n case 'html':\n return slice(node).replace(/</g, '<');\n case 'definition': {\n const safe =\n sanitizeParsedNavigationHref(node.url) ??\n sanitizeParsedAssetUrl(node.url);\n if (safe === node.url) {\n return undefined;\n }\n const title = node.title ? ` ${escapeTitle(node.title)}` : '';\n return `[${node.label ?? node.identifier}]: ${\n safe === null ? BLOCKED_HREF : escapeParsedDestination(safe)\n }${title}`;\n }\n case 'imageReference': {\n const definition = definitions.get(node.identifier);\n return definition && sanitizeParsedAssetUrl(definition.url) === null\n ? escapeLinkLabel(node.alt ?? '')\n : undefined;\n }\n case 'linkReference': {\n const definition = definitions.get(node.identifier);\n return definition &&\n sanitizeParsedNavigationHref(definition.url) === null &&\n sanitizeParsedAssetUrl(definition.url) !== null\n ? emitLabel(node)\n : undefined;\n }\n case 'image': {\n const safe = sanitizeParsedAssetUrl(node.url);\n if (safe === null) {\n return escapeLinkLabel(node.alt ?? '');\n }\n if (safe === node.url) {\n return undefined;\n }\n const title = node.title ? ` ${escapeTitle(node.title)}` : '';\n return `}${title})`;\n }\n case 'link': {\n const raw = slice(node);\n const safe = sanitizeParsedNavigationHref(node.url);\n if (raw.startsWith('<')) {\n return safe === null ? raw.slice(1, -1) : undefined;\n }\n // A GFM literal (`www.x.com`) is http(s) or mailto by construction.\n if (!raw.startsWith('[')) {\n return undefined;\n }\n if (safe === null) {\n return emitLabel(node);\n }\n if (safe === node.url) {\n return undefined;\n }\n const title = node.title ? ` ${escapeTitle(node.title)}` : '';\n return `[${emitLabel(node)}](${escapeParsedDestination(safe)}${title})`;\n }\n default:\n return undefined;\n }\n };\n\n const emit = (node: Nodes): string => {\n const replaced = rewrite(node);\n if (replaced !== undefined) {\n return replaced;\n }\n const range = offsets(node);\n if (!range) {\n return '';\n }\n return 'children' in node\n ? emitChildren(range[0], range[1], node.children)\n : source.slice(...range);\n };\n\n return emitChildren(0, source.length, root.children);\n};\n\n/** {@link sanitizeMarkdownSource}'s result, and whether it degraded to inert text. */\nexport const sanitizeAuthoredSource = (\n markdown: string\n): { markdown: string; inert: boolean } => {\n if (exceedsParseBudget(markdown)) {\n return { markdown: inert(markdown), inert: true };\n }\n let current = markdown;\n try {\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const next = sanitizePass(current);\n if (next === current) {\n return { markdown: current, inert: false };\n }\n current = next;\n }\n } catch (error) {\n // The parser recurses per nesting level, so inline nesting deep enough\n // to exhaust the stack lands here.\n if (!(error instanceof RangeError)) {\n throw error;\n }\n }\n return { markdown: inert(current), inert: true };\n};\n\n/** Sanitizes GFM destinations and HTML; excessive syntax or length degrades to inert text. */\nexport const sanitizeMarkdownSource = (markdown: string): string =>\n sanitizeAuthoredSource(markdown).markdown;\n\n// No link, image, definition, or tag can survive without `[` or `<`.\nexport const inert = (markdown: string): string =>\n markdown.replace(/[[\\]\\\\]/g, '\\\\$&').replace(/</g, '<');\n\n// GFM parsing is superlinear for some delimiter runs, even without nesting.\nconst LINE_PREFIX_RE = /^(?:[ \\t>]|[-*+](?=[ \\t])|\\d{1,9}[.)](?=[ \\t]))+/gm;\nconst MAX_LINE_PREFIX = 256;\n// An escaped punctuation character opens nothing, so `\\*` counts as one.\nconst INLINE_DELIMITER_RE =\n /\\\\[!-/:-@[-`{-~]|[[\\]*`~<>|\\\\]|(?<![\\p{L}\\p{N}])_|_(?![\\p{L}\\p{N}])/gu;\nconst MAX_INLINE_DELIMITERS = 2048;\n\nconst MAX_PARSE_LENGTH = 16_384;\n\nexport const exceedsParseBudget = (markdown: string): boolean => {\n if (markdown.length > MAX_PARSE_LENGTH) {\n return true;\n }\n for (const [prefix] of markdown.matchAll(LINE_PREFIX_RE)) {\n if (prefix.length > MAX_LINE_PREFIX) {\n return true;\n }\n }\n let delimiters = 0;\n for (const _ of markdown.matchAll(INLINE_DELIMITER_RE)) {\n if (++delimiters > MAX_INLINE_DELIMITERS) {\n return true;\n }\n }\n return false;\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** A tag found by {@link findHostTags}. */
|
|
2
|
+
export interface HostTag {
|
|
3
|
+
/** Offset of the `<` in the source. */
|
|
4
|
+
readonly index: number;
|
|
5
|
+
/** The tag as written. */
|
|
6
|
+
readonly raw: string;
|
|
7
|
+
/** The name as listed in the options. */
|
|
8
|
+
readonly name: string;
|
|
9
|
+
/** Values as written, keyed by lower-cased name; a bare attribute is `''`. */
|
|
10
|
+
readonly attributes: Readonly<Record<string, string>>;
|
|
11
|
+
}
|
|
12
|
+
/** Every tag named in `names` (matched case-insensitively and whole), in source order. */
|
|
13
|
+
export declare const findHostTags: (source: string, names: readonly string[]) => HostTag[];
|
|
14
|
+
//# sourceMappingURL=host_tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host_tags.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/host_tags.ts"],"names":[],"mappings":"AAaA,2CAA2C;AAC3C,MAAM,WAAW,OAAO;IACtB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AA6CD,0FAA0F;AAC1F,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,EACd,OAAO,SAAS,MAAM,EAAE,KACvB,OAAO,EAwBT,CAAC"}
|