bobflux-gen
Version:
Generator for monkey files in bobflux application.
88 lines (87 loc) • 3.39 kB
JavaScript
;
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();
});
}