mirror of
https://github.com/bobwen-dev/react-templates
synced 2025-04-12 00:56:39 +02:00
113 lines
3.6 KiB
JavaScript
Executable File
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
|
|
}
|