kevoree-kevscript
Version:
Kevoree KevScript module - contains parser, interpreter and grammar
120 lines (109 loc) • 4.24 kB
JavaScript
const path = require('path');
const fs = require('fs');
const chalk = require('chalk');
const config = require('tiny-conf');
const KevScript = require('./../lib/KevScript');
const kevoree = require('kevoree-library');
const kConst = require('kevoree-const');
const loggerFactory = require('kevoree-logger');
const optimist = require('optimist').usage('Usage: $0 <path/to/a/model.kevs> [-c /path/to/a/context/model.json -o /path/to/output/model.json]').demand(['o'])
// -o, --output
.alias('o', 'output').describe('o', 'Where to write the output Kevoree JSON model').default('o', 'model.json')
// -c, --ctxModel
.alias('c', 'ctxModel').describe('ctxModel', 'A context model to apply KevScript on')
// --ctxVar
.describe('ctxVar', 'A context variable to replace a %NAME% in the script (usage: --ctxVar NAME=foo)')
// --log.level
.describe('log.level', 'Change logger level (ALL|DEBUG|INFO|WARN|ERROR|QUIET) (default: INFO)');
require('tiny-conf-plugin-file')(config, kConst.CONFIG_PATH);
require('tiny-conf-plugin-argv')(config);
config.set('cache', {
root: path.join(kConst.CONFIG_PATH, '..', 'tdefs'),
ttl: 1000 * 60 * 60 * 24 // 24 hours
});
if (optimist.argv._.length === 1) {
const input = path.resolve(optimist.argv._[0]);
const output = path.resolve(optimist.argv.o);
const factory = new kevoree.factory.DefaultKevoreeFactory();
const serializer = factory.createJSONSerializer();
const logger = loggerFactory.create('KevScript');
const logLevel = config.get('log.level');
if (logLevel) {
logger.setLevel(logLevel);
}
const registryResolver = KevScript.Resolvers.registryResolverFactory(logger);
const fsResolver = KevScript.Resolvers.fsResolverFactory(logger, registryResolver);
const modelResolver = KevScript.Resolvers.modelResolverFactory(logger, fsResolver);
const rootResolver = KevScript.Resolvers.tagResolverFactory(logger, modelResolver);
const kevs = new KevScript(logger, { resolver: rootResolver });
const ctxVars = {};
if (optimist.argv.ctxVar) {
[].concat(optimist.argv.ctxVar).forEach((ctxvar) => {
const data = ctxvar.split('=');
ctxVars[data[0]] = data[1];
});
}
/**
*
* @param err
* @param model
*/
const kevscriptHandler = function (err, model) {
if (err) {
if (err.nt) {
console.log(chalk.red('Unable to parse KevScript'));
console.log('Unexpected token "' + err.nt + '" (l:' + err.line + ':' + err.col + ')');
} else {
console.log(chalk.red('KevScript execution error'));
console.log(err.stack);
}
process.exit(1);
} else {
try {
const modelStr = JSON.stringify(JSON.parse(serializer.serialize(model)), null, 4);
fs.writeFile(output, modelStr, 'utf8', (err) => {
if (err) {
throw err;
}
console.log('Kevoree model generated succefully from KevScript file');
if (Object.keys(ctxVars).length > 0) {
const ctxVarsStr = Object.keys(ctxVars).map((key) => {
return key + '=' + ctxVars[key];
}).join(', ');
console.log('ctx vars: ' + ctxVarsStr);
}
console.log('kevs used: ' + input);
console.log('model gen: ' + output);
});
} catch (err) {
console.log(chalk.red('Unable to serialize generated model') + '\n' + err.stack);
}
}
};
fs.readFile(input, 'utf8', (err, data) => {
if (err) {
throw err;
}
if (optimist.argv.c) {
const loader = factory.createJSONLoader();
fs.readFile(path.resolve(optimist.argv.c), 'utf8', (err, ctxModelSrc) => {
if (err) {
console.log(chalk.red('Unable to read context model file') + '\n' + err.stack);
process.exit(1);
} else {
try {
kevs.parse(data, loader.loadModelFromString(ctxModelSrc).get(0), ctxVars, kevscriptHandler);
} catch (err) {
console.log(chalk.red('Unable to load context model') + '\n' + err.stack);
process.exit(1);
}
}
});
} else {
kevs.parse(data, null, ctxVars, kevscriptHandler);
}
});
} else {
console.log(optimist.help());
}