bobflux-gen
Version:
Generator for monkey files in bobflux application.
176 lines (175 loc) • 9.29 kB
JavaScript
;
var c = require("commander");
var ts = require("typescript");
var cg = require("./cursorsGenerator");
var fcg = require("./funCursorsGenerator");
var bg = require("./buildersGenrator");
var odataGenerator = require("./odata/odata");
var tsa = require("./tsAnalyzer");
var log = require("./logger");
var fs = require("fs");
var pathPlatformDependent = require("path");
var path = pathPlatformDependent.posix; // This works everythere, just use forward slashes
function run(version) {
c
.command("odata")
.alias("o")
.description("generates odata api in typescript")
.option("-u, --metadataUlr <metadataUlr>", "defines odata metadata url")
.option("-f, --targetFile <targetFile>", "defines target file where will be odata api generated")
.option("-d, --debug <1/0>", "enables logging in debug level", /^(true|false|1|0|t|f|y|n)$/i, "0")
.action(function (o) {
var logger = humanTrue(o.debug)
? log.create(true, true, true, true)
: log.create();
logger.info('Odata api generator started');
var targetFile = o.targetFile || 'odataAxiosApi.ts';
odataGenerator
.create(logger, version, function (b) {
logger.info("Writing started into " + targetFile);
mkpathsync(path.dirname(targetFile));
fs.writeFileSync(targetFile, b);
logger.info("Writing finished");
})
.run(o.metadataUlr);
logger.info('Cursors generator finished');
});
c
.command("cursors")
.alias("c")
.description("generates cursors for each state")
.option("-p, --appStatePath <appStatePath>", "defines pattren for state files search (default is ./state.ts)")
.option("-n, --appStateName <appStateName>", "defines root name of Application state (default is IApplicationState)")
.option("-k, --parentStateKey <parentStateKey>", "defines key of parent state, it's suitable for nested states (default is empty)")
.option("-r, --recursively <1/0>", "enables recursively generation for nested states", /^(true|false|1|0|t|f|y|n)$/i, "0")
.option("-d, --debug <1/0>", "enables logging in debug level", /^(true|false|1|0|t|f|y|n)$/i, "0")
.action(function (o) {
var logger = humanTrue(o.debug)
? log.create(true, true, true, true)
: log.create();
if (o.parentStateKey)
logger.info("Parent state cursor key '" + o.parentStateKey + "' has been set");
logger.info('Cursors generator started');
if (humanTrue(o.recursively)) {
logger.info('Recurse generating has been set');
cg.default(createProjectFromDir(version, logger, currentDirectory(), o.appStatePath, o.appStateName), tsa.create(logger), logger, o.parentStateKey)
.runRecurse()
.then(function (r) { return logger.info('Cursors generator finished'); });
}
else
cg.default(createProjectFromDir(version, logger, currentDirectory(), o.appStatePath, o.appStateName), tsa.create(logger), logger, o.parentStateKey)
.run()
.then(function (r) { return logger.info('Cursors generator finished'); })
.catch(function (e) { return logger.error('Cursors generator finished with errors: ', e); });
});
c
.command("funCursors")
.alias("fc")
.description("generates functional cursors for each state")
.option("-p, --appStatePath <appStatePath>", "defines pattren for state files search (default is ./state.ts)")
.option("-n, --appStateName <appStateName>", "defines root name of Application state (default is IApplicationState)")
.option("-k, --parentStateKey <parentStateKey>", "defines key of parent state, it's suitable for nested states (default is empty)")
.option("-r, --recursively <1/0>", "enables recursively generation for nested states", /^(true|false|1|0|t|f|y|n)$/i, "0")
.option("-d, --debug <1/0>", "enables logging in debug level", /^(true|false|1|0|t|f|y|n)$/i, "0")
.action(function (o) {
var logger = humanTrue(o.debug)
? log.create(true, true, true, true)
: log.create();
if (o.parentStateKey)
logger.info("Parent state cursor key '" + o.parentStateKey + "' has been set");
logger.info('Functional cursors generator started');
if (humanTrue(o.recursively)) {
logger.info('Recurse generation has been set');
fcg.default(createProjectFromDir(version, logger, currentDirectory(), o.appStatePath, o.appStateName), tsa.create(logger), logger, o.parentStateKey)
.runRecurse()
.then(function (r) { return logger.info('Functional cursors generator finished'); });
}
else
fcg.default(createProjectFromDir(version, logger, currentDirectory(), o.appStatePath, o.appStateName), tsa.create(logger), logger, o.parentStateKey)
.run()
.then(function (r) { return logger.info('Cursors generator finished'); })
.catch(function (e) { return logger.error('Cursors generator finished with errors: ', e); });
});
c
.command("builders")
.alias("b")
.description("generates builders for each state")
.option("-p, --appStatePath <appStatePath>", "defines pattren for state files search (default is ./state.ts)")
.option("-n, --appStateName <appStateName>", "defines root name of Application state (default is IApplicationState)")
.option("-s, --specRelativePath <specRelativePath>", "defines spec directory relative path from appStatePath (default is next to states)")
.option("-r, --recursively <1/0>", "enables recursively generation for nested states", /^(true|false|1|0|t|f|y|n)$/i, "0")
.option("-k, --parentStateKey <parentStateKey>", "defines key of parent state, it's suitable for nested states (default is empty)")
.option("-d, --debug <1/0>", "enables logging in debug level", /^(true|false|1|0|t|f|y|n)$/i, "0")
.action(function (o) {
var logger = humanTrue(o.debug)
? log.create(true, true, true, true)
: log.create();
if (o.parentStateKey)
logger.info("Parent state cursor key '" + o.parentStateKey + "' has been set");
logger.info('Builders generator started');
if (humanTrue(o.recursively)) {
logger.info('Recurse generating has been set');
bg.default(createProjectFromDir(version, logger, currentDirectory(), o.appStatePath, o.appStateName, o.specRelativePath), tsa.create(logger), logger, o.parentStateKey)
.runRecurse()
.then(function (r) { return logger.info('Builders generator finished'); })
.catch(function (e) { return logger.error('Builders generator finished with errors: ', e); });
}
else
bg.default(createProjectFromDir(version, logger, currentDirectory(), o.appStatePath, o.appStateName, o.specRelativePath), tsa.create(logger), logger, o.parentStateKey)
.run()
.then(function (r) { return logger.info('Builders generator finished'); })
.catch(function (e) { return logger.error('Builders generator finished with errors: ', e); });
});
c.command('*', null, { noHelp: true }).action(function (com) {
console.log('Invalid command: ' + com);
});
c.parse(process.argv);
}
exports.run = run;
function createProjectFromDir(version, logger, dirPath, appStatePath, appStateName, relativePath) {
if (appStatePath === void 0) { appStatePath = path.join(__dirname, './state.ts'); }
if (appStateName === void 0) { appStateName = 'IApplicationState'; }
if (relativePath === void 0) { relativePath = null; }
var statePath = path.normalize(appStatePath.replace(/\\/g, '/'));
return {
version: version,
dir: dirPath.replace(/\\/g, '/'),
appStateName: appStateName,
appSourcesDirectory: path.dirname(statePath),
appStateFileName: path.basename(statePath),
tsOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES5, skipDefaultLibCheck: true },
relativePath: relativePath,
writeFileCallback: function (filename, b) {
logger.info("Writing started into " + filename);
mkpathsync(path.dirname(filename));
fs.writeFileSync(filename, b);
logger.info("Writing finished");
}
};
}
exports.createProjectFromDir = createProjectFromDir;
function currentDirectory() {
return process.cwd().replace(/\\/g, "/");
}
exports.currentDirectory = currentDirectory;
function mkpathsync(dirpath) {
try {
if (!fs.statSync(dirpath).isDirectory()) {
throw new Error(dirpath + ' exists and is not a directory');
}
}
catch (err) {
if (err.code === 'ENOENT') {
mkpathsync(path.dirname(dirpath));
fs.mkdirSync(dirpath);
}
else {
throw err;
}
}
}
exports.mkpathsync = mkpathsync;
;
function humanTrue(val) {
return /^(true|1|t|y)$/i.test(val);
}