openapi-json-schema
Version:
Minimalistic OpenAPI 3 ⬌ JSON Schema (draft 7) conversion
50 lines (49 loc) • 1.75 kB
JavaScript
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);
}