airship-server
Version:
Airship is a framework for Node.JS & TypeScript that helps you to write big, scalable and maintainable API servers.
101 lines • 4.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const SourceCode_1 = require("../../codeGen/domain/SourceCode");
const TypescriptCodeGenerator_1 = require("../../codeGen/infrastructure/TypescriptCodeGenerator");
const CustomType_1 = require("../../codeGen/domain/types/CustomType");
const ClassScheme_1 = require("../../codeGen/domain/schema/ClassScheme");
const ClassField_1 = require("../../codeGen/domain/schema/ClassField");
const VectorType_1 = require("../../codeGen/domain/types/VectorType");
class AirshipApiSDKGenerator {
constructor() {
this._codeGenerator = new TypescriptCodeGenerator_1.default();
}
generateModelsFile(scheme) {
let code = new SourceCode_1.default();
scheme.models.forEach(m => {
code.append(this._codeGenerator.generateClass(m));
code.add('');
});
return code;
}
generateResponsesFile(scheme) {
let code = new SourceCode_1.default();
code.add(`import * as Models from './Models'`);
code.add('');
function prepareType(type) {
if (type instanceof CustomType_1.default)
return new CustomType_1.default(`Models.${type.name}`);
if (type instanceof VectorType_1.default)
return new VectorType_1.default(prepareType(type.item));
return type;
}
scheme.responses.forEach(r => {
let fields = r.fields.map(f => {
return new ClassField_1.default(f.name, prepareType(f.type), f.description);
});
code.append(this._codeGenerator.generateClass(new ClassScheme_1.default(r.name, fields)));
code.add('');
});
return code;
}
generateMethodsProps(scheme) {
let code = new SourceCode_1.default();
code.add(`import * as Models from './Models'`);
code.add('');
scheme.methods.forEach(m => {
code.append(this._codeGenerator.generateApiMethodParamsInterface(m));
code.add('');
});
return code;
}
generateApiClassFile(scheme, config) {
let code = new SourceCode_1.default();
code
.add('/**')
.add(' * This is an automatically generated code (and probably compiled with TSC)')
.add(` * Generated at ${(new Date()).toString()}`)
.add(` * Scheme version: ${config.schemeVersion}`)
.add(' */')
.add(`const API_PATH = '${config.apiPath}'`)
.add(``)
.add(`import * as Responses from './Responses'`)
.add(`import * as MethodsProps from './MethodsProps'`)
.add('')
.add(`export default class ${config.sdkName} {`)
.add(`public async call(method: string, params: Object, responseType?: Function): Promise<any> {`, 1)
.add('return fetch(', 2)
.add(`API_PATH + method,`, 3)
.add(`{`, 3)
.add(`method: 'POST',`, 4)
.add(`body: JSON.stringify(params),`, 4)
.add(`headers: {`, 4)
.add(`'Content-Type': 'application/json'`, 5)
.add(`}`, 4)
.add(`}`, 3)
.add(`)`, 2)
.add(`.then(r => {`, 3)
.add(`return r.json()`, 4)
.add(`})`, 3)
.add(`.then(json => {`, 3)
.add(`if (json.ok == false)`, 4)
.add(`throw Responses.ErrorResponse.deserialize(json)`, 5)
.add(`else`, 4)
.add(`return json`, 5)
.add(`})`, 3)
.add(`.then(data => {`, 3)
.add(`if (responseType)`, 4)
.add(`return (responseType as any).deserialize(data)`, 5)
.add('')
.add(`return data`, 4)
.add(`})`, 3)
.add(`}`, 1)
.add('');
scheme.methods.forEach(m => {
code.append(this._codeGenerator.generateApiMethod(m), 1);
});
code.add('}');
return code;
}
}
exports.default = AirshipApiSDKGenerator;
//# sourceMappingURL=AirshipApiSDKGenerator.js.map