'use strict' const _ = require('lodash') const path = require('path') // const fs = require('fs'); const api = require('./api') const context = require('./context') const shell = require('./shell') const pkg = require('../package.json') const options = require('./options') const reactDOMSupport = require('./reactDOMSupport') const reactTemplates = require('./reactTemplates') const rtStyle = require('./rtStyle') const glob = require('glob') /** * @param {Options} currentOptions * @return {number} */ function executeOptions(currentOptions) { let ret = 0 const 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; // }); const allFiles = _.flatMap(files, f => 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) { const 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 { const sourceExt = path.extname(filename) let outputFilename 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 { const currentOptions = options.parse(args) return executeOptions(currentOptions) } catch (error) { console.error(error.message) return 1 } } module.exports = { context, execute, executeOptions, handleSingleFile, convertTemplateToReact: reactTemplates.convertTemplateToReact, convertStyle: rtStyle.convert }