UNPKG

bobflux-gen

Version:

Generator for monkey files in bobflux application.

88 lines (87 loc) 3.39 kB
"use strict"; var url = require("url"); var http = require("http"); var odataSchema = require("./odataSchema"); var t = require("./templates"); var typeConvertor = require("./odataTypeConvertor"); var ts = require("typescript"); var gen = require("../generator"); var indentSpaces = ' '; var moduleName = 'Some.Models'; var apiServiceAlias = 'a'; var apiServiceModuleName = 'axios'; function create(logger, version, writeCallback) { return { run: function (odataMetadataUrl) { var parsedUrl = url.parse(odataMetadataUrl); downloadMetadata(parsedUrl) .then(function (xml) { logger.debug('Downloaded xml:'); logger.debug(xml); odataSchema.fromXml(xml) .then(function (obj) { logger.debug('Xml converted to object:'); obj.edmxEdmx.edmxDataServices.forEach(function (ds) { writeCallback(new Buffer([ gen.createAutogeneratedHeader(version), t.apiServiceToString(apiServiceAlias, apiServiceModuleName), t.moduleToString('', { name: moduleName, content: createContent(ds, parsedUrl.path.replace('$metadata', ''), apiServiceAlias, moduleName) }) ].join(''), 'utf-8')); }); }); }); } }; } exports.create = create; function createContent(ds, apiPath, apiServiceAlias, moduleName) { return ds.Schema.map(function (sch) { return odataSchema.isIOdataEntityTypeSchema(sch) ? sch.EntityType.map(function (e) { return t.interfaceToString(indentSpaces, { name: e.$.Name, isExported: true, properties: e.Property.map(function (p) { return ({ name: p.$.Name, valueName: ts.tokenToString(typeConvertor.EdmInt32ToTs(p.$.Type)) }); }) }); }).join('') : odataSchema.isIOdataEntitySetSchema(sch) ? t.apiGetResponse(indentSpaces) + sch.EntityContainer .map(function (ec) { return ec.EntitySet .map(function (e) { return t.apiGet(indentSpaces, { apiServiceAlias: apiServiceAlias, apiPrefix: apiPath, entitySet: e.$.Name, entityTypeName: e.$.EntityType.replace(moduleName + '.', '') }); }).join(''); }).join('') : ''; }).join(''); } function downloadMetadata(parsedUrl) { return new Promise(function (f, r) { var options = { host: parsedUrl.hostname, path: parsedUrl.path, port: Number(parsedUrl.port), method: 'GET' }; var callback = function (response) { var str = ''; response.on('data', function (chunk) { str += chunk; }); response.on('end', function () { f(str); }); }; var req = http.request(options, callback); req.end(); }); }