@scalar/api-reference
Version:
Generate beautiful API references from OpenAPI documents
281 lines (280 loc) • 11.9 kB
JavaScript
import WithBreadcrumb_default from "../../Anchor/WithBreadcrumb.vue.js";
import SpecificationExtension_default from "../../../features/specification-extension/SpecificationExtension.vue.js";
import { isTypeObject } from "./helpers/is-type-object.js";
import { hasComplexArrayItems } from "./helpers/has-complex-array-items.js";
import { getCompositionsToRender } from "./helpers/get-compositions-to-render.js";
import { getEnumValues } from "./helpers/get-enum-values.js";
import { getPropertyDescription } from "./helpers/get-property-description.js";
import { optimizeValueForDisplay } from "./helpers/optimize-value-for-display.js";
import { shouldDisplayDescription } from "./helpers/should-display-description.js";
import { shouldDisplayHeading } from "./helpers/should-display-heading.js";
import SchemaComposition_default from "./SchemaComposition.vue.js";
import SchemaEnums_default from "./SchemaEnums.vue.js";
import SchemaPropertyHeading_default from "./SchemaPropertyHeading.vue.js";
import Schema_default from "./Schema.vue.js";
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createSlots, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderList, resolveDynamicComponent, toDisplayString, unref, withCtx } from "vue";
import { ScalarMarkdown, ScalarWrappingText } from "@scalar/components";
import { resolve } from "@scalar/workspace-store/resolve";
import { isArraySchema } from "@scalar/workspace-store/schemas/v3.1/strict/type-guards";
//#region src/components/Content/Schema/SchemaProperty.vue?vue&type=script&setup=true&lang.ts
var _hoisted_1 = {
key: 0,
class: "property-name-pattern-properties"
};
var _hoisted_2 = {
key: 1,
class: "property-name-additional-properties"
};
var _hoisted_3 = {
key: 1,
class: "property-description"
};
var _hoisted_4 = {
key: 4,
class: "children"
};
var _hoisted_5 = {
key: 5,
class: "children"
};
/**
* Note: We're taking in a prop called `value` which should be a JSON Schema.
*
* We're using `optimizeValueForDisplay` to merge null types in compositions (anyOf, allOf, oneOf, not).
* So you should basically use the optimizedValue everywhere in the component.
*/
var SchemaProperty_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "SchemaProperty",
props: {
is: {},
schema: {},
noncollapsible: { type: Boolean },
level: { default: 0 },
name: {},
required: {
type: Boolean,
default: false
},
compact: {
type: Boolean,
default: false
},
discriminator: {},
description: {},
hideModelNames: {
type: Boolean,
default: false
},
hideHeading: { type: Boolean },
modelName: {},
variant: {},
breadcrumb: {},
eventBus: {},
options: {},
propertyNamesEnum: {},
schemaContext: {},
compositionPath: {},
compositionPathSegment: {}
},
setup(__props) {
const props = __props;
/** Simplified composition with `null` type. */
const optimizedValue = computed(() => optimizeValueForDisplay(props.schema));
const childBreadcrumb = computed(() => props.breadcrumb && props.name ? [...props.breadcrumb, props.name] : void 0);
const currentCompositionPath = computed(() => props.compositionPathSegment ? [...props.compositionPath ?? [], props.compositionPathSegment] : props.compositionPath ?? []);
const arrayItemsCompositionPath = computed(() => [...currentCompositionPath.value, "items"]);
const shouldHaveLink = computed(() => props.level <= 2);
/** Checks if array items have complex structure */
const hasComplexArrayItemsComputed = computed(() => hasComplexArrayItems(optimizedValue.value));
/** Check if enum should be displayed (from value schema or from propertyNames) */
const hasEnum = computed(() => enumValues.value.length > 0);
/** Determine if object properties should be displayed */
const shouldRenderObjectProperties = computed(() => {
const value = optimizedValue.value;
if (!value) return false;
return isTypeObject(value) && ("properties" in value || "additionalProperties" in value);
});
/** Determine if array of objects should be rendered */
const shouldRenderArrayOfObjects = computed(() => {
const value = optimizedValue.value;
if (!value || !isArraySchema(value) || typeof value.items !== "object") return false;
return hasComplexArrayItemsComputed.value;
});
/** Extract enum values from schema or array items */
const enumValues = computed(() => getEnumValues(optimizedValue.value));
/** Generate property description from type/format */
const propertyDescription = computed(() => getPropertyDescription(optimizedValue.value));
/** Determine if description should be displayed */
const displayDescription = computed(() => shouldDisplayDescription(optimizedValue.value, props.description));
/**
* When the property already renders the description, avoid repeating it in the nested object schema card.
*/
const objectSchemaForChildren = computed(() => {
const value = optimizedValue.value;
if (!value || !displayDescription.value || !("description" in value)) return value;
const { description: _description, ...schemaWithoutDescription } = value;
return schemaWithoutDescription;
});
/** Determine if property heading should be displayed */
const shouldDisplayHeadingComputed = computed(() => shouldDisplayHeading(optimizedValue.value, props.name, props.required));
/** Computes which compositions should be rendered and with which values */
const compositionsToRender = computed(() => getCompositionsToRender(optimizedValue.value));
/** Get resolved array items for rendering */
const resolvedArrayItems = computed(() => {
const value = optimizedValue.value;
if (!value || !isArraySchema(value) || typeof value.items !== "object") return;
return resolve.schema(value.items);
});
/** Check if discriminator matches current property */
const isDiscriminatorProperty = computed(() => Boolean(props.name && props.discriminator?.propertyName === props.name));
return (_ctx, _cache) => {
return openBlock(), createBlock(resolveDynamicComponent(__props.is ?? "li"), { class: normalizeClass(["property", [`property--level-${__props.level}`, {
"property--compact": __props.compact,
"property--deprecated": optimizedValue.value?.deprecated
}]]) }, {
default: withCtx(() => [
shouldDisplayHeadingComputed.value ? (openBlock(), createBlock(SchemaPropertyHeading_default, {
key: 0,
class: "group",
enum: hasEnum.value,
eventBus: __props.eventBus,
hideModelNames: __props.hideModelNames,
isDiscriminator: isDiscriminatorProperty.value,
modelName: __props.modelName,
required: __props.required,
value: optimizedValue.value
}, createSlots({ _: 2 }, [__props.name ? {
name: "name",
fn: withCtx(() => [createVNode(unref(WithBreadcrumb_default), {
breadcrumb: shouldHaveLink.value ? childBreadcrumb.value : void 0,
eventBus: __props.eventBus
}, {
default: withCtx(() => [__props.variant === "patternProperties" ? (openBlock(), createElementBlock("span", _hoisted_1, [createVNode(unref(ScalarWrappingText), {
preset: "property",
text: __props.name
}, null, 8, ["text"])])) : __props.variant === "additionalProperties" ? (openBlock(), createElementBlock("span", _hoisted_2, [createVNode(unref(ScalarWrappingText), {
preset: "property",
text: __props.name
}, null, 8, ["text"])])) : (openBlock(), createBlock(unref(ScalarWrappingText), {
key: 2,
preset: "property",
text: __props.name
}, null, 8, ["text"]))]),
_: 1
}, 8, ["breadcrumb", "eventBus"])]),
key: "0"
} : void 0, optimizedValue.value?.example !== void 0 ? {
name: "example",
fn: withCtx(() => [createTextVNode(" Example: " + toDisplayString(optimizedValue.value.example), 1)]),
key: "1"
} : void 0]), 1032, [
"enum",
"eventBus",
"hideModelNames",
"isDiscriminator",
"modelName",
"required",
"value"
])) : createCommentVNode("", true),
displayDescription.value || propertyDescription.value ? (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(unref(ScalarMarkdown), { value: displayDescription.value || propertyDescription.value || "" }, null, 8, ["value"])])) : createCommentVNode("", true),
__props.propertyNamesEnum && __props.propertyNamesEnum.length > 0 ? (openBlock(), createBlock(SchemaEnums_default, {
key: 2,
propertyNames: "",
value: { enum: __props.propertyNamesEnum }
}, null, 8, ["value"])) : createCommentVNode("", true),
enumValues.value.length > 0 ? (openBlock(), createBlock(SchemaEnums_default, {
key: 3,
value: optimizedValue.value
}, null, 8, ["value"])) : createCommentVNode("", true),
shouldRenderObjectProperties.value ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(Schema_default, {
breadcrumb: childBreadcrumb.value,
compact: __props.compact,
compositionPath: currentCompositionPath.value,
eventBus: __props.eventBus,
hideModelNames: __props.hideModelNames,
level: __props.level + 1,
name: __props.name,
noncollapsible: __props.noncollapsible,
options: __props.options,
schema: objectSchemaForChildren.value,
schemaContext: __props.schemaContext
}, null, 8, [
"breadcrumb",
"compact",
"compositionPath",
"eventBus",
"hideModelNames",
"level",
"name",
"noncollapsible",
"options",
"schema",
"schemaContext"
])])) : createCommentVNode("", true),
shouldRenderArrayOfObjects.value && resolvedArrayItems.value ? (openBlock(), createElementBlock("div", _hoisted_5, [createVNode(Schema_default, {
compact: __props.compact,
compositionPath: arrayItemsCompositionPath.value,
eventBus: __props.eventBus,
hideModelNames: __props.hideModelNames,
level: __props.level + 1,
name: __props.name,
noncollapsible: __props.noncollapsible,
options: __props.options,
schema: unref(resolve).schema(resolvedArrayItems.value),
schemaContext: __props.schemaContext
}, null, 8, [
"compact",
"compositionPath",
"eventBus",
"hideModelNames",
"level",
"name",
"noncollapsible",
"options",
"schema",
"schemaContext"
])])) : createCommentVNode("", true),
(openBlock(true), createElementBlock(Fragment, null, renderList(compositionsToRender.value, (compositionData) => {
return openBlock(), createBlock(SchemaComposition_default, {
key: compositionData.composition,
breadcrumb: __props.breadcrumb,
compact: __props.compact,
composition: compositionData.composition,
compositionPath: currentCompositionPath.value,
discriminator: __props.schema?.discriminator,
eventBus: __props.eventBus,
hideHeading: __props.hideHeading,
hideModelNames: __props.hideModelNames,
level: __props.level,
name: __props.name,
noncollapsible: __props.noncollapsible,
options: __props.options,
schema: compositionData.value,
schemaContext: __props.schemaContext
}, null, 8, [
"breadcrumb",
"compact",
"composition",
"compositionPath",
"discriminator",
"eventBus",
"hideHeading",
"hideModelNames",
"level",
"name",
"noncollapsible",
"options",
"schema",
"schemaContext"
]);
}), 128)),
createVNode(unref(SpecificationExtension_default), { value: optimizedValue.value }, null, 8, ["value"])
]),
_: 1
}, 8, ["class"]);
};
}
});
//#endregion
export { SchemaProperty_vue_vue_type_script_setup_true_lang_default as default };
//# sourceMappingURL=SchemaProperty.vue.script.js.map