@elastic/isomer-sdk 0.0.0 → 0.1.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 +58 -0
- package/THIRD_PARTY_LICENSES.md +957 -0
- package/dist/author/authored_fields.d.ts +103 -0
- package/dist/author/authored_fields.d.ts.map +1 -0
- package/dist/author/authored_fields.js +183 -0
- package/dist/author/authored_fields.js.map +1 -0
- package/dist/author/index.d.ts +5 -0
- package/dist/author/index.d.ts.map +1 -0
- package/dist/author/index.js +10 -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 +116 -0
- package/dist/author/jsx_shim.d.ts.map +1 -0
- package/dist/author/jsx_shim.js +353 -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/cjs/author/authored_fields.js +189 -0
- package/dist/cjs/author/authored_fields.js.map +1 -0
- package/dist/cjs/author/index.js +20 -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 +359 -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/composition/action_event.js +9 -0
- package/dist/cjs/composition/action_event.js.map +1 -0
- package/dist/cjs/composition/body_node_base.js +105 -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 +72 -0
- package/dist/cjs/composition/error.js.map +1 -0
- package/dist/cjs/composition/index.js +31 -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 +32 -0
- package/dist/cjs/define/frame.js.map +1 -0
- package/dist/cjs/define/index.js +25 -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_module.js +107 -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 +75 -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 +26 -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 +34 -0
- package/dist/cjs/pack/capabilities.js.map +1 -0
- package/dist/cjs/pack/compose.js +56 -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 +85 -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 +189 -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 +190 -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 +187 -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 +825 -0
- package/dist/cjs/render/slack/format.js.map +1 -0
- package/dist/cjs/render/slack/index.js +31 -0
- package/dist/cjs/render/slack/index.js.map +1 -0
- package/dist/cjs/render/slack/markdown_content.js +358 -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 +296 -0
- package/dist/cjs/testing/conformance.js.map +1 -0
- package/dist/cjs/testing/index.js +16 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/registration.js +140 -0
- package/dist/cjs/testing/registration.js.map +1 -0
- package/dist/cjs/validate/authoring_schema.js +296 -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 +52 -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 +208 -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 +71 -0
- package/dist/composition/body_node_base.d.ts.map +1 -0
- package/dist/composition/body_node_base.js +97 -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 +60 -0
- package/dist/composition/error.d.ts.map +1 -0
- package/dist/composition/error.js +68 -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 +166 -0
- package/dist/define/frame.d.ts.map +1 -0
- package/dist/define/frame.js +28 -0
- package/dist/define/frame.js.map +1 -0
- package/dist/define/index.d.ts +8 -0
- package/dist/define/index.d.ts.map +1 -0
- package/dist/define/index.js +11 -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_module.d.ts +421 -0
- package/dist/define/primitive_module.d.ts.map +1 -0
- package/dist/define/primitive_module.js +101 -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 +27 -0
- package/dist/pack/capabilities.d.ts.map +1 -0
- package/dist/pack/capabilities.js +30 -0
- package/dist/pack/capabilities.js.map +1 -0
- package/dist/pack/compose.d.ts +21 -0
- package/dist/pack/compose.d.ts.map +1 -0
- package/dist/pack/compose.js +52 -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 +155 -0
- package/dist/pack/primitive_pack.d.ts.map +1 -0
- package/dist/pack/primitive_pack.js +81 -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 +48 -0
- package/dist/render/markdown/builder.d.ts.map +1 -0
- package/dist/render/markdown/builder.js +183 -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 +3 -0
- package/dist/render/markdown/format.d.ts.map +1 -0
- package/dist/render/markdown/format.js +186 -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 +183 -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 +95 -0
- package/dist/render/slack/format.d.ts.map +1 -0
- package/dist/render/slack/format.js +807 -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 +11 -0
- package/dist/render/slack/markdown_content.d.ts.map +1 -0
- package/dist/render/slack/markdown_content.js +354 -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 +140 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +287 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +9 -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 +103 -0
- package/dist/testing/registration.js.map +1 -0
- package/dist/validate/authoring_schema.d.ts +27 -0
- package/dist/validate/authoring_schema.d.ts.map +1 -0
- package/dist/validate/authoring_schema.js +291 -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 +105 -0
- package/dist/validate/validation.d.ts.map +1 -0
- package/dist/validate/validation.js +200 -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 +118 -5
|
@@ -0,0 +1,103 @@
|
|
|
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 } 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
|
+
const subdirectoriesOf = (root, ignore) => readdirSync(root, { withFileTypes: true })
|
|
42
|
+
.filter((entry) => entry.isDirectory() && !ignore.includes(entry.name))
|
|
43
|
+
.map((entry) => entry.name)
|
|
44
|
+
.sort();
|
|
45
|
+
/**
|
|
46
|
+
* Fails when the primitives directory and the pack's registry disagree: a
|
|
47
|
+
* subdirectory with no entry file or no exported definition, a defined type
|
|
48
|
+
* nothing registers, or a registered type no directory defines. Each problem
|
|
49
|
+
* line carries its fix.
|
|
50
|
+
*
|
|
51
|
+
* A pack keeps two hand-written lists, the registry array and the body-node
|
|
52
|
+
* union, and nothing in the type system relates either to the directory they
|
|
53
|
+
* describe. A primitive absent from both lists leaves them agreeing with each
|
|
54
|
+
* other, so it compiles and every other test passes while the primitive is
|
|
55
|
+
* unreachable. This is the check that notices.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* await assertPackRegistrationComplete({
|
|
60
|
+
* primitivesDir: new URL('./primitives/', import.meta.url),
|
|
61
|
+
* registered: slideDeckPrimitives,
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export const assertPackRegistrationComplete = async ({ primitivesDir, registered, ignore = [], }) => {
|
|
66
|
+
const root = typeof primitivesDir === 'string'
|
|
67
|
+
? primitivesDir
|
|
68
|
+
: fileURLToPath(primitivesDir);
|
|
69
|
+
const registeredTypes = new Set(registered.map(({ type }) => type));
|
|
70
|
+
const problems = [];
|
|
71
|
+
const foundTypes = new Set();
|
|
72
|
+
for (const folder of subdirectoriesOf(root, ignore)) {
|
|
73
|
+
const entry = entryFileIn(join(root, folder));
|
|
74
|
+
if (!entry) {
|
|
75
|
+
problems.push(`${folder}/ has no ${ENTRY_FILES.join(' or ')}; add one or pass it in \`ignore\`.`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const module = (await import(pathToFileURL(entry).href));
|
|
79
|
+
const exported = Object.entries(module).filter(([, value]) => isPrimitiveDefinition(value));
|
|
80
|
+
if (exported.length === 0) {
|
|
81
|
+
problems.push(`${folder}/ exports no primitive definition; add one or pass it in \`ignore\`.`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
for (const [exportName, definition] of exported) {
|
|
85
|
+
foundTypes.add(definition.type);
|
|
86
|
+
if (registeredTypes.has(definition.type)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
problems.push(`${folder}/ defines "${definition.type}" but nothing registers it.\n` +
|
|
90
|
+
` Import \`${exportName}\` from './${folder}' and add it to the registry array,\n` +
|
|
91
|
+
` then add its node type to the pack's body-node union.`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const { type } of registered) {
|
|
95
|
+
if (!foundTypes.has(type)) {
|
|
96
|
+
problems.push(`"${type}" is registered but no directory under ${root} defines it.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (problems.length > 0) {
|
|
100
|
+
throw new Error(`Pack registration is incomplete:\n${problems.map((line) => `- ${line}`).join('\n')}`);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
//# 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 } 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 `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\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 =\n typeof primitivesDir === 'string'\n ? primitivesDir\n : fileURLToPath(primitivesDir);\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 import(pathToFileURL(entry).href)) as Record<\n string,\n unknown\n >;\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,27 @@
|
|
|
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
|
+
export {};
|
|
27
|
+
//# 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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
import { buildCompositionJsonSchema, } from './json_schema.js';
|
|
8
|
+
import { displayValueSchema, namedColorSchema, renderThemeSchema, structuredValueSchema, } from './value_schemas.js';
|
|
9
|
+
const DEF_PREFIX = '#/$defs/';
|
|
10
|
+
const BODY_NODE_ID = 'bodyNode';
|
|
11
|
+
const SAFE_INTEGER_MAX = Number.MAX_SAFE_INTEGER;
|
|
12
|
+
const SCALAR_TYPES = new Set(['string', 'number', 'integer', 'boolean']);
|
|
13
|
+
const DEFAULT_EXTRA_DEFS = [
|
|
14
|
+
{ schema: namedColorSchema, id: 'tone' },
|
|
15
|
+
{ schema: displayValueSchema, id: 'displayValue' },
|
|
16
|
+
{ schema: structuredValueSchema, id: 'structuredValue' },
|
|
17
|
+
{ schema: renderThemeSchema, id: 'renderTheme' },
|
|
18
|
+
];
|
|
19
|
+
const isJsonObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
20
|
+
const cloneJson = (value) => JSON.parse(JSON.stringify(value));
|
|
21
|
+
const ownDef = (defs, id) => Object.hasOwn(defs, id) ? defs[id] : undefined;
|
|
22
|
+
const parseDefRef = (ref) => {
|
|
23
|
+
if (typeof ref !== 'string' || !ref.startsWith(DEF_PREFIX)) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return ref.slice(DEF_PREFIX.length);
|
|
27
|
+
};
|
|
28
|
+
const walkJson = (node, visit) => {
|
|
29
|
+
if (Array.isArray(node)) {
|
|
30
|
+
for (const item of node) {
|
|
31
|
+
walkJson(item, visit);
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!isJsonObject(node)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
visit(node);
|
|
39
|
+
for (const value of Object.values(node)) {
|
|
40
|
+
walkJson(value, visit);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const mapJson = (node, visit) => {
|
|
44
|
+
if (Array.isArray(node)) {
|
|
45
|
+
return node.map((item) => mapJson(item, visit));
|
|
46
|
+
}
|
|
47
|
+
if (!isJsonObject(node)) {
|
|
48
|
+
return node;
|
|
49
|
+
}
|
|
50
|
+
return Object.fromEntries(Object.entries(visit(node)).map(([key, value]) => [
|
|
51
|
+
key,
|
|
52
|
+
mapJson(value, visit),
|
|
53
|
+
]));
|
|
54
|
+
};
|
|
55
|
+
const rewriteDefRefs = (schema, rewrite) => mapJson(schema, (node) => {
|
|
56
|
+
const id = parseDefRef(node.$ref);
|
|
57
|
+
if (id === undefined) {
|
|
58
|
+
return node;
|
|
59
|
+
}
|
|
60
|
+
const replacement = rewrite(id);
|
|
61
|
+
if (replacement === undefined) {
|
|
62
|
+
return node;
|
|
63
|
+
}
|
|
64
|
+
if (typeof replacement === 'string') {
|
|
65
|
+
return { ...node, $ref: `${DEF_PREFIX}${replacement}` };
|
|
66
|
+
}
|
|
67
|
+
const rest = { ...node };
|
|
68
|
+
delete rest.$ref;
|
|
69
|
+
return Object.keys(rest).length === 0
|
|
70
|
+
? cloneJson(replacement)
|
|
71
|
+
: { ...cloneJson(replacement), ...rest };
|
|
72
|
+
});
|
|
73
|
+
const isRefOnlyDef = (def) => isJsonObject(def) &&
|
|
74
|
+
Object.keys(def).length === 1 &&
|
|
75
|
+
typeof def.$ref === 'string';
|
|
76
|
+
const isBareScalarDef = (def) => {
|
|
77
|
+
if (!isJsonObject(def)) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
const { type } = def;
|
|
81
|
+
if (typeof type !== 'string' || !SCALAR_TYPES.has(type)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return !['enum', 'const', '$ref', 'properties'].some((key) => Object.hasOwn(def, key));
|
|
85
|
+
};
|
|
86
|
+
const defsOf = (schema) => isJsonObject(schema.$defs) ? schema.$defs : {};
|
|
87
|
+
const withDefs = (schema, defs) => ({ ...schema, $defs: defs });
|
|
88
|
+
const dropSafeIntegerMaxima = (schema) => {
|
|
89
|
+
walkJson(schema, (node) => {
|
|
90
|
+
if (node.maximum === SAFE_INTEGER_MAX) {
|
|
91
|
+
delete node.maximum;
|
|
92
|
+
}
|
|
93
|
+
if (node.minimum === -SAFE_INTEGER_MAX) {
|
|
94
|
+
delete node.minimum;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
const dropNodeIdAndSurfaces = (schema) => {
|
|
99
|
+
for (const def of Object.values(defsOf(schema))) {
|
|
100
|
+
if (!isJsonObject(def) || !isJsonObject(def.properties)) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const typeProp = def.properties.type;
|
|
104
|
+
if (!isJsonObject(typeProp) || typeof typeProp.const !== 'string') {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
delete def.properties.id;
|
|
108
|
+
delete def.properties.surfaces;
|
|
109
|
+
if (Array.isArray(def.required)) {
|
|
110
|
+
def.required = def.required.filter((key) => key !== 'id' && key !== 'surfaces');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const omitListedProperties = (schema, paths) => {
|
|
115
|
+
const defs = defsOf(schema);
|
|
116
|
+
for (const path of paths) {
|
|
117
|
+
const dot = path.indexOf('.');
|
|
118
|
+
if (dot <= 0) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const defId = path.slice(0, dot);
|
|
122
|
+
const property = path.slice(dot + 1);
|
|
123
|
+
const def = ownDef(defs, defId);
|
|
124
|
+
if (!isJsonObject(def) || !isJsonObject(def.properties)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
delete def.properties[property];
|
|
128
|
+
if (Array.isArray(def.required)) {
|
|
129
|
+
def.required = def.required.filter((key) => key !== property);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const applyDescriptions = (schema, describe) => {
|
|
134
|
+
const defs = defsOf(schema);
|
|
135
|
+
for (const [id, description] of Object.entries(describe)) {
|
|
136
|
+
const def = ownDef(defs, id);
|
|
137
|
+
if (isJsonObject(def)) {
|
|
138
|
+
def.description = description;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const flattenRefOnlyDefs = (schema) => {
|
|
143
|
+
const defs = defsOf(schema);
|
|
144
|
+
const aliases = new Map();
|
|
145
|
+
for (const [id, def] of Object.entries(defs)) {
|
|
146
|
+
if (id === BODY_NODE_ID || !isRefOnlyDef(def)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const target = parseDefRef(def.$ref);
|
|
150
|
+
if (target === undefined || target === id) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
aliases.set(id, target);
|
|
154
|
+
}
|
|
155
|
+
if (aliases.size === 0) {
|
|
156
|
+
return schema;
|
|
157
|
+
}
|
|
158
|
+
const resolve = (id) => {
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
let current = id;
|
|
161
|
+
while (aliases.has(current) && !seen.has(current)) {
|
|
162
|
+
seen.add(current);
|
|
163
|
+
current = aliases.get(current) ?? current;
|
|
164
|
+
}
|
|
165
|
+
return current;
|
|
166
|
+
};
|
|
167
|
+
const rewritten = rewriteDefRefs(schema, (id) => aliases.has(id) ? resolve(id) : undefined);
|
|
168
|
+
const nextDefs = { ...defsOf(rewritten) };
|
|
169
|
+
for (const id of aliases.keys()) {
|
|
170
|
+
delete nextDefs[id];
|
|
171
|
+
}
|
|
172
|
+
return withDefs(rewritten, nextDefs);
|
|
173
|
+
};
|
|
174
|
+
const inlineScalarDefs = (schema) => {
|
|
175
|
+
const defs = defsOf(schema);
|
|
176
|
+
const scalars = new Map();
|
|
177
|
+
for (const [id, def] of Object.entries(defs)) {
|
|
178
|
+
if (id === BODY_NODE_ID || !isBareScalarDef(def)) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
scalars.set(id, def);
|
|
182
|
+
}
|
|
183
|
+
if (scalars.size === 0) {
|
|
184
|
+
return schema;
|
|
185
|
+
}
|
|
186
|
+
const rewritten = rewriteDefRefs(schema, (id) => scalars.get(id));
|
|
187
|
+
const nextDefs = { ...defsOf(rewritten) };
|
|
188
|
+
for (const id of scalars.keys()) {
|
|
189
|
+
delete nextDefs[id];
|
|
190
|
+
}
|
|
191
|
+
return withDefs(rewritten, nextDefs);
|
|
192
|
+
};
|
|
193
|
+
const pruneUnreferencedDefs = (schema) => {
|
|
194
|
+
const defs = defsOf(schema);
|
|
195
|
+
if (Object.keys(defs).length === 0) {
|
|
196
|
+
return schema;
|
|
197
|
+
}
|
|
198
|
+
const referenced = new Set();
|
|
199
|
+
const visit = (node) => {
|
|
200
|
+
walkJson(node, (value) => {
|
|
201
|
+
const id = parseDefRef(value.$ref);
|
|
202
|
+
if (id === undefined || referenced.has(id)) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
referenced.add(id);
|
|
206
|
+
visit(ownDef(defs, id));
|
|
207
|
+
});
|
|
208
|
+
};
|
|
209
|
+
const root = { ...schema };
|
|
210
|
+
delete root.$defs;
|
|
211
|
+
visit(root);
|
|
212
|
+
referenced.add(BODY_NODE_ID);
|
|
213
|
+
visit(defs[BODY_NODE_ID]);
|
|
214
|
+
return withDefs(schema, Object.fromEntries(Object.entries(defs).filter(([id]) => referenced.has(id))));
|
|
215
|
+
};
|
|
216
|
+
const mergeExtraDefs = (extras) => {
|
|
217
|
+
const bySchema = new Map();
|
|
218
|
+
for (const item of DEFAULT_EXTRA_DEFS) {
|
|
219
|
+
bySchema.set(item.schema, item);
|
|
220
|
+
}
|
|
221
|
+
for (const item of extras ?? []) {
|
|
222
|
+
bySchema.set(item.schema, item);
|
|
223
|
+
}
|
|
224
|
+
const byId = new Map();
|
|
225
|
+
for (const item of bySchema.values()) {
|
|
226
|
+
byId.set(item.id, item);
|
|
227
|
+
}
|
|
228
|
+
return [...byId.values()];
|
|
229
|
+
};
|
|
230
|
+
const slimAuthoringSchema = (schema, options) => {
|
|
231
|
+
const next = cloneJson(schema);
|
|
232
|
+
dropSafeIntegerMaxima(next);
|
|
233
|
+
dropNodeIdAndSurfaces(next);
|
|
234
|
+
omitListedProperties(next, options.omitProperties ?? []);
|
|
235
|
+
const flattened = flattenRefOnlyDefs(next);
|
|
236
|
+
const inlined = inlineScalarDefs(flattened);
|
|
237
|
+
const pruned = pruneUnreferencedDefs(inlined);
|
|
238
|
+
applyDescriptions(pruned, options.describe ?? {});
|
|
239
|
+
return pruned;
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* Projects a composition to the JSON Schema an agent reads.
|
|
243
|
+
*
|
|
244
|
+
* {@link buildCompositionJsonSchema} stays the validator projection. This walk
|
|
245
|
+
* names shared SDK defs, inlines scalar leaves, and drops host-only fields.
|
|
246
|
+
*/
|
|
247
|
+
export const buildAuthoringJsonSchema = (definitions, options = {}) => {
|
|
248
|
+
const { describe, omitProperties, extraDefs, ...rest } = options;
|
|
249
|
+
const projected = buildCompositionJsonSchema(definitions, {
|
|
250
|
+
...rest,
|
|
251
|
+
extraDefs: mergeExtraDefs(extraDefs),
|
|
252
|
+
});
|
|
253
|
+
return slimAuthoringSchema(projected, {
|
|
254
|
+
...(describe === undefined ? {} : { describe }),
|
|
255
|
+
...(omitProperties === undefined ? {} : { omitProperties }),
|
|
256
|
+
});
|
|
257
|
+
};
|
|
258
|
+
const BODY_NODE_STUB = {
|
|
259
|
+
description: 'Any primitive in the catalog, as its own object with its `type`.',
|
|
260
|
+
};
|
|
261
|
+
/**
|
|
262
|
+
* The `$defs` that `types` reach in a schema from {@link buildAuthoringJsonSchema},
|
|
263
|
+
* keyed as `schema` keys them, with the body-node union stubbed so a container
|
|
264
|
+
* does not pull in every primitive.
|
|
265
|
+
*/
|
|
266
|
+
export const authoringSchemaSubset = (schema, types) => {
|
|
267
|
+
const defs = defsOf(schema);
|
|
268
|
+
// A `Map`, so an id such as `constructor` is never an inherited key.
|
|
269
|
+
const kept = new Map();
|
|
270
|
+
const visit = (id) => {
|
|
271
|
+
if (kept.has(id) || !Object.hasOwn(defs, id)) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (id === BODY_NODE_ID) {
|
|
275
|
+
kept.set(id, BODY_NODE_STUB);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
kept.set(id, defs[id]);
|
|
279
|
+
walkJson(defs[id], (value) => {
|
|
280
|
+
const ref = parseDefRef(value.$ref);
|
|
281
|
+
if (ref !== undefined) {
|
|
282
|
+
visit(ref);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
};
|
|
286
|
+
for (const type of types) {
|
|
287
|
+
visit(type);
|
|
288
|
+
}
|
|
289
|
+
return { $defs: Object.fromEntries(kept) };
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=authoring_schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authoring_schema.js","sourceRoot":"","sources":["../../src/validate/authoring_schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EACL,0BAA0B,GAE3B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAIzB,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzE,MAAM,kBAAkB,GAA+C;IACrE,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE;IACxC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,cAAc,EAAE;IAClD,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,EAAE,iBAAiB,EAAE;IACxD,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,EAAE,aAAa,EAAE;CACjD,CAAC;AAUF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAoC,EAAE,CACxE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,SAAS,GAAG,CAAI,KAAQ,EAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAE7E,MAAM,MAAM,GAAG,CAAC,IAA6B,EAAE,EAAU,EAAW,EAAE,CACpE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,GAAY,EAAsB,EAAE;IACvD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CACf,IAAa,EACb,KAA+C,EACzC,EAAE;IACR,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CACd,IAAa,EACb,KAAkE,EACzD,EAAE;IACX,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAChD,GAAG;QACH,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;KACtB,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,MAAkB,EAClB,OAAwD,EAC5C,EAAE,CACd,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IACvB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,GAAG,WAAW,EAAE,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC;IACjB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;QACxB,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;AAC7C,CAAC,CAAe,CAAC;AAEnB,MAAM,YAAY,GAAG,CAAC,GAAY,EAA2B,EAAE,CAC7D,YAAY,CAAC,GAAG,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;IAC7B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;AAE/B,MAAM,eAAe,GAAG,CAAC,GAAY,EAAkC,EAAE;IACvE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACrB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,MAAkB,EAA2B,EAAE,CAC7D,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAEjD,MAAM,QAAQ,GAAG,CACf,MAAkB,EAClB,IAA6B,EACjB,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE9C,MAAM,qBAAqB,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACzD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClE,SAAS;QACX,CAAC;QACD,OAAO,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAChC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,UAAU,CAC5C,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,MAAkB,EAClB,KAAwB,EAClB,EAAE;IACR,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,SAAS;QACX,CAAC;QACD,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,MAAkB,EAClB,QAA0C,EACpC,EAAE;IACR,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAc,EAAE;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,IAAI,EAAE,KAAK,YAAY,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,EAAU,EAAU,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAC1C,CAAC;IACF,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAkB,EAAc,EAAE;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC3D,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,IAAI,EAAE,KAAK,YAAY,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAkB,EAAc,EAAE;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,EAAE,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC3C,OAAO;YACT,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,IAAI,GAAe,EAAE,GAAG,MAAM,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1B,OAAO,QAAQ,CACb,MAAM,EACN,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAC1D,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,MAAiD,EACd,EAAE;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4C,CAAC;IACrE,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QAChC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAA2C,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,MAAkB,EAClB,OAAmC,EACvB,EAAE;IACd,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,WAA8C,EAC9C,UAAsC,EAAE,EAC5B,EAAE;IACd,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACjE,MAAM,SAAS,GAAG,0BAA0B,CAAC,WAAW,EAAE;QACxD,GAAG,IAAI;QACP,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC;KACrC,CAAC,CAAC;IACH,OAAO,mBAAmB,CAAC,SAAS,EAAE;QACpC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,WAAW,EACT,kEAAkE;CACrE,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAAkB,EAClB,KAAwB,EACY,EAAE;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,qEAAqE;IACrE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAQ,EAAE;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7C,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { ZodType } from 'zod';\n\nimport type { AnyPrimitiveDefinition } from '../define/primitive_module';\n\nimport {\n buildCompositionJsonSchema,\n type CompositionJsonSchemaOptions,\n} from './json_schema';\nimport {\n displayValueSchema,\n namedColorSchema,\n renderThemeSchema,\n structuredValueSchema,\n} from './value_schemas';\n\ntype JsonSchema = Record<string, unknown>;\n\nconst DEF_PREFIX = '#/$defs/';\nconst BODY_NODE_ID = 'bodyNode';\nconst SAFE_INTEGER_MAX = Number.MAX_SAFE_INTEGER;\nconst SCALAR_TYPES = new Set(['string', 'number', 'integer', 'boolean']);\n\nconst DEFAULT_EXTRA_DEFS: readonly { schema: ZodType; id: string }[] = [\n { schema: namedColorSchema, id: 'tone' },\n { schema: displayValueSchema, id: 'displayValue' },\n { schema: structuredValueSchema, id: 'structuredValue' },\n { schema: renderThemeSchema, id: 'renderTheme' },\n];\n\n/** Options for {@link buildAuthoringJsonSchema}. */\nexport interface AuthoringJsonSchemaOptions extends CompositionJsonSchemaOptions {\n /** `$def` id to `description`. Survives `z.toJSONSchema` dropping `.refine` text. */\n describe?: Readonly<Record<string, string>>;\n /** `$defId.property` paths to drop, e.g. `'kpi.delta'`. */\n omitProperties?: readonly string[];\n}\n\nconst isJsonObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst ownDef = (defs: Record<string, unknown>, id: string): unknown =>\n Object.hasOwn(defs, id) ? defs[id] : undefined;\n\nconst parseDefRef = (ref: unknown): string | undefined => {\n if (typeof ref !== 'string' || !ref.startsWith(DEF_PREFIX)) {\n return undefined;\n }\n return ref.slice(DEF_PREFIX.length);\n};\n\nconst walkJson = (\n node: unknown,\n visit: (value: Record<string, unknown>) => void\n): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n walkJson(item, visit);\n }\n return;\n }\n if (!isJsonObject(node)) {\n return;\n }\n visit(node);\n for (const value of Object.values(node)) {\n walkJson(value, visit);\n }\n};\n\nconst mapJson = (\n node: unknown,\n visit: (value: Record<string, unknown>) => Record<string, unknown>\n): unknown => {\n if (Array.isArray(node)) {\n return node.map((item) => mapJson(item, visit));\n }\n if (!isJsonObject(node)) {\n return node;\n }\n return Object.fromEntries(\n Object.entries(visit(node)).map(([key, value]) => [\n key,\n mapJson(value, visit),\n ])\n );\n};\n\nconst rewriteDefRefs = (\n schema: JsonSchema,\n rewrite: (id: string) => string | JsonSchema | undefined\n): JsonSchema =>\n mapJson(schema, (node) => {\n const id = parseDefRef(node.$ref);\n if (id === undefined) {\n return node;\n }\n const replacement = rewrite(id);\n if (replacement === undefined) {\n return node;\n }\n if (typeof replacement === 'string') {\n return { ...node, $ref: `${DEF_PREFIX}${replacement}` };\n }\n const rest = { ...node };\n delete rest.$ref;\n return Object.keys(rest).length === 0\n ? cloneJson(replacement)\n : { ...cloneJson(replacement), ...rest };\n }) as JsonSchema;\n\nconst isRefOnlyDef = (def: unknown): def is { $ref: string } =>\n isJsonObject(def) &&\n Object.keys(def).length === 1 &&\n typeof def.$ref === 'string';\n\nconst isBareScalarDef = (def: unknown): def is Record<string, unknown> => {\n if (!isJsonObject(def)) {\n return false;\n }\n const { type } = def;\n if (typeof type !== 'string' || !SCALAR_TYPES.has(type)) {\n return false;\n }\n return !['enum', 'const', '$ref', 'properties'].some((key) =>\n Object.hasOwn(def, key)\n );\n};\n\nconst defsOf = (schema: JsonSchema): Record<string, unknown> =>\n isJsonObject(schema.$defs) ? schema.$defs : {};\n\nconst withDefs = (\n schema: JsonSchema,\n defs: Record<string, unknown>\n): JsonSchema => ({ ...schema, $defs: defs });\n\nconst dropSafeIntegerMaxima = (schema: JsonSchema): void => {\n walkJson(schema, (node) => {\n if (node.maximum === SAFE_INTEGER_MAX) {\n delete node.maximum;\n }\n if (node.minimum === -SAFE_INTEGER_MAX) {\n delete node.minimum;\n }\n });\n};\n\nconst dropNodeIdAndSurfaces = (schema: JsonSchema): void => {\n for (const def of Object.values(defsOf(schema))) {\n if (!isJsonObject(def) || !isJsonObject(def.properties)) {\n continue;\n }\n const typeProp = def.properties.type;\n if (!isJsonObject(typeProp) || typeof typeProp.const !== 'string') {\n continue;\n }\n delete def.properties.id;\n delete def.properties.surfaces;\n if (Array.isArray(def.required)) {\n def.required = def.required.filter(\n (key) => key !== 'id' && key !== 'surfaces'\n );\n }\n }\n};\n\nconst omitListedProperties = (\n schema: JsonSchema,\n paths: readonly string[]\n): void => {\n const defs = defsOf(schema);\n for (const path of paths) {\n const dot = path.indexOf('.');\n if (dot <= 0) {\n continue;\n }\n const defId = path.slice(0, dot);\n const property = path.slice(dot + 1);\n const def = ownDef(defs, defId);\n if (!isJsonObject(def) || !isJsonObject(def.properties)) {\n continue;\n }\n delete def.properties[property];\n if (Array.isArray(def.required)) {\n def.required = def.required.filter((key) => key !== property);\n }\n }\n};\n\nconst applyDescriptions = (\n schema: JsonSchema,\n describe: Readonly<Record<string, string>>\n): void => {\n const defs = defsOf(schema);\n for (const [id, description] of Object.entries(describe)) {\n const def = ownDef(defs, id);\n if (isJsonObject(def)) {\n def.description = description;\n }\n }\n};\n\nconst flattenRefOnlyDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n const aliases = new Map<string, string>();\n for (const [id, def] of Object.entries(defs)) {\n if (id === BODY_NODE_ID || !isRefOnlyDef(def)) {\n continue;\n }\n const target = parseDefRef(def.$ref);\n if (target === undefined || target === id) {\n continue;\n }\n aliases.set(id, target);\n }\n if (aliases.size === 0) {\n return schema;\n }\n const resolve = (id: string): string => {\n const seen = new Set<string>();\n let current = id;\n while (aliases.has(current) && !seen.has(current)) {\n seen.add(current);\n current = aliases.get(current) ?? current;\n }\n return current;\n };\n const rewritten = rewriteDefRefs(schema, (id) =>\n aliases.has(id) ? resolve(id) : undefined\n );\n const nextDefs = { ...defsOf(rewritten) };\n for (const id of aliases.keys()) {\n delete nextDefs[id];\n }\n return withDefs(rewritten, nextDefs);\n};\n\nconst inlineScalarDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n const scalars = new Map<string, Record<string, unknown>>();\n for (const [id, def] of Object.entries(defs)) {\n if (id === BODY_NODE_ID || !isBareScalarDef(def)) {\n continue;\n }\n scalars.set(id, def);\n }\n if (scalars.size === 0) {\n return schema;\n }\n const rewritten = rewriteDefRefs(schema, (id) => scalars.get(id));\n const nextDefs = { ...defsOf(rewritten) };\n for (const id of scalars.keys()) {\n delete nextDefs[id];\n }\n return withDefs(rewritten, nextDefs);\n};\n\nconst pruneUnreferencedDefs = (schema: JsonSchema): JsonSchema => {\n const defs = defsOf(schema);\n if (Object.keys(defs).length === 0) {\n return schema;\n }\n const referenced = new Set<string>();\n const visit = (node: unknown): void => {\n walkJson(node, (value) => {\n const id = parseDefRef(value.$ref);\n if (id === undefined || referenced.has(id)) {\n return;\n }\n referenced.add(id);\n visit(ownDef(defs, id));\n });\n };\n const root: JsonSchema = { ...schema };\n delete root.$defs;\n visit(root);\n referenced.add(BODY_NODE_ID);\n visit(defs[BODY_NODE_ID]);\n return withDefs(\n schema,\n Object.fromEntries(\n Object.entries(defs).filter(([id]) => referenced.has(id))\n )\n );\n};\n\nconst mergeExtraDefs = (\n extras: CompositionJsonSchemaOptions['extraDefs']\n): { schema: ZodType; id: string }[] => {\n const bySchema = new Map<ZodType, { schema: ZodType; id: string }>();\n for (const item of DEFAULT_EXTRA_DEFS) {\n bySchema.set(item.schema, item);\n }\n for (const item of extras ?? []) {\n bySchema.set(item.schema, item);\n }\n const byId = new Map<string, { schema: ZodType; id: string }>();\n for (const item of bySchema.values()) {\n byId.set(item.id, item);\n }\n return [...byId.values()];\n};\n\nconst slimAuthoringSchema = (\n schema: JsonSchema,\n options: AuthoringJsonSchemaOptions\n): JsonSchema => {\n const next = cloneJson(schema);\n dropSafeIntegerMaxima(next);\n dropNodeIdAndSurfaces(next);\n omitListedProperties(next, options.omitProperties ?? []);\n const flattened = flattenRefOnlyDefs(next);\n const inlined = inlineScalarDefs(flattened);\n const pruned = pruneUnreferencedDefs(inlined);\n applyDescriptions(pruned, options.describe ?? {});\n return pruned;\n};\n\n/**\n * Projects a composition to the JSON Schema an agent reads.\n *\n * {@link buildCompositionJsonSchema} stays the validator projection. This walk\n * names shared SDK defs, inlines scalar leaves, and drops host-only fields.\n */\nexport const buildAuthoringJsonSchema = (\n definitions: readonly AnyPrimitiveDefinition[],\n options: AuthoringJsonSchemaOptions = {}\n): JsonSchema => {\n const { describe, omitProperties, extraDefs, ...rest } = options;\n const projected = buildCompositionJsonSchema(definitions, {\n ...rest,\n extraDefs: mergeExtraDefs(extraDefs),\n });\n return slimAuthoringSchema(projected, {\n ...(describe === undefined ? {} : { describe }),\n ...(omitProperties === undefined ? {} : { omitProperties }),\n });\n};\n\nconst BODY_NODE_STUB = {\n description:\n 'Any primitive in the catalog, as its own object with its `type`.',\n};\n\n/**\n * The `$defs` that `types` reach in a schema from {@link buildAuthoringJsonSchema},\n * keyed as `schema` keys them, with the body-node union stubbed so a container\n * does not pull in every primitive.\n */\nexport const authoringSchemaSubset = (\n schema: JsonSchema,\n types: readonly string[]\n): { $defs: Record<string, unknown> } => {\n const defs = defsOf(schema);\n // A `Map`, so an id such as `constructor` is never an inherited key.\n const kept = new Map<string, unknown>();\n const visit = (id: string): void => {\n if (kept.has(id) || !Object.hasOwn(defs, id)) {\n return;\n }\n if (id === BODY_NODE_ID) {\n kept.set(id, BODY_NODE_STUB);\n return;\n }\n kept.set(id, defs[id]);\n walkJson(defs[id], (value) => {\n const ref = parseDefRef(value.$ref);\n if (ref !== undefined) {\n visit(ref);\n }\n });\n };\n for (const type of types) {\n visit(type);\n }\n return { $defs: Object.fromEntries(kept) };\n};\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z, type ZodObject, type ZodType } from 'zod';
|
|
2
|
+
import type { AnyPrimitiveDefinition } from '../define/primitive_module.js';
|
|
3
|
+
/** `Composition.meta`: provenance and freshness, every field optional. */
|
|
4
|
+
export declare const metaSchema: z.ZodObject<{
|
|
5
|
+
source: z.ZodOptional<z.ZodString>;
|
|
6
|
+
generatedAt: z.ZodOptional<z.ZodString>;
|
|
7
|
+
ariaLabel: z.ZodOptional<z.ZodString>;
|
|
8
|
+
provenance: z.ZodOptional<z.ZodObject<{
|
|
9
|
+
source: z.ZodOptional<z.ZodString>;
|
|
10
|
+
query: z.ZodOptional<z.ZodString>;
|
|
11
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>>;
|
|
13
|
+
freshness: z.ZodOptional<z.ZodObject<{
|
|
14
|
+
asOf: z.ZodOptional<z.ZodString>;
|
|
15
|
+
stale: z.ZodOptional<z.ZodBoolean>;
|
|
16
|
+
ttlSeconds: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
partialFailure: z.ZodOptional<z.ZodObject<{
|
|
19
|
+
degraded: z.ZodOptional<z.ZodBoolean>;
|
|
20
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
/** Options for the `Composition` envelope schema a body-node union is wrapped in. */
|
|
24
|
+
export interface CompositionSchemaOptions {
|
|
25
|
+
/** The union the envelope's `body` array holds, as {@link resolveVocabulary} builds it. */
|
|
26
|
+
bodyNodeSchema: ZodType<unknown>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wraps a body-node union in the `Composition` envelope.
|
|
30
|
+
*
|
|
31
|
+
* `.strict()`, so an unknown root key is an error rather than silently carried:
|
|
32
|
+
* the format crosses vendor boundaries, and a typo'd field that validates is
|
|
33
|
+
* worse than one that fails. Most callers want
|
|
34
|
+
* {@link getCompositionSchemaForDefinitions} instead, which memoizes.
|
|
35
|
+
*/
|
|
36
|
+
export declare const buildCompositionSchema: ({ bodyNodeSchema, }: CompositionSchemaOptions) => ZodObject;
|
|
37
|
+
/**
|
|
38
|
+
* One set of definitions resolved into a body-node union, with the schema
|
|
39
|
+
* instance that actually landed in it per primitive type.
|
|
40
|
+
*
|
|
41
|
+
* The members matter to callers because a container's schema in the union is
|
|
42
|
+
* built by `schemaFor` and is therefore *not* `definition.schema`. Anything
|
|
43
|
+
* keyed on identity — the JSON Schema id registry, which names `$defs` — has to
|
|
44
|
+
* be given these, or a container's projection silently loses its name.
|
|
45
|
+
*/
|
|
46
|
+
export interface ResolvedVocabulary {
|
|
47
|
+
/** The discriminated union over every primitive type in this vocabulary. */
|
|
48
|
+
bodyNodeSchema: ZodType<unknown>;
|
|
49
|
+
/** Keyed by node type. A container's value comes from `schemaFor`, not `definition.schema`. */
|
|
50
|
+
members: ReadonlyMap<string, ZodObject>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Builds a body-node union whose containers reference *this* union.
|
|
54
|
+
*
|
|
55
|
+
* The `z.lazy` closing the recursion is created here and discarded with the
|
|
56
|
+
* vocabulary: it memoizes its getter after the first resolution, so one shared
|
|
57
|
+
* across vocabularies would freeze on whichever union parsed first.
|
|
58
|
+
*/
|
|
59
|
+
export declare const resolveVocabulary: (definitions: readonly AnyPrimitiveDefinition[]) => ResolvedVocabulary;
|
|
60
|
+
/**
|
|
61
|
+
* {@link resolveVocabulary}, discarding the member instances.
|
|
62
|
+
*
|
|
63
|
+
* Only for a caller with no id registry to name; anything projecting to JSON
|
|
64
|
+
* Schema needs the members and should use {@link resolveVocabulary}.
|
|
65
|
+
*/
|
|
66
|
+
export declare const buildBodyNodeSchemaFromDefinitions: (definitions: readonly AnyPrimitiveDefinition[]) => ZodType<unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* A fresh `Composition` schema over `definitions`.
|
|
69
|
+
*
|
|
70
|
+
* Builds a new union per call. Prefer
|
|
71
|
+
* {@link getCompositionSchemaForDefinitions} unless a fresh instance is
|
|
72
|
+
* required.
|
|
73
|
+
*/
|
|
74
|
+
export declare const buildCompositionSchemaFromDefinitions: (definitions: readonly AnyPrimitiveDefinition[]) => ZodObject;
|
|
75
|
+
/**
|
|
76
|
+
* {@link buildCompositionSchemaFromDefinitions}, memoized per definition array.
|
|
77
|
+
* Prefer this whenever the caller does not need a fresh schema instance.
|
|
78
|
+
*/
|
|
79
|
+
export declare const getCompositionSchemaForDefinitions: (definitions: readonly AnyPrimitiveDefinition[]) => ZodObject;
|
|
80
|
+
//# sourceMappingURL=composition_schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition_schema.d.ts","sourceRoot":"","sources":["../../src/validate/composition_schema.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAGtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAIzE,0EAA0E;AAC1E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;iBAwBrB,CAAC;AAEH,qFAAqF;AACrF,MAAM,WAAW,wBAAwB;IACvC,2FAA2F;IAC3F,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,qBAEpC,wBAAwB,KAAG,SAajB,CAAC;AAEd;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,+FAA+F;IAC/F,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACzC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,aAAa,SAAS,sBAAsB,EAAE,KAC7C,kBAmCF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kCAAkC,GAC7C,aAAa,SAAS,sBAAsB,EAAE,KAC7C,OAAO,CAAC,OAAO,CAAkD,CAAC;AAErE;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,GAChD,aAAa,SAAS,sBAAsB,EAAE,KAC7C,SAGC,CAAC;AAgCL;;;GAGG;AACH,eAAO,MAAM,kCAAkC,GAC7C,aAAa,SAAS,sBAAsB,EAAE,KAC7C,SAA0C,CAAC"}
|