parse-openapi
Version:
OpenAPI v3 parser
178 lines (177 loc) • 7.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getModel = void 0;
const getPattern_1 = require("../utils/getPattern");
const getEnum_1 = require("./getEnum");
const getEnumFromDescription_1 = require("./getEnumFromDescription");
const getModelComposition_1 = require("./getModelComposition");
const getModelDefault_1 = require("./getModelDefault");
const getModelProperties_1 = require("./getModelProperties");
const getType_1 = require("./getType");
const getModel = (openApi, definition, isDefinition = false, name = '') => {
const model = {
name,
export: 'interface',
type: 'any',
base: 'any',
template: null,
link: null,
description: definition.description || null,
isDefinition,
isReadOnly: definition.readOnly === true,
isNullable: definition.nullable === true,
isRequired: false,
format: definition.format,
maximum: definition.maximum,
exclusiveMaximum: definition.exclusiveMaximum,
minimum: definition.minimum,
exclusiveMinimum: definition.exclusiveMinimum,
multipleOf: definition.multipleOf,
maxLength: definition.maxLength,
minLength: definition.minLength,
maxItems: definition.maxItems,
minItems: definition.minItems,
uniqueItems: definition.uniqueItems,
maxProperties: definition.maxProperties,
minProperties: definition.minProperties,
pattern: (0, getPattern_1.getPattern)(definition.pattern),
imports: [],
enum: [],
enums: [],
properties: [],
};
if (definition.$ref) {
const definitionRef = (0, getType_1.getType)(definition.$ref);
model.export = 'reference';
model.type = definitionRef.type;
model.base = definitionRef.base;
model.template = definitionRef.template;
model.imports.push(...definitionRef.imports);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
if (definition.enum && definition.type !== 'boolean') {
const enumerators = (0, getEnum_1.getEnum)(definition.enum);
if (enumerators.length) {
model.export = 'enum';
model.type = 'string';
model.base = 'string';
model.enum.push(...enumerators);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
}
if ((definition.type === 'int' || definition.type === 'integer') && definition.description) {
const enumerators = (0, getEnumFromDescription_1.getEnumFromDescription)(definition.description);
if (enumerators.length) {
model.export = 'enum';
model.type = 'number';
model.base = 'number';
model.enum.push(...enumerators);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
}
if (definition.type === 'array' && definition.items) {
if (definition.items.$ref) {
const arrayItems = (0, getType_1.getType)(definition.items.$ref);
model.export = 'array';
model.type = arrayItems.type;
model.base = arrayItems.base;
model.template = arrayItems.template;
model.imports.push(...arrayItems.imports);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
else {
const arrayItems = (0, exports.getModel)(openApi, definition.items);
model.export = 'array';
model.type = arrayItems.type;
model.base = arrayItems.base;
model.template = arrayItems.template;
model.link = arrayItems;
model.imports.push(...arrayItems.imports);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
}
if (definition.type === 'object' && typeof definition.additionalProperties === 'object') {
if (definition.additionalProperties.$ref) {
const additionalProperties = (0, getType_1.getType)(definition.additionalProperties.$ref);
model.export = 'dictionary';
model.type = additionalProperties.type;
model.base = additionalProperties.base;
model.template = additionalProperties.template;
model.imports.push(...additionalProperties.imports);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
else {
const additionalProperties = (0, exports.getModel)(openApi, definition.additionalProperties);
model.export = 'dictionary';
model.type = additionalProperties.type;
model.base = additionalProperties.base;
model.template = additionalProperties.template;
model.link = additionalProperties;
model.imports.push(...additionalProperties.imports);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
}
if (definition.oneOf?.length) {
const composition = (0, getModelComposition_1.getModelComposition)(openApi, definition, definition.oneOf, 'one-of', exports.getModel);
model.export = composition.type;
model.imports.push(...composition.imports);
model.properties.push(...composition.properties);
model.enums.push(...composition.enums);
return model;
}
if (definition.anyOf?.length) {
const composition = (0, getModelComposition_1.getModelComposition)(openApi, definition, definition.anyOf, 'any-of', exports.getModel);
model.export = composition.type;
model.imports.push(...composition.imports);
model.properties.push(...composition.properties);
model.enums.push(...composition.enums);
return model;
}
if (definition.allOf?.length) {
const composition = (0, getModelComposition_1.getModelComposition)(openApi, definition, definition.allOf, 'all-of', exports.getModel);
model.export = composition.type;
model.imports.push(...composition.imports);
model.properties.push(...composition.properties);
model.enums.push(...composition.enums);
return model;
}
if (definition.type === 'object') {
model.export = 'interface';
model.type = 'any';
model.base = 'any';
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
if (definition.properties) {
const modelProperties = (0, getModelProperties_1.getModelProperties)(openApi, definition, exports.getModel, model);
modelProperties.forEach(modelProperty => {
model.imports.push(...modelProperty.imports);
model.enums.push(...modelProperty.enums);
model.properties.push(modelProperty);
if (modelProperty.export === 'enum') {
model.enums.push(modelProperty);
}
});
}
return model;
}
// If the schema has a type than it can be a basic or generic type.
if (definition.type) {
const definitionType = (0, getType_1.getType)(definition.type, definition.format);
model.export = 'generic';
model.type = definitionType.type;
model.base = definitionType.base;
model.template = definitionType.template;
model.isNullable = definitionType.isNullable || model.isNullable;
model.imports.push(...definitionType.imports);
model.default = (0, getModelDefault_1.getModelDefault)(definition, model);
return model;
}
return model;
};
exports.getModel = getModel;