react-templates/src/cli.js

113 lines
3.6 KiB
JavaScript
Executable File

'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
}