UNPKG

@scalar/api-reference

Version:

Generate beautiful API references from OpenAPI documents

109 lines (108 loc) 4.77 kB
import { defineComponent, computed, ref, createElementBlock, openBlock, createBlock, unref, Fragment, createVNode, createElementVNode, withCtx, createCommentVNode, toDisplayString, normalizeClass } from "vue"; import { ScalarListbox } from "@scalar/components"; import { isDefined } from "@scalar/helpers/array/is-defined"; import { ScalarIconCaretDown } from "@scalar/icons"; import { getResolvedRef } from "@scalar/workspace-store/helpers/get-resolved-ref"; import { getSchemaType } from "./helpers/get-schema-type.js"; import { mergeAllOfSchemas } from "./helpers/merge-all-of-schemas.js"; import Schema from "./Schema.vue.js"; const _hoisted_1 = { class: "property-rule" }; const _hoisted_2 = { class: "composition-selector bg-b-1.5 hover:bg-b-2 flex w-full cursor-pointer items-center gap-1 rounded-t-lg border border-b-0 px-2 py-1.25 pr-3 text-left", type: "button" }; const _hoisted_3 = { class: "text-c-2" }; const _hoisted_4 = { key: 0, class: "text-red" }; const _hoisted_5 = { class: "composition-panel" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "SchemaComposition", props: { composition: {}, discriminator: {}, name: {}, schema: {}, level: {}, compact: { type: Boolean, default: false }, hideHeading: { type: Boolean, default: false }, breadcrumb: {}, eventBus: {}, options: {} }, setup(__props) { const props = __props; const composition = computed( () => [props.schema[props.composition]].flat().map((schema) => ({ value: getResolvedRef(schema), original: schema })).filter((it) => isDefined(it.value)) ); const listboxOptions = computed( () => composition.value.map((schema, index) => ({ id: String(index), label: getSchemaType(schema.original) || "Schema" })) ); const selectedOption = ref( listboxOptions.value[0] ); const humanizeType = (type) => type.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).toLowerCase().replace(/^(\w)/, (c) => c.toUpperCase()); const selectedComposition = computed( () => composition.value[Number(selectedOption.value?.id ?? "0")]?.value ); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", _hoisted_1, [ props.composition === "allOf" ? (openBlock(), createBlock(Schema, { key: 0, breadcrumb: __props.breadcrumb, compact: __props.compact, discriminator: __props.discriminator, eventBus: __props.eventBus, hideHeading: __props.hideHeading, level: __props.level, name: __props.name, noncollapsible: true, options: __props.options, schema: unref(mergeAllOfSchemas)(__props.schema) }, null, 8, ["breadcrumb", "compact", "discriminator", "eventBus", "hideHeading", "level", "name", "options", "schema"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [ createVNode(unref(ScalarListbox), { modelValue: selectedOption.value, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedOption.value = $event), options: listboxOptions.value, resize: "" }, { default: withCtx(() => [ createElementVNode("button", _hoisted_2, [ createElementVNode("span", _hoisted_3, toDisplayString(humanizeType(props.composition)), 1), createElementVNode("span", { class: normalizeClass(["composition-selector-label text-c-1", { "line-through": selectedComposition.value?.deprecated }]) }, toDisplayString(selectedOption.value?.label || "Schema"), 3), selectedComposition.value?.deprecated ? (openBlock(), createElementBlock("div", _hoisted_4, " deprecated ")) : createCommentVNode("", true), createVNode(unref(ScalarIconCaretDown)) ]) ]), _: 1 }, 8, ["modelValue", "options"]), createElementVNode("div", _hoisted_5, [ createVNode(Schema, { breadcrumb: __props.breadcrumb, compact: __props.compact, discriminator: __props.discriminator, eventBus: __props.eventBus, hideHeading: __props.hideHeading, level: __props.level + 1, name: __props.name, noncollapsible: true, options: __props.options, schema: selectedComposition.value }, null, 8, ["breadcrumb", "compact", "discriminator", "eventBus", "hideHeading", "level", "name", "options", "schema"]) ]) ], 64)) ]); }; } }); export { _sfc_main as default };