@elastic/isomer-sdk 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +93 -0
- package/NOTICE.txt +1861 -0
- package/README.md +69 -0
- package/THIRD_PARTY_LICENSES.md +957 -0
- package/dist/author/authored_fields.d.ts +153 -0
- package/dist/author/authored_fields.d.ts.map +1 -0
- package/dist/author/authored_fields.js +227 -0
- package/dist/author/authored_fields.js.map +1 -0
- package/dist/author/authoring_input.d.ts +7 -0
- package/dist/author/authoring_input.d.ts.map +1 -0
- package/dist/author/authoring_input.js +60 -0
- package/dist/author/authoring_input.js.map +1 -0
- package/dist/author/authoring_model.d.ts +27 -0
- package/dist/author/authoring_model.d.ts.map +1 -0
- package/dist/author/authoring_model.js +98 -0
- package/dist/author/authoring_model.js.map +1 -0
- package/dist/author/declarations.d.ts +13 -0
- package/dist/author/declarations.d.ts.map +1 -0
- package/dist/author/declarations.js +277 -0
- package/dist/author/declarations.js.map +1 -0
- package/dist/author/index.d.ts +7 -0
- package/dist/author/index.d.ts.map +1 -0
- package/dist/author/index.js +12 -0
- package/dist/author/index.js.map +1 -0
- package/dist/author/jsx.d.ts +21 -0
- package/dist/author/jsx.d.ts.map +1 -0
- package/dist/author/jsx.js +20 -0
- package/dist/author/jsx.js.map +1 -0
- package/dist/author/jsx_shim.d.ts +117 -0
- package/dist/author/jsx_shim.d.ts.map +1 -0
- package/dist/author/jsx_shim.js +270 -0
- package/dist/author/jsx_shim.js.map +1 -0
- package/dist/author/prompt.d.ts +58 -0
- package/dist/author/prompt.d.ts.map +1 -0
- package/dist/author/prompt.js +148 -0
- package/dist/author/prompt.js.map +1 -0
- package/dist/author/schema_to_typescript.d.ts +37 -0
- package/dist/author/schema_to_typescript.d.ts.map +1 -0
- package/dist/author/schema_to_typescript.js +286 -0
- package/dist/author/schema_to_typescript.js.map +1 -0
- package/dist/cjs/author/authored_fields.js +233 -0
- package/dist/cjs/author/authored_fields.js.map +1 -0
- package/dist/cjs/author/authoring_input.js +64 -0
- package/dist/cjs/author/authoring_input.js.map +1 -0
- package/dist/cjs/author/authoring_model.js +104 -0
- package/dist/cjs/author/authoring_model.js.map +1 -0
- package/dist/cjs/author/declarations.js +281 -0
- package/dist/cjs/author/declarations.js.map +1 -0
- package/dist/cjs/author/index.js +25 -0
- package/dist/cjs/author/index.js.map +1 -0
- package/dist/cjs/author/jsx.js +24 -0
- package/dist/cjs/author/jsx.js.map +1 -0
- package/dist/cjs/author/jsx_shim.js +276 -0
- package/dist/cjs/author/jsx_shim.js.map +1 -0
- package/dist/cjs/author/prompt.js +153 -0
- package/dist/cjs/author/prompt.js.map +1 -0
- package/dist/cjs/author/schema_to_typescript.js +295 -0
- package/dist/cjs/author/schema_to_typescript.js.map +1 -0
- package/dist/cjs/composition/action_event.js +9 -0
- package/dist/cjs/composition/action_event.js.map +1 -0
- package/dist/cjs/composition/body_node_base.js +112 -0
- package/dist/cjs/composition/body_node_base.js.map +1 -0
- package/dist/cjs/composition/composition.js +9 -0
- package/dist/cjs/composition/composition.js.map +1 -0
- package/dist/cjs/composition/error.js +73 -0
- package/dist/cjs/composition/error.js.map +1 -0
- package/dist/cjs/composition/index.js +32 -0
- package/dist/cjs/composition/index.js.map +1 -0
- package/dist/cjs/composition/map_nodes.js +85 -0
- package/dist/cjs/composition/map_nodes.js.map +1 -0
- package/dist/cjs/composition/named_color.js +20 -0
- package/dist/cjs/composition/named_color.js.map +1 -0
- package/dist/cjs/composition/node.js +9 -0
- package/dist/cjs/composition/node.js.map +1 -0
- package/dist/cjs/composition/one_line.js +23 -0
- package/dist/cjs/composition/one_line.js.map +1 -0
- package/dist/cjs/composition/structured_value.js +21 -0
- package/dist/cjs/composition/structured_value.js.map +1 -0
- package/dist/cjs/composition/validation_error.js +40 -0
- package/dist/cjs/composition/validation_error.js.map +1 -0
- package/dist/cjs/define/frame.js +31 -0
- package/dist/cjs/define/frame.js.map +1 -0
- package/dist/cjs/define/index.js +31 -0
- package/dist/cjs/define/index.js.map +1 -0
- package/dist/cjs/define/markdown_content.js +12 -0
- package/dist/cjs/define/markdown_content.js.map +1 -0
- package/dist/cjs/define/primitive_example.js +26 -0
- package/dist/cjs/define/primitive_example.js.map +1 -0
- package/dist/cjs/define/primitive_icon.js +17 -0
- package/dist/cjs/define/primitive_icon.js.map +1 -0
- package/dist/cjs/define/primitive_module.js +118 -0
- package/dist/cjs/define/primitive_module.js.map +1 -0
- package/dist/cjs/define/slack_assets.js +9 -0
- package/dist/cjs/define/slack_assets.js.map +1 -0
- package/dist/cjs/define/slack_blocks.js +9 -0
- package/dist/cjs/define/slack_blocks.js.map +1 -0
- package/dist/cjs/define/zod_format.js +122 -0
- package/dist/cjs/define/zod_format.js.map +1 -0
- package/dist/cjs/define/zod_helpers.js +26 -0
- package/dist/cjs/define/zod_helpers.js.map +1 -0
- package/dist/cjs/entries/html.js +12 -0
- package/dist/cjs/entries/html.js.map +1 -0
- package/dist/cjs/entries/index.js +80 -0
- package/dist/cjs/entries/index.js.map +1 -0
- package/dist/cjs/entries/markdown.js +14 -0
- package/dist/cjs/entries/markdown.js.map +1 -0
- package/dist/cjs/entries/react.js +20 -0
- package/dist/cjs/entries/react.js.map +1 -0
- package/dist/cjs/entries/slack.js +25 -0
- package/dist/cjs/entries/slack.js.map +1 -0
- package/dist/cjs/entries/text.js +12 -0
- package/dist/cjs/entries/text.js.map +1 -0
- package/dist/cjs/pack/capabilities.js +40 -0
- package/dist/cjs/pack/capabilities.js.map +1 -0
- package/dist/cjs/pack/compose.js +59 -0
- package/dist/cjs/pack/compose.js.map +1 -0
- package/dist/cjs/pack/enhancements.js +65 -0
- package/dist/cjs/pack/enhancements.js.map +1 -0
- package/dist/cjs/pack/index.js +18 -0
- package/dist/cjs/pack/index.js.map +1 -0
- package/dist/cjs/pack/primitive_pack.js +97 -0
- package/dist/cjs/pack/primitive_pack.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/render/anchors.js +167 -0
- package/dist/cjs/render/anchors.js.map +1 -0
- package/dist/cjs/render/context_view.js +54 -0
- package/dist/cjs/render/context_view.js.map +1 -0
- package/dist/cjs/render/format_display_value.js +143 -0
- package/dist/cjs/render/format_display_value.js.map +1 -0
- package/dist/cjs/render/format_number.js +46 -0
- package/dist/cjs/render/format_number.js.map +1 -0
- package/dist/cjs/render/html/enhancements.js +30 -0
- package/dist/cjs/render/html/enhancements.js.map +1 -0
- package/dist/cjs/render/html/envelope.js +218 -0
- package/dist/cjs/render/html/envelope.js.map +1 -0
- package/dist/cjs/render/html/index.js +12 -0
- package/dist/cjs/render/html/index.js.map +1 -0
- package/dist/cjs/render/index.js +25 -0
- package/dist/cjs/render/index.js.map +1 -0
- package/dist/cjs/render/layout_check.js +133 -0
- package/dist/cjs/render/layout_check.js.map +1 -0
- package/dist/cjs/render/markdown/builder.js +195 -0
- package/dist/cjs/render/markdown/builder.js.map +1 -0
- package/dist/cjs/render/markdown/envelope.js +33 -0
- package/dist/cjs/render/markdown/envelope.js.map +1 -0
- package/dist/cjs/render/markdown/format.js +208 -0
- package/dist/cjs/render/markdown/format.js.map +1 -0
- package/dist/cjs/render/markdown/index.js +15 -0
- package/dist/cjs/render/markdown/index.js.map +1 -0
- package/dist/cjs/render/measure_dom.js +61 -0
- package/dist/cjs/render/measure_dom.js.map +1 -0
- package/dist/cjs/render/payload.js +13 -0
- package/dist/cjs/render/payload.js.map +1 -0
- package/dist/cjs/render/primitive_dispatch.js +173 -0
- package/dist/cjs/render/primitive_dispatch.js.map +1 -0
- package/dist/cjs/render/react/content.js +44 -0
- package/dist/cjs/render/react/content.js.map +1 -0
- package/dist/cjs/render/react/enhancements.js +32 -0
- package/dist/cjs/render/react/enhancements.js.map +1 -0
- package/dist/cjs/render/react/index.js +15 -0
- package/dist/cjs/render/react/index.js.map +1 -0
- package/dist/cjs/render/slack/assets.js +45 -0
- package/dist/cjs/render/slack/assets.js.map +1 -0
- package/dist/cjs/render/slack/blocks.js +80 -0
- package/dist/cjs/render/slack/blocks.js.map +1 -0
- package/dist/cjs/render/slack/envelope.js +551 -0
- package/dist/cjs/render/slack/envelope.js.map +1 -0
- package/dist/cjs/render/slack/format.js +225 -0
- package/dist/cjs/render/slack/format.js.map +1 -0
- package/dist/cjs/render/slack/index.js +30 -0
- package/dist/cjs/render/slack/index.js.map +1 -0
- package/dist/cjs/render/slack/markdown_content.js +409 -0
- package/dist/cjs/render/slack/markdown_content.js.map +1 -0
- package/dist/cjs/render/text/envelope.js +21 -0
- package/dist/cjs/render/text/envelope.js.map +1 -0
- package/dist/cjs/render/text/index.js +12 -0
- package/dist/cjs/render/text/index.js.map +1 -0
- package/dist/cjs/testing/conformance.js +312 -0
- package/dist/cjs/testing/conformance.js.map +1 -0
- package/dist/cjs/testing/icon.js +248 -0
- package/dist/cjs/testing/icon.js.map +1 -0
- package/dist/cjs/testing/index.js +18 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/registration.js +142 -0
- package/dist/cjs/testing/registration.js.map +1 -0
- package/dist/cjs/validate/authoring_schema.js +312 -0
- package/dist/cjs/validate/authoring_schema.js.map +1 -0
- package/dist/cjs/validate/composition_schema.js +135 -0
- package/dist/cjs/validate/composition_schema.js.map +1 -0
- package/dist/cjs/validate/index.js +53 -0
- package/dist/cjs/validate/index.js.map +1 -0
- package/dist/cjs/validate/input_budget.js +156 -0
- package/dist/cjs/validate/input_budget.js.map +1 -0
- package/dist/cjs/validate/json_schema.js +72 -0
- package/dist/cjs/validate/json_schema.js.map +1 -0
- package/dist/cjs/validate/node_issues.js +65 -0
- package/dist/cjs/validate/node_issues.js.map +1 -0
- package/dist/cjs/validate/url.js +116 -0
- package/dist/cjs/validate/url.js.map +1 -0
- package/dist/cjs/validate/validation.js +165 -0
- package/dist/cjs/validate/validation.js.map +1 -0
- package/dist/cjs/validate/value_schemas.js +53 -0
- package/dist/cjs/validate/value_schemas.js.map +1 -0
- package/dist/composition/action_event.d.ts +13 -0
- package/dist/composition/action_event.d.ts.map +1 -0
- package/dist/composition/action_event.js +8 -0
- package/dist/composition/action_event.js.map +1 -0
- package/dist/composition/body_node_base.d.ts +72 -0
- package/dist/composition/body_node_base.d.ts.map +1 -0
- package/dist/composition/body_node_base.js +104 -0
- package/dist/composition/body_node_base.js.map +1 -0
- package/dist/composition/composition.d.ts +71 -0
- package/dist/composition/composition.d.ts.map +1 -0
- package/dist/composition/composition.js +8 -0
- package/dist/composition/composition.js.map +1 -0
- package/dist/composition/error.d.ts +61 -0
- package/dist/composition/error.d.ts.map +1 -0
- package/dist/composition/error.js +69 -0
- package/dist/composition/error.js.map +1 -0
- package/dist/composition/index.d.ts +11 -0
- package/dist/composition/index.d.ts.map +1 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/composition/map_nodes.d.ts +16 -0
- package/dist/composition/map_nodes.d.ts.map +1 -0
- package/dist/composition/map_nodes.js +81 -0
- package/dist/composition/map_nodes.js.map +1 -0
- package/dist/composition/named_color.d.ts +9 -0
- package/dist/composition/named_color.d.ts.map +1 -0
- package/dist/composition/named_color.js +17 -0
- package/dist/composition/named_color.js.map +1 -0
- package/dist/composition/node.d.ts +11 -0
- package/dist/composition/node.d.ts.map +1 -0
- package/dist/composition/node.js +8 -0
- package/dist/composition/node.js.map +1 -0
- package/dist/composition/one_line.d.ts +7 -0
- package/dist/composition/one_line.d.ts.map +1 -0
- package/dist/composition/one_line.js +17 -0
- package/dist/composition/one_line.js.map +1 -0
- package/dist/composition/structured_value.d.ts +27 -0
- package/dist/composition/structured_value.d.ts.map +1 -0
- package/dist/composition/structured_value.js +18 -0
- package/dist/composition/structured_value.js.map +1 -0
- package/dist/composition/validation_error.d.ts +33 -0
- package/dist/composition/validation_error.d.ts.map +1 -0
- package/dist/composition/validation_error.js +35 -0
- package/dist/composition/validation_error.js.map +1 -0
- package/dist/define/frame.d.ts +155 -0
- package/dist/define/frame.d.ts.map +1 -0
- package/dist/define/frame.js +27 -0
- package/dist/define/frame.js.map +1 -0
- package/dist/define/index.d.ts +10 -0
- package/dist/define/index.d.ts.map +1 -0
- package/dist/define/index.js +13 -0
- package/dist/define/index.js.map +1 -0
- package/dist/define/markdown_content.d.ts +15 -0
- package/dist/define/markdown_content.d.ts.map +1 -0
- package/dist/define/markdown_content.js +9 -0
- package/dist/define/markdown_content.js.map +1 -0
- package/dist/define/primitive_example.d.ts +30 -0
- package/dist/define/primitive_example.d.ts.map +1 -0
- package/dist/define/primitive_example.js +21 -0
- package/dist/define/primitive_example.js.map +1 -0
- package/dist/define/primitive_icon.d.ts +11 -0
- package/dist/define/primitive_icon.d.ts.map +1 -0
- package/dist/define/primitive_icon.js +14 -0
- package/dist/define/primitive_icon.js.map +1 -0
- package/dist/define/primitive_module.d.ts +435 -0
- package/dist/define/primitive_module.d.ts.map +1 -0
- package/dist/define/primitive_module.js +112 -0
- package/dist/define/primitive_module.js.map +1 -0
- package/dist/define/slack_assets.d.ts +28 -0
- package/dist/define/slack_assets.d.ts.map +1 -0
- package/dist/define/slack_assets.js +8 -0
- package/dist/define/slack_assets.js.map +1 -0
- package/dist/define/slack_blocks.d.ts +234 -0
- package/dist/define/slack_blocks.d.ts.map +1 -0
- package/dist/define/slack_blocks.js +8 -0
- package/dist/define/slack_blocks.js.map +1 -0
- package/dist/define/zod_format.d.ts +33 -0
- package/dist/define/zod_format.d.ts.map +1 -0
- package/dist/define/zod_format.js +114 -0
- package/dist/define/zod_format.js.map +1 -0
- package/dist/define/zod_helpers.d.ts +10 -0
- package/dist/define/zod_helpers.d.ts.map +1 -0
- package/dist/define/zod_helpers.js +22 -0
- package/dist/define/zod_helpers.js.map +1 -0
- package/dist/entries/html.d.ts +3 -0
- package/dist/entries/html.d.ts.map +1 -0
- package/dist/entries/html.js +8 -0
- package/dist/entries/html.js.map +1 -0
- package/dist/entries/index.d.ts +6 -0
- package/dist/entries/index.d.ts.map +1 -0
- package/dist/entries/index.js +12 -0
- package/dist/entries/index.js.map +1 -0
- package/dist/entries/markdown.d.ts +3 -0
- package/dist/entries/markdown.d.ts.map +1 -0
- package/dist/entries/markdown.js +8 -0
- package/dist/entries/markdown.js.map +1 -0
- package/dist/entries/react.d.ts +5 -0
- package/dist/entries/react.d.ts.map +1 -0
- package/dist/entries/react.js +11 -0
- package/dist/entries/react.js.map +1 -0
- package/dist/entries/slack.d.ts +2 -0
- package/dist/entries/slack.d.ts.map +1 -0
- package/dist/entries/slack.js +8 -0
- package/dist/entries/slack.js.map +1 -0
- package/dist/entries/text.d.ts +2 -0
- package/dist/entries/text.d.ts.map +1 -0
- package/dist/entries/text.js +8 -0
- package/dist/entries/text.js.map +1 -0
- package/dist/pack/capabilities.d.ts +41 -0
- package/dist/pack/capabilities.d.ts.map +1 -0
- package/dist/pack/capabilities.js +36 -0
- package/dist/pack/capabilities.js.map +1 -0
- package/dist/pack/compose.d.ts +24 -0
- package/dist/pack/compose.d.ts.map +1 -0
- package/dist/pack/compose.js +55 -0
- package/dist/pack/compose.js.map +1 -0
- package/dist/pack/enhancements.d.ts +65 -0
- package/dist/pack/enhancements.d.ts.map +1 -0
- package/dist/pack/enhancements.js +59 -0
- package/dist/pack/enhancements.js.map +1 -0
- package/dist/pack/index.d.ts +5 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +11 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/pack/primitive_pack.d.ts +164 -0
- package/dist/pack/primitive_pack.d.ts.map +1 -0
- package/dist/pack/primitive_pack.js +92 -0
- package/dist/pack/primitive_pack.js.map +1 -0
- package/dist/render/anchors.d.ts +82 -0
- package/dist/render/anchors.d.ts.map +1 -0
- package/dist/render/anchors.js +153 -0
- package/dist/render/anchors.js.map +1 -0
- package/dist/render/context_view.d.ts +10 -0
- package/dist/render/context_view.d.ts.map +1 -0
- package/dist/render/context_view.js +49 -0
- package/dist/render/context_view.js.map +1 -0
- package/dist/render/format_display_value.d.ts +20 -0
- package/dist/render/format_display_value.d.ts.map +1 -0
- package/dist/render/format_display_value.js +137 -0
- package/dist/render/format_display_value.js.map +1 -0
- package/dist/render/format_number.d.ts +9 -0
- package/dist/render/format_number.d.ts.map +1 -0
- package/dist/render/format_number.js +42 -0
- package/dist/render/format_number.js.map +1 -0
- package/dist/render/html/enhancements.d.ts +10 -0
- package/dist/render/html/enhancements.d.ts.map +1 -0
- package/dist/render/html/enhancements.js +25 -0
- package/dist/render/html/enhancements.js.map +1 -0
- package/dist/render/html/envelope.d.ts +182 -0
- package/dist/render/html/envelope.d.ts.map +1 -0
- package/dist/render/html/envelope.js +214 -0
- package/dist/render/html/envelope.js.map +1 -0
- package/dist/render/html/index.d.ts +3 -0
- package/dist/render/html/index.d.ts.map +1 -0
- package/dist/render/html/index.js +8 -0
- package/dist/render/html/index.js.map +1 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/layout_check.d.ts +43 -0
- package/dist/render/layout_check.d.ts.map +1 -0
- package/dist/render/layout_check.js +129 -0
- package/dist/render/layout_check.js.map +1 -0
- package/dist/render/markdown/builder.d.ts +46 -0
- package/dist/render/markdown/builder.d.ts.map +1 -0
- package/dist/render/markdown/builder.js +190 -0
- package/dist/render/markdown/builder.js.map +1 -0
- package/dist/render/markdown/envelope.d.ts +20 -0
- package/dist/render/markdown/envelope.d.ts.map +1 -0
- package/dist/render/markdown/envelope.js +29 -0
- package/dist/render/markdown/envelope.js.map +1 -0
- package/dist/render/markdown/format.d.ts +10 -0
- package/dist/render/markdown/format.d.ts.map +1 -0
- package/dist/render/markdown/format.js +202 -0
- package/dist/render/markdown/format.js.map +1 -0
- package/dist/render/markdown/index.d.ts +3 -0
- package/dist/render/markdown/index.d.ts.map +1 -0
- package/dist/render/markdown/index.js +9 -0
- package/dist/render/markdown/index.js.map +1 -0
- package/dist/render/measure_dom.d.ts +10 -0
- package/dist/render/measure_dom.d.ts.map +1 -0
- package/dist/render/measure_dom.js +57 -0
- package/dist/render/measure_dom.js.map +1 -0
- package/dist/render/payload.d.ts +16 -0
- package/dist/render/payload.d.ts.map +1 -0
- package/dist/render/payload.js +9 -0
- package/dist/render/payload.js.map +1 -0
- package/dist/render/primitive_dispatch.d.ts +72 -0
- package/dist/render/primitive_dispatch.d.ts.map +1 -0
- package/dist/render/primitive_dispatch.js +169 -0
- package/dist/render/primitive_dispatch.js.map +1 -0
- package/dist/render/react/content.d.ts +40 -0
- package/dist/render/react/content.d.ts.map +1 -0
- package/dist/render/react/content.js +39 -0
- package/dist/render/react/content.js.map +1 -0
- package/dist/render/react/enhancements.d.ts +15 -0
- package/dist/render/react/enhancements.d.ts.map +1 -0
- package/dist/render/react/enhancements.js +28 -0
- package/dist/render/react/enhancements.js.map +1 -0
- package/dist/render/react/index.d.ts +3 -0
- package/dist/render/react/index.d.ts.map +1 -0
- package/dist/render/react/index.js +9 -0
- package/dist/render/react/index.js.map +1 -0
- package/dist/render/slack/assets.d.ts +16 -0
- package/dist/render/slack/assets.d.ts.map +1 -0
- package/dist/render/slack/assets.js +40 -0
- package/dist/render/slack/assets.js.map +1 -0
- package/dist/render/slack/blocks.d.ts +72 -0
- package/dist/render/slack/blocks.d.ts.map +1 -0
- package/dist/render/slack/blocks.js +77 -0
- package/dist/render/slack/blocks.js.map +1 -0
- package/dist/render/slack/envelope.d.ts +52 -0
- package/dist/render/slack/envelope.d.ts.map +1 -0
- package/dist/render/slack/envelope.js +547 -0
- package/dist/render/slack/envelope.js.map +1 -0
- package/dist/render/slack/format.d.ts +70 -0
- package/dist/render/slack/format.d.ts.map +1 -0
- package/dist/render/slack/format.js +209 -0
- package/dist/render/slack/format.js.map +1 -0
- package/dist/render/slack/index.d.ts +6 -0
- package/dist/render/slack/index.d.ts.map +1 -0
- package/dist/render/slack/index.js +12 -0
- package/dist/render/slack/index.js.map +1 -0
- package/dist/render/slack/markdown_content.d.ts +17 -0
- package/dist/render/slack/markdown_content.d.ts.map +1 -0
- package/dist/render/slack/markdown_content.js +404 -0
- package/dist/render/slack/markdown_content.js.map +1 -0
- package/dist/render/text/envelope.d.ts +15 -0
- package/dist/render/text/envelope.d.ts.map +1 -0
- package/dist/render/text/envelope.js +17 -0
- package/dist/render/text/envelope.js.map +1 -0
- package/dist/render/text/index.d.ts +2 -0
- package/dist/render/text/index.d.ts.map +1 -0
- package/dist/render/text/index.js +8 -0
- package/dist/render/text/index.js.map +1 -0
- package/dist/testing/conformance.d.ts +145 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +303 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/icon.d.ts +11 -0
- package/dist/testing/icon.d.ts.map +1 -0
- package/dist/testing/icon.js +244 -0
- package/dist/testing/icon.js.map +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/registration.d.ts +32 -0
- package/dist/testing/registration.d.ts.map +1 -0
- package/dist/testing/registration.js +105 -0
- package/dist/testing/registration.js.map +1 -0
- package/dist/validate/authoring_schema.d.ts +33 -0
- package/dist/validate/authoring_schema.d.ts.map +1 -0
- package/dist/validate/authoring_schema.js +306 -0
- package/dist/validate/authoring_schema.js.map +1 -0
- package/dist/validate/composition_schema.d.ts +80 -0
- package/dist/validate/composition_schema.d.ts.map +1 -0
- package/dist/validate/composition_schema.js +127 -0
- package/dist/validate/composition_schema.js.map +1 -0
- package/dist/validate/index.d.ts +9 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +15 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/input_budget.d.ts +35 -0
- package/dist/validate/input_budget.d.ts.map +1 -0
- package/dist/validate/input_budget.js +151 -0
- package/dist/validate/input_budget.js.map +1 -0
- package/dist/validate/json_schema.d.ts +32 -0
- package/dist/validate/json_schema.d.ts.map +1 -0
- package/dist/validate/json_schema.js +68 -0
- package/dist/validate/json_schema.js.map +1 -0
- package/dist/validate/node_issues.d.ts +12 -0
- package/dist/validate/node_issues.d.ts.map +1 -0
- package/dist/validate/node_issues.js +61 -0
- package/dist/validate/node_issues.js.map +1 -0
- package/dist/validate/url.d.ts +50 -0
- package/dist/validate/url.d.ts.map +1 -0
- package/dist/validate/url.js +107 -0
- package/dist/validate/url.js.map +1 -0
- package/dist/validate/validation.d.ts +95 -0
- package/dist/validate/validation.d.ts.map +1 -0
- package/dist/validate/validation.js +157 -0
- package/dist/validate/validation.js.map +1 -0
- package/dist/validate/value_schemas.d.ts +53 -0
- package/dist/validate/value_schemas.d.ts.map +1 -0
- package/dist/validate/value_schemas.js +50 -0
- package/dist/validate/value_schemas.js.map +1 -0
- package/package.json +119 -5
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
// Hosts insert an icon's `svg` as markup, so every rule here is an allowlist.
|
|
8
|
+
import { iconsByType } from '../pack/primitive_pack.js';
|
|
9
|
+
// HTML's markup whitespace, never `\s`: a parser reads NBSP and other Unicode separators as part of a name or as text.
|
|
10
|
+
const NUMBER = /^[-+0-9.eE,\t\n\f\r ]*$/;
|
|
11
|
+
const PATH_DATA = /^[-+0-9.eE,\t\n\f\r MmLlHhVvCcSsQqTtAaZz]*$/;
|
|
12
|
+
const TRANSFORM = /^(?:[\t\n\f\r ]*(?:matrix|translate|scale|rotate|skewX|skewY)[\t\n\f\r ]*\([-+0-9.eE,\t\n\f\r ]*\)[\t\n\f\r ]*,?)*[\t\n\f\r ]*$/;
|
|
13
|
+
const PAINT = /^(?:none|currentColor|var\(--isomer-icon-(?:accent|bg|fg|muted)(?:[\t\n\f\r ]*,[\t\n\f\r ]*(?:currentColor|#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}))?\))$/;
|
|
14
|
+
const PAINT_RULE = 'is not none, currentColor, or var(--isomer-icon-*)';
|
|
15
|
+
const NAME = /[A-Za-z][\w:.-]*/y;
|
|
16
|
+
const ATTRIBUTE_NAME = /[^\t\n\f\r "'<>/=]+/y;
|
|
17
|
+
const WHITESPACE = /[\t\n\f\r ]*/y;
|
|
18
|
+
const BLANK = /^[\t\n\f\r ]*$/;
|
|
19
|
+
const NAME_END = /[\t\n\f\r />]/;
|
|
20
|
+
const trimMarkup = (text) => text.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '');
|
|
21
|
+
const isNumber = (value) => NUMBER.test(value);
|
|
22
|
+
const keyword = (...words) => (value) => words.includes(value);
|
|
23
|
+
const ATTRIBUTE_RULES = new Map([
|
|
24
|
+
['clip-rule', keyword('nonzero', 'evenodd')],
|
|
25
|
+
['cx', isNumber],
|
|
26
|
+
['cy', isNumber],
|
|
27
|
+
['d', (value) => PATH_DATA.test(value)],
|
|
28
|
+
['fill', (value) => PAINT.test(value)],
|
|
29
|
+
['fill-opacity', isNumber],
|
|
30
|
+
['fill-rule', keyword('nonzero', 'evenodd')],
|
|
31
|
+
['height', isNumber],
|
|
32
|
+
['opacity', isNumber],
|
|
33
|
+
['points', isNumber],
|
|
34
|
+
['r', isNumber],
|
|
35
|
+
['rx', isNumber],
|
|
36
|
+
['ry', isNumber],
|
|
37
|
+
['stroke', (value) => PAINT.test(value)],
|
|
38
|
+
['stroke-linecap', keyword('butt', 'round', 'square')],
|
|
39
|
+
['stroke-linejoin', keyword('miter', 'round', 'bevel')],
|
|
40
|
+
['stroke-opacity', isNumber],
|
|
41
|
+
['stroke-width', isNumber],
|
|
42
|
+
['transform', (value) => TRANSFORM.test(value)],
|
|
43
|
+
['viewBox', keyword('0 0 16 16')],
|
|
44
|
+
['width', isNumber],
|
|
45
|
+
['x', isNumber],
|
|
46
|
+
['x1', isNumber],
|
|
47
|
+
['x2', isNumber],
|
|
48
|
+
['xmlns', keyword('http://www.w3.org/2000/svg')],
|
|
49
|
+
['y', isNumber],
|
|
50
|
+
['y1', isNumber],
|
|
51
|
+
['y2', isNumber],
|
|
52
|
+
]);
|
|
53
|
+
const PRESENTATION = [
|
|
54
|
+
'clip-rule',
|
|
55
|
+
'fill',
|
|
56
|
+
'fill-opacity',
|
|
57
|
+
'fill-rule',
|
|
58
|
+
'opacity',
|
|
59
|
+
'stroke',
|
|
60
|
+
'stroke-linecap',
|
|
61
|
+
'stroke-linejoin',
|
|
62
|
+
'stroke-opacity',
|
|
63
|
+
'stroke-width',
|
|
64
|
+
'transform',
|
|
65
|
+
];
|
|
66
|
+
const ELEMENT_ATTRIBUTES = new Map([
|
|
67
|
+
['svg', new Set(['viewBox', 'xmlns', ...PRESENTATION])],
|
|
68
|
+
['g', new Set(PRESENTATION)],
|
|
69
|
+
['path', new Set(['d', ...PRESENTATION])],
|
|
70
|
+
['rect', new Set(['x', 'y', 'width', 'height', 'rx', 'ry', ...PRESENTATION])],
|
|
71
|
+
['circle', new Set(['cx', 'cy', 'r', ...PRESENTATION])],
|
|
72
|
+
['ellipse', new Set(['cx', 'cy', 'rx', 'ry', ...PRESENTATION])],
|
|
73
|
+
['line', new Set(['x1', 'y1', 'x2', 'y2', ...PRESENTATION])],
|
|
74
|
+
['polyline', new Set(['points', ...PRESENTATION])],
|
|
75
|
+
['polygon', new Set(['points', ...PRESENTATION])],
|
|
76
|
+
]);
|
|
77
|
+
/** Every way `svg` breaks the icon rules, as one line each; empty when it passes. */
|
|
78
|
+
const iconProblems = (svg) => {
|
|
79
|
+
const problems = [];
|
|
80
|
+
const open = [];
|
|
81
|
+
let roots = 0;
|
|
82
|
+
let index = 0;
|
|
83
|
+
const match = (pattern) => {
|
|
84
|
+
pattern.lastIndex = index;
|
|
85
|
+
const found = pattern.exec(svg)?.[0] ?? '';
|
|
86
|
+
index += found.length;
|
|
87
|
+
return found;
|
|
88
|
+
};
|
|
89
|
+
const checkAttributes = (element, attributes) => {
|
|
90
|
+
const allowed = ELEMENT_ATTRIBUTES.get(element);
|
|
91
|
+
if (!allowed) {
|
|
92
|
+
problems.push(`<${element}> is not an allowed element`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const [name, value] of attributes) {
|
|
96
|
+
if (!allowed.has(name)) {
|
|
97
|
+
problems.push(`${name} is not an allowed attribute on <${element}>`);
|
|
98
|
+
}
|
|
99
|
+
else if (value.includes('&')) {
|
|
100
|
+
problems.push(`${name}="${value}" contains an entity`);
|
|
101
|
+
}
|
|
102
|
+
else if (!ATTRIBUTE_RULES.get(name)(value)) {
|
|
103
|
+
problems.push(name === 'fill' || name === 'stroke'
|
|
104
|
+
? `${name}="${value}" ${PAINT_RULE}`
|
|
105
|
+
: `${name}="${value}" is not an allowed value`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
while (index < svg.length) {
|
|
110
|
+
if (svg[index] !== '<') {
|
|
111
|
+
const end = svg.indexOf('<', index);
|
|
112
|
+
const text = svg.slice(index, end === -1 ? undefined : end);
|
|
113
|
+
if (!BLANK.test(text)) {
|
|
114
|
+
problems.push(open.length > 0
|
|
115
|
+
? `text content "${trimMarkup(text)}" is not allowed`
|
|
116
|
+
: `unexpected "${trimMarkup(text)}" outside <svg>`);
|
|
117
|
+
return problems;
|
|
118
|
+
}
|
|
119
|
+
index += text.length;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (svg.startsWith('<!', index) || svg.startsWith('<?', index)) {
|
|
123
|
+
problems.push('comments, declarations, and CDATA are not allowed');
|
|
124
|
+
return problems;
|
|
125
|
+
}
|
|
126
|
+
if (svg.startsWith('</', index)) {
|
|
127
|
+
index += 2;
|
|
128
|
+
const name = match(NAME);
|
|
129
|
+
match(WHITESPACE);
|
|
130
|
+
if (name === '' || svg[index] !== '>') {
|
|
131
|
+
problems.push('malformed closing tag');
|
|
132
|
+
return problems;
|
|
133
|
+
}
|
|
134
|
+
index += 1;
|
|
135
|
+
const expected = open.pop();
|
|
136
|
+
if (expected === undefined) {
|
|
137
|
+
problems.push(`</${name}> closes nothing`);
|
|
138
|
+
return problems;
|
|
139
|
+
}
|
|
140
|
+
if (expected !== name) {
|
|
141
|
+
problems.push(`</${name}> does not close <${expected}>`);
|
|
142
|
+
return problems;
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
index += 1;
|
|
147
|
+
const element = match(NAME);
|
|
148
|
+
if (element === '' || !NAME_END.test(svg[index] ?? '>')) {
|
|
149
|
+
problems.push('malformed opening tag');
|
|
150
|
+
return problems;
|
|
151
|
+
}
|
|
152
|
+
if (open.length === 0) {
|
|
153
|
+
roots += 1;
|
|
154
|
+
if (roots > 1) {
|
|
155
|
+
problems.push('more than one root element');
|
|
156
|
+
return problems;
|
|
157
|
+
}
|
|
158
|
+
if (element !== 'svg') {
|
|
159
|
+
problems.push(`root is <${element}>, not <svg>`);
|
|
160
|
+
return problems;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const attributes = new Map();
|
|
164
|
+
let selfClosing = false;
|
|
165
|
+
for (;;) {
|
|
166
|
+
match(WHITESPACE);
|
|
167
|
+
if (svg.startsWith('/>', index)) {
|
|
168
|
+
index += 2;
|
|
169
|
+
selfClosing = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
if (svg[index] === '>') {
|
|
173
|
+
index += 1;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
const name = match(ATTRIBUTE_NAME);
|
|
177
|
+
if (name === '') {
|
|
178
|
+
problems.push(`<${element}> is not terminated`);
|
|
179
|
+
return problems;
|
|
180
|
+
}
|
|
181
|
+
match(WHITESPACE);
|
|
182
|
+
if (svg[index] !== '=') {
|
|
183
|
+
problems.push(`${name} on <${element}> has no value`);
|
|
184
|
+
return problems;
|
|
185
|
+
}
|
|
186
|
+
index += 1;
|
|
187
|
+
match(WHITESPACE);
|
|
188
|
+
const quote = svg[index];
|
|
189
|
+
if (quote !== '"' && quote !== "'") {
|
|
190
|
+
problems.push(`${name} on <${element}> is unquoted`);
|
|
191
|
+
return problems;
|
|
192
|
+
}
|
|
193
|
+
const close = svg.indexOf(quote, index + 1);
|
|
194
|
+
if (close === -1) {
|
|
195
|
+
problems.push(`${name} on <${element}> is unterminated`);
|
|
196
|
+
return problems;
|
|
197
|
+
}
|
|
198
|
+
const value = svg.slice(index + 1, close);
|
|
199
|
+
index = close + 1;
|
|
200
|
+
if (value.includes('<')) {
|
|
201
|
+
problems.push(`${name} on <${element}> contains "<"`);
|
|
202
|
+
return problems;
|
|
203
|
+
}
|
|
204
|
+
if (attributes.has(name)) {
|
|
205
|
+
problems.push(`<${element}> repeats ${name}`);
|
|
206
|
+
return problems;
|
|
207
|
+
}
|
|
208
|
+
attributes.set(name, value);
|
|
209
|
+
}
|
|
210
|
+
checkAttributes(element, attributes);
|
|
211
|
+
if (open.length === 0 && !attributes.has('viewBox')) {
|
|
212
|
+
problems.push('<svg> has no viewBox="0 0 16 16"');
|
|
213
|
+
}
|
|
214
|
+
if (!selfClosing) {
|
|
215
|
+
open.push(element);
|
|
216
|
+
}
|
|
217
|
+
else if (open.length === 0) {
|
|
218
|
+
problems.push('<svg> is empty');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (roots === 0) {
|
|
222
|
+
problems.push('has no <svg> root');
|
|
223
|
+
}
|
|
224
|
+
for (const element of open.reverse()) {
|
|
225
|
+
problems.push(`<${element}> is not closed`);
|
|
226
|
+
}
|
|
227
|
+
return problems;
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Fails when any icon in `pack` breaks the rules a host relies on to inline it: a single `<svg viewBox="0 0 16 16">` root, allowlisted shape elements and geometry or paint attributes, and paint limited to `none`, `currentColor`, or `var(--isomer-icon-*)` with an optional `currentColor` or hex fallback.
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```ts
|
|
234
|
+
* assertPackIconsValid(slidesPack);
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
export const assertPackIconsValid = ({ icons, primitives, }) => {
|
|
238
|
+
const byType = icons ?? iconsByType(primitives);
|
|
239
|
+
const problems = Object.keys(byType).flatMap((type) => iconProblems(byType[type].svg).map((problem) => `${type} icon: ${problem}`));
|
|
240
|
+
if (problems.length > 0) {
|
|
241
|
+
throw new Error(`Pack icons break the icon rules:\n${problems.map((line) => `- ${line}`).join('\n')}`);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","sourceRoot":"","sources":["../../src/testing/icon.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// Hosts insert an icon's `svg` as markup, so every rule here is an allowlist.\n\nimport { iconsByType, type PrimitivePack } from '../pack/primitive_pack';\n\n// HTML's markup whitespace, never `\\s`: a parser reads NBSP and other Unicode separators as part of a name or as text.\nconst NUMBER = /^[-+0-9.eE,\\t\\n\\f\\r ]*$/;\nconst PATH_DATA = /^[-+0-9.eE,\\t\\n\\f\\r MmLlHhVvCcSsQqTtAaZz]*$/;\nconst TRANSFORM =\n /^(?:[\\t\\n\\f\\r ]*(?:matrix|translate|scale|rotate|skewX|skewY)[\\t\\n\\f\\r ]*\\([-+0-9.eE,\\t\\n\\f\\r ]*\\)[\\t\\n\\f\\r ]*,?)*[\\t\\n\\f\\r ]*$/;\nconst PAINT =\n /^(?:none|currentColor|var\\(--isomer-icon-(?:accent|bg|fg|muted)(?:[\\t\\n\\f\\r ]*,[\\t\\n\\f\\r ]*(?:currentColor|#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}))?\\))$/;\nconst PAINT_RULE = 'is not none, currentColor, or var(--isomer-icon-*)';\n\nconst NAME = /[A-Za-z][\\w:.-]*/y;\nconst ATTRIBUTE_NAME = /[^\\t\\n\\f\\r \"'<>/=]+/y;\nconst WHITESPACE = /[\\t\\n\\f\\r ]*/y;\nconst BLANK = /^[\\t\\n\\f\\r ]*$/;\nconst NAME_END = /[\\t\\n\\f\\r />]/;\n\nconst trimMarkup = (text: string): string =>\n text.replace(/^[\\t\\n\\f\\r ]+|[\\t\\n\\f\\r ]+$/g, '');\n\nconst isNumber = (value: string): boolean => NUMBER.test(value);\n\nconst keyword =\n (...words: string[]) =>\n (value: string): boolean =>\n words.includes(value);\n\nconst ATTRIBUTE_RULES: ReadonlyMap<string, (value: string) => boolean> =\n new Map([\n ['clip-rule', keyword('nonzero', 'evenodd')],\n ['cx', isNumber],\n ['cy', isNumber],\n ['d', (value) => PATH_DATA.test(value)],\n ['fill', (value) => PAINT.test(value)],\n ['fill-opacity', isNumber],\n ['fill-rule', keyword('nonzero', 'evenodd')],\n ['height', isNumber],\n ['opacity', isNumber],\n ['points', isNumber],\n ['r', isNumber],\n ['rx', isNumber],\n ['ry', isNumber],\n ['stroke', (value) => PAINT.test(value)],\n ['stroke-linecap', keyword('butt', 'round', 'square')],\n ['stroke-linejoin', keyword('miter', 'round', 'bevel')],\n ['stroke-opacity', isNumber],\n ['stroke-width', isNumber],\n ['transform', (value) => TRANSFORM.test(value)],\n ['viewBox', keyword('0 0 16 16')],\n ['width', isNumber],\n ['x', isNumber],\n ['x1', isNumber],\n ['x2', isNumber],\n ['xmlns', keyword('http://www.w3.org/2000/svg')],\n ['y', isNumber],\n ['y1', isNumber],\n ['y2', isNumber],\n ]);\n\nconst PRESENTATION = [\n 'clip-rule',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'opacity',\n 'stroke',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-opacity',\n 'stroke-width',\n 'transform',\n];\n\nconst ELEMENT_ATTRIBUTES: ReadonlyMap<string, ReadonlySet<string>> = new Map([\n ['svg', new Set(['viewBox', 'xmlns', ...PRESENTATION])],\n ['g', new Set(PRESENTATION)],\n ['path', new Set(['d', ...PRESENTATION])],\n ['rect', new Set(['x', 'y', 'width', 'height', 'rx', 'ry', ...PRESENTATION])],\n ['circle', new Set(['cx', 'cy', 'r', ...PRESENTATION])],\n ['ellipse', new Set(['cx', 'cy', 'rx', 'ry', ...PRESENTATION])],\n ['line', new Set(['x1', 'y1', 'x2', 'y2', ...PRESENTATION])],\n ['polyline', new Set(['points', ...PRESENTATION])],\n ['polygon', new Set(['points', ...PRESENTATION])],\n]);\n\n/** Every way `svg` breaks the icon rules, as one line each; empty when it passes. */\nconst iconProblems = (svg: string): string[] => {\n const problems: string[] = [];\n const open: string[] = [];\n let roots = 0;\n let index = 0;\n\n const match = (pattern: RegExp): string => {\n pattern.lastIndex = index;\n const found = pattern.exec(svg)?.[0] ?? '';\n index += found.length;\n return found;\n };\n\n const checkAttributes = (\n element: string,\n attributes: ReadonlyMap<string, string>\n ): void => {\n const allowed = ELEMENT_ATTRIBUTES.get(element);\n if (!allowed) {\n problems.push(`<${element}> is not an allowed element`);\n return;\n }\n for (const [name, value] of attributes) {\n if (!allowed.has(name)) {\n problems.push(`${name} is not an allowed attribute on <${element}>`);\n } else if (value.includes('&')) {\n problems.push(`${name}=\"${value}\" contains an entity`);\n } else if (!ATTRIBUTE_RULES.get(name)!(value)) {\n problems.push(\n name === 'fill' || name === 'stroke'\n ? `${name}=\"${value}\" ${PAINT_RULE}`\n : `${name}=\"${value}\" is not an allowed value`\n );\n }\n }\n };\n\n while (index < svg.length) {\n if (svg[index] !== '<') {\n const end = svg.indexOf('<', index);\n const text = svg.slice(index, end === -1 ? undefined : end);\n if (!BLANK.test(text)) {\n problems.push(\n open.length > 0\n ? `text content \"${trimMarkup(text)}\" is not allowed`\n : `unexpected \"${trimMarkup(text)}\" outside <svg>`\n );\n return problems;\n }\n index += text.length;\n continue;\n }\n\n if (svg.startsWith('<!', index) || svg.startsWith('<?', index)) {\n problems.push('comments, declarations, and CDATA are not allowed');\n return problems;\n }\n\n if (svg.startsWith('</', index)) {\n index += 2;\n const name = match(NAME);\n match(WHITESPACE);\n if (name === '' || svg[index] !== '>') {\n problems.push('malformed closing tag');\n return problems;\n }\n index += 1;\n const expected = open.pop();\n if (expected === undefined) {\n problems.push(`</${name}> closes nothing`);\n return problems;\n }\n if (expected !== name) {\n problems.push(`</${name}> does not close <${expected}>`);\n return problems;\n }\n continue;\n }\n\n index += 1;\n const element = match(NAME);\n if (element === '' || !NAME_END.test(svg[index] ?? '>')) {\n problems.push('malformed opening tag');\n return problems;\n }\n if (open.length === 0) {\n roots += 1;\n if (roots > 1) {\n problems.push('more than one root element');\n return problems;\n }\n if (element !== 'svg') {\n problems.push(`root is <${element}>, not <svg>`);\n return problems;\n }\n }\n\n const attributes = new Map<string, string>();\n let selfClosing = false;\n for (;;) {\n match(WHITESPACE);\n if (svg.startsWith('/>', index)) {\n index += 2;\n selfClosing = true;\n break;\n }\n if (svg[index] === '>') {\n index += 1;\n break;\n }\n const name = match(ATTRIBUTE_NAME);\n if (name === '') {\n problems.push(`<${element}> is not terminated`);\n return problems;\n }\n match(WHITESPACE);\n if (svg[index] !== '=') {\n problems.push(`${name} on <${element}> has no value`);\n return problems;\n }\n index += 1;\n match(WHITESPACE);\n const quote = svg[index];\n if (quote !== '\"' && quote !== \"'\") {\n problems.push(`${name} on <${element}> is unquoted`);\n return problems;\n }\n const close = svg.indexOf(quote, index + 1);\n if (close === -1) {\n problems.push(`${name} on <${element}> is unterminated`);\n return problems;\n }\n const value = svg.slice(index + 1, close);\n index = close + 1;\n if (value.includes('<')) {\n problems.push(`${name} on <${element}> contains \"<\"`);\n return problems;\n }\n if (attributes.has(name)) {\n problems.push(`<${element}> repeats ${name}`);\n return problems;\n }\n attributes.set(name, value);\n }\n\n checkAttributes(element, attributes);\n if (open.length === 0 && !attributes.has('viewBox')) {\n problems.push('<svg> has no viewBox=\"0 0 16 16\"');\n }\n if (!selfClosing) {\n open.push(element);\n } else if (open.length === 0) {\n problems.push('<svg> is empty');\n }\n }\n\n if (roots === 0) {\n problems.push('has no <svg> root');\n }\n for (const element of open.reverse()) {\n problems.push(`<${element}> is not closed`);\n }\n return problems;\n};\n\n/**\n * Fails when any icon in `pack` breaks the rules a host relies on to inline it: a single `<svg viewBox=\"0 0 16 16\">` root, allowlisted shape elements and geometry or paint attributes, and paint limited to `none`, `currentColor`, or `var(--isomer-icon-*)` with an optional `currentColor` or hex fallback.\n *\n * @example\n * ```ts\n * assertPackIconsValid(slidesPack);\n * ```\n */\nexport const assertPackIconsValid = ({\n icons,\n primitives,\n}: Pick<PrimitivePack, 'icons' | 'primitives'>): void => {\n const byType = icons ?? iconsByType(primitives);\n const problems = Object.keys(byType).flatMap((type) =>\n iconProblems(byType[type]!.svg).map((problem) => `${type} icon: ${problem}`)\n );\n if (problems.length > 0) {\n throw new Error(\n `Pack icons break the icon rules:\\n${problems.map((line) => `- ${line}`).join('\\n')}`\n );\n }\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { type PrimitiveConformanceCase, type PrimitiveConformanceExample, type PrimitiveConformanceHarness, type PrimitiveConformanceHtmlOptions, type PrimitiveConformanceSlackResult, type PrimitiveConformanceSnapshotResult, CONFORMANCE_FOREIGN_MARKER, primitiveConformanceRows, runPrimitiveInventoryConformance, } from './conformance.js';
|
|
2
|
+
export { assertPackIconsValid } from './icon.js';
|
|
3
|
+
export { type PackRegistrationOptions, assertPackRegistrationComplete, } from './registration.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,kCAAkC,EACvC,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,KAAK,uBAAuB,EAC5B,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
export { CONFORMANCE_FOREIGN_MARKER, primitiveConformanceRows, runPrimitiveInventoryConformance, } from './conformance.js';
|
|
8
|
+
export { assertPackIconsValid } from './icon.js';
|
|
9
|
+
export { assertPackRegistrationComplete, } from './registration.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAOL,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAEL,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type PrimitiveConformanceCase,\n type PrimitiveConformanceExample,\n type PrimitiveConformanceHarness,\n type PrimitiveConformanceHtmlOptions,\n type PrimitiveConformanceSlackResult,\n type PrimitiveConformanceSnapshotResult,\n CONFORMANCE_FOREIGN_MARKER,\n primitiveConformanceRows,\n runPrimitiveInventoryConformance,\n} from './conformance';\nexport { assertPackIconsValid } from './icon';\nexport {\n type PackRegistrationOptions,\n assertPackRegistrationComplete,\n} from './registration';\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AnyPrimitiveDefinition } from '../define/primitive_module.js';
|
|
2
|
+
/** What {@link assertPackRegistrationComplete} needs to compare a pack against its directory. */
|
|
3
|
+
export interface PackRegistrationOptions {
|
|
4
|
+
/** Directory whose subdirectories are one primitive each. A relative path resolves against the working directory; a `URL` is resolved with `fileURLToPath`. */
|
|
5
|
+
primitivesDir: URL | string;
|
|
6
|
+
/** The pack's registry array, as passed to `definePrimitivePack`. */
|
|
7
|
+
registered: readonly AnyPrimitiveDefinition[];
|
|
8
|
+
/** Subdirectory names that hold no primitive. */
|
|
9
|
+
ignore?: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Fails when the primitives directory and the pack's registry disagree: a
|
|
13
|
+
* subdirectory with no entry file or no exported definition, a defined type
|
|
14
|
+
* nothing registers, or a registered type no directory defines. Each problem
|
|
15
|
+
* line carries its fix.
|
|
16
|
+
*
|
|
17
|
+
* A pack keeps two hand-written lists, the registry array and the body-node
|
|
18
|
+
* union, and nothing in the type system relates either to the directory they
|
|
19
|
+
* describe. A primitive absent from both lists leaves them agreeing with each
|
|
20
|
+
* other, so it compiles and every other test passes while the primitive is
|
|
21
|
+
* unreachable. This is the check that notices.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* await assertPackRegistrationComplete({
|
|
26
|
+
* primitivesDir: new URL('./primitives/', import.meta.url),
|
|
27
|
+
* registered: slideDeckPrimitives,
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const assertPackRegistrationComplete: ({ primitivesDir, registered, ignore, }: PackRegistrationOptions) => Promise<void>;
|
|
32
|
+
//# sourceMappingURL=registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/testing/registration.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,iGAAiG;AACjG,MAAM,WAAW,uBAAuB;IACtC,+JAA+J;IAC/J,aAAa,EAAE,GAAG,GAAG,MAAM,CAAC;IAC5B,qEAAqE;IACrE,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,iDAAiD;IACjD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAiDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,8BAA8B,GAAU,wCAIlD,uBAAuB,KAAG,OAAO,CAAC,IAAI,CAyDxC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
// Node-only, and reached only through the `./testing` entry: this reads the
|
|
8
|
+
// filesystem, which no rendering path may do.
|
|
9
|
+
import { readdirSync, statSync } from 'node:fs';
|
|
10
|
+
import { join, resolve } from 'node:path';
|
|
11
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
12
|
+
const ENTRY_FILES = ['index.tsx', 'index.ts'];
|
|
13
|
+
/** Duck-typed so a definition from a different copy of the sdk still matches. */
|
|
14
|
+
const isPrimitiveDefinition = (value) => {
|
|
15
|
+
if (typeof value !== 'object' || value === null) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const { type, catalog, schema, renderers } = value;
|
|
19
|
+
return (typeof type === 'string' &&
|
|
20
|
+
typeof catalog === 'object' &&
|
|
21
|
+
catalog !== null &&
|
|
22
|
+
typeof schema === 'object' &&
|
|
23
|
+
schema !== null &&
|
|
24
|
+
typeof renderers === 'object' &&
|
|
25
|
+
renderers !== null);
|
|
26
|
+
};
|
|
27
|
+
const entryFileIn = (dir) => {
|
|
28
|
+
for (const name of ENTRY_FILES) {
|
|
29
|
+
const candidate = join(dir, name);
|
|
30
|
+
try {
|
|
31
|
+
if (statSync(candidate).isFile()) {
|
|
32
|
+
return candidate;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Not this name; try the next.
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
};
|
|
41
|
+
// The CommonJS build compiles `import()` to `require()`, which rejects `file:` URLs.
|
|
42
|
+
const loadEntry = async (entry) => (await import(typeof require === 'function' ? entry : pathToFileURL(entry).href));
|
|
43
|
+
const subdirectoriesOf = (root, ignore) => readdirSync(root, { withFileTypes: true })
|
|
44
|
+
.filter((entry) => entry.isDirectory() && !ignore.includes(entry.name))
|
|
45
|
+
.map((entry) => entry.name)
|
|
46
|
+
.sort();
|
|
47
|
+
/**
|
|
48
|
+
* Fails when the primitives directory and the pack's registry disagree: a
|
|
49
|
+
* subdirectory with no entry file or no exported definition, a defined type
|
|
50
|
+
* nothing registers, or a registered type no directory defines. Each problem
|
|
51
|
+
* line carries its fix.
|
|
52
|
+
*
|
|
53
|
+
* A pack keeps two hand-written lists, the registry array and the body-node
|
|
54
|
+
* union, and nothing in the type system relates either to the directory they
|
|
55
|
+
* describe. A primitive absent from both lists leaves them agreeing with each
|
|
56
|
+
* other, so it compiles and every other test passes while the primitive is
|
|
57
|
+
* unreachable. This is the check that notices.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* await assertPackRegistrationComplete({
|
|
62
|
+
* primitivesDir: new URL('./primitives/', import.meta.url),
|
|
63
|
+
* registered: slideDeckPrimitives,
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export const assertPackRegistrationComplete = async ({ primitivesDir, registered, ignore = [], }) => {
|
|
68
|
+
const root = resolve(typeof primitivesDir === 'string'
|
|
69
|
+
? primitivesDir
|
|
70
|
+
: fileURLToPath(primitivesDir));
|
|
71
|
+
const registeredTypes = new Set(registered.map(({ type }) => type));
|
|
72
|
+
const problems = [];
|
|
73
|
+
const foundTypes = new Set();
|
|
74
|
+
for (const folder of subdirectoriesOf(root, ignore)) {
|
|
75
|
+
const entry = entryFileIn(join(root, folder));
|
|
76
|
+
if (!entry) {
|
|
77
|
+
problems.push(`${folder}/ has no ${ENTRY_FILES.join(' or ')}; add one or pass it in \`ignore\`.`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const module = await loadEntry(entry);
|
|
81
|
+
const exported = Object.entries(module).filter(([, value]) => isPrimitiveDefinition(value));
|
|
82
|
+
if (exported.length === 0) {
|
|
83
|
+
problems.push(`${folder}/ exports no primitive definition; add one or pass it in \`ignore\`.`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
for (const [exportName, definition] of exported) {
|
|
87
|
+
foundTypes.add(definition.type);
|
|
88
|
+
if (registeredTypes.has(definition.type)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
problems.push(`${folder}/ defines "${definition.type}" but nothing registers it.\n` +
|
|
92
|
+
` Import \`${exportName}\` from './${folder}' and add it to the registry array,\n` +
|
|
93
|
+
` then add its node type to the pack's body-node union.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (const { type } of registered) {
|
|
97
|
+
if (!foundTypes.has(type)) {
|
|
98
|
+
problems.push(`"${type}" is registered but no directory under ${root} defines it.`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (problems.length > 0) {
|
|
102
|
+
throw new Error(`Pack registration is incomplete:\n${problems.map((line) => `- ${line}`).join('\n')}`);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/testing/registration.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// Node-only, and reached only through the `./testing` entry: this reads the\n// filesystem, which no rendering path may do.\n\nimport { readdirSync, statSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport type { AnyPrimitiveDefinition } from '../define/primitive_module';\n\n/** What {@link assertPackRegistrationComplete} needs to compare a pack against its directory. */\nexport interface PackRegistrationOptions {\n /** Directory whose subdirectories are one primitive each. A relative path resolves against the working directory; a `URL` is resolved with `fileURLToPath`. */\n primitivesDir: URL | string;\n /** The pack's registry array, as passed to `definePrimitivePack`. */\n registered: readonly AnyPrimitiveDefinition[];\n /** Subdirectory names that hold no primitive. */\n ignore?: readonly string[];\n}\n\nconst ENTRY_FILES = ['index.tsx', 'index.ts'] as const;\n\n/** Duck-typed so a definition from a different copy of the sdk still matches. */\nconst isPrimitiveDefinition = (\n value: unknown\n): value is AnyPrimitiveDefinition => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const { type, catalog, schema, renderers } = value as Record<string, unknown>;\n return (\n typeof type === 'string' &&\n typeof catalog === 'object' &&\n catalog !== null &&\n typeof schema === 'object' &&\n schema !== null &&\n typeof renderers === 'object' &&\n renderers !== null\n );\n};\n\nconst entryFileIn = (dir: string): string | undefined => {\n for (const name of ENTRY_FILES) {\n const candidate = join(dir, name);\n try {\n if (statSync(candidate).isFile()) {\n return candidate;\n }\n } catch {\n // Not this name; try the next.\n }\n }\n return undefined;\n};\n\n// The CommonJS build compiles `import()` to `require()`, which rejects `file:` URLs.\nconst loadEntry = async (entry: string): Promise<Record<string, unknown>> =>\n (await import(\n typeof require === 'function' ? entry : pathToFileURL(entry).href\n )) as Record<string, unknown>;\n\nconst subdirectoriesOf = (root: string, ignore: readonly string[]): string[] =>\n readdirSync(root, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !ignore.includes(entry.name))\n .map((entry) => entry.name)\n .sort();\n\n/**\n * Fails when the primitives directory and the pack's registry disagree: a\n * subdirectory with no entry file or no exported definition, a defined type\n * nothing registers, or a registered type no directory defines. Each problem\n * line carries its fix.\n *\n * A pack keeps two hand-written lists, the registry array and the body-node\n * union, and nothing in the type system relates either to the directory they\n * describe. A primitive absent from both lists leaves them agreeing with each\n * other, so it compiles and every other test passes while the primitive is\n * unreachable. This is the check that notices.\n *\n * @example\n * ```ts\n * await assertPackRegistrationComplete({\n * primitivesDir: new URL('./primitives/', import.meta.url),\n * registered: slideDeckPrimitives,\n * });\n * ```\n */\nexport const assertPackRegistrationComplete = async ({\n primitivesDir,\n registered,\n ignore = [],\n}: PackRegistrationOptions): Promise<void> => {\n const root = resolve(\n typeof primitivesDir === 'string'\n ? primitivesDir\n : fileURLToPath(primitivesDir)\n );\n const registeredTypes = new Set(registered.map(({ type }) => type));\n const problems: string[] = [];\n const foundTypes = new Set<string>();\n\n for (const folder of subdirectoriesOf(root, ignore)) {\n const entry = entryFileIn(join(root, folder));\n if (!entry) {\n problems.push(\n `${folder}/ has no ${ENTRY_FILES.join(' or ')}; add one or pass it in \\`ignore\\`.`\n );\n continue;\n }\n\n const module = await loadEntry(entry);\n const exported = Object.entries(module).filter(([, value]) =>\n isPrimitiveDefinition(value)\n ) as Array<[string, AnyPrimitiveDefinition]>;\n\n if (exported.length === 0) {\n problems.push(\n `${folder}/ exports no primitive definition; add one or pass it in \\`ignore\\`.`\n );\n continue;\n }\n\n for (const [exportName, definition] of exported) {\n foundTypes.add(definition.type);\n if (registeredTypes.has(definition.type)) {\n continue;\n }\n problems.push(\n `${folder}/ defines \"${definition.type}\" but nothing registers it.\\n` +\n ` Import \\`${exportName}\\` from './${folder}' and add it to the registry array,\\n` +\n ` then add its node type to the pack's body-node union.`\n );\n }\n }\n\n for (const { type } of registered) {\n if (!foundTypes.has(type)) {\n problems.push(\n `\"${type}\" is registered but no directory under ${root} defines it.`\n );\n }\n }\n\n if (problems.length > 0) {\n throw new Error(\n `Pack registration is incomplete:\\n${problems.map((line) => `- ${line}`).join('\\n')}`\n );\n }\n};\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AnyPrimitiveDefinition } from '../define/primitive_module.js';
|
|
2
|
+
import { type CompositionJsonSchemaOptions } from './json_schema.js';
|
|
3
|
+
type JsonSchema = Record<string, unknown>;
|
|
4
|
+
/** Options for {@link buildAuthoringJsonSchema}. */
|
|
5
|
+
export interface AuthoringJsonSchemaOptions extends CompositionJsonSchemaOptions {
|
|
6
|
+
/** `$def` id to `description`. Survives `z.toJSONSchema` dropping `.refine` text. */
|
|
7
|
+
describe?: Readonly<Record<string, string>>;
|
|
8
|
+
/** `$defId.property` paths to drop, e.g. `'kpi.delta'`. */
|
|
9
|
+
omitProperties?: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Projects a composition to the JSON Schema an agent reads.
|
|
13
|
+
*
|
|
14
|
+
* {@link buildCompositionJsonSchema} stays the validator projection. This walk
|
|
15
|
+
* names shared SDK defs, inlines scalar leaves, and drops host-only fields.
|
|
16
|
+
*/
|
|
17
|
+
export declare const buildAuthoringJsonSchema: (definitions: readonly AnyPrimitiveDefinition[], options?: AuthoringJsonSchemaOptions) => JsonSchema;
|
|
18
|
+
/**
|
|
19
|
+
* The `$defs` that `types` reach in a schema from {@link buildAuthoringJsonSchema},
|
|
20
|
+
* keyed as `schema` keys them, with the body-node union stubbed so a container
|
|
21
|
+
* does not pull in every primitive.
|
|
22
|
+
*/
|
|
23
|
+
export declare const authoringSchemaSubset: (schema: JsonSchema, types: readonly string[]) => {
|
|
24
|
+
$defs: Record<string, unknown>;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* The `body` of a schema from {@link buildAuthoringJsonSchema} as a schema of
|
|
28
|
+
* its own, for an editor that validates body nodes rather than a whole
|
|
29
|
+
* composition. Carries the `$defs` the body reaches.
|
|
30
|
+
*/
|
|
31
|
+
export declare const authoringBodySchema: (schema: JsonSchema) => JsonSchema;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=authoring_schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authoring_schema.d.ts","sourceRoot":"","sources":["../../src/validate/authoring_schema.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,eAAe,CAAC;AAQvB,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAc1C,oDAAoD;AACpD,MAAM,WAAW,0BAA2B,SAAQ,4BAA4B;IAC9E,qFAAqF;IACrF,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,2DAA2D;IAC3D,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AA6RD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,aAAa,SAAS,sBAAsB,EAAE,EAC9C,UAAS,0BAA+B,KACvC,UAUF,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,SAAS,MAAM,EAAE,KACvB;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAwBlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,KAAG,UASxD,CAAC"}
|