UNPKG

5.72 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
9var _commander = require('commander');
10
11var _package = require('../package.json');
12
13var _package2 = _interopRequireDefault(_package);
14
15var _fs = require('fs');
16
17var _fs2 = _interopRequireDefault(_fs);
18
19var _path = require('path');
20
21var _path2 = _interopRequireDefault(_path);
22
23var _builtinTransforms = require('./builtinTransforms');
24
25var _builtinTransforms2 = _interopRequireDefault(_builtinTransforms);
26
27function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
29function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
30
31var transformsDocs = '\n Safe transforms:\n\n + arrow .......... callback to arrow function\n + arrow-return ... drop return statements in arrow functions\n + for-of ......... for loop to for-of loop\n + for-each ....... for loop to Array.forEach()\n + arg-rest ....... use of arguments to function(...args)\n + arg-spread ..... use of apply() to spread operator\n + obj-method ..... function values in objects to methods\n + obj-shorthand .. {foo: foo} to {foo}\n + no-strict ...... remove "use strict" directives\n + exponent ....... Math.pow() to ** operator (ES7)\n + multi-var ...... single var x,y; declaration to var x; var y; (refactor)\n\n Unsafe transforms:\n\n + let ............ var to let/const\n + class .......... prototype assignments to class declaration\n + commonjs ....... CommonJS module loading to import/export\n + template ....... string concatenation to template string\n + default-param .. use of || to default parameters\n + destruct-param . use destructuring for objects in function parameters\n + includes ....... indexOf() != -1 to includes() (ES7)\n';
32
33/**
34 * Command line options parser.
35 */
36
37var OptionParser = function () {
38 function OptionParser() {
39 _classCallCheck(this, OptionParser);
40
41 this.program = new _commander.Command();
42 this.program.usage('-t <transform> <file>');
43 this.program.description(_package2.default.description + '\n' + transformsDocs);
44 this.program.version(_package2.default.version);
45 this.program.option('-o, --out-file <file>', 'write output to a file');
46 this.program.option('--replace <dir>', 'in-place transform all *.js files in a directory\n <dir> can also be a single file or a glob pattern');
47 this.program.option('-t, --transform <a,b,c>', 'one or more transformations to perform', function (v) {
48 return v.split(',');
49 });
50 }
51
52 /**
53 * Parses and validates command line options from argv.
54 *
55 * - On success returns object with options.
56 * - On failure throws exceptions with error message to be shown to user.
57 *
58 * @param {String[]} argv Raw command line arguments
59 * @return {Object} options object
60 */
61
62
63 _createClass(OptionParser, [{
64 key: 'parse',
65 value: function parse(argv) {
66 this.program.parse(argv);
67
68 return {
69 inFile: this.getInputFile(),
70 outFile: this.program.outFile,
71 replace: this.getReplace(),
72 transforms: this.getTransforms()
73 };
74 }
75 }, {
76 key: 'getInputFile',
77 value: function getInputFile() {
78 if (this.program.args.length > 1) {
79 throw 'Only one input file allowed, but ' + this.program.args.length + ' given instead.';
80 }
81 if (this.program.args[0] && !_fs2.default.existsSync(this.program.args[0])) {
82 throw 'File ' + this.program.args[0] + ' does not exist.';
83 }
84 return this.program.args[0];
85 }
86 }, {
87 key: 'getReplace',
88 value: function getReplace() {
89 if (!this.program.replace) {
90 return undefined;
91 }
92 if (this.program.outFile) {
93 throw 'The --replace and --out-file options cannot be used together.';
94 }
95 if (this.program.args[0]) {
96 throw 'The --replace and plain input file options cannot be used together.\n' + 'Did you forget to quote the --replace parameter?';
97 }
98 if (_fs2.default.existsSync(this.program.replace) && _fs2.default.statSync(this.program.replace).isDirectory()) {
99 return _path2.default.join(this.program.replace, '/**/*.js');
100 }
101 return this.program.replace;
102 }
103 }, {
104 key: 'getTransforms',
105 value: function getTransforms() {
106 if (!this.program.transform || this.program.transform.length === 0) {
107 throw 'No transforms specified :(\n\n Use --transform option to pick one of the following:\n ' + transformsDocs;
108 }
109
110 // Ensure only valid transform names are used
111 this.validateTransforms(this.program.transform);
112
113 return this.program.transform;
114 }
115 }, {
116 key: 'validateTransforms',
117 value: function validateTransforms(transformNames) {
118 transformNames.forEach(function (name) {
119 if (!_builtinTransforms2.default.get(name)) {
120 throw 'Unknown transform "' + name + '".';
121 }
122 });
123 }
124 }]);
125
126 return OptionParser;
127}();
128
129exports.default = OptionParser;
130module.exports = exports['default'];
\No newline at end of file