UNPKG

starlight-openapi

Version:

Starlight plugin to generate documentation from OpenAPI/Swagger specifications.

90 lines (71 loc) 3.2 kB
import type { IJsonSchema, OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types' import type { Parameter } from './parameter' export function getNullable(schemaObject: SchemaObject) { return 'nullable' in schemaObject ? (schemaObject as OpenAPIV3.NonArraySchemaObject).nullable : undefined } export function isParameterWithSchemaObject(parameter: Parameter): parameter is Parameter & { schema: SchemaObject } { return 'schema' in parameter && typeof parameter.schema === 'object' } export function isSchemaObjectObject(schemaObject: SchemaObject): schemaObject is SchemaObject { return ( schemaObject.type === 'object' || 'properties' in schemaObject || ('oneOf' in schemaObject && (schemaObject.oneOf as SchemaObject[]).some(isSchemaObjectObject)) || ('anyOf' in schemaObject && (schemaObject.anyOf as SchemaObject[]).some(isSchemaObjectObject)) || ('allOf' in schemaObject && (schemaObject.allOf as SchemaObject[]).some(isSchemaObjectObject)) ) } export function isSchemaObjectAllOf(schemaObject: SchemaObject): schemaObject is SchemaObject { return schemaObject.type === 'object' || 'allOf' in schemaObject } export function getProperties(schemaObject: SchemaObject): Properties { return (schemaObject.properties ?? {}) as Properties } export function isAdditionalPropertiesWithSchemaObject( additionalProperties: SchemaObject['additionalProperties'], ): additionalProperties is SchemaObject { return typeof additionalProperties === 'object' } export function isSchemaObject( schemaObject: OpenAPIV2.SchemaObject | OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject | IJsonSchema | undefined, ): schemaObject is SchemaObject { return typeof schemaObject === 'object' } export function getSchemaObjects(schemaObject: SchemaObject): SchemaObjects | undefined { if (schemaObject.oneOf && schemaObject.oneOf.length > 0) { const { oneOf, ...otherProperties } = schemaObject return { schemaObjects: sanitizeSchemaObjects(oneOf as SchemaObject[], otherProperties), type: 'oneOf', } } else if (schemaObject.anyOf && schemaObject.anyOf.length > 0) { const { anyOf, ...otherProperties } = schemaObject return { schemaObjects: sanitizeSchemaObjects(anyOf as SchemaObject[], otherProperties), type: 'anyOf', } } return } function sanitizeSchemaObjects(schemaObjects: SchemaObject[], parentProperties: SchemaObject) { if (schemaObjects.some((schemaObjectsObject) => schemaObjectsObject.type !== undefined)) { return schemaObjects } return schemaObjects.map((schemaObjectsObject) => { const sanitizeSchemaObject = { ...parentProperties, ...schemaObjectsObject, } as SchemaObject if (!sanitizeSchemaObject.type && sanitizeSchemaObject.properties) { sanitizeSchemaObject.type = 'object' } return sanitizeSchemaObject }) } export type SchemaObject = OpenAPIV2.SchemaObject | OpenAPIV3.NonArraySchemaObject | OpenAPIV3_1.NonArraySchemaObject export type Properties = Record<string, SchemaObject> export type Discriminator = SchemaObject['discriminator'] export interface SchemaObjects { schemaObjects: SchemaObject[] type: 'anyOf' | 'oneOf' }