From 26e4911eb22a75f6581febe0cedc245a683c55cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Prie=C3=ABls?= Date: Wed, 10 Jan 2018 04:17:07 +0100 Subject: [PATCH] Use the async version of transform in babel-cli (#6826) * use the async version of transform in babel-cli * Modify compile to use async version of transformFile * Babel-CLI: transform files sequentially * Remove useless res in callback --- packages/babel-cli/src/babel/dir.js | 124 +++++++++++++++++++-------- packages/babel-cli/src/babel/file.js | 46 ++++++---- packages/babel-cli/src/babel/util.js | 25 +++--- 3 files changed, 128 insertions(+), 67 deletions(-) diff --git a/packages/babel-cli/src/babel/dir.js b/packages/babel-cli/src/babel/dir.js index ca6b29c49f..c9aa57daa3 100644 --- a/packages/babel-cli/src/babel/dir.js +++ b/packages/babel-cli/src/babel/dir.js @@ -7,9 +7,13 @@ import fs from "fs"; import * as util from "./util"; export default function(commander, filenames, opts) { - function write(src, relative, base) { + function write(src, relative, base, callback) { + if (typeof base === "function") { + callback = base; + base = undefined; + } if (!util.isCompilableExtension(relative, commander.extensions)) { - return false; + return callback(); } // remove extension and then append back on .js @@ -17,7 +21,7 @@ export default function(commander, filenames, opts) { const dest = getDest(commander, relative, base); - const data = util.compile( + util.compile( src, defaults( { @@ -26,23 +30,28 @@ export default function(commander, filenames, opts) { }, opts, ), + function(err, res) { + if (err) return callback(err); + if (!res) return callback(); + + // we've requested explicit sourcemaps to be written to disk + if ( + res.map && + commander.sourceMaps && + commander.sourceMaps !== "inline" + ) { + const mapLoc = dest + ".map"; + res.code = util.addSourceMappingUrl(res.code, mapLoc); + outputFileSync(mapLoc, JSON.stringify(res.map)); + } + + outputFileSync(dest, res.code); + util.chmod(src, dest); + + util.log(src + " -> " + dest); + return callback(null, true); + }, ); - - if (!data) return false; - - // we've requested explicit sourcemaps to be written to disk - if (data.map && commander.sourceMaps && commander.sourceMaps !== "inline") { - const mapLoc = dest + ".map"; - data.code = util.addSourceMappingUrl(data.code, mapLoc); - outputFileSync(mapLoc, JSON.stringify(data.map)); - } - - outputFileSync(dest, data.code); - util.chmod(src, dest); - - util.log(src + " -> " + dest); - - return true; } function getDest(commander, filename, base) { @@ -50,17 +59,45 @@ export default function(commander, filenames, opts) { return path.join(commander.outDir, filename); } - function handleFile(src, filename, base) { - const didWrite = write(src, filename, base); - - if (!didWrite && commander.copyFiles) { - const dest = getDest(commander, filename, base); - outputFileSync(dest, fs.readFileSync(src)); - util.chmod(src, dest); + function handleFile(src, filename, base, callback) { + if (typeof base === "function") { + callback = base; + base = undefined; } + + write(src, filename, base, function(err, res) { + if (err) return callback(err); + if (!res && commander.copyFiles) { + const dest = getDest(commander, filename, base); + outputFileSync(dest, fs.readFileSync(src)); + util.chmod(src, dest); + } + + return callback(); + }); } - function handle(filename) { + function sequentialHandleFile(files, dirname, index, callback) { + if (typeof index === "function") { + callback = index; + index = 0; + } + + const filename = files[index]; + const src = path.join(dirname, filename); + + handleFile(src, filename, dirname, function(err) { + if (err) return callback(err); + index++; + if (index !== files.length) { + sequentialHandleFile(files, dirname, index, callback); + } else { + callback(); + } + }); + } + + function handle(filename, callback) { if (!fs.existsSync(filename)) return; const stat = fs.statSync(filename); @@ -72,19 +109,32 @@ export default function(commander, filenames, opts) { util.deleteDir(commander.outDir); } - util - .readdir(dirname, commander.includeDotfiles) - .forEach(function(filename) { - const src = path.join(dirname, filename); - handleFile(src, filename, dirname); - }); + const files = util.readdir(dirname, commander.includeDotfiles); + sequentialHandleFile(files, dirname, callback); } else { - write(filename, path.basename(filename), path.dirname(filename)); + write( + filename, + path.basename(filename), + path.dirname(filename), + callback, + ); } } + function sequentialHandle(filenames, index = 0) { + const filename = filenames[index]; + + handle(filename, function(err) { + if (err) throw err; + index++; + if (index !== filenames.length) { + sequentialHandle(filenames, index); + } + }); + } + if (!commander.skipInitialBuild) { - filenames.forEach(handle); + sequentialHandle(filenames); } if (commander.watch) { @@ -104,7 +154,9 @@ export default function(commander, filenames, opts) { watcher.on(type, function(filename) { const relative = path.relative(dirname, filename) || filename; try { - handleFile(filename, relative); + handleFile(filename, relative, function(err) { + if (err) throw err; + }); } catch (err) { console.error(err.stack); } diff --git a/packages/babel-cli/src/babel/file.js b/packages/babel-cli/src/babel/file.js index 480447a45a..9a08545b76 100644 --- a/packages/babel-cli/src/babel/file.js +++ b/packages/babel-cli/src/babel/file.js @@ -103,19 +103,21 @@ export default function(commander, filenames, opts) { }); process.stdin.on("end", function() { - results.push( - util.transform( - commander.filename, - code, - defaults( - { - sourceFileName: "stdin", - }, - opts, - ), + util.transform( + commander.filename, + code, + defaults( + { + sourceFileName: "stdin", + }, + opts, ), + function(err, res) { + if (err) throw err; + results.push(res); + output(); + }, ); - output(); }); }; @@ -140,7 +142,9 @@ export default function(commander, filenames, opts) { } }); - _filenames.forEach(function(filename) { + let filesProcessed = 0; + + _filenames.forEach(function(filename, index) { let sourceFilename = filename; if (commander.outFile) { sourceFilename = path.relative( @@ -150,7 +154,7 @@ export default function(commander, filenames, opts) { } sourceFilename = slash(sourceFilename); - const data = util.compile( + util.compile( filename, defaults( { @@ -158,14 +162,18 @@ export default function(commander, filenames, opts) { }, opts, ), + function(err, res) { + if (err) throw err; + + filesProcessed++; + if (res) results[index] = res; + + if (filesProcessed === _filenames.length) { + output(); + } + }, ); - - if (!data) return; - - results.push(data); }); - - output(); }; const files = function() { diff --git a/packages/babel-cli/src/babel/util.js b/packages/babel-cli/src/babel/util.js index edb9fd530a..a08580578a 100644 --- a/packages/babel-cli/src/babel/util.js +++ b/packages/babel-cli/src/babel/util.js @@ -50,25 +50,26 @@ export function log(msg) { if (!commander.quiet) console.log(msg); } -export function transform(filename, code, opts) { +export function transform(filename, code, opts, callback) { opts = Object.assign({}, opts, { filename, }); - return babel.transform(code, opts); + babel.transform(code, opts, callback); } -export function compile(filename, opts) { - try { - return babel.transformFileSync(filename, opts); - } catch (err) { - if (commander.watch) { - console.error(err); - return { ignored: true }; - } else { - throw err; +export function compile(filename, opts, callback) { + babel.transformFile(filename, opts, function(err, res) { + if (err) { + if (commander.watch) { + console.error(err); + return callback(null, { ignored: true }); + } else { + return callback(err); + } } - } + return callback(null, res); + }); } export function deleteDir(path) {