UNPKG

ern-api-gen

Version:

Electrode Native API generator

373 lines 18.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ArrayModel_1 = __importDefault(require("./models/ArrayModel")); const ModelImpl_1 = __importDefault(require("./models//ModelImpl")); const RefModel_1 = __importDefault(require("./models/RefModel")); const parameters_1 = require("./models/parameters"); const properties_1 = require("./models/properties"); const Json_1 = __importDefault(require("./java/Json")); const javaUtil_1 = require("./java/javaUtil"); const LoggerFactory_1 = __importDefault(require("./java/LoggerFactory")); function hasProperties(obj) { if (obj == null) { return false; } return javaUtil_1.isNotEmptySet(obj.getProperties()); } class InlineModelResolver { constructor() { this.addedModels = javaUtil_1.newHashMap(); this.generatedSignature = javaUtil_1.newHashMap(); this.skipMatches = false; } flatten(swagger) { this.swagger = swagger; if (swagger.getDefinitions() == null) { swagger.setDefinitions(javaUtil_1.newHashMap()); } const paths = swagger.getPaths(); const models = swagger.getDefinitions(); if (paths != null) { for (const path of paths) { const pathname = path.path; for (const operation of path.getOperations()) { const parameters = operation.getParameters(); if (javaUtil_1.isNotEmptySet(parameters)) { for (const parameter of parameters) { if (parameter != null && parameter instanceof parameters_1.BodyParameter) { const bp = parameter; if (bp.getSchema() != null) { const model = bp.getSchema(); if (model != null && model instanceof ModelImpl_1.default) { const obj = model; if (obj.getType() == null || 'object' === obj.getType()) { if (javaUtil_1.isNotEmptySet(obj.getProperties())) { this.flattenProperties(obj.getProperties(), pathname); const modelName = this.resolveModelName(obj.getTitle(), bp.getName()); bp.setSchema(new RefModel_1.default(modelName)); this.addGenerated(modelName, model); swagger.addDefinition(modelName, model); } } } else if (model != null && model instanceof ArrayModel_1.default) { const am = model; const inner = am.getItems(); if (inner != null && inner instanceof properties_1.ObjectProperty) { const op = inner; if (javaUtil_1.isNotEmptySet(op.getProperties())) { this.flattenProperties(op.getProperties(), pathname); const modelName = this.resolveModelName(op.getTitle(), bp.getName()); const innerModel = this.modelFromProperty(op, modelName); const existing = this.matchGenerated(innerModel); if (existing != null) { am.setItems(new properties_1.RefProperty(existing)); } else { am.setItems(new properties_1.RefProperty(modelName)); this.addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); } } } } } } else if (parameter instanceof parameters_1.RefParameter) { console.log('what the propertye?', parameter, operation); } } } const responses = operation.getResponses(); if (javaUtil_1.isNotEmptySet(responses)) { for (const [key, response] of responses) { const property = response.getSchema(); if (property == null) { continue; } if (property instanceof properties_1.ObjectProperty) { const op = property; if (hasProperties(op)) { const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key); const model = this.modelFromProperty(op, modelName); const existing = this.matchGenerated(model); if (existing != null) { response.setSchema(new properties_1.RefProperty(existing)); } else { response.setSchema(new properties_1.RefProperty(modelName)); this.addGenerated(modelName, model); swagger.addDefinition(modelName, model); } } } else if (property instanceof properties_1.ArrayProperty) { const ap = property; const inner = ap.getItems(); if (inner != null && inner instanceof properties_1.ObjectProperty) { const op = inner; if (hasProperties(op)) { this.flattenProperties(op.getProperties(), pathname); const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key); const innerModel = this.modelFromProperty(op, modelName); const existing = this.matchGenerated(innerModel); if (existing != null) { ap.setItems(new properties_1.RefProperty(existing)); } else { ap.setItems(new properties_1.RefProperty(modelName)); this.addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); } } } } else if (property instanceof properties_1.MapProperty) { const mp = property; const innerProperty = mp.getAdditionalProperties(); if (innerProperty != null && innerProperty instanceof properties_1.ObjectProperty) { const op = innerProperty; if (hasProperties(op)) { this.flattenProperties(op.getProperties(), pathname); const modelName = this.resolveModelName(op.getTitle(), 'inline_response_' + key); const innerModel = this.modelFromProperty(op, modelName); const existing = this.matchGenerated(innerModel); if (existing != null) { mp.setAdditionalProperties(new properties_1.RefProperty(existing)); } else { mp.setAdditionalProperties(new properties_1.RefProperty(modelName)); this.addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); } } } } } } } } } if (models != null) { for (const [modelName, model] of models) { if (model == null) { continue; } if (model instanceof ModelImpl_1.default) { this.flattenProperties(model.getProperties(), modelName); } else if (model instanceof ArrayModel_1.default) { const m = model; const inner = m.getItems(); if (inner != null && inner instanceof properties_1.ObjectProperty) { const op = inner; if (javaUtil_1.isNotEmptySet(op.getProperties())) { const innerModelName = this.uniqueName(modelName + '_inner'); const innerModel = this.modelFromProperty(op, innerModelName); const existing = this.matchGenerated(innerModel); if (existing == null) { swagger.addDefinition(innerModelName, innerModel); this.addGenerated(innerModelName, innerModel); m.setItems(new properties_1.RefProperty(innerModelName)); } else { m.setItems(new properties_1.RefProperty(existing)); } } } } } } } resolveModelName(title, key) { if (title == null) { return this.uniqueName(key); } else { return this.uniqueName(title); } } matchGenerated(model) { if (this.skipMatches) { return null; } const json = Json_1.default.pretty(model); if (this.generatedSignature.containsKey(json)) { return this.generatedSignature.get(json); } return null; } addGenerated(name, model) { this.generatedSignature.put(Json_1.default.pretty(model), name); } uniqueName(key) { let count = 0; key = key.replace(new RegExp('[^a-z_\\.A-Z0-9 ]', 'g'), ''); while (true) { let name = key; if (count > 0) { name = key + '_' + count; } if (this.swagger.getDefinitions() == null) { return name; } else if (!this.swagger.getDefinitions().containsKey(name)) { return name; } count += 1; } return key; } flattenProperties(properties, path) { if (properties == null) { return; } const propsToUpdate = javaUtil_1.newHashMap(); const modelsToAdd = javaUtil_1.newHashMap(); for (const [key, property] of properties) { if (property instanceof properties_1.ObjectProperty && hasProperties(property)) { const modelName = this.uniqueName(path + '_' + key); const model = this.modelFromProperty(property, modelName); const existing = this.matchGenerated(model); if (existing != null) { propsToUpdate.put(key, new properties_1.RefProperty(existing)); } else { propsToUpdate.put(key, new properties_1.RefProperty(modelName)); modelsToAdd.put(modelName, model); this.addGenerated(modelName, model); this.swagger.addDefinition(modelName, model); } } else if (property instanceof properties_1.ArrayProperty) { const ap = property; const inner = ap.getItems(); if (inner instanceof properties_1.ObjectProperty) { const op = inner; if (hasProperties(op)) { this.flattenProperties(op.getProperties(), path); const modelName = this.uniqueName(path + '_' + key); const innerModel = this.modelFromProperty(op, modelName); const existing = this.matchGenerated(innerModel); if (existing != null) { ap.setItems(new properties_1.RefProperty(existing)); } else { ap.setItems(new properties_1.RefProperty(modelName)); this.addGenerated(modelName, innerModel); this.swagger.addDefinition(modelName, innerModel); } } } } else if (property instanceof properties_1.MapProperty) { const mp = property; const inner = mp.getAdditionalProperties(); if (inner != null && inner instanceof properties_1.ObjectProperty) { const op = inner; if (hasProperties(op)) { this.flattenProperties(op.getProperties(), path); const modelName = this.uniqueName(path + '_' + key); const innerModel = this.modelFromProperty(op, modelName); const existing = this.matchGenerated(innerModel); if (existing != null) { mp.setAdditionalProperties(new properties_1.RefProperty(existing)); } else { mp.setAdditionalProperties(new properties_1.RefProperty(modelName)); this.addGenerated(modelName, innerModel); this.swagger.addDefinition(modelName, innerModel); } } } } } if (javaUtil_1.isNotEmptySet(propsToUpdate)) { properties.putAll(propsToUpdate); } for (const [key, definition] of modelsToAdd) { this.swagger.addDefinition(key, definition); this.addedModels.put(key, definition); } } modelFromProperty(object, path) { if (((object != null && object instanceof properties_1.ArrayProperty) || object === null) && (typeof path === 'string' || path === null)) { const description = object.getDescription(); let example = null; const obj = object.getExample(); if (obj != null) { example = obj.toString(); } const inner = object.getItems(); if (inner != null && inner instanceof properties_1.ObjectProperty) { const model = new ArrayModel_1.default(); model.setDescription(description); model.setExample(example); model.setItems(object.getItems()); return model; } return null; } else if (((object != null && object instanceof properties_1.ObjectProperty) || object === null) && (typeof path === 'string' || path === null)) { return this.modelFromProperty$io_swagger_models_properties_ObjectProperty$java_lang_String(object, path); } else if (((object != null && object instanceof properties_1.MapProperty) || object === null) && (typeof path === 'string' || path === null)) { return this.modelFromProperty$io_swagger_models_properties_MapProperty$java_lang_String(object, path); } else { throw new Error('invalid overload'); } } modelFromProperty$io_swagger_models_properties_ObjectProperty$java_lang_String(object, path) { const description = object.getDescription(); let example = null; const obj = object.getExample(); if (obj != null) { example = obj.toString(); } const name = object.getName(); const xml = object.getXml(); const properties = object.getProperties(); const model = new ModelImpl_1.default(); model.setDescription(description); model.setExample(example); model.setName(name); model.setXml(xml); if (properties != null) { this.flattenProperties(properties, path); model.setProperties(properties); } return model; } modelFromProperty$io_swagger_models_properties_MapProperty$java_lang_String(object, path) { const description = object.getDescription(); let example = null; const obj = object.getExample(); if (obj != null) { example = obj.toString(); } const model = new ArrayModel_1.default(); model.setDescription(description); model.setExample(example); model.setItems(object.getAdditionalProperties()); return model; } isSkipMatches() { return this.skipMatches; } setSkipMatches(skipMatches) { this.skipMatches = skipMatches; } } exports.default = InlineModelResolver; const Log = LoggerFactory_1.default.getLogger(InlineModelResolver); //# sourceMappingURL=InlineModelResolver.js.map