diff --git a/packages/babel-cli/src/babel/dir.js b/packages/babel-cli/src/babel/dir.js index 234eb7c8f6..4e8a48daa6 100644 --- a/packages/babel-cli/src/babel/dir.js +++ b/packages/babel-cli/src/babel/dir.js @@ -27,8 +27,12 @@ export default async function({ return false; } - // remove extension and then append back on .js - relative = util.adjustRelative(relative, cliOptions.keepFileExtension); + relative = util.withExtension( + relative, + cliOptions.keepFileExtension + ? path.extname(relative) + : cliOptions.outFileExtension, + ); const dest = getDest(relative, base); diff --git a/packages/babel-cli/src/babel/options.js b/packages/babel-cli/src/babel/options.js index 96b4aa9c24..e32144c678 100644 --- a/packages/babel-cli/src/babel/options.js +++ b/packages/babel-cli/src/babel/options.js @@ -160,6 +160,10 @@ commander.option( "--delete-dir-on-start", "Delete the out directory before compilation.", ); +commander.option( + "--out-file-extension [string]", + "Use a specific extension for the output files", +); commander.version(pkg.version + " (@babel/core " + version + ")"); commander.usage("[options] "); @@ -237,6 +241,12 @@ export default function parseArgv(args: Array): CmdOptions | null { ); } + if (commander.keepFileExtension && commander.outFileExtension) { + errors.push( + "--out-file-extension cannot be used with --keep-file-extension", + ); + } + if (errors.length) { console.error("babel:"); errors.forEach(function(e) { @@ -293,6 +303,7 @@ export default function parseArgv(args: Array): CmdOptions | null { filenames, extensions: opts.extensions, keepFileExtension: opts.keepFileExtension, + outFileExtension: opts.outFileExtension, watch: opts.watch, skipInitialBuild: opts.skipInitialBuild, outFile: opts.outFile, diff --git a/packages/babel-cli/src/babel/util.js b/packages/babel-cli/src/babel/util.js index 9355c0ff85..3cdfe49279 100644 --- a/packages/babel-cli/src/babel/util.js +++ b/packages/babel-cli/src/babel/util.js @@ -127,12 +127,7 @@ export function requireChokidar(): Object { } } -export function adjustRelative( - relative: string, - keepFileExtension: boolean, -): string { - if (keepFileExtension) { - return relative; - } - return relative.replace(/\.(\w*?)$/, "") + ".js"; +export function withExtension(filename: string, ext: string = ".js") { + const newBasename = path.basename(filename, path.extname(filename)) + ext; + return path.join(path.dirname(filename), newBasename); } diff --git a/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/in-files/src/bar.mjs b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/in-files/src/bar.mjs new file mode 100644 index 0000000000..7c1178b8d6 --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/in-files/src/bar.mjs @@ -0,0 +1 @@ +arr.map(x => x / DIVIDER); diff --git a/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/in-files/src/foo.jsx b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/in-files/src/foo.jsx new file mode 100644 index 0000000000..4bc9539528 --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/in-files/src/foo.jsx @@ -0,0 +1 @@ +arr.map(x => x * MULTIPLIER); diff --git a/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/options.json b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/options.json new file mode 100644 index 0000000000..5150f4941a --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/options.json @@ -0,0 +1,12 @@ +{ + "args": [ + "src", + "--out-dir", + "lib", + "--out-file-extension", + ".mjs", + "--extensions", + ".jsx,.mjs", + "--verbose" + ] +} diff --git a/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/out-files/lib/bar.mjs b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/out-files/lib/bar.mjs new file mode 100644 index 0000000000..5d02843681 --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/out-files/lib/bar.mjs @@ -0,0 +1,5 @@ +"use strict"; + +arr.map(function (x) { + return x / DIVIDER; +}); diff --git a/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/out-files/lib/foo.mjs b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/out-files/lib/foo.mjs new file mode 100644 index 0000000000..ae4557e57b --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/out-files/lib/foo.mjs @@ -0,0 +1,5 @@ +"use strict"; + +arr.map(function (x) { + return x * MULTIPLIER; +}); diff --git a/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/stdout.txt b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/stdout.txt new file mode 100644 index 0000000000..24ba955afb --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/dir --out-dir --out-file-extension/stdout.txt @@ -0,0 +1,3 @@ +src/bar.mjs -> lib/bar.mjs +src/foo.jsx -> lib/foo.mjs +Successfully compiled 2 files with Babel. diff --git a/packages/babel-cli/test/fixtures/babel/error --keep-file-extension --out-file-extension/options.json b/packages/babel-cli/test/fixtures/babel/error --keep-file-extension --out-file-extension/options.json new file mode 100644 index 0000000000..8ad9743c9d --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/error --keep-file-extension --out-file-extension/options.json @@ -0,0 +1,4 @@ +{ + "args": ["--keep-file-extension", "--out-file-extension", ".mjs"], + "stderrContains": true +} diff --git a/packages/babel-cli/test/fixtures/babel/error --keep-file-extension --out-file-extension/stderr.txt b/packages/babel-cli/test/fixtures/babel/error --keep-file-extension --out-file-extension/stderr.txt new file mode 100644 index 0000000000..acc6f8edb8 --- /dev/null +++ b/packages/babel-cli/test/fixtures/babel/error --keep-file-extension --out-file-extension/stderr.txt @@ -0,0 +1 @@ +--out-file-extension cannot be used with --keep-file-extension