UNPKG

openapi-json-schema

Version:

Minimalistic OpenAPI 3 ⬌ JSON Schema (draft 7) conversion

50 lines (49 loc) 1.75 kB
import { decodeRefNameJsonSchema, encodeRefNameOpenApi, recurseSchema, } from './utils.js'; function jsonSchemaTypeToOpenApiConvertType(schema) { if (schema.type === undefined) return schema; const { type: _type, ...rest } = schema; const nullable = Array.isArray(_type) ? _type.includes('null') : _type === 'null'; const type = Array.isArray(_type) ? _type.filter(val => val !== 'null') : _type === 'null' ? undefined : _type; const decorateType = (t, type) => (type === "any" || !type) ? t : ({ ...t, type }); if (typeof schema.const !== 'undefined') { rest.enum = [schema.const]; delete rest.const; } const decorateNullable = (t) => nullable ? ({ ...t, nullable }) : t; if (Array.isArray(type)) { if (type.length === 0) return decorateNullable(rest); else if (type.length === 1) return decorateType(decorateNullable(rest), type[0]); else { return { ...decorateNullable(rest), anyOf: type.map(type => decorateType({}, type)), }; } } return decorateType(decorateNullable(rest), type); } function jsonSchemaToOpenApi7Ref(node) { if (node.$ref) return { ...node, $ref: encodeRefNameOpenApi(decodeRefNameJsonSchema(node.$ref)), }; return node; } export function jsonSchemaTypeToOpenApi(schema) { if (typeof schema === 'boolean') return schema; schema = jsonSchemaTypeToOpenApiConvertType(schema); schema = jsonSchemaToOpenApi7Ref(schema); // TODO: Proper draft 7-to-4 conversion return recurseSchema(schema, jsonSchemaTypeToOpenApi); }