react-templates
Version:
Light weight templates for react -> write html get valid react code
115 lines (108 loc) • 3.82 kB
JavaScript
var _ = require('lodash');
var path = require('path');
// const fs = require('fs');
var api = require('./api');
var context = require('./context');
var shell = require('./shell');
var pkg = require('../package.json');
var options = require('./options');
var reactDOMSupport = require('./reactDOMSupport');
var reactTemplates = require('./reactTemplates');
var rtStyle = require('./rtStyle');
var glob = require('glob');
/**
* @param {Options} currentOptions
* @return {number}
*/
function executeOptions(currentOptions) {
var ret = 0;
var files = currentOptions._;
context.options.format = currentOptions.format || 'stylish';
if (currentOptions.version) {
console.log('v' + pkg.version);
} else if (currentOptions.help) {
if (files.length) {
console.log(options.generateHelpForOption(files[0]));
} else {
console.log(options.generateHelp());
}
} else if (currentOptions.listTargetVersion) {
printVersions(currentOptions);
} else if (files.length) {
// console.log(files);
// console.log(files.length);
// const allFiles = _.flatMap(files, f => {
// const fp = path.resolve(context.cwd, f);
// if (fs.statSync(fp).isDirectory()) {
// // TODO: consider removing glob and simply walk the directory
// return glob.sync(`${fp}/**/*.rt`, {cwd: context.cwd});
// }
// return fp;
// });
var allFiles = _.flatMap(files, function (f) {
return glob.sync(f, { cwd: context.cwd });
});
// console.log(allFiles.length);
_.forEach(allFiles, handleSingleFile.bind(this, currentOptions));
ret = shell.printResults(context);
} else {
console.log(options.generateHelp());
}
return ret;
}
function printVersions(currentOptions) {
var ret = Object.keys(reactDOMSupport);
if (currentOptions.format === 'json') {
console.log(JSON.stringify(ret, undefined, 2));
} else {
console.log(ret.join(', '));
}
}
/**
* @param {Options} currentOptions
* @param {string} filename file name to process
*/
function handleSingleFile(currentOptions, filename) {
try {
var sourceExt = path.extname(filename);
var outputFilename = void 0;
if (sourceExt === '.rt') {
outputFilename = filename + (currentOptions.modules === 'typescript' ? '.ts' : '.js');
} else if (sourceExt === '.jsrt') {
outputFilename = filename.replace(/\.jsrt$/, '.js');
currentOptions = _.assign({}, currentOptions, { modules: 'jsrt' });
} else if (sourceExt === '.rts') {
outputFilename = filename + '.js';
currentOptions = _.assign({}, currentOptions, { modules: 'rts' });
} else {
context.error('invalid file, only handle rt/jsrt files', filename);
return;
}
api.convertFile(filename, outputFilename, currentOptions, context);
} catch (e) {
context.error(e.message, filename, e.line, e.column, e.startOffset, e.endOffset);
}
}
/**
* Executes the CLI based on an array of arguments that is passed in.
* @param {string|Array|Object} args The arguments to process.
* @returns {int} The exit code for the operation.
*/
function execute(args) {
try {
var currentOptions = options.parse(args);
return executeOptions(currentOptions);
} catch (error) {
console.error(error.message);
return 1;
}
}
module.exports = {
context: context,
execute: execute,
executeOptions: executeOptions,
handleSingleFile: handleSingleFile,
convertTemplateToReact: reactTemplates.convertTemplateToReact,
convertStyle: rtStyle.convert
};
;