/* ============================================================================ * Copyright (c) Palo Alto Networks * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * ========================================================================== */ import React, { ReactNode } from "react"; import { translate } from "@docusaurus/Translate"; import { Example } from "@theme/Example"; import Markdown from "@theme/Markdown"; import { OPENAPI_SCHEMA_ITEM } from "@theme/translationIds"; import clsx from "clsx"; import { getQualifierMessage } from "../../markdown/schema"; import { guard } from "../../markdown/utils"; export interface Props { children?: ReactNode; collapsible?: boolean; name?: string; qualifierMessage?: string | undefined; required?: boolean; schemaName?: string; // TODO should probably be typed schema?: any; discriminator?: boolean; } const transformEnumDescriptions = ( enumDescriptions?: Record ) => { if (enumDescriptions) { return Object.entries(enumDescriptions); } return []; }; const getEnumDescriptionMarkdown = (enumDescriptions?: [string, string][]) => { if (enumDescriptions?.length) { const enumValue = translate({ id: OPENAPI_SCHEMA_ITEM.ENUM_VALUE, message: "Enum Value", }); const description = translate({ id: OPENAPI_SCHEMA_ITEM.ENUM_DESCRIPTION, message: "Description", }); return `| ${enumValue} | ${description} | | ---- | ----- | ${enumDescriptions .map((desc) => { return `| ${desc[0]} | ${desc[1]} | `.replaceAll("\n", "
"); }) .join("\n")} `; } return ""; }; export default function SchemaItem(props: Props) { const { children: collapsibleSchemaContent, collapsible, name, qualifierMessage, required, schemaName, schema, } = props; let deprecated; let schemaDescription; let defaultValue: string | undefined; let example: string | undefined; let examples: string[] | undefined; let nullable; let enumDescriptions: [string, string][] = []; let constValue: string | undefined; if (schema) { deprecated = schema.deprecated; schemaDescription = schema.description; enumDescriptions = transformEnumDescriptions(schema["x-enumDescriptions"]); defaultValue = schema.default; example = schema.example; examples = schema.examples; nullable = schema.nullable || (Array.isArray(schema.type) && schema.type.includes("null")); // support JSON Schema nullable constValue = schema.const; } const renderRequired = guard( Array.isArray(required) ? required.includes(name) : required, () => ( {translate({ id: OPENAPI_SCHEMA_ITEM.REQUIRED, message: "required" })} ) ); const renderDeprecated = guard(deprecated, () => ( {translate({ id: OPENAPI_SCHEMA_ITEM.DEPRECATED, message: "deprecated" })} )); const renderNullable = guard(nullable, () => ( {translate({ id: OPENAPI_SCHEMA_ITEM.NULLABLE, message: "nullable" })} )); const renderEnumDescriptions = guard( getEnumDescriptionMarkdown(enumDescriptions), (value) => { return (
{value}
); } ); const renderSchemaDescription = guard(schemaDescription, (description) => ( <> {description} )); // Generate qualifierMessage from schema if not provided const effectiveQualifierMessage = qualifierMessage ?? (schema ? getQualifierMessage(schema) : undefined); const renderQualifierMessage = guard(effectiveQualifierMessage, (message) => ( <> {message} )); function renderDefaultValue() { if (defaultValue !== undefined) { if (typeof defaultValue === "string") { return (
{translate({ id: OPENAPI_SCHEMA_ITEM.DEFAULT_VALUE, message: "Default value:", })}{" "} {defaultValue}
); } return (
{translate({ id: OPENAPI_SCHEMA_ITEM.DEFAULT_VALUE, message: "Default value:", })}{" "} {JSON.stringify(defaultValue)}
); } return undefined; } function renderConstValue() { if (constValue !== undefined) { if (typeof constValue === "string") { return (
{translate({ id: OPENAPI_SCHEMA_ITEM.CONSTANT_VALUE, message: "Constant value:", })}{" "} {constValue}
); } return (
{translate({ id: OPENAPI_SCHEMA_ITEM.CONSTANT_VALUE, message: "Constant value:", })}{" "} {JSON.stringify(constValue)}
); } return undefined; } const schemaContent = (
{name} {Array.isArray(schemaName) ? schemaName.join(" | ") : schemaName} {(nullable || required || deprecated) && ( )} {renderNullable} {renderRequired} {renderDeprecated} {renderSchemaDescription} {renderEnumDescriptions} {renderQualifierMessage} {renderConstValue()} {renderDefaultValue()} {collapsibleSchemaContent ?? collapsibleSchemaContent}
); return (
{collapsible ? collapsibleSchemaContent : schemaContent}
); }