docusaurus-plugin-openapi-docs
Version:
OpenAPI plugin for Docusaurus.
145 lines (137 loc) • 4.63 kB
text/typescript
/* ============================================================================
* 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 { createAuthentication } from "./createAuthentication";
import { createAuthorization } from "./createAuthorization";
import { createCallbacks } from "./createCallbacks";
import { createContactInfo } from "./createContactInfo";
import { createDeprecationNotice } from "./createDeprecationNotice";
import { createDescription } from "./createDescription";
import { createDownload } from "./createDownload";
import { createHeading } from "./createHeading";
import { createLicense } from "./createLicense";
import { createLogo } from "./createLogo";
import { createMethodEndpoint } from "./createMethodEndpoint";
import { createParamsDetails } from "./createParamsDetails";
import { createRequestBodyDetails } from "./createRequestBodyDetails";
import { createRequestHeader } from "./createRequestHeader";
import { createStatusCodes } from "./createStatusCodes";
import { createTermsOfService } from "./createTermsOfService";
import { createVendorExtensions } from "./createVendorExtensions";
import { createVersionBadge } from "./createVersionBadge";
import { create, greaterThan, lessThan, render } from "./utils";
import {
ContactObject,
LicenseObject,
MediaTypeObject,
SecuritySchemeObject,
} from "../openapi/types";
import {
ApiPageMetadata,
InfoPageMetadata,
SchemaPageMetadata,
TagPageMetadata,
} from "../types";
interface RequestBodyProps {
title: string;
body: {
content?: {
[key: string]: MediaTypeObject;
};
description?: string;
required?: boolean;
};
}
export function createApiPageMD({
title,
api: {
deprecated,
"x-deprecated-description": deprecatedDescription,
description,
method,
path,
extensions,
parameters,
requestBody,
responses,
callbacks,
},
infoPath,
frontMatter,
}: ApiPageMetadata) {
return render([
`import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";\n`,
`import ParamsDetails from "@theme/ParamsDetails";\n`,
`import RequestSchema from "@theme/RequestSchema";\n`,
`import StatusCodes from "@theme/StatusCodes";\n`,
`import OperationTabs from "@theme/OperationTabs";\n`,
`import TabItem from "@theme/TabItem";\n`,
`import Heading from "@theme/Heading";\n\n`,
createHeading(title),
createMethodEndpoint(method, path),
infoPath && createAuthorization(infoPath),
frontMatter.show_extensions
? createVendorExtensions(extensions)
: undefined,
createDeprecationNotice({ deprecated, description: deprecatedDescription }),
createDescription(description),
requestBody || parameters ? createRequestHeader("Request") : undefined,
createParamsDetails({ parameters }),
createRequestBodyDetails({
title: "Body",
body: requestBody,
} as RequestBodyProps),
createStatusCodes({ responses }),
createCallbacks({ callbacks }),
]);
}
export function createInfoPageMD({
info: {
title,
version,
description,
contact,
license,
termsOfService,
logo,
darkLogo,
},
securitySchemes,
downloadUrl,
}: InfoPageMetadata) {
return render([
`import ApiLogo from "@theme/ApiLogo";\n`,
`import Heading from "@theme/Heading";\n`,
`import SchemaTabs from "@theme/SchemaTabs";\n`,
`import TabItem from "@theme/TabItem";\n`,
`import Export from "@theme/ApiExplorer/Export";\n\n`,
createVersionBadge(version),
createDownload(downloadUrl),
createHeading(title),
createLogo(logo, darkLogo),
createDescription(description),
createAuthentication(securitySchemes as unknown as SecuritySchemeObject),
createContactInfo(contact as ContactObject),
createTermsOfService(termsOfService),
createLicense(license as LicenseObject),
]);
}
export function createTagPageMD({ tag: { description } }: TagPageMetadata) {
return render([createDescription(description)]);
}
export function createSchemaPageMD({ schema }: SchemaPageMetadata) {
const { title = "", description } = schema;
return render([
`import Schema from "@theme/Schema";\n`,
`import Heading from "@theme/Heading";\n\n`,
createHeading(title.replace(lessThan, "<").replace(greaterThan, ">")),
createDescription(description),
create("Schema", {
schema: schema,
schemaType: "response",
}),
]);
}