Source: openapi31to30.js

/**
 * @copyright Copyright 2021 Kevin Locke <kevin@kevinlocke.name>
 * @license MIT
 * @module "openapi-transformers/openapi31to30.js"
 */

import AnyOfNullToNullableTransformer from './any-of-null-to-nullable.js';
import ConstToEnumTransformer from './const-to-enum.js';
import ExclusiveMinMaxToBoolTransformer from './exclusive-min-max-to-bool.js';
import PatternPropertiesToAdditionalPropertiesTransformer
  from './pattern-properties-to-additional-properties.js';
import RemoveTypeIfTransformer, { allNonNullTypes } from './remove-type-if.js';
import TypeNullToEnumTransformer from './type-null-to-enum.js';
import TypeNullToNullableTransformer from './type-null-to-nullable.js';

/**
 * Transformer to convert an OpenAPI 3.1.* document to OpenAPI 3.0.3.
 */
export default class OpenApi31To30Transformer {
  constructor() {
    this.transformers = [
      new ExclusiveMinMaxToBoolTransformer(),
      new ConstToEnumTransformer(),
      new AnyOfNullToNullableTransformer(),
      new TypeNullToEnumTransformer(),
      new TypeNullToNullableTransformer(),
      new RemoveTypeIfTransformer(allNonNullTypes),
      new PatternPropertiesToAdditionalPropertiesTransformer(),
    ];
  }

  transformOpenApi(openApi) {
    if (typeof openApi !== 'object'
      || openApi === null
      || Array.isArray(openApi)) {
      this.warn('Ignoring non-object OpenAPI', openApi);
      return openApi;
    }

    if (typeof openApi.openapi !== 'string'
      || !openApi.openapi.startsWith('3.1.')) {
      this.warn('Expected OpenAPI 3.1, got', openApi.openapi);
    }

    for (const transformer of this.transformers) {
      openApi = transformer.transformOpenApi(openApi);
    }

    return {
      ...openApi,
      openapi: '3.0.3',
    };
  }
}