From bab2ba4f64d41ed633707401a1d68bda6b573627 Mon Sep 17 00:00:00 2001 From: Ainun Nazieb Date: Tue, 24 Oct 2017 18:04:57 +0700 Subject: [PATCH] transforms apib variable property name to swagger additional properties --- package.json | 2 +- src/formatters/swagger.js | 51 +++++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 38aec84..69a1842 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "optimusjs", - "version": "0.4.5", + "version": "0.4.6", "description": "Transform API Blueprint into any other formats", "main": "dist/index.js", "bin": { diff --git a/src/formatters/swagger.js b/src/formatters/swagger.js index 7cd75cb..a37d45c 100644 --- a/src/formatters/swagger.js +++ b/src/formatters/swagger.js @@ -356,16 +356,13 @@ function getDefinitions(dataStructures) { const properties = {}; for (let content of structure.content) { - if (content.element != "member") { + if (content.element !== "member") { continue; } - const property = { - "description": content.meta.description || "", - }; + let property = {}; const memberName = content.content.key.content; - const memberType = content.content.value.element; if (isPrimitiveType(memberType)) { property["type"] = memberType; @@ -378,23 +375,26 @@ function getDefinitions(dataStructures) { } } else if (isInheritedType(memberType)) { property["$ref"] = convertDefinitionPath(memberType); - } else if (memberType == "enum") { + } else if (memberType === "enum") { const enums = convertEnum(content.content.value.content); property["type"] = enums["type"]; property["enum"] = enums["enum"]; - } else if (memberType == "array") { + } else if (memberType === "array") { property["type"] = memberType; const itemsType = content.content.value.content[0].element; - property["items"] = isPrimitiveType(itemsType) || itemsType == "object" ? { + property["items"] = isPrimitiveType(itemsType) || itemsType === "object" ? { "type": itemsType, } : { "$ref": convertDefinitionPath(itemsType), }; - } else if (memberType == "object") { - property["type"] = memberType; + } else if (memberType === "object") { + property = convertObject(content.content.value); } + property["description"] = content.hasOwnProperty("meta") && content.meta.hasOwnProperty("description") ? + content.meta.description : ""; + properties[memberName] = property; if ( @@ -444,6 +444,37 @@ function convertEnum(members) { return result; } +function convertObject(object) { + const property = {"type": "object"}; + if (!object || !object.hasOwnProperty("content") || !Array.isArray(object.content)) { + return property; + } + + const additionalProperties = {}; + for (let content of object.content) { + if ( + content.hasOwnProperty("content") && + content.content.hasOwnProperty("key") && + content.content.key.hasOwnProperty("attributes") && + content.content.key.attributes.hasOwnProperty("variable") && + content.content.key.attributes.variable === true && + content.content.hasOwnProperty("value") && + content.content.value.hasOwnProperty("element") + ) { + const memberType = content.content.value.element; + if (isPrimitiveType(memberType)) { + additionalProperties["type"] = memberType; + } else if (isInheritedType(memberType)) { + additionalProperties["$ref"] = convertDefinitionPath(memberType); + } + + property["additionalProperties"] = additionalProperties; + } + } + + return property; +} + function convertDefinitionName(name) { return Strings(name).capitalize().camelize().s; }