mirror of
https://github.com/LukeHagar/SwagDefGen.git
synced 2025-12-06 12:47:44 +00:00
146 lines
4.7 KiB
JavaScript
146 lines
4.7 KiB
JavaScript
function convert () {
|
|
'use strict';
|
|
var inJSON = document.getElementById("JSON").value;
|
|
try {
|
|
inJSON = JSON.parse(inJSON);
|
|
} catch (e) {
|
|
alert("Your JSON is invalid!\n(" + e +")");
|
|
return;
|
|
}
|
|
|
|
//For recursive functions to keep track of the tab spacing
|
|
var tabCount = 0;
|
|
var indentator = "\n";
|
|
//Begin definitions
|
|
var outSwagger = '"definitions": {';
|
|
|
|
function changeIndentation (count) {
|
|
let i;
|
|
if (count >= tabCount) {
|
|
i = tabCount
|
|
} else {
|
|
i = 0;
|
|
indentator = '\n';
|
|
}
|
|
for ( ; i < count; i++) {
|
|
indentator += '\t';
|
|
}
|
|
//Update tabCount
|
|
tabCount = count;
|
|
};
|
|
|
|
function convertNumber (num) {
|
|
if (num % 1 === 0) {
|
|
outSwagger += indentator + '"type": "integer",';
|
|
if (num < 2147483647 && num > -2147483647) {
|
|
outSwagger += indentator + '"format": "int32"';
|
|
} else if (Number.isSafeInteger(num)) {
|
|
outSwagger += indentator + '"format": "int64"';
|
|
} else {
|
|
outSwagger += indentator + '"format": "unsafe"';
|
|
}
|
|
} else {
|
|
outSwagger += indentator + '"type": "number"';
|
|
}
|
|
};
|
|
|
|
//ISO8601 format - https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14
|
|
function convertDate (str) {
|
|
let regxDate = /^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/,
|
|
regxDateTime = /^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]).([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]{1,2})?(Z|(\+|\-)([0-1][0-9]|2[0-3]):[0-5][0-9])$/;
|
|
if (regxDateTime.test(str)) {
|
|
outSwagger += ','
|
|
outSwagger += indentator + '"format": "date-time"';
|
|
} else if (regxDate.test(str)) {
|
|
outSwagger += ','
|
|
outSwagger += indentator + '"format": "date"';
|
|
}
|
|
};
|
|
|
|
function convertArray (obj) {
|
|
outSwagger += indentator + '"type": "array",';
|
|
outSwagger += indentator + '"items": {';
|
|
changeIndentation(tabCount + 1);
|
|
|
|
if (typeof obj === "number") { //attribute is a number
|
|
convertNumber(obj);
|
|
} else if (Object.prototype.toString.call(obj) === '[object Array]') { //attribute is an array
|
|
convertArray(obj[0]);
|
|
} else if (typeof obj === "object"){ //attribute is an object
|
|
convertObject(obj);
|
|
} else {
|
|
outSwagger += indentator + '"type": "' + typeof obj + '"';
|
|
if (typeof obj === "string") {
|
|
convertDate(obj);
|
|
}
|
|
}
|
|
changeIndentation(tabCount - 1);
|
|
outSwagger += indentator + '}';
|
|
};
|
|
|
|
function convertObject (obj) {
|
|
// ---- Begin properties scope ----
|
|
outSwagger += indentator + '"type": "object",'
|
|
outSwagger += indentator + '"properties": {';
|
|
changeIndentation(tabCount + 1);
|
|
//For each attribute inside that object
|
|
for (var prop in obj) {
|
|
// ---- Begin property type scope ----
|
|
outSwagger += indentator + '"' + prop + '": {';
|
|
changeIndentation(tabCount + 1);
|
|
if (typeof obj[prop] === "number") { //attribute is a number
|
|
convertNumber(obj[prop]);
|
|
} else if (Object.prototype.toString.call(obj[prop]) === '[object Array]') { //attribute is an array
|
|
convertArray(obj[prop][0], prop);
|
|
} else if (typeof obj[prop] === "object") { //attribute is an object
|
|
convertObject(obj[prop], prop);
|
|
} else {
|
|
outSwagger += indentator + '"type": "' + typeof obj[prop] + '"';
|
|
if (typeof obj[prop] === "string") {
|
|
convertDate(obj[prop]);
|
|
}
|
|
}
|
|
// ---- End property type scope ----
|
|
changeIndentation(tabCount - 1);
|
|
outSwagger += indentator + '},'
|
|
}
|
|
|
|
changeIndentation(tabCount - 1);
|
|
try { // ---- End properties scope ----
|
|
if (Object.keys(obj).length > 0) { //At least 1 property inserted
|
|
outSwagger = outSwagger.substring(0, outSwagger.length - 1); //Remove last comma
|
|
outSwagger += indentator + '}'
|
|
} else { // No property inserted
|
|
outSwagger += ' }';
|
|
}
|
|
} catch (e) {
|
|
alert("Cannot fetch a type for null attributes!\n(" + e + ")");
|
|
return;
|
|
}
|
|
};
|
|
|
|
//Execution begins here
|
|
changeIndentation(1);
|
|
//For each object inside the JSON
|
|
for (var obj in inJSON) {
|
|
if (typeof inJSON[obj] === "object") {
|
|
// ---- Begin object scope ----
|
|
outSwagger += indentator + '"' + obj + '": {'
|
|
changeIndentation(tabCount+1);
|
|
if (Object.prototype.toString.call(inJSON[obj]) === '[object Array]') {
|
|
convertArray(inJSON[obj][0], obj);
|
|
} else {
|
|
convertObject(inJSON[obj], obj);
|
|
}
|
|
// ---- End object scope ----
|
|
changeIndentation(tabCount-1);
|
|
outSwagger += indentator + '},';
|
|
}
|
|
}
|
|
//Remove last comma
|
|
outSwagger = outSwagger.substring(0, outSwagger.length - 1);
|
|
changeIndentation(tabCount-1);
|
|
outSwagger += indentator + '}';
|
|
document.getElementById("Swagger").value = outSwagger;
|
|
}
|