| #!/usr/bin/env node |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| let path = require('path'); |
|
|
| let { Parser } = require('../lib/cjs/parseargs'); |
|
|
| let ejs = require('../lib/cjs/ejs'); |
| let { hyphenToCamel } = require('../lib/cjs/utils'); |
| let fs = require('fs'); |
| let args = process.argv.slice(2); |
| let usage = fs.readFileSync(`${__dirname}/../usage.txt`).toString(); |
|
|
| function die(msg) { |
| console.log(msg); |
| process.stdout.write('', function () { |
| process.stderr.write('', function () { |
| process.exit(); |
| }); |
| }); |
| } |
|
|
| const CLI_OPTS = [ |
| { full: 'output-file', |
| abbr: 'o', |
| expectValue: true, |
| }, |
| { full: 'data-file', |
| abbr: 'f', |
| expectValue: true, |
| }, |
| { full: 'data-input', |
| abbr: 'i', |
| expectValue: true, |
| }, |
| { full: 'delimiter', |
| abbr: 'm', |
| expectValue: true, |
| passThrough: true, |
| }, |
| { full: 'open-delimiter', |
| abbr: 'p', |
| expectValue: true, |
| passThrough: true, |
| }, |
| { full: 'close-delimiter', |
| abbr: 'c', |
| expectValue: true, |
| passThrough: true, |
| }, |
| { full: 'strict', |
| abbr: 's', |
| expectValue: false, |
| allowValue: false, |
| passThrough: true, |
| }, |
| { full: 'no-with', |
| abbr: 'n', |
| expectValue: false, |
| allowValue: false, |
| }, |
| { full: 'locals-name', |
| abbr: 'l', |
| expectValue: true, |
| passThrough: true, |
| }, |
| { full: 'rm-whitespace', |
| abbr: 'w', |
| expectValue: false, |
| allowValue: false, |
| passThrough: true, |
| }, |
| { full: 'debug', |
| abbr: 'd', |
| expectValue: false, |
| allowValue: false, |
| passThrough: true, |
| }, |
| { full: 'help', |
| abbr: 'h', |
| passThrough: true, |
| }, |
| { full: 'version', |
| abbr: 'V', |
| passThrough: true, |
| }, |
| |
| { full: 'version', |
| abbr: 'v', |
| passThrough: true, |
| }, |
| ]; |
|
|
| let preempts = { |
| version: function () { |
| die(ejs.VERSION); |
| }, |
| help: function () { |
| die(usage); |
| } |
| }; |
|
|
| let stdin = ''; |
| process.stdin.setEncoding('utf8'); |
| process.stdin.on('readable', () => { |
| let chunk; |
| while ((chunk = process.stdin.read()) !== null) { |
| stdin += chunk; |
| } |
| }); |
|
|
| function run() { |
|
|
| let parser = new Parser(CLI_OPTS); |
| let result = parser.parse(args); |
|
|
| let templatePath = result.taskNames[0]; |
| let pVals = result.envVars; |
| let pOpts = {}; |
|
|
| for (let p in result.opts) { |
| let name = hyphenToCamel(p); |
| pOpts[name] = result.opts[p]; |
| } |
|
|
| let opts = {}; |
| let vals = {}; |
|
|
| |
| CLI_OPTS.forEach((opt) => { |
| let optName = hyphenToCamel(opt.full); |
| if (opt.passThrough && typeof pOpts[optName] != 'undefined') { |
| opts[optName] = pOpts[optName]; |
| } |
| }); |
|
|
| |
| for (let p in opts) { |
| if (preempts[p]) { |
| return preempts[p](); |
| } |
| } |
|
|
| |
| if (!templatePath) { |
| throw new Error('Please provide a template path. (Run ejs -h for help)'); |
| } |
|
|
| if (opts.strict) { |
| pOpts.noWith = true; |
| } |
| if (pOpts.noWith) { |
| opts._with = false; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| let input; |
| let err = new Error('Please do not pass data multiple ways. Pick one of stdin, -f, or -i.'); |
| if (stdin) { |
| input = stdin; |
| } |
| else if (pOpts.dataInput) { |
| if (input) { |
| throw err; |
| } |
| input = decodeURIComponent(pOpts.dataInput); |
| } |
| else if (pOpts.dataFile) { |
| if (input) { |
| throw err; |
| } |
| input = fs.readFileSync(pOpts.dataFile).toString(); |
| } |
|
|
| if (input) { |
| vals = JSON.parse(input); |
| } |
|
|
| |
| for (let p in pVals) { |
| vals[p] = pVals[p]; |
| } |
|
|
| opts.filename = path.resolve(process.cwd(), templatePath); |
| let template = fs.readFileSync(opts.filename).toString(); |
| let output = ejs.render(template, vals, opts); |
| if (pOpts.outputFile) { |
| fs.writeFileSync(pOpts.outputFile, output); |
| } |
| else { |
| process.stdout.write(output); |
| } |
| process.exit(); |
| } |
|
|
| |
| setImmediate(run); |
|
|