babel-backwards
Version:
Upgrade ES5 to newer language features; lebab but with babel
204 lines (150 loc) • 8.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.transformFile = transformFile;
var _commander = require('commander');
var _commander2 = _interopRequireDefault(_commander);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _glob = require('glob');
var _glob2 = _interopRequireDefault(_glob);
var _mkdirp = require('mkdirp');
var _readStdin = require('./readStdin');
var _readStdin2 = _interopRequireDefault(_readStdin);
var _recast = require('recast');
var _recast2 = _interopRequireDefault(_recast);
var _babelCore = require('babel-core');
var babel = _interopRequireWildcard(_babelCore);
var _babelPlugin5to6ObjShorthand = require('babel-plugin-5to6-obj-shorthand');
var _babelPlugin5to6ObjShorthand2 = _interopRequireDefault(_babelPlugin5to6ObjShorthand);
var _babelPlugin5to6CommonjsToImport = require('babel-plugin-5to6-commonjs-to-import');
var _babelPlugin5to6CommonjsToImport2 = _interopRequireDefault(_babelPlugin5to6CommonjsToImport);
var _babelPlugin5to6NoStrict = require('babel-plugin-5to6-no-strict');
var _babelPlugin5to6NoStrict2 = _interopRequireDefault(_babelPlugin5to6NoStrict);
var _package = require('../package.json');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
var usage = _commander2.default.version(_package.version).usage('[options] [file|indir]').description('Transforms infile with the transforms specified by -t. If -d is\n specified, reads all files from indir and transforms them into files\n in outdir.').option('-d, --out-dir <output directory>', 'Transform entire directory.').option('-t, --transform <transform>', 'Transform to apply. Can appear multiple times.', function (val, acc) {
return acc.concat(val);
}, []);
var transforms = {
'obj-shorthand': {
description: '{a:a} => {a}',
plugin: _babelPlugin5to6ObjShorthand2.default
},
'no-strict': {
description: '"use strict"; => (nothing!)',
plugin: _babelPlugin5to6NoStrict2.default
},
commonjs: {
description: 'var a = require("./b"); => import a from "b";',
plugin: _babelPlugin5to6CommonjsToImport2.default
}
};
var defaultBabelOpts = {
sourceType: 'module',
babelrc: false,
parserOpts: {
parser: _recast2.default.parse,
allowImportExportEverywhere: false,
allowReturnOutsideFunction: false,
plugins: ['asyncGenerators', 'classConstructorCall', 'classProperties', 'decorators', 'doExpressions', 'exportExtensions', 'flow', 'functionSent', 'functionBind', 'jsx', 'objectRestSpread', 'dynamicImport']
},
generatorOpts: {
generator: function generator() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
// Forces recast to reprint _everything_; maybe a bit
// dangerous/unperformant, but needs to be here or recast
// will throw an exception (TODO: still trying to isolate a
// minimal reproduction of this)
delete args[0].tokens;
// Print AST
//console.log(require('util').inspect(args[0], {depth: null}));
return _recast2.default.print.apply(_recast2.default, args);
}
}
};
// From babel-cli:
function toErrorStack(err) {
if (err._babel && err instanceof SyntaxError) {
return err.name + ': ' + err.message + '\n' + err.codeFrame;
} else {
return err.stack;
}
}
function transformFile(filename, plugins) {
var input = filename === '-' ? (0, _readStdin2.default)() : _fs2.default.readFileSync(filename, 'utf8'),
output = babel.transform(input, _extends({
filename: filename,
plugins: plugins
}, defaultBabelOpts)).code;
if (input.endsWith('\n') && !output.endsWith('\n')) {
return output + '\n';
}
return output;
}
exports.default = function () {
var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(argv) {
var _usage$parse, _usage$parse$args, _usage$parse$args$, filename, _usage$parse$transfor, desiredTransforms, outDir, plugins, stat, dirname, files;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_usage$parse = usage.parse(argv), _usage$parse$args = _slicedToArray(_usage$parse.args, 1), _usage$parse$args$ = _usage$parse$args[0], filename = _usage$parse$args$ === undefined ? '-' : _usage$parse$args$, _usage$parse$transfor = _usage$parse.transform, desiredTransforms = _usage$parse$transfor === undefined ? [] : _usage$parse$transfor, outDir = _usage$parse.outDir;
plugins = desiredTransforms.map(function (name) {
if (transforms[name]) {
return transforms[name].plugin;
} else {
var plugin = void 0;
try {
plugin = require('babel-plugin-' + name);
} catch (e) {}
if (plugin) {
return plugin;
} else {
console.warn('Unknown transform: "' + name + '", skipping.');
}
}
}).filter(Boolean);
try {
if (!outDir) {
process.stdout.write(transformFile(filename, plugins));
} else {
stat = _fs2.default.statSync(filename);
if (stat.isDirectory(filename)) {
dirname = filename;
files = _glob2.default.sync('./**/*.@(js|jsx)', {
cwd: dirname
});
files.forEach(function (filename) {
var src = _path2.default.join(dirname, filename),
dest = _path2.default.join(outDir, filename);
(0, _mkdirp.sync)(_path2.default.dirname(dest));
console.log(src + ' -> ' + dest);
_fs2.default.writeFileSync(dest, transformFile(src, plugins));
});
}
}
} catch (e) {
console.error(toErrorStack(e));
}
case 3:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function cli(_x) {
return _ref.apply(this, arguments);
}
return cli;
}();