Breeze / breeze.tooling

Utilities and tooling for Breeze
17 stars 12 forks source link

Generating entities directly from odata service $metadata endpoint (csdl as xml) #20

Open buchatsky opened 5 years ago

buchatsky commented 5 years ago

I've written a tsgen-odata.js script which consumes a csdl xml directly from $metadata endpoint and then calls tsgen-core.ts for entity generation. It uses datajs library to parse metadata as you do in breeze.js

var argv = require('yargs').argv;
var tsGenCore = require('./tsgen-core');
var fs = require('fs');
var doRequest = require('request');
require('datajs');
var xmldom = require('xmldom');
global.DOMParser = xmldom.DOMParser;

var metaPath = './tools/metadata.json';

try {
    //var metaUrl = 'http://localhost:51163/odata/$metadata';
    var metaUrl = argv.i || argv.input;

    OData.defaultHttpClient = {
        request: function(request, success, error) {
            doRequest({
                url: request.requestUri,
                headers: request.headers
            }, (err, resp, body) => {
                var response;
                if (!err && resp.statusCode >= 200 && resp.statusCode <= 299) {
                    response = { requestUri: request.requestUri, statusCode: resp.statusCode, statusText: resp.statusText, headers: resp.headers, body: body };
                    success(response);
                } else {
                    error({ message: "HTTP request failed", request: request, response: response });
                }
            });
        }
    };

    OData.read({
            requestUri: metaUrl,
            // headers: { "Accept": "application/json"}
            headers: { 'Accept': 'application/*; odata.metadata=full'}
        },
        function (data) {
            // data.dataServices.schema is an array of schemas. with properties of
            // entityContainer[], association[], entityType[], and namespace.
            if (!data || !data.dataServices) {
                var error = new Error("Metadata query failed for: " + url);
                return deferred.reject(error);
            }
            var csdlMetadata = data.dataServices;
            //            
            var jsonStr = JSON.stringify(csdlMetadata);
            fs.writeFile(metaPath, jsonStr, (err) => {
                if (err) throw err;

                var config = argvToConfig();
                tsGenCore.generate(config);
            });
        },
        function (error) {
            var message = "Metadata query failed; " + (error.message || "");
            console.log('Unexpected error occurred: ' + message);
        },
        OData.metadataHandler
    );

} catch (e) {
    console.log('Unexpected error occurred: ' + e.stack);
}

function argvToConfig() {
    var config = {
        inputFileName: metaPath,//argv.i || argv.input,
        outputFolder: argv.o || argv.outputFolder,
        sourceFilesFolder: argv.s || argv.sourceFiles,
        baseClassName: argv.b || argv.baseClass,
        camelCase: !!(argv.c || argv.camelCase),
        kebabCaseFileNames: !!(argv.k || argv.kebabCaseFileNames),
        useEnumTypes: !!(argv.e || argv.useEnumTypes)
    };
    return config;
}

You may treat this as a feature request