UNPKG

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
"use strict"; 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