airship-server
Version:
Airship is a framework for Node.JS & TypeScript that helps you to write big, scalable and maintainable API servers.
169 lines • 7.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const SourceCode_1 = require("../../codeGen/domain/SourceCode");
const NumberType_1 = require("../../codeGen/domain/types/NumberType");
const StringType_1 = require("../../codeGen/domain/types/StringType");
const CustomType_1 = require("../../codeGen/domain/types/CustomType");
const BooleanType_1 = require("../../codeGen/domain/types/BooleanType");
const VectorType_1 = require("../../codeGen/domain/types/VectorType");
const TypescriptCodeGenerator_1 = require("../../codeGen/infrastructure/TypescriptCodeGenerator");
const JavaScriptCodeGenerator_1 = require("../../codeGen/infrastructure/JavaScriptCodeGenerator");
const SwiftCodeGenerator_1 = require("../../codeGen/infrastructure/SwiftCodeGenerator");
class ApiDocGenerator {
constructor() {
this.tsCodeGenerator = new TypescriptCodeGenerator_1.default();
this.jsCodeGenerator = new JavaScriptCodeGenerator_1.default();
this.swiftCodeGenerator = new SwiftCodeGenerator_1.default();
}
generateApiDoc(scheme, schemeVersion) {
let code = new SourceCode_1.default();
code.add('<html>');
code.add('<head>');
code.add(`<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous"
>`);
code.add(`<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>`);
code.add(`<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"></script>
`);
code.add(`<title>V${schemeVersion} API Docs</title>`);
code.add('</head>');
code.add('<div class="wrapper container">');
code.add('<div class="row">');
code.add('<div class="col-md-2"></div>');
code.add('<div class="col-md-8">');
code.add(`<h1>API Docs</h1>`);
code.add(`<h4>Scheme version: ${schemeVersion}, Generated at ${(new Date()).toString()}</h4>`);
code.add(`</br>`);
code.add('<h2>Methods</h2>');
for (let method of scheme.methods) {
code.add('<div class="panel panel-primary">');
code.add(`<div class="panel-heading">${method.name}</div>`);
code.add('<div class="panel-body">');
code.add(`<h3>/${method.name}</h3>`);
code.add('<table class="table">');
code.add('<thead>');
code.add('<tr>');
code.add('<th>Param</th>');
code.add('<th>Type</th>');
code.add('</tr>');
code.add('</thead>');
code.add('<tbody>');
for (let param of method.params) {
code.add('<tr>');
code.add(`<td>${param.name}</td>`);
code.add(`<td>${this.renderType(param.type)}</td>`);
code.add('</tr>');
}
code.add('</tbody>');
code.add('</table>');
let responseType = scheme.responses.find(r => r.name == method.responseType.name);
if (!responseType)
throw new Error('Cant find response type' + method.responseType.name);
code.add(`<h3>Response: ${responseType.name}</h3>`);
code.add('<table class="table">');
code.add('<thead>');
code.add('<tr>');
code.add('<th>Field</th>');
code.add('<th>Type</th>');
code.add('</tr>');
code.add('</thead>');
code.add('<tbody>');
for (let param of responseType.fields) {
code.add('<tr>');
code.add(`<td>${param.name}</td>`);
code.add(`<td>${this.renderType(param.type)}</td>`);
code.add('</tr>');
}
code.add('</tbody>');
code.add('</table>');
code.add('</div>');
code.add('</div>');
}
code.add('<h2>Models</h2>');
for (let model of scheme.models) {
code.add(`<div class="panel panel-info" id="${model.name}">`);
code.add(`<div class="panel-heading">${model.name}</div>`);
code.add('<div class="panel-body">');
code.add(`<h3>${model.name}</h3>`);
code.add('<table class="table">');
code.add('<thead>');
code.add('<tr>');
code.add('<th>Param</th>');
code.add('<th>Type</th>');
code.add('</tr>');
code.add('</thead>');
code.add('<tbody>');
for (let param of model.fields) {
code.add('<tr>');
code.add(`<td>${param.name}</td>`);
code.add(`<td>${this.renderType(param.type)}</td>`);
code.add('</tr>');
}
code.add('</tbody>');
code.add('</table>');
let tsModelCode = new SourceCode_1.default();
tsModelCode.add('<pre>');
tsModelCode.add(this.tsCodeGenerator.generateClass(model).render());
tsModelCode.add('</pre>');
code.append(this.createCollapsablePanel('TS model code', tsModelCode));
let jsModelCode = new SourceCode_1.default();
jsModelCode.add('<pre>');
jsModelCode.add(this.jsCodeGenerator.generateClass(model).render());
jsModelCode.add('</pre>');
code.append(this.createCollapsablePanel('JS model code', jsModelCode));
let swiftModelCode = new SourceCode_1.default();
swiftModelCode.add('<pre>');
swiftModelCode.add(this.swiftCodeGenerator.generateClass(model).render());
swiftModelCode.add('</pre>');
code.append(this.createCollapsablePanel('Swift model code', swiftModelCode));
code.add('</div>');
code.add('</div>');
}
code.add('</div>');
code.add('</div>');
code.add('<div class="col-md-2"></div>');
code.add('</div>');
code.add('</html>');
return code;
}
renderType(type) {
if (type instanceof NumberType_1.default)
return 'number';
else if (type instanceof StringType_1.default)
return 'string';
else if (type instanceof CustomType_1.default)
return `<a href="#${type.name}">${type.name}</a>`;
else if (type instanceof BooleanType_1.default)
return 'bool';
else if (type instanceof VectorType_1.default)
return this.renderType(type.item) + '[ ]';
throw new Error('Unknown type');
}
createCollapsablePanel(name, content) {
let code = new SourceCode_1.default();
let randomId = Math.random().toString(16).replace('.', '');
code.add('<div class="panel-group">');
code.add('<div class="panel panel-default">');
code.add('<div class="panel-heading">');
code.add('<h4 class="panel-title">');
code.add(`<a data-toggle="collapse" href="#${randomId}">${name}</a>`);
code.add('</h4>');
code.add('</div>');
code.add(`<div id="${randomId}" class="panel-collapse collapse">`);
code.add('<div class="panel-body">');
code.append(content);
code.add('</div>');
code.add('</div>');
code.add('</div>');
code.add('</div>');
return code;
}
}
exports.default = ApiDocGenerator;
//# sourceMappingURL=ApiDocGenerator.js.map