diff --git a/Gulpfile.js b/Gulpfile.js index 678cb173d7..04535b387b 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -21,32 +21,41 @@ function swapSrcWithLib(srcPath) { gulp.task("default", ["build"]); -gulp.task("build", function () { - return gulp.src(scripts, { base: base }) - .pipe(plumber({ - errorHandler: function (err) { - gutil.log(err.stack); - }, - })) - .pipe(newer({ - dest: base, - map: swapSrcWithLib, - })) - .pipe(through.obj(function (file, enc, callback) { - gutil.log("Compiling", "'" + chalk.cyan(file.relative) + "'..."); - callback(null, file); - })) +gulp.task("build", function() { + return gulp + .src(scripts, { base: base }) + .pipe( + plumber({ + errorHandler: function(err) { + gutil.log(err.stack); + }, + }) + ) + .pipe( + newer({ + dest: base, + map: swapSrcWithLib, + }) + ) + .pipe( + through.obj(function(file, enc, callback) { + gutil.log("Compiling", "'" + chalk.cyan(file.relative) + "'..."); + callback(null, file); + }) + ) .pipe(babel()) - .pipe(through.obj(function (file, enc, callback) { - // Passing 'file.relative' because newer() above uses a relative path and this keeps it consistent. - file.path = path.resolve(file.base, swapSrcWithLib(file.relative)); - callback(null, file); - })) + .pipe( + through.obj(function(file, enc, callback) { + // Passing 'file.relative' because newer() above uses a relative path and this keeps it consistent. + file.path = path.resolve(file.base, swapSrcWithLib(file.relative)); + callback(null, file); + }) + ) .pipe(gulp.dest(base)); }); -gulp.task("watch", ["build"], function () { - watch(scripts, { debounceDelay: 200 }, function () { +gulp.task("watch", ["build"], function() { + watch(scripts, { debounceDelay: 200 }, function() { gulp.start("build"); }); }); diff --git a/packages/babel-cli/src/_babel-node.js b/packages/babel-cli/src/_babel-node.js index 4b9ac5160a..56c03c7683 100644 --- a/packages/babel-cli/src/_babel-node.js +++ b/packages/babel-cli/src/_babel-node.js @@ -24,9 +24,21 @@ function collect(value, previousValue): Array { /* eslint-disable max-len */ program.option("-e, --eval [script]", "Evaluate script"); program.option("-p, --print [code]", "Evaluate script and print result"); -program.option("-o, --only [globs]", "A comma-separated list of glob patterns to compile", collect); -program.option("-i, --ignore [globs]", "A comma-separated list of glob patterns to skip compiling", collect); -program.option("-x, --extensions [extensions]", "List of extensions to hook into [.es6,.js,.es,.jsx,.mjs]", collect); +program.option( + "-o, --only [globs]", + "A comma-separated list of glob patterns to compile", + collect, +); +program.option( + "-i, --ignore [globs]", + "A comma-separated list of glob patterns to skip compiling", + collect, +); +program.option( + "-x, --extensions [extensions]", + "List of extensions to hook into [.es6,.js,.es,.jsx,.mjs]", + collect, +); program.option("-w, --plugins [string]", "", collect); program.option("-b, --presets [string]", "", collect); /* eslint-enable max-len */ @@ -55,23 +67,28 @@ const replPlugin = ({ types: t }) => ({ VariableDeclaration(path) { if (path.node.kind !== "var") { - throw path.buildCodeFrameError("Only `var` variables are supported in the REPL"); + throw path.buildCodeFrameError( + "Only `var` variables are supported in the REPL", + ); } }, Program(path) { - if (path.get("body").some((child) => child.isExpressionStatement())) return; + if (path.get("body").some(child => child.isExpressionStatement())) return; // If the executed code doesn't evaluate to a value, // prevent implicit strict mode from printing 'use strict'. - path.pushContainer("body", t.expressionStatement(t.identifier("undefined"))); + path.pushContainer( + "body", + t.expressionStatement(t.identifier("undefined")), + ); }, }, }); // -const _eval = function (code, filename) { +const _eval = function(code, filename) { code = code.trim(); if (!code) return undefined; @@ -113,7 +130,7 @@ if (program.eval || program.print) { let i = 0; let ignoreNext = false; - args.some(function (arg, i2) { + args.some(function(arg, i2) { if (ignoreNext) { ignoreNext = false; return; @@ -133,7 +150,9 @@ if (program.eval || program.print) { // make the filename absolute const filename = args[0]; - if (!path.isAbsolute(filename)) args[0] = path.join(process.cwd(), filename); + if (!path.isAbsolute(filename)) { + args[0] = path.join(process.cwd(), filename); + } // add back on node and concat the sliced args process.argv = ["node"].concat(args); diff --git a/packages/babel-cli/src/babel-external-helpers.js b/packages/babel-cli/src/babel-external-helpers.js index 6624b64d65..2180d10773 100755 --- a/packages/babel-cli/src/babel-external-helpers.js +++ b/packages/babel-cli/src/babel-external-helpers.js @@ -10,8 +10,16 @@ function collect(value, previousValue): Array { return previousValue ? previousValue.concat(values) : values; } -commander.option("-l, --whitelist [whitelist]", "Whitelist of helpers to ONLY include", collect); -commander.option("-t, --output-type [type]", "Type of output (global|umd|var)", "global"); +commander.option( + "-l, --whitelist [whitelist]", + "Whitelist of helpers to ONLY include", + collect, +); +commander.option( + "-t, --output-type [type]", + "Type of output (global|umd|var)", + "global", +); commander.usage("[options]"); commander.parse(process.argv); diff --git a/packages/babel-cli/src/babel-node.js b/packages/babel-cli/src/babel-node.js index 101c422f0a..94682978f9 100755 --- a/packages/babel-cli/src/babel-node.js +++ b/packages/babel-cli/src/babel-node.js @@ -33,7 +33,7 @@ function getNormalizedV8Flag(arg) { return arg; } -getV8Flags(function (err, v8Flags) { +getV8Flags(function(err, v8Flags) { babelArgs.forEach(function(arg) { const flag = arg.split("=")[0]; @@ -59,7 +59,10 @@ getV8Flags(function (err, v8Flags) { break; default: - if (v8Flags.indexOf(getNormalizedV8Flag(flag)) >= 0 || arg.indexOf("--trace") === 0) { + if ( + v8Flags.indexOf(getNormalizedV8Flag(flag)) >= 0 || + arg.indexOf("--trace") === 0 + ) { args.unshift(arg); } else { args.push(arg); @@ -80,9 +83,11 @@ getV8Flags(function (err, v8Flags) { if (err.code !== "MODULE_NOT_FOUND") throw err; const child_process = require("child_process"); - const proc = child_process.spawn(process.argv[0], args, { stdio: "inherit" }); - proc.on("exit", function (code, signal) { - process.on("exit", function () { + const proc = child_process.spawn(process.argv[0], args, { + stdio: "inherit", + }); + proc.on("exit", function(code, signal) { + process.on("exit", function() { if (signal) { process.kill(process.pid, signal); } else { diff --git a/packages/babel-cli/src/babel/dir.js b/packages/babel-cli/src/babel/dir.js index 1113fd9afc..d59e4e5844 100644 --- a/packages/babel-cli/src/babel/dir.js +++ b/packages/babel-cli/src/babel/dir.js @@ -6,19 +6,27 @@ import fs from "fs"; import * as util from "./util"; -export default function (commander, filenames, opts) { +export default function(commander, filenames, opts) { function write(src, relative) { - if (!util.isCompilableExtension(relative, commander.extensions)) return false; + if (!util.isCompilableExtension(relative, commander.extensions)) { + return false; + } // remove extension and then append back on .js relative = relative.replace(/\.(\w*?)$/, "") + ".js"; const dest = path.join(commander.outDir, relative); - const data = util.compile(src, defaults({ - sourceFileName: slash(path.relative(dest + "/..", src)), - sourceMapTarget: path.basename(relative), - }, opts)); + const data = util.compile( + src, + defaults( + { + sourceFileName: slash(path.relative(dest + "/..", src)), + sourceMapTarget: path.basename(relative), + }, + opts, + ), + ); if (!data) return false; @@ -55,7 +63,7 @@ export default function (commander, filenames, opts) { if (stat.isDirectory(filename)) { const dirname = filename; - util.readdir(dirname).forEach(function (filename) { + util.readdir(dirname).forEach(function(filename) { const src = path.join(dirname, filename); handleFile(src, filename); }); @@ -71,7 +79,7 @@ export default function (commander, filenames, opts) { if (commander.watch) { const chokidar = util.requireChokidar(); - filenames.forEach(function (dirname) { + filenames.forEach(function(dirname) { const watcher = chokidar.watch(dirname, { persistent: true, ignoreInitial: true, @@ -81,8 +89,8 @@ export default function (commander, filenames, opts) { }, }); - ["add", "change"].forEach(function (type) { - watcher.on(type, function (filename) { + ["add", "change"].forEach(function(type) { + watcher.on(type, function(filename) { const relative = path.relative(dirname, filename) || filename; try { handleFile(filename, relative); diff --git a/packages/babel-cli/src/babel/file.js b/packages/babel-cli/src/babel/file.js index 689f8f9353..79ceef3f6a 100644 --- a/packages/babel-cli/src/babel/file.js +++ b/packages/babel-cli/src/babel/file.js @@ -7,14 +7,14 @@ import fs from "fs"; import * as util from "./util"; -export default function (commander, filenames, opts) { +export default function(commander, filenames, opts) { if (commander.sourceMaps === "inline") { opts.sourceMaps = true; } let results = []; - const buildResult = function () { + const buildResult = function() { const map = new sourceMap.SourceMapGenerator({ file: path.basename(commander.outFile || "") || "stdout", sourceRoot: opts.sourceRoot, @@ -23,14 +23,14 @@ export default function (commander, filenames, opts) { let code = ""; let offset = 0; - results.forEach(function (result) { + results.forEach(function(result) { code += result.code + "\n"; if (result.map) { const consumer = new sourceMap.SourceMapConsumer(result.map); const sources = new Set(); - consumer.eachMapping(function (mapping) { + consumer.eachMapping(function(mapping) { if (mapping.source != null) sources.add(mapping.source); map.addMapping({ @@ -39,14 +39,17 @@ export default function (commander, filenames, opts) { column: mapping.generatedColumn, }, source: mapping.source, - original: mapping.source == null ? null : { - line: mapping.originalLine, - column: mapping.originalColumn, - }, + original: + mapping.source == null + ? null + : { + line: mapping.originalLine, + column: mapping.originalColumn, + }, }); }); - sources.forEach((source) => { + sources.forEach(source => { const content = consumer.sourceContentFor(source, true); if (content !== null) { map.setSourceContent(source, content); @@ -59,7 +62,10 @@ export default function (commander, filenames, opts) { // add the inline sourcemap comment if we've either explicitly asked for inline source // maps, or we've requested them without any output file - if (commander.sourceMaps === "inline" || (!commander.outFile && commander.sourceMaps)) { + if ( + commander.sourceMaps === "inline" || + (!commander.outFile && commander.sourceMaps) + ) { code += "\n" + convertSourceMap.fromObject(map).toComment(); } @@ -69,7 +75,7 @@ export default function (commander, filenames, opts) { }; }; - const output = function () { + const output = function() { const result = buildResult(); if (commander.outFile) { @@ -86,36 +92,45 @@ export default function (commander, filenames, opts) { } }; - const stdin = function () { + const stdin = function() { let code = ""; process.stdin.setEncoding("utf8"); - process.stdin.on("readable", function () { + process.stdin.on("readable", function() { const chunk = process.stdin.read(); if (chunk !== null) code += chunk; }); - process.stdin.on("end", function () { - results.push(util.transform(commander.filename, code, defaults({ - sourceFileName: "stdin", - }, opts))); + process.stdin.on("end", function() { + results.push( + util.transform( + commander.filename, + code, + defaults( + { + sourceFileName: "stdin", + }, + opts, + ), + ), + ); output(); }); }; - const walk = function () { + const walk = function() { const _filenames = []; results = []; - filenames.forEach(function (filename) { + filenames.forEach(function(filename) { if (!fs.existsSync(filename)) return; const stat = fs.statSync(filename); if (stat.isDirectory()) { const dirname = filename; - util.readdirFilter(filename).forEach(function (filename) { + util.readdirFilter(filename).forEach(function(filename) { _filenames.push(path.join(dirname, filename)); }); } else { @@ -123,16 +138,25 @@ export default function (commander, filenames, opts) { } }); - _filenames.forEach(function (filename) { + _filenames.forEach(function(filename) { let sourceFilename = filename; if (commander.outFile) { - sourceFilename = path.relative(path.dirname(commander.outFile), sourceFilename); + sourceFilename = path.relative( + path.dirname(commander.outFile), + sourceFilename, + ); } sourceFilename = slash(sourceFilename); - const data = util.compile(filename, defaults({ - sourceFileName: sourceFilename, - }, opts)); + const data = util.compile( + filename, + defaults( + { + sourceFileName: sourceFilename, + }, + opts, + ), + ); if (!data) return; @@ -142,33 +166,36 @@ export default function (commander, filenames, opts) { output(); }; - const files = function () { - + const files = function() { if (!commander.skipInitialBuild) { walk(); } if (commander.watch) { const chokidar = util.requireChokidar(); - chokidar.watch(filenames, { - persistent: true, - ignoreInitial: true, - awaitWriteFinish: { - stabilityThreshold: 50, - pollInterval: 10, - }, - }).on("all", function (type, filename) { - if (!util.isCompilableExtension(filename, commander.extensions)) return; - - if (type === "add" || type === "change") { - util.log(type + " " + filename); - try { - walk(); - } catch (err) { - console.error(err.stack); + chokidar + .watch(filenames, { + persistent: true, + ignoreInitial: true, + awaitWriteFinish: { + stabilityThreshold: 50, + pollInterval: 10, + }, + }) + .on("all", function(type, filename) { + if (!util.isCompilableExtension(filename, commander.extensions)) { + return; } - } - }); + + if (type === "add" || type === "change") { + util.log(type + " " + filename); + try { + walk(); + } catch (err) { + console.error(err.stack); + } + } + }); } }; diff --git a/packages/babel-cli/src/babel/index.js b/packages/babel-cli/src/babel/index.js index 42b949f952..4ac77fd051 100755 --- a/packages/babel-cli/src/babel/index.js +++ b/packages/babel-cli/src/babel/index.js @@ -34,45 +34,117 @@ function collect(value, previousValue): Array { /* eslint-disable max-len */ // Standard Babel input configs. -commander.option("-f, --filename [filename]", "filename to use when reading from stdin - this will be used in source-maps, errors etc"); -commander.option("--presets [list]", "comma-separated list of preset names", collect); -commander.option("--plugins [list]", "comma-separated list of plugin names", collect); +commander.option( + "-f, --filename [filename]", + "filename to use when reading from stdin - this will be used in source-maps, errors etc", +); +commander.option( + "--presets [list]", + "comma-separated list of preset names", + collect, +); +commander.option( + "--plugins [list]", + "comma-separated list of plugin names", + collect, +); // Basic file input configuration. commander.option("--source-type [script|module]", ""); -commander.option("--no-babelrc", "Whether or not to look up .babelrc and .babelignore files"); -commander.option("--ignore [list]", "list of glob paths to **not** compile", collect); -commander.option("--only [list]", "list of glob paths to **only** compile", collect); +commander.option( + "--no-babelrc", + "Whether or not to look up .babelrc and .babelignore files", +); +commander.option( + "--ignore [list]", + "list of glob paths to **not** compile", + collect, +); +commander.option( + "--only [list]", + "list of glob paths to **only** compile", + collect, +); // Misc babel config. -commander.option("--no-highlight-code", "enable/disable ANSI syntax highlighting of code frames (on by default)"); +commander.option( + "--no-highlight-code", + "enable/disable ANSI syntax highlighting of code frames (on by default)", +); // General output formatting. -commander.option("--no-comments", "write comments to generated output (true by default)"); -commander.option("--retain-lines", "retain line numbers - will result in really ugly code"); -commander.option("--compact [true|false|auto]", "do not include superfluous whitespace characters and line terminators", booleanify); +commander.option( + "--no-comments", + "write comments to generated output (true by default)", +); +commander.option( + "--retain-lines", + "retain line numbers - will result in really ugly code", +); +commander.option( + "--compact [true|false|auto]", + "do not include superfluous whitespace characters and line terminators", + booleanify, +); commander.option("--minified", "save as much bytes when printing [true|false]"); -commander.option("--auxiliary-comment-before [string]", "print a comment before any injected non-user code"); -commander.option("--auxiliary-comment-after [string]", "print a comment after any injected non-user code"); +commander.option( + "--auxiliary-comment-before [string]", + "print a comment before any injected non-user code", +); +commander.option( + "--auxiliary-comment-after [string]", + "print a comment after any injected non-user code", +); // General soucemap formatting. commander.option("-s, --source-maps [true|false|inline|both]", "", booleanify); -commander.option("--source-map-target [string]", "set `file` on returned source map"); -commander.option("--source-file-name [string]", "set `sources[0]` on returned source map"); -commander.option("--source-root [filename]", "the root from which all sources are relative"); +commander.option( + "--source-map-target [string]", + "set `file` on returned source map", +); +commander.option( + "--source-file-name [string]", + "set `sources[0]` on returned source map", +); +commander.option( + "--source-root [filename]", + "the root from which all sources are relative", +); // Config params for certain module output formats. -commander.option("--module-root [filename]", "optional prefix for the AMD module formatter that will be prepend to the filename on module definitions"); +commander.option( + "--module-root [filename]", + "optional prefix for the AMD module formatter that will be prepend to the filename on module definitions", +); commander.option("-M, --module-ids", "insert an explicit id for modules"); -commander.option("--module-id [string]", "specify a custom name for module ids"); +commander.option( + "--module-id [string]", + "specify a custom name for module ids", +); // "babel" command specific arguments that are not passed to babel-core. -commander.option("-x, --extensions [extensions]", "List of extensions to compile when a directory has been input [.es6,.js,.es,.jsx,.mjs]", collect); +commander.option( + "-x, --extensions [extensions]", + "List of extensions to compile when a directory has been input [.es6,.js,.es,.jsx,.mjs]", + collect, +); commander.option("-w, --watch", "Recompile files on changes"); -commander.option("--skip-initial-build", "Do not compile files before watching"); -commander.option("-o, --out-file [out]", "Compile all input files into a single file"); -commander.option("-d, --out-dir [out]", "Compile an input directory of modules into an output directory"); -commander.option("-D, --copy-files", "When compiling a directory copy over non-compilable files"); +commander.option( + "--skip-initial-build", + "Do not compile files before watching", +); +commander.option( + "-o, --out-file [out]", + "Compile all input files into a single file", +); +commander.option( + "-d, --out-dir [out]", + "Compile an input directory of modules into an output directory", +); +commander.option( + "-D, --copy-files", + "When compiling a directory copy over non-compilable files", +); commander.option("-q, --quiet", "Don't log anything"); /* eslint-enable max-len */ @@ -84,7 +156,7 @@ commander.parse(process.argv); const errors = []; -let filenames = commander.args.reduce(function (globbed, input) { +let filenames = commander.args.reduce(function(globbed, input) { let files = glob.sync(input); if (!files.length) files = [input]; return globbed.concat(files); @@ -92,7 +164,7 @@ let filenames = commander.args.reduce(function (globbed, input) { filenames = uniq(filenames); -filenames.forEach(function (filename) { +filenames.forEach(function(filename) { if (!fs.existsSync(filename)) { errors.push(filename + " doesn't exist"); } diff --git a/packages/babel-cli/src/babel/util.js b/packages/babel-cli/src/babel/util.js index 7f393b5101..3150b3753a 100644 --- a/packages/babel-cli/src/babel/util.js +++ b/packages/babel-cli/src/babel/util.js @@ -10,7 +10,7 @@ export function chmod(src, dest) { } export function readdirFilter(filename) { - return readdir(filename).filter(function (filename) { + return readdir(filename).filter(function(filename) { return isCompilableExtension(filename); }); } @@ -20,7 +20,10 @@ export { readdir }; /** * Test if a filename ends with a compilable extension. */ -export function isCompilableExtension(filename: string, altExts?: Array): boolean { +export function isCompilableExtension( + filename: string, + altExts?: Array, +): boolean { const exts = altExts || babel.DEFAULT_EXTENSIONS; const ext = path.extname(filename); return includes(exts, ext); @@ -63,7 +66,7 @@ function toErrorStack(err) { } } -process.on("uncaughtException", function (err) { +process.on("uncaughtException", function(err) { console.error(toErrorStack(err)); process.exit(1); }); @@ -74,7 +77,7 @@ export function requireChokidar() { } catch (err) { console.error( "The optional dependency chokidar failed to install and is required for " + - "--watch. Chokidar is likely not supported on your platform." + "--watch. Chokidar is likely not supported on your platform.", ); throw err; } diff --git a/packages/babel-cli/test/index.js b/packages/babel-cli/test/index.js index a5ebfbfc55..2bfaa02c71 100644 --- a/packages/babel-cli/test/index.js +++ b/packages/babel-cli/test/index.js @@ -27,34 +27,39 @@ const pluginLocs = [ path.join(__dirname, "/../../babel-plugin-transform-es2015-modules-commonjs"), ].join(","); -const readDir = function (loc, filter) { +const readDir = function(loc, filter) { const files = {}; if (fs.existsSync(loc)) { - readdir(loc, filter).forEach(function (filename) { + readdir(loc, filter).forEach(function(filename) { files[filename] = helper.readFile(path.join(loc, filename)); }); } return files; }; -const saveInFiles = function (files) { +const saveInFiles = function(files) { // Place an empty .babelrc in each test so tests won't unexpectedly get to repo-level config. outputFileSync(".babelrc", "{}"); - Object.keys(files).forEach(function (filename) { + Object.keys(files).forEach(function(filename) { const content = files[filename]; outputFileSync(filename, content); }); }; -const assertTest = function (stdout, stderr, opts) { +const assertTest = function(stdout, stderr, opts) { const expectStderr = opts.stderr.trim(); stderr = stderr.trim(); if (opts.stderr) { if (opts.stderrContains) { - assert.ok(includes(stderr, expectStderr), "stderr " + JSON.stringify(stderr) + - " didn't contain " + JSON.stringify(expectStderr)); + assert.ok( + includes(stderr, expectStderr), + "stderr " + + JSON.stringify(stderr) + + " didn't contain " + + JSON.stringify(expectStderr), + ); } else { chai.expect(stderr).to.equal(expectStderr, "stderr didn't match"); } @@ -68,8 +73,13 @@ const assertTest = function (stdout, stderr, opts) { if (opts.stdout) { if (opts.stdoutContains) { - assert.ok(includes(stdout, expectStdout), "stdout " + JSON.stringify(stdout) + - " didn't contain " + JSON.stringify(expectStdout)); + assert.ok( + includes(stdout, expectStdout), + "stdout " + + JSON.stringify(stdout) + + " didn't contain " + + JSON.stringify(expectStdout), + ); } else { chai.expect(stdout).to.equal(expectStdout, "stdout didn't match"); } @@ -80,30 +90,34 @@ const assertTest = function (stdout, stderr, opts) { if (opts.outFiles) { const actualFiles = readDir(path.join(tmpLoc)); - Object.keys(actualFiles).forEach(function (filename) { + Object.keys(actualFiles).forEach(function(filename) { if (!opts.inFiles.hasOwnProperty(filename)) { const expect = opts.outFiles[filename]; const actual = actualFiles[filename]; - chai.expect(expect, "Output is missing: " + filename).to.not.be.undefined; + chai.expect(expect, "Output is missing: " + filename).to.not.be + .undefined; if (expect) { - chai.expect(actual).to.equal(expect, "Compiled output does not match: " + filename); + chai + .expect(actual) + .to.equal(expect, "Compiled output does not match: " + filename); } } }); Object.keys(opts.outFiles).forEach(function(filename) { - chai.expect(actualFiles, "Extraneous file in output: " + filename) + chai + .expect(actualFiles, "Extraneous file in output: " + filename) .to.contain.key(filename); }); } }; -const buildTest = function (binName, testName, opts) { +const buildTest = function(binName, testName, opts) { const binLoc = path.join(__dirname, "../lib", binName); - return function (callback) { + return function(callback) { clear(); saveInFiles(opts.inFiles); @@ -124,15 +138,15 @@ const buildTest = function (binName, testName, opts) { let stderr = ""; let stdout = ""; - spawn.stderr.on("data", function (chunk) { + spawn.stderr.on("data", function(chunk) { stderr += chunk; }); - spawn.stdout.on("data", function (chunk) { + spawn.stdout.on("data", function(chunk) { stdout += chunk; }); - spawn.on("close", function () { + spawn.on("close", function() { let err; try { @@ -142,7 +156,8 @@ const buildTest = function (binName, testName, opts) { } if (err) { - err.message = args.map((arg) => `"${ arg }"`).join(" ") + ": " + err.message; + err.message = + args.map(arg => `"${arg}"`).join(" ") + ": " + err.message; } callback(err); @@ -155,19 +170,19 @@ const buildTest = function (binName, testName, opts) { }; }; -const clear = function () { +const clear = function() { process.chdir(__dirname); if (fs.existsSync(tmpLoc)) rimraf.sync(tmpLoc); fs.mkdirSync(tmpLoc); process.chdir(tmpLoc); }; -fs.readdirSync(fixtureLoc).forEach(function (binName) { +fs.readdirSync(fixtureLoc).forEach(function(binName) { if (binName[0] === ".") return; const suiteLoc = path.join(fixtureLoc, binName); - describe("bin/" + binName, function () { - fs.readdirSync(suiteLoc).forEach(function (testName) { + describe("bin/" + binName, function() { + fs.readdirSync(suiteLoc).forEach(function(testName) { if (testName[0] === ".") return; const testLoc = path.join(suiteLoc, testName); @@ -179,7 +194,7 @@ fs.readdirSync(fixtureLoc).forEach(function (binName) { const optionsLoc = path.join(testLoc, "options.json"); if (fs.existsSync(optionsLoc)) merge(opts, require(optionsLoc)); - ["stdout", "stdin", "stderr"].forEach(function (key) { + ["stdout", "stdin", "stderr"].forEach(function(key) { const loc = path.join(testLoc, key + ".txt"); if (fs.existsSync(loc)) { opts[key] = helper.readFile(loc); diff --git a/packages/babel-code-frame/src/index.js b/packages/babel-code-frame/src/index.js index f8564a0a23..cb1901d160 100644 --- a/packages/babel-code-frame/src/index.js +++ b/packages/babel-code-frame/src/index.js @@ -90,11 +90,11 @@ function getTokenType(match) { */ function highlight(defs: Object, text: string) { - return text.replace(jsTokens, function (...args) { + return text.replace(jsTokens, function(...args) { const type = getTokenType(args); const colorize = defs[type]; if (colorize) { - return args[0].split(NEWLINE).map((str) => colorize(str)).join("\n"); + return args[0].split(NEWLINE).map(str => colorize(str)).join("\n"); } else { return args[0]; } @@ -106,9 +106,15 @@ function highlight(defs: Object, text: string) { */ function getMarkerLines( - loc: NodeLocation, source: Array, opts: Object + loc: NodeLocation, + source: Array, + opts: Object, ): { start: number, end: number, markerLines: Object } { - const startLoc: Location = Object.assign({}, { column: 0, line: -1 }, loc.start); + const startLoc: Location = Object.assign( + {}, + { column: 0, line: -1 }, + loc.start, + ); const endLoc: Location = Object.assign({}, startLoc, loc.end); const linesAbove = opts.linesAbove || 2; const linesBelow = opts.linesBelow || 3; @@ -165,12 +171,13 @@ function getMarkerLines( return { start, end, markerLines }; } -export function codeFrameColumns ( +export function codeFrameColumns( rawLines: string, loc: NodeLocation, opts: Object = {}, ): string { - const highlighted = (opts.highlightCode && Chalk.supportsColor) || opts.forceColor; + const highlighted = + (opts.highlightCode && Chalk.supportsColor) || opts.forceColor; let chalk = Chalk; if (opts.forceColor) { chalk = new Chalk.constructor({ enabled: true }); @@ -186,34 +193,39 @@ export function codeFrameColumns ( const numberMaxWidth = String(end).length; - const frame = lines.slice(start, end).map((line, index) => { - const number = start + 1 + index; - const paddedNumber = ` ${number}`.slice(-numberMaxWidth); - const gutter = ` ${paddedNumber} | `; - const hasMarker = markerLines[number]; - if (hasMarker) { - let markerLine = ""; - if (Array.isArray(hasMarker)) { - const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); - const numberOfMarkers = hasMarker[1] || 1; + const frame = lines + .slice(start, end) + .map((line, index) => { + const number = start + 1 + index; + const paddedNumber = ` ${number}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} | `; + const hasMarker = markerLines[number]; + if (hasMarker) { + let markerLine = ""; + if (Array.isArray(hasMarker)) { + const markerSpacing = line + .slice(0, Math.max(hasMarker[0] - 1, 0)) + .replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; - markerLine = [ - "\n ", - maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), - markerSpacing, - maybeHighlight(defs.marker, "^").repeat(numberOfMarkers), + markerLine = [ + "\n ", + maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), + markerSpacing, + maybeHighlight(defs.marker, "^").repeat(numberOfMarkers), + ].join(""); + } + return [ + maybeHighlight(defs.marker, ">"), + maybeHighlight(defs.gutter, gutter), + line, + markerLine, ].join(""); + } else { + return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; } - return [ - maybeHighlight(defs.marker, ">"), - maybeHighlight(defs.gutter, gutter), - line, - markerLine, - ].join(""); - } else { - return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; - } - }).join("\n"); + }) + .join("\n"); if (highlighted) { return chalk.reset(frame); @@ -226,7 +238,7 @@ export function codeFrameColumns ( * Create a code frame, adding line numbers, code highlighting, and pointing to a given position. */ -export default function ( +export default function( rawLines: string, lineNumber: number, colNumber: ?number, @@ -236,7 +248,7 @@ export default function ( deprecationWarningShown = true; const deprecationError = new Error( - "Passing lineNumber and colNumber is deprecated to babel-code-frame. Please use `codeFrameColumns`." + "Passing lineNumber and colNumber is deprecated to babel-code-frame. Please use `codeFrameColumns`.", ); deprecationError.name = "DeprecationWarning"; @@ -249,7 +261,9 @@ export default function ( colNumber = Math.max(colNumber, 0); - const location: NodeLocation = { start: { column: colNumber, line: lineNumber } }; + const location: NodeLocation = { + start: { column: colNumber, line: lineNumber }, + }; return codeFrameColumns(rawLines, location, opts); } diff --git a/packages/babel-code-frame/test/index.js b/packages/babel-code-frame/test/index.js index a0a1223463..5892b7a443 100644 --- a/packages/babel-code-frame/test/index.js +++ b/packages/babel-code-frame/test/index.js @@ -2,35 +2,29 @@ import assert from "assert"; import chalk from "chalk"; import codeFrame, { codeFrameColumns } from ".."; -describe("babel-code-frame", function () { - it("basic usage", function () { - const rawLines = [ - "class Foo {", - " constructor()", - "};", - ].join("\n"); - assert.equal(codeFrame(rawLines, 2, 16), [ - " 1 | class Foo {", - "> 2 | constructor()", - " | ^", - " 3 | };", - ].join("\n")); +describe("babel-code-frame", function() { + it("basic usage", function() { + const rawLines = ["class Foo {", " constructor()", "};"].join("\n"); + assert.equal( + codeFrame(rawLines, 2, 16), + [ + " 1 | class Foo {", + "> 2 | constructor()", + " | ^", + " 3 | };", + ].join("\n"), + ); }); - it("optional column number", function () { - const rawLines = [ - "class Foo {", - " constructor()", - "};", - ].join("\n"); - assert.equal(codeFrame(rawLines, 2, null), [ - " 1 | class Foo {", - "> 2 | constructor()", - " 3 | };", - ].join("\n")); + it("optional column number", function() { + const rawLines = ["class Foo {", " constructor()", "};"].join("\n"); + assert.equal( + codeFrame(rawLines, 2, null), + [" 1 | class Foo {", "> 2 | constructor()", " 3 | };"].join("\n"), + ); }); - it("maximum context lines and padding", function () { + it("maximum context lines and padding", function() { const rawLines = [ "/**", " * Sums two numbers.", @@ -44,18 +38,21 @@ describe("babel-code-frame", function () { " return a + b", "}", ].join("\n"); - assert.equal(codeFrame(rawLines, 7, 2), [ - " 5 | * @param b Number", - " 6 | * @returns Number", - "> 7 | */", - " | ^", - " 8 | ", - " 9 | function sum(a, b) {", - " 10 | return a + b", - ].join("\n")); + assert.equal( + codeFrame(rawLines, 7, 2), + [ + " 5 | * @param b Number", + " 6 | * @returns Number", + "> 7 | */", + " | ^", + " 8 | ", + " 9 | function sum(a, b) {", + " 10 | return a + b", + ].join("\n"), + ); }); - it("no unnecessary padding due to one-off errors", function () { + it("no unnecessary padding due to one-off errors", function() { const rawLines = [ "/**", " * Sums two numbers.", @@ -69,43 +66,49 @@ describe("babel-code-frame", function () { " return a + b", "}", ].join("\n"); - assert.equal(codeFrame(rawLines, 6, 2), [ - " 4 | * @param a Number", - " 5 | * @param b Number", - "> 6 | * @returns Number", - " | ^", - " 7 | */", - " 8 | ", - " 9 | function sum(a, b) {", - ].join("\n")); + assert.equal( + codeFrame(rawLines, 6, 2), + [ + " 4 | * @param a Number", + " 5 | * @param b Number", + "> 6 | * @returns Number", + " | ^", + " 7 | */", + " 8 | ", + " 9 | function sum(a, b) {", + ].join("\n"), + ); }); - it("tabs", function () { + it("tabs", function() { const rawLines = [ "\tclass Foo {", "\t \t\t constructor\t(\t)", "\t};", ].join("\n"); - assert.equal(codeFrame(rawLines, 2, 25), [ - " 1 | \tclass Foo {", - "> 2 | \t \t\t constructor\t(\t)", - " | \t \t\t \t \t ^", - " 3 | \t};", - ].join("\n")); + assert.equal( + codeFrame(rawLines, 2, 25), + [ + " 1 | \tclass Foo {", + "> 2 | \t \t\t constructor\t(\t)", + " | \t \t\t \t \t ^", + " 3 | \t};", + ].join("\n"), + ); }); - it("opts.highlightCode", function () { + it("opts.highlightCode", function() { const rawLines = "console.log('babel')"; const result = codeFrame(rawLines, 1, 9, { highlightCode: true }); const stripped = chalk.stripColor(result); assert.ok(result.length > stripped.length); - assert.equal(stripped, [ - "> 1 | console.log('babel')", - " | ^", - ].join("\n")); + assert.equal( + stripped, + ["> 1 | console.log('babel')", " | ^"].join("\n"), + ); }); - it("opts.linesAbove", function () { + it("opts.linesAbove", function() { const rawLines = [ "/**", " * Sums two numbers.", @@ -119,17 +122,20 @@ describe("babel-code-frame", function () { " return a + b", "}", ].join("\n"); - assert.equal(codeFrame(rawLines, 7, 2, { linesAbove: 1 }), [ - " 6 | * @returns Number", - "> 7 | */", - " | ^", - " 8 | ", - " 9 | function sum(a, b) {", - " 10 | return a + b", - ].join("\n")); + assert.equal( + codeFrame(rawLines, 7, 2, { linesAbove: 1 }), + [ + " 6 | * @returns Number", + "> 7 | */", + " | ^", + " 8 | ", + " 9 | function sum(a, b) {", + " 10 | return a + b", + ].join("\n"), + ); }); - it("opts.linesBelow", function () { + it("opts.linesBelow", function() { const rawLines = [ "/**", " * Sums two numbers.", @@ -143,16 +149,19 @@ describe("babel-code-frame", function () { " return a + b", "}", ].join("\n"); - assert.equal(codeFrame(rawLines, 7, 2, { linesBelow: 1 }), [ - " 5 | * @param b Number", - " 6 | * @returns Number", - "> 7 | */", - " | ^", - " 8 | ", - ].join("\n")); + assert.equal( + codeFrame(rawLines, 7, 2, { linesBelow: 1 }), + [ + " 5 | * @param b Number", + " 6 | * @returns Number", + "> 7 | */", + " | ^", + " 8 | ", + ].join("\n"), + ); }); - it("opts.linesAbove and opts.linesBelow", function () { + it("opts.linesAbove and opts.linesBelow", function() { const rawLines = [ "/**", " * Sums two numbers.", @@ -166,78 +175,82 @@ describe("babel-code-frame", function () { " return a + b", "}", ].join("\n"); - assert.equal(codeFrame(rawLines, 7, 2, { linesAbove: 1, linesBelow: 1 }), [ - " 6 | * @returns Number", - "> 7 | */", - " | ^", - " 8 | ", - ].join("\n")); + assert.equal( + codeFrame(rawLines, 7, 2, { linesAbove: 1, linesBelow: 1 }), + [" 6 | * @returns Number", "> 7 | */", " | ^", " 8 | "].join( + "\n", + ), + ); }); it("opts.forceColor", function() { const marker = chalk.red.bold; const gutter = chalk.grey; - const rawLines = [ - "", - "", - "", - "", - ].join("\n"); - assert.equal(codeFrame(rawLines, 3, null, { linesAbove: 1, linesBelow: 1, forceColor: true }), - chalk.reset([ - " " + gutter(" 2 | "), - marker(">") + gutter(" 3 | "), - " " + gutter(" 4 | "), - ].join("\n")) + const rawLines = ["", "", "", ""].join("\n"); + assert.equal( + codeFrame(rawLines, 3, null, { + linesAbove: 1, + linesBelow: 1, + forceColor: true, + }), + chalk.reset( + [ + " " + gutter(" 2 | "), + marker(">") + gutter(" 3 | "), + " " + gutter(" 4 | "), + ].join("\n"), + ), ); }); - it("basic usage, new API", function () { - const rawLines = [ - "class Foo {", - " constructor()", - "};", - ].join("\n"); - assert.equal(codeFrameColumns(rawLines, { start: { line: 2, column: 16 } }), [ - " 1 | class Foo {", - "> 2 | constructor()", - " | ^", - " 3 | };", - ].join("\n")); + it("basic usage, new API", function() { + const rawLines = ["class Foo {", " constructor()", "};"].join("\n"); + assert.equal( + codeFrameColumns(rawLines, { start: { line: 2, column: 16 } }), + [ + " 1 | class Foo {", + "> 2 | constructor()", + " | ^", + " 3 | };", + ].join("\n"), + ); }); it("mark multiple columns", function() { - const rawLines = [ - "class Foo {", - " constructor()", - "};", - ].join("\n"); + const rawLines = ["class Foo {", " constructor()", "};"].join("\n"); assert.equal( - codeFrameColumns(rawLines, { start: { line: 2, column: 3 }, end: { line: 2, column: 16 } }), [ + codeFrameColumns(rawLines, { + start: { line: 2, column: 3 }, + end: { line: 2, column: 16 }, + }), + [ " 1 | class Foo {", "> 2 | constructor()", " | ^^^^^^^^^^^^^", " 3 | };", - ].join("\n")); + ].join("\n"), + ); }); it("mark multiple columns across lines", function() { - const rawLines = [ - "class Foo {", - " constructor() {", - " }", - "};", - ].join("\n"); + const rawLines = ["class Foo {", " constructor() {", " }", "};"].join( + "\n", + ); assert.equal( - codeFrameColumns(rawLines, { start: { line: 2, column: 17 }, end: { line: 3, column: 3 } }), [ + codeFrameColumns(rawLines, { + start: { line: 2, column: 17 }, + end: { line: 3, column: 3 }, + }), + [ " 1 | class Foo {", "> 2 | constructor() {", " | ^", "> 3 | }", " | ^^^", " 4 | };", - ].join("\n")); + ].join("\n"), + ); }); it("mark multiple columns across multiple lines", function() { @@ -249,7 +262,11 @@ describe("babel-code-frame", function () { "};", ].join("\n"); assert.equal( - codeFrameColumns(rawLines, { start: { line: 2, column: 17 }, end: { line: 4, column: 3 } }), [ + codeFrameColumns(rawLines, { + start: { line: 2, column: 17 }, + end: { line: 4, column: 3 }, + }), + [ " 1 | class Foo {", "> 2 | constructor() {", " | ^", @@ -258,7 +275,8 @@ describe("babel-code-frame", function () { "> 4 | }", " | ^^^", " 5 | };", - ].join("\n")); + ].join("\n"), + ); }); it("mark across multiple lines without columns", function() { @@ -270,12 +288,14 @@ describe("babel-code-frame", function () { "};", ].join("\n"); assert.equal( - codeFrameColumns(rawLines, { start: { line: 2 }, end: { line: 4 } }), [ + codeFrameColumns(rawLines, { start: { line: 2 }, end: { line: 4 } }), + [ " 1 | class Foo {", "> 2 | constructor() {", "> 3 | console.log(arguments);", "> 4 | }", " 5 | };", - ].join("\n")); + ].join("\n"), + ); }); }); diff --git a/packages/babel-core/src/config/build-config-chain.js b/packages/babel-core/src/config/build-config-chain.js index 7c9813f14d..dd10f3166c 100644 --- a/packages/babel-core/src/config/build-config-chain.js +++ b/packages/babel-core/src/config/build-config-chain.js @@ -7,14 +7,14 @@ import micromatch from "micromatch"; import { findConfigs, loadConfig } from "./loading/files"; type ConfigItem = { - type: "options"|"arguments", + type: "options" | "arguments", options: {}, dirname: string, alias: string, loc: string, }; -export default function buildConfigChain(opts: {}): Array|null { +export default function buildConfigChain(opts: {}): Array | null { if (typeof opts.filename !== "string" && opts.filename != null) { throw new Error(".filename must be a string, null, or undefined"); } @@ -44,9 +44,9 @@ export default function buildConfigChain(opts: {}): Array|null { } class ConfigChainBuilder { - filename: string|null; + filename: string | null; configs: Array; - possibleDirs: null|Array; + possibleDirs: null | Array; constructor(filename) { this.configs = []; @@ -57,16 +57,14 @@ class ConfigChainBuilder { /** * Tests if a filename should be ignored based on "ignore" and "only" options. */ - shouldIgnore( - ignore: mixed, - only: mixed, - dirname: string, - ): boolean { + shouldIgnore(ignore: mixed, only: mixed, dirname: string): boolean { if (!this.filename) return false; if (ignore) { if (!Array.isArray(ignore)) { - throw new Error(`.ignore should be an array, ${JSON.stringify(ignore)} given`); + throw new Error( + `.ignore should be an array, ${JSON.stringify(ignore)} given`, + ); } if (this.matchesPatterns(ignore, dirname)) return true; @@ -74,7 +72,9 @@ class ConfigChainBuilder { if (only) { if (!Array.isArray(only)) { - throw new Error(`.only should be an array, ${JSON.stringify(only)} given`); + throw new Error( + `.only should be an array, ${JSON.stringify(only)} given`, + ); } if (!this.matchesPatterns(only, dirname)) return true; @@ -89,21 +89,27 @@ class ConfigChainBuilder { */ matchesPatterns(patterns: Array, dirname: string) { const filename = this.filename; - if (!filename) throw new Error("Assertion failure: .filename should always exist here"); + if (!filename) { + throw new Error("Assertion failure: .filename should always exist here"); + } const res = []; const strings = []; const fns = []; - patterns.forEach((pattern) => { + patterns.forEach(pattern => { if (typeof pattern === "string") strings.push(pattern); else if (typeof pattern === "function") fns.push(pattern); else if (pattern instanceof RegExp) res.push(pattern); - else throw new Error("Patterns must be a string, function, or regular expression"); + else { + throw new Error( + "Patterns must be a string, function, or regular expression", + ); + } }); - if (res.some((re) => re.test(filename))) return true; - if (fns.some((fn) => fn(filename))) return true; + if (res.some(re => re.test(filename))) return true; + if (fns.some(fn => fn(filename))) return true; if (strings.length > 0) { let possibleDirs = this.possibleDirs; @@ -123,7 +129,7 @@ class ConfigChainBuilder { } } - const absolutePatterns = strings.map((pattern) => { + const absolutePatterns = strings.map(pattern => { // Preserve the "!" prefix so that micromatch can use it for negation. const negate = pattern[0] === "!"; if (negate) pattern = pattern.slice(1); @@ -131,7 +137,9 @@ class ConfigChainBuilder { return (negate ? "!" : "") + path.resolve(dirname, pattern); }); - if (micromatch(possibleDirs, absolutePatterns, { nocase: true }).length > 0) { + if ( + micromatch(possibleDirs, absolutePatterns, { nocase: true }).length > 0 + ) { return true; } } @@ -150,16 +158,16 @@ class ConfigChainBuilder { }); } - mergeConfig({ - type, - options: rawOpts, - alias, - dirname, - }) { + mergeConfig({ type, options: rawOpts, alias, dirname }) { // Bail out ASAP if this file is ignored so that we run as little logic as possible on ignored files. - if (this.filename && this.shouldIgnore(rawOpts.ignore || null, rawOpts.only || null, dirname)) { + if ( + this.filename && + this.shouldIgnore(rawOpts.ignore || null, rawOpts.only || null, dirname) + ) { // TODO(logan): This is a really cross way to bail out. Avoid this in rewrite. - throw Object.assign((new Error("This file has been ignored."): any), { code: "BABEL_IGNORED_FILE" }); + throw Object.assign((new Error("This file has been ignored."): any), { + code: "BABEL_IGNORED_FILE", + }); } const options = Object.assign({}, rawOpts); @@ -168,13 +176,19 @@ class ConfigChainBuilder { const envKey = getEnv(); - if (rawOpts.env != null && (typeof rawOpts.env !== "object" || Array.isArray(rawOpts.env))) { + if ( + rawOpts.env != null && + (typeof rawOpts.env !== "object" || Array.isArray(rawOpts.env)) + ) { throw new Error(".env block must be an object, null, or undefined"); } const envOpts = rawOpts.env && rawOpts.env[envKey]; - if (envOpts != null && (typeof envOpts !== "object" || Array.isArray(envOpts))) { + if ( + envOpts != null && + (typeof envOpts !== "object" || Array.isArray(envOpts)) + ) { throw new Error(".env[...] block must be an object, null, or undefined"); } @@ -196,11 +210,13 @@ class ConfigChainBuilder { }); if (rawOpts.extends) { - if (typeof rawOpts.extends !== "string") throw new Error(".extends must be a string"); + if (typeof rawOpts.extends !== "string") { + throw new Error(".extends must be a string"); + } const extendsConfig = loadConfig(rawOpts.extends, dirname); - const existingConfig = this.configs.some((config) => { + const existingConfig = this.configs.some(config => { return config.alias === extendsConfig.filepath; }); if (!existingConfig) { @@ -214,4 +230,3 @@ class ConfigChainBuilder { } } } - diff --git a/packages/babel-core/src/config/caching.js b/packages/babel-core/src/config/caching.js index 7f27735874..24d3e748bb 100644 --- a/packages/babel-core/src/config/caching.js +++ b/packages/babel-core/src/config/caching.js @@ -13,7 +13,7 @@ type CacheConfiguratorObj = { invalidate: (handler: () => T) => T, }; -type CacheEntry = Array<[ ResultT, () => boolean ]>; +type CacheEntry = Array<[ResultT, () => boolean]>; /** * Given a function with a single argument, cache its results based on its argument and how it @@ -22,7 +22,7 @@ type CacheEntry = Array<[ ResultT, () => boolean ]>; export function makeStrongCache( handler: (ArgT, CacheConfigurator) => ResultT, autoPermacache?: boolean, -): (ArgT) => ResultT { +): ArgT => ResultT { return makeCachedFunction(new Map(), handler, autoPermacache); } @@ -34,22 +34,24 @@ export function makeStrongCache( export function makeWeakCache( handler: (ArgT, CacheConfigurator) => ResultT, autoPermacache?: boolean, -): (ArgT) => ResultT { +): ArgT => ResultT { return makeCachedFunction(new WeakMap(), handler, autoPermacache); } -type CacheMap = Map>|WeakMap>; +type CacheMap = + | Map> + | WeakMap>; function makeCachedFunction>( callCache: Cache, handler: (ArgT, CacheConfigurator) => ResultT, autoPermacache: boolean = true, -): (ArgT) => ResultT { +): ArgT => ResultT { return function cachedFunction(arg) { - let cachedValue: CacheEntry|void = callCache.get(arg); + let cachedValue: CacheEntry | void = callCache.get(arg); if (cachedValue) { - for (const [ value, valid ] of cachedValue) { + for (const [value, valid] of cachedValue) { if (valid()) return value; } } @@ -64,55 +66,53 @@ function makeCachedFunction>( if (!result.configured) { // eslint-disable-next-line max-len - throw new Error([ - "Caching was left unconfigured. Babel's plugins, presets, and .babelrc.js files can be configured", - "for various types of caching, using the first param of their handler functions:", - "", - "module.exports = function(api) {", - " // The API exposes the following:", - "", - " // Cache the returned value forever and don't call this function again.", - " api.cache(true);", - "", - " // Don't cache at all. Not recommended because it will be very slow.", - " api.cache(false);", - "", - " // Cached based on the value of some function. If this function returns a value different from", - " // a previously-encountered value, the plugins will re-evaluate.", - " var env = api.cache(() => process.env.NODE_ENV);", - "", - " // If testing for a specific env, we recommend specifics to avoid instantiating a plugin for", - " // any possible NODE_ENV value that might come up during plugin execution.", - " var isProd = api.cache(() => process.env.NODE_ENV === \"production\");", - "", - " // .cache(fn) will perform a linear search though instances to find the matching plugin based", - " // based on previous instantiated plugins. If you want to recreate the plugin and discard the", - " // previous instance whenever something changes, you may use:", - " var isProd = api.cache.invalidate(() => process.env.NODE_ENV === \"production\");", - "", - " // Note, we also expose the following more-verbose versions of the above examples:", - " api.cache.forever(); // api.cache(true)", - " api.cache.never(); // api.cache(false)", - " api.cache.using(fn); // api.cache(fn)", - "", - " // Return the value that will be cached.", - " return { };", - "};", - ].join("\n")); + throw new Error( + [ + "Caching was left unconfigured. Babel's plugins, presets, and .babelrc.js files can be configured", + "for various types of caching, using the first param of their handler functions:", + "", + "module.exports = function(api) {", + " // The API exposes the following:", + "", + " // Cache the returned value forever and don't call this function again.", + " api.cache(true);", + "", + " // Don't cache at all. Not recommended because it will be very slow.", + " api.cache(false);", + "", + " // Cached based on the value of some function. If this function returns a value different from", + " // a previously-encountered value, the plugins will re-evaluate.", + " var env = api.cache(() => process.env.NODE_ENV);", + "", + " // If testing for a specific env, we recommend specifics to avoid instantiating a plugin for", + " // any possible NODE_ENV value that might come up during plugin execution.", + ' var isProd = api.cache(() => process.env.NODE_ENV === "production");', + "", + " // .cache(fn) will perform a linear search though instances to find the matching plugin based", + " // based on previous instantiated plugins. If you want to recreate the plugin and discard the", + " // previous instance whenever something changes, you may use:", + ' var isProd = api.cache.invalidate(() => process.env.NODE_ENV === "production");', + "", + " // Note, we also expose the following more-verbose versions of the above examples:", + " api.cache.forever(); // api.cache(true)", + " api.cache.never(); // api.cache(false)", + " api.cache.using(fn); // api.cache(fn)", + "", + " // Return the value that will be cached.", + " return { };", + "};", + ].join("\n"), + ); } if (!result.never) { if (result.forever) { - cachedValue = [ - [value, () => true], - ]; + cachedValue = [[value, () => true]]; } else if (result.invalidate) { - cachedValue = [ - [value, result.valid], - ]; + cachedValue = [[value, result.valid]]; } else { cachedValue = cachedValue || []; - cachedValue.push([ value, result.valid ]); + cachedValue.push([value, result.valid]); } callCache.set(arg, cachedValue); } @@ -121,7 +121,11 @@ function makeCachedFunction>( }; } -function makeCacheConfig(): { cache: CacheConfigurator, result: *, deactivate: () => void } { +function makeCacheConfig(): { + cache: CacheConfigurator, + result: *, + deactivate: () => void, +} { const pairs = []; const result = { @@ -137,51 +141,80 @@ function makeCacheConfig(): { cache: CacheConfigurator, result: *, deactivate: ( active = false; }; - const cache: CacheConfigurator = Object.assign((function cacheFn(val) { - if (typeof val === "boolean") { - if (val) cache.forever(); - else cache.never(); - return; - } - - return cache.using(val); - }: any), ({ - forever() { - if (!active) throw new Error("Cannot change caching after evaluation has completed."); - if (result.never) throw new Error("Caching has already been configured with .never()"); - result.forever = true; - result.configured = true; - }, - never() { - if (!active) throw new Error("Cannot change caching after evaluation has completed."); - if (result.forever) throw new Error("Caching has already been configured with .forever()"); - result.never = true; - result.configured = true; - }, - using(handler: () => T): T { - if (!active) throw new Error("Cannot change caching after evaluation has completed."); - if (result.never || result.forever) { - throw new Error("Caching has already been configured with .never or .forever()"); + const cache: CacheConfigurator = Object.assign( + (function cacheFn(val) { + if (typeof val === "boolean") { + if (val) cache.forever(); + else cache.never(); + return; } - result.configured = true; - const key = handler(); - pairs.push([ key, handler ]); - return key; - }, - invalidate(handler: () => T): T { - if (!active) throw new Error("Cannot change caching after evaluation has completed."); - if (result.never || result.forever) { - throw new Error("Caching has already been configured with .never or .forever()"); - } - result.invalidate = true; - result.configured = true; + return cache.using(val); + }: any), + ({ + forever() { + if (!active) { + throw new Error( + "Cannot change caching after evaluation has completed.", + ); + } + if (result.never) { + throw new Error("Caching has already been configured with .never()"); + } + result.forever = true; + result.configured = true; + }, + never() { + if (!active) { + throw new Error( + "Cannot change caching after evaluation has completed.", + ); + } + if (result.forever) { + throw new Error( + "Caching has already been configured with .forever()", + ); + } + result.never = true; + result.configured = true; + }, + using(handler: () => T): T { + if (!active) { + throw new Error( + "Cannot change caching after evaluation has completed.", + ); + } + if (result.never || result.forever) { + throw new Error( + "Caching has already been configured with .never or .forever()", + ); + } + result.configured = true; - const key = handler(); - pairs.push([ key, handler ]); - return key; - }, - }: CacheConfiguratorObj)); + const key = handler(); + pairs.push([key, handler]); + return key; + }, + invalidate(handler: () => T): T { + if (!active) { + throw new Error( + "Cannot change caching after evaluation has completed.", + ); + } + if (result.never || result.forever) { + throw new Error( + "Caching has already been configured with .never or .forever()", + ); + } + result.invalidate = true; + result.configured = true; + + const key = handler(); + pairs.push([key, handler]); + return key; + }, + }: CacheConfiguratorObj), + ); return { cache, result, deactivate }; } diff --git a/packages/babel-core/src/config/helpers/environment.js b/packages/babel-core/src/config/helpers/environment.js index eaa95de791..06bd33484a 100644 --- a/packages/babel-core/src/config/helpers/environment.js +++ b/packages/babel-core/src/config/helpers/environment.js @@ -1,7 +1,5 @@ // @flow export function getEnv(defaultValue: string = "development"): string { - return process.env.BABEL_ENV - || process.env.NODE_ENV - || defaultValue; + return process.env.BABEL_ENV || process.env.NODE_ENV || defaultValue; } diff --git a/packages/babel-core/src/config/index.js b/packages/babel-core/src/config/index.js index d0a6030d75..f00fd0e924 100644 --- a/packages/babel-core/src/config/index.js +++ b/packages/babel-core/src/config/index.js @@ -5,13 +5,13 @@ import manageOptions from "./option-manager"; export type ResolvedConfig = { options: Object, - passes: Array>, + passes: Array>, }; /** * Standard API for loading Babel configuration data. Not for public consumption. */ -export default function loadConfig(opts: mixed): ResolvedConfig|null { +export default function loadConfig(opts: mixed): ResolvedConfig | null { if (opts != null && typeof opts !== "object") { throw new Error("Babel options must be an object, null, or undefined"); } diff --git a/packages/babel-core/src/config/loading/files/configuration.js b/packages/babel-core/src/config/loading/files/configuration.js index 3d762ff8e3..73ce1565d4 100644 --- a/packages/babel-core/src/config/loading/files/configuration.js +++ b/packages/babel-core/src/config/loading/files/configuration.js @@ -41,13 +41,16 @@ export function findConfigs(dirname: string): Array { BABELRC_FILENAME, BABELRC_JS_FILENAME, PACKAGE_FILENAME, - ].reduce((previousConfig: ConfigFile|null, name) => { + ].reduce((previousConfig: ConfigFile | null, name) => { const filepath = path.join(loc, name); const config = readConfig(filepath); if (config && previousConfig) { - throw new Error(`Multiple configuration files found. Please remove one:\n- ${ - path.basename(previousConfig.filepath)}\n- ${name}\nfrom ${loc}`); + throw new Error( + `Multiple configuration files found. Please remove one:\n- ${path.basename( + previousConfig.filepath, + )}\n- ${name}\nfrom ${loc}`, + ); } return config || previousConfig; @@ -73,7 +76,9 @@ export function loadConfig(name: string, dirname: string): ConfigFile { const filepath = resolve.sync(name, { basedir: dirname }); const conf = readConfig(filepath); - if (!conf) throw new Error(`Config file ${filepath} contains no configuration data`); + if (!conf) { + throw new Error(`Config file ${filepath} contains no configuration data`); + } return conf; } @@ -83,7 +88,9 @@ export function loadConfig(name: string, dirname: string): ConfigFile { * throw if there are parsing errors while loading a config. */ function readConfig(filepath) { - return (path.extname(filepath) === ".js") ? readConfigJS(filepath) : readConfigFile(filepath); + return path.extname(filepath) === ".js" + ? readConfigJS(filepath) + : readConfigFile(filepath); } const readConfigJS = makeStrongCache((filepath, cache) => { @@ -96,7 +103,10 @@ const readConfigJS = makeStrongCache((filepath, cache) => { try { // $FlowIssue const configModule = (require(filepath): mixed); - options = configModule && configModule.__esModule ? (configModule.default || undefined) : configModule; + options = + configModule && configModule.__esModule + ? configModule.default || undefined + : configModule; } catch (err) { err.message = `${filepath}: Error while loading config - ${err.message}`; throw err; @@ -113,7 +123,9 @@ const readConfigJS = makeStrongCache((filepath, cache) => { } if (!options || typeof options !== "object" || Array.isArray(options)) { - throw new Error(`${filepath}: Configuration should be an exported JavaScript object.`); + throw new Error( + `${filepath}: Configuration should be an exported JavaScript object.`, + ); } return { @@ -144,8 +156,12 @@ const readConfigFile = makeStaticFileCache((filepath, content) => { if (!options) throw new Error(`${filepath}: No config detected`); } - if (typeof options !== "object") throw new Error(`${filepath}: Config returned typeof ${typeof options}`); - if (Array.isArray(options)) throw new Error(`${filepath}: Expected config object but found array`); + if (typeof options !== "object") { + throw new Error(`${filepath}: Config returned typeof ${typeof options}`); + } + if (Array.isArray(options)) { + throw new Error(`${filepath}: Expected config object but found array`); + } return { filepath, @@ -157,8 +173,8 @@ const readConfigFile = makeStaticFileCache((filepath, content) => { const readIgnoreConfig = makeStaticFileCache((filepath, content) => { const ignore = content .split("\n") - .map((line) => line.replace(/#(.*?)$/, "").trim()) - .filter((line) => !!line); + .map(line => line.replace(/#(.*?)$/, "").trim()) + .filter(line => !!line); return { filepath, @@ -167,7 +183,7 @@ const readIgnoreConfig = makeStaticFileCache((filepath, content) => { }; }); -function makeStaticFileCache(fn: (string, string) => T): (string) => T|null { +function makeStaticFileCache(fn: (string, string) => T): string => T | null { return makeStrongCache((filepath, cache) => { if (cache.invalidate(() => fileMtime(filepath)) === null) { cache.forever(); @@ -178,7 +194,7 @@ function makeStaticFileCache(fn: (string, string) => T): (string) => T|null { }); } -function fileMtime(filepath: string): number|null { +function fileMtime(filepath: string): number | null { try { return +fs.statSync(filepath).mtime; } catch (e) { diff --git a/packages/babel-core/src/config/loading/files/index-browser.js b/packages/babel-core/src/config/loading/files/index-browser.js index 302c2e9c66..79d5325291 100644 --- a/packages/babel-core/src/config/loading/files/index-browser.js +++ b/packages/babel-core/src/config/loading/files/index-browser.js @@ -16,27 +16,47 @@ export function loadConfig(name: string, dirname: string): ConfigFile { } // eslint-disable-next-line no-unused-vars -export function resolvePlugin(name: string, dirname: string): string|null { +export function resolvePlugin(name: string, dirname: string): string | null { return null; } // eslint-disable-next-line no-unused-vars -export function resolvePreset(name: string, dirname: string): string|null { +export function resolvePreset(name: string, dirname: string): string | null { return null; } -export function loadPlugin(name: string, dirname: string): { filepath: string, value: mixed } { - throw new Error(`Cannot load plugin ${name} relative to ${dirname} in a browser`); +export function loadPlugin( + name: string, + dirname: string, +): { filepath: string, value: mixed } { + throw new Error( + `Cannot load plugin ${name} relative to ${dirname} in a browser`, + ); } -export function loadPreset(name: string, dirname: string): { filepath: string, value: mixed } { - throw new Error(`Cannot load preset ${name} relative to ${dirname} in a browser`); +export function loadPreset( + name: string, + dirname: string, +): { filepath: string, value: mixed } { + throw new Error( + `Cannot load preset ${name} relative to ${dirname} in a browser`, + ); } -export function loadParser(name: string, dirname: string): { filepath: string, value: Function } { - throw new Error(`Cannot load parser ${name} relative to ${dirname} in a browser`); +export function loadParser( + name: string, + dirname: string, +): { filepath: string, value: Function } { + throw new Error( + `Cannot load parser ${name} relative to ${dirname} in a browser`, + ); } -export function loadGenerator(name: string, dirname: string): { filepath: string, value: Function } { - throw new Error(`Cannot load generator ${name} relative to ${dirname} in a browser`); +export function loadGenerator( + name: string, + dirname: string, +): { filepath: string, value: Function } { + throw new Error( + `Cannot load generator ${name} relative to ${dirname} in a browser`, + ); } diff --git a/packages/babel-core/src/config/loading/files/index.js b/packages/babel-core/src/config/loading/files/index.js index f26999328e..c7e61ad469 100644 --- a/packages/babel-core/src/config/loading/files/index.js +++ b/packages/babel-core/src/config/loading/files/index.js @@ -5,7 +5,7 @@ import typeof * as indexType from "./index"; // Kind of gross, but essentially asserting that the exports of this module are the same as the // exports of index-browser, since this file may be replaced at bundle time with index-browser. -((({}: any) : $Exact): $Exact); +((({}: any): $Exact): $Exact); export * from "./configuration"; export * from "./plugins"; diff --git a/packages/babel-core/src/config/loading/files/plugins.js b/packages/babel-core/src/config/loading/files/plugins.js index 7828e90d02..ff65ae8f56 100644 --- a/packages/babel-core/src/config/loading/files/plugins.js +++ b/packages/babel-core/src/config/loading/files/plugins.js @@ -15,17 +15,22 @@ const BABEL_PRESET_ORG_RE = /^(@babel[/\/])(?!preset-|[^/\/]+[/\/])/; const OTHER_PLUGIN_ORG_RE = /^(@(?!babel[/\/])[^/\/]+[/\/])(?!babel-plugin-|[^/\/]+[/\/])/; const OTHER_PRESET_ORG_RE = /^(@(?!babel[/\/])[^/\/]+[/\/])(?!babel-preset-|[^/\/]+[/\/])/; -export function resolvePlugin(name: string, dirname: string): string|null { +export function resolvePlugin(name: string, dirname: string): string | null { return resolveStandardizedName("plugin", name, dirname); } -export function resolvePreset(name: string, dirname: string): string|null { +export function resolvePreset(name: string, dirname: string): string | null { return resolveStandardizedName("preset", name, dirname); } -export function loadPlugin(name: string, dirname: string): { filepath: string, value: mixed } { +export function loadPlugin( + name: string, + dirname: string, +): { filepath: string, value: mixed } { const filepath = resolvePlugin(name, dirname); - if (!filepath) throw new Error(`Plugin ${name} not found relative to ${dirname}`); + if (!filepath) { + throw new Error(`Plugin ${name} not found relative to ${dirname}`); + } return { filepath, @@ -33,9 +38,14 @@ export function loadPlugin(name: string, dirname: string): { filepath: string, v }; } -export function loadPreset(name: string, dirname: string): { filepath: string, value: mixed } { +export function loadPreset( + name: string, + dirname: string, +): { filepath: string, value: mixed } { const filepath = resolvePreset(name, dirname); - if (!filepath) throw new Error(`Preset ${name} not found relative to ${dirname}`); + if (!filepath) { + throw new Error(`Preset ${name} not found relative to ${dirname}`); + } return { filepath, @@ -43,16 +53,23 @@ export function loadPreset(name: string, dirname: string): { filepath: string, v }; } -export function loadParser(name: string, dirname: string): { filepath: string, value: Function } { +export function loadParser( + name: string, + dirname: string, +): { filepath: string, value: Function } { const filepath = resolve.sync(name, { basedir: dirname }); const mod = requireModule(filepath); if (!mod) { - throw new Error(`Parser ${name} relative to ${dirname} does not export an object`); + throw new Error( + `Parser ${name} relative to ${dirname} does not export an object`, + ); } if (typeof mod.parse !== "function") { - throw new Error(`Parser ${name} relative to ${dirname} does not export a .parse function`); + throw new Error( + `Parser ${name} relative to ${dirname} does not export a .parse function`, + ); } return { @@ -61,16 +78,23 @@ export function loadParser(name: string, dirname: string): { filepath: string, v }; } -export function loadGenerator(name: string, dirname: string): { filepath: string, value: Function } { +export function loadGenerator( + name: string, + dirname: string, +): { filepath: string, value: Function } { const filepath = resolve.sync(name, { basedir: dirname }); const mod = requireModule(filepath); if (!mod) { - throw new Error(`Generator ${name} relative to ${dirname} does not export an object`); + throw new Error( + `Generator ${name} relative to ${dirname} does not export an object`, + ); } if (typeof mod.print !== "function") { - throw new Error(`Generator ${name} relative to ${dirname} does not export a .print function`); + throw new Error( + `Generator ${name} relative to ${dirname} does not export a .print function`, + ); } return { @@ -79,24 +103,39 @@ export function loadGenerator(name: string, dirname: string): { filepath: string }; } -function standardizeName(type: "plugin"|"preset", name: string) { +function standardizeName(type: "plugin" | "preset", name: string) { // Let absolute and relative paths through. if (path.isAbsolute(name)) return name; const isPreset = type === "preset"; - return name - // foo -> babel-preset-foo - .replace(isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE, `babel-${type}-`) - // @babel/es2015 -> @babel/preset-es2015 - .replace(isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE, `$1${type}-`) - // @foo/mypreset -> @foo/babel-preset-mypreset - .replace(isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE, `$1babel-${type}-`) - // module:mypreset -> mypreset - .replace(EXACT_RE, ""); + return ( + name + // foo -> babel-preset-foo + .replace( + isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE, + `babel-${type}-`, + ) + // @babel/es2015 -> @babel/preset-es2015 + .replace( + isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE, + `$1${type}-`, + ) + // @foo/mypreset -> @foo/babel-preset-mypreset + .replace( + isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE, + `$1babel-${type}-`, + ) + // module:mypreset -> mypreset + .replace(EXACT_RE, "") + ); } -function resolveStandardizedName(type: "plugin"|"preset", name: string, dirname: string = process.cwd()) { +function resolveStandardizedName( + type: "plugin" | "preset", + name: string, + dirname: string = process.cwd(), +) { const standardizedName = standardizeName(type, name); try { @@ -109,7 +148,7 @@ function resolveStandardizedName(type: "plugin"|"preset", name: string, dirname: try { resolve.sync(name, { basedir: dirname }); resolvedOriginal = true; - } catch (e2) { } + } catch (e2) {} if (resolvedOriginal) { // eslint-disable-next-line max-len @@ -119,9 +158,11 @@ function resolveStandardizedName(type: "plugin"|"preset", name: string, dirname: let resolvedBabel = false; try { - resolve.sync(standardizeName(type, "@babel/" + name), { basedir: dirname }); + resolve.sync(standardizeName(type, "@babel/" + name), { + basedir: dirname, + }); resolvedBabel = true; - } catch (e2) { } + } catch (e2) {} if (resolvedBabel) { // eslint-disable-next-line max-len @@ -133,7 +174,7 @@ function resolveStandardizedName(type: "plugin"|"preset", name: string, dirname: try { resolve.sync(standardizeName(oppositeType, name), { basedir: dirname }); resolvedOppositeType = true; - } catch (e2) { } + } catch (e2) {} if (resolvedOppositeType) { // eslint-disable-next-line max-len diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index a5cfc63bbd..3d50264923 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -11,14 +11,19 @@ import path from "path"; import traverse from "babel-traverse"; import clone from "lodash/clone"; -import { loadPlugin, loadPreset, loadParser, loadGenerator } from "./loading/files"; +import { + loadPlugin, + loadPreset, + loadParser, + loadGenerator, +} from "./loading/files"; type MergeOptions = { - +type: "arguments"|"options"|"preset", + +type: "arguments" | "options" | "preset", options: {}, alias: string, loc: string, - dirname: string + dirname: string, }; const optionNames = new Set([ @@ -74,8 +79,8 @@ const ALLOWED_PLUGIN_KEYS = new Set([ export default function manageOptions(opts: {}): { options: Object, - passes: Array>, -}|null { + passes: Array>, +} | null { return new OptionManager().init(opts); } @@ -100,9 +105,12 @@ class OptionManager { mergeOptions(config: MergeOptions, pass?: Array<[Plugin, ?{}]>) { const result = loadConfig(config); - const plugins = result.plugins.map((descriptor) => loadPluginDescriptor(descriptor)); - const presets = result.presets.map((descriptor) => loadPresetDescriptor(descriptor)); - + const plugins = result.plugins.map(descriptor => + loadPluginDescriptor(descriptor), + ); + const presets = result.presets.map(descriptor => + loadPresetDescriptor(descriptor), + ); if ( config.options.passPerPreset != null && @@ -148,7 +156,8 @@ class OptionManager { // There are a few case where thrown errors will try to annotate themselves multiple times, so // to keep things simple we just bail out if re-wrapping the message. if (!/^\[BABEL\]/.test(e.message)) { - const filename = typeof opts.filename === "string" ? opts.filename : null; + const filename = + typeof opts.filename === "string" ? opts.filename : null; e.message = `[BABEL] ${filename || "unknown"}: ${e.message}`; } @@ -160,9 +169,10 @@ class OptionManager { // Tack the passes onto the object itself so that, if this object is passed back to Babel a second time, // it will be in the right structure to not change behavior. opts.plugins = this.passes[0]; - opts.presets = this.passes.slice(1) - .filter((plugins) => plugins.length > 0) - .map((plugins) => ({ plugins })); + opts.presets = this.passes + .slice(1) + .filter(plugins => plugins.length > 0) + .map(plugins => ({ plugins })); if (opts.inputSourceMap) { opts.sourceMaps = true; @@ -199,7 +209,7 @@ class OptionManager { } type BasicDescriptor = { - value: {}|Function, + value: {} | Function, options: ?{}, dirname: string, alias: string, @@ -209,19 +219,28 @@ type BasicDescriptor = { /** * Load and validate the given config into a set of options, plugins, and presets. */ -function loadConfig(config): { +function loadConfig( + config, +): { options: {}, plugins: Array, presets: Array, } { const options = normalizeOptions(config); - if (config.options.plugins != null && !Array.isArray(config.options.plugins)) { + if ( + config.options.plugins != null && + !Array.isArray(config.options.plugins) + ) { throw new Error(".plugins should be an array, null, or undefined"); } const plugins = (config.options.plugins || []).map((plugin, index) => { - const { filepath, value, options } = normalizePair(plugin, loadPlugin, config.dirname); + const { filepath, value, options } = normalizePair( + plugin, + loadPlugin, + config.dirname, + ); return { alias: filepath || `${config.loc}$${index}`, @@ -232,12 +251,19 @@ function loadConfig(config): { }; }); - if (config.options.presets != null && !Array.isArray(config.options.presets)) { + if ( + config.options.presets != null && + !Array.isArray(config.options.presets) + ) { throw new Error(".presets should be an array, null, or undefined"); } const presets = (config.options.presets || []).map((preset, index) => { - const { filepath, value, options } = normalizePair(preset, loadPreset, config.dirname); + const { filepath, value, options } = normalizePair( + preset, + loadPreset, + config.dirname, + ); return { alias: filepath || `${config.loc}$${index}`, @@ -255,7 +281,9 @@ function loadConfig(config): { * Load a generic plugin/preset from the given descriptor loaded from the config object. */ function loadDescriptor(descriptor, skipOptions) { - if (typeof descriptor.value !== "function") return { value: descriptor.value, descriptor }; + if (typeof descriptor.value !== "function") { + return { value: descriptor.value, descriptor }; + } const { value, options } = descriptor; let item; @@ -266,7 +294,9 @@ function loadDescriptor(descriptor, skipOptions) { item = value(context, options, { dirname: descriptor.dirname }); } } catch (e) { - if (descriptor.alias) e.message += ` (While processing: ${JSON.stringify(descriptor.alias)})`; + if (descriptor.alias) { + e.message += ` (While processing: ${JSON.stringify(descriptor.alias)})`; + } throw e; } @@ -282,26 +312,37 @@ function loadDescriptor(descriptor, skipOptions) { */ const PLUGIN_CACHE = new WeakMap(); function loadPluginDescriptor(descriptor) { - if (descriptor.value instanceof Plugin) return [ descriptor.value, descriptor.options ]; + if (descriptor.value instanceof Plugin) { + return [descriptor.value, descriptor.options]; + } let result = PLUGIN_CACHE.get(descriptor.value); if (!result) { - result = instantiatePlugin(loadDescriptor(descriptor, true /* skipOptions */)); + result = instantiatePlugin( + loadDescriptor(descriptor, true /* skipOptions */), + ); PLUGIN_CACHE.set(descriptor.value, result); } - return [ result, descriptor.options]; + return [result, descriptor.options]; } function instantiatePlugin({ value: pluginObj, descriptor }) { - Object.keys(pluginObj).forEach((key) => { + Object.keys(pluginObj).forEach(key => { if (!ALLOWED_PLUGIN_KEYS.has(key)) { - throw new Error(messages.get("pluginInvalidProperty", descriptor.alias, key)); + throw new Error( + messages.get("pluginInvalidProperty", descriptor.alias, key), + ); } }); - if (pluginObj.visitor && (pluginObj.visitor.enter || pluginObj.visitor.exit)) { - throw new Error("Plugins aren't allowed to specify catch-all enter/exit handlers. " + - "Please target individual nodes."); + if ( + pluginObj.visitor && + (pluginObj.visitor.enter || pluginObj.visitor.exit) + ) { + throw new Error( + "Plugins aren't allowed to specify catch-all enter/exit handlers. " + + "Please target individual nodes.", + ); } const plugin = Object.assign({}, pluginObj, { @@ -325,8 +366,14 @@ function instantiatePlugin({ value: pluginObj, descriptor }) { plugin.pre = chain(inherits.pre, plugin.pre); plugin.post = chain(inherits.post, plugin.post); - plugin.manipulateOptions = chain(inherits.manipulateOptions, plugin.manipulateOptions); - plugin.visitor = traverse.visitors.merge([inherits.visitor, plugin.visitor]); + plugin.manipulateOptions = chain( + inherits.manipulateOptions, + plugin.manipulateOptions, + ); + plugin.visitor = traverse.visitors.merge([ + inherits.visitor, + plugin.visitor, + ]); } return new Plugin(plugin, descriptor.alias); @@ -371,10 +418,18 @@ function normalizeOptions(config) { } if (type === "preset") { - if (options.only !== undefined) throw new Error(`${alias}.only is not supported in a preset`); - if (options.ignore !== undefined) throw new Error(`${alias}.ignore is not supported in a preset`); - if (options.extends !== undefined) throw new Error(`${alias}.extends is not supported in a preset`); - if (options.env !== undefined) throw new Error(`${alias}.env is not supported in a preset`); + if (options.only !== undefined) { + throw new Error(`${alias}.only is not supported in a preset`); + } + if (options.ignore !== undefined) { + throw new Error(`${alias}.ignore is not supported in a preset`); + } + if (options.extends !== undefined) { + throw new Error(`${alias}.extends is not supported in a preset`); + } + if (options.env !== undefined) { + throw new Error(`${alias}.env is not supported in a preset`); + } } if (options.sourceMap !== undefined) { @@ -390,7 +445,10 @@ function normalizeOptions(config) { // check for an unknown option if (!optionNames.has(key)) { if (removed[key]) { - throw new ReferenceError(`Using removed Babel 5 option: ${alias}.${key} - ${removed[key].message}`); + throw new ReferenceError( + `Using removed Babel 5 option: ${alias}.${key} - ${removed[key] + .message}`, + ); } else { // eslint-disable-next-line max-len const unknownOptErr = `Unknown option: ${alias}.${key}. Check out http://babeljs.io/docs/usage/options/ for more information about options.`; @@ -402,12 +460,21 @@ function normalizeOptions(config) { if (options.parserOpts && typeof options.parserOpts.parser === "string") { options.parserOpts = Object.assign({}, options.parserOpts); - options.parserOpts.parser = loadParser(options.parserOpts.parser, config.dirname).value; + options.parserOpts.parser = loadParser( + options.parserOpts.parser, + config.dirname, + ).value; } - if (options.generatorOpts && typeof options.generatorOpts.generator === "string") { + if ( + options.generatorOpts && + typeof options.generatorOpts.generator === "string" + ) { options.generatorOpts = Object.assign({}, options.generatorOpts); - options.generatorOpts.generator = loadGenerator(options.generatorOpts.generator, config.dirname).value; + options.generatorOpts.generator = loadGenerator( + options.generatorOpts.generator, + config.dirname, + ).value; } delete options.passPerPreset; @@ -420,16 +487,22 @@ function normalizeOptions(config) { /** * Given a plugin/preset item, resolve it into a standard format. */ -function normalizePair(pair: mixed, resolver, dirname): { - filepath: string|null, - value: {}|Function, +function normalizePair( + pair: mixed, + resolver, + dirname, +): { + filepath: string | null, + value: {} | Function, options: ?{}, } { let options; let value = pair; if (Array.isArray(pair)) { if (pair.length > 2) { - throw new Error(`Unexpected extra options ${JSON.stringify(pair.slice(2))}.`); + throw new Error( + `Unexpected extra options ${JSON.stringify(pair.slice(2))}.`, + ); } [value, options] = pair; @@ -437,10 +510,7 @@ function normalizePair(pair: mixed, resolver, dirname): { let filepath = null; if (typeof value === "string") { - ({ - filepath, - value, - } = resolver(value, dirname)); + ({ filepath, value } = resolver(value, dirname)); } if (!value) { @@ -456,11 +526,15 @@ function normalizePair(pair: mixed, resolver, dirname): { } if (typeof value !== "object" && typeof value !== "function") { - throw new Error(`Unsupported format: ${typeof value}. Expected an object or a function.`); + throw new Error( + `Unsupported format: ${typeof value}. Expected an object or a function.`, + ); } if (options != null && typeof options !== "object") { - throw new Error("Plugin/Preset options must be an object, null, or undefined"); + throw new Error( + "Plugin/Preset options must be an object, null, or undefined", + ); } return { filepath, value, options }; diff --git a/packages/babel-core/src/config/plugin.js b/packages/babel-core/src/config/plugin.js index 7e6036ec0f..84b3701061 100644 --- a/packages/babel-core/src/config/plugin.js +++ b/packages/babel-core/src/config/plugin.js @@ -5,8 +5,13 @@ export default class Plugin { if (plugin.name != null && typeof plugin.name !== "string") { throw new Error("Plugin .name must be a string, null, or undefined"); } - if (plugin.manipulateOptions != null && typeof plugin.manipulateOptions !== "function") { - throw new Error("Plugin .manipulateOptions must be a function, null, or undefined"); + if ( + plugin.manipulateOptions != null && + typeof plugin.manipulateOptions !== "function" + ) { + throw new Error( + "Plugin .manipulateOptions must be a function, null, or undefined", + ); } if (plugin.post != null && typeof plugin.post !== "function") { throw new Error("Plugin .post must be a function, null, or undefined"); diff --git a/packages/babel-core/src/config/removed.js b/packages/babel-core/src/config/removed.js index 542f7d1533..751209e8e6 100644 --- a/packages/babel-core/src/config/removed.js +++ b/packages/babel-core/src/config/removed.js @@ -2,52 +2,58 @@ /* eslint max-len: "off" */ export default { - "auxiliaryComment": { - "message": "Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`", + auxiliaryComment: { + message: "Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`", }, - "blacklist": { - "message": "Put the specific transforms you want in the `plugins` option", + blacklist: { + message: "Put the specific transforms you want in the `plugins` option", }, - "breakConfig": { - "message": "This is not a necessary option in Babel 6", + breakConfig: { + message: "This is not a necessary option in Babel 6", }, - "experimental": { - "message": "Put the specific transforms you want in the `plugins` option", + experimental: { + message: "Put the specific transforms you want in the `plugins` option", }, - "externalHelpers": { - "message": "Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/", + externalHelpers: { + message: + "Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/", }, - "extra": { - "message": "", + extra: { + message: "", }, - "jsxPragma": { - "message": "use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/", + jsxPragma: { + message: + "use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/", }, // "keepModuleIdExtensions": { // "message": "" // }, - "loose": { - "message": "Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option.", + loose: { + message: + "Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option.", }, - "metadataUsedHelpers": { - "message": "Not required anymore as this is enabled by default", + metadataUsedHelpers: { + message: "Not required anymore as this is enabled by default", }, - "modules": { - "message": "Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules", + modules: { + message: + "Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules", }, - "nonStandard": { - "message": "Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/", + nonStandard: { + message: + "Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/", }, - "optional": { - "message": "Put the specific transforms you want in the `plugins` option", + optional: { + message: "Put the specific transforms you want in the `plugins` option", }, - "sourceMapName": { - "message": "Use the `sourceMapTarget` option", + sourceMapName: { + message: "Use the `sourceMapTarget` option", }, - "stage": { - "message": "Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets", + stage: { + message: + "Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets", }, - "whitelist": { - "message": "Put the specific transforms you want in the `plugins` option", + whitelist: { + message: "Put the specific transforms you want in the `plugins` option", }, }; diff --git a/packages/babel-core/src/index.js b/packages/babel-core/src/index.js index 918929f9bc..35e8e5c77f 100644 --- a/packages/babel-core/src/index.js +++ b/packages/babel-core/src/index.js @@ -12,7 +12,7 @@ export template from "babel-template"; import loadConfig from "./config"; -export function loadOptions(opts): Object|null { +export function loadOptions(opts): Object | null { const config = loadConfig(opts); return config ? config.options : null; @@ -41,4 +41,10 @@ export { * Recommended set of compilable extensions. Not used in babel-core directly, but meant as * as an easy source for tooling making use of babel-core. */ -export const DEFAULT_EXTENSIONS = Object.freeze([".js", ".jsx", ".es6", ".es", ".mjs"]); +export const DEFAULT_EXTENSIONS = Object.freeze([ + ".js", + ".jsx", + ".es6", + ".es", + ".mjs", +]); diff --git a/packages/babel-core/src/tools/build-external-helpers.js b/packages/babel-core/src/tools/build-external-helpers.js index 75a00f0fff..7d0a311d36 100644 --- a/packages/babel-core/src/tools/build-external-helpers.js +++ b/packages/babel-core/src/tools/build-external-helpers.js @@ -20,17 +20,29 @@ const buildUmdWrapper = template(` function buildGlobal(namespace, builder) { const body = []; - const container = t.functionExpression(null, [t.identifier("global")], t.blockStatement(body)); + const container = t.functionExpression( + null, + [t.identifier("global")], + t.blockStatement(body), + ); const tree = t.program([ - t.expressionStatement(t.callExpression(container, [helpers.get("selfGlobal")]))]); - - body.push(t.variableDeclaration("var", [ - t.variableDeclarator( - namespace, - t.assignmentExpression("=", t.memberExpression(t.identifier("global"), namespace), - t.objectExpression([])) + t.expressionStatement( + t.callExpression(container, [helpers.get("selfGlobal")]), ), - ])); + ]); + + body.push( + t.variableDeclaration("var", [ + t.variableDeclarator( + namespace, + t.assignmentExpression( + "=", + t.memberExpression(t.identifier("global"), namespace), + t.objectExpression([]), + ), + ), + ]), + ); builder(body); @@ -39,9 +51,11 @@ function buildGlobal(namespace, builder) { function buildUmd(namespace, builder) { const body = []; - body.push(t.variableDeclaration("var", [ - t.variableDeclarator(namespace, t.identifier("global")), - ])); + body.push( + t.variableDeclaration("var", [ + t.variableDeclarator(namespace, t.identifier("global")), + ]), + ); builder(body); @@ -51,7 +65,7 @@ function buildUmd(namespace, builder) { BROWSER_ARGUMENTS: t.assignmentExpression( "=", t.memberExpression(t.identifier("root"), namespace), - t.objectExpression([]) + t.objectExpression([]), ), COMMON_ARGUMENTS: t.identifier("exports"), AMD_ARGUMENTS: t.arrayExpression([t.stringLiteral("exports")]), @@ -63,31 +77,39 @@ function buildUmd(namespace, builder) { function buildVar(namespace, builder) { const body = []; - body.push(t.variableDeclaration("var", [ - t.variableDeclarator(namespace, t.objectExpression([])), - ])); + body.push( + t.variableDeclaration("var", [ + t.variableDeclarator(namespace, t.objectExpression([])), + ]), + ); builder(body); body.push(t.expressionStatement(namespace)); return t.program(body); } function buildHelpers(body, namespace, whitelist) { - helpers.list.forEach(function (name) { + helpers.list.forEach(function(name) { if (whitelist && whitelist.indexOf(name) < 0) return; const key = t.identifier(name); - body.push(t.expressionStatement( - t.assignmentExpression("=", t.memberExpression(namespace, key), helpers.get(name)) - )); + body.push( + t.expressionStatement( + t.assignmentExpression( + "=", + t.memberExpression(namespace, key), + helpers.get(name), + ), + ), + ); }); } -export default function ( +export default function( whitelist?: Array, outputType: "global" | "umd" | "var" = "global", ) { const namespace = t.identifier("babelHelpers"); - const builder = function (body) { + const builder = function(body) { return buildHelpers(body, namespace, whitelist); }; diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index bf5063198f..77fabcb11f 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -45,7 +45,7 @@ export default class File extends Store { // passed babel-core's export object, which loads this file, and this 'loadConfig' loading plugins. INTERNAL_PLUGINS = loadConfig({ babelrc: false, - plugins: [ blockHoistPlugin ], + plugins: [blockHoistPlugin], }).passes[0]; } @@ -61,7 +61,7 @@ export default class File extends Store { }; for (const pluginPairs of passes) { - for (const [ plugin ] of pluginPairs) { + for (const [plugin] of pluginPairs) { if (plugin.manipulateOptions) { plugin.manipulateOptions(this.opts, this.parserOpts, this); } @@ -150,7 +150,7 @@ export default class File extends Store { if (opts.sourceRoot != null) { // remove sourceRoot from filename - const sourceRootRegEx = new RegExp("^" + opts.sourceRoot + "\/?"); + const sourceRootRegEx = new RegExp("^" + opts.sourceRoot + "/?"); filenameRelative = filenameRelative.replace(sourceRootRegEx, ""); } @@ -172,17 +172,25 @@ export default class File extends Store { resolveModuleSource(source: string): string { const resolveModuleSource = this.opts.resolveModuleSource; - if (resolveModuleSource) source = resolveModuleSource(source, this.opts.filename); + if (resolveModuleSource) { + source = resolveModuleSource(source, this.opts.filename); + } return source; } - addImport(source: string, imported: string, name?: string = imported): Object { + addImport( + source: string, + imported: string, + name?: string = imported, + ): Object { const alias = `${source}:${imported}`; let id = this.dynamicImportIds[alias]; if (!id) { source = this.resolveModuleSource(source); - id = this.dynamicImportIds[alias] = this.scope.generateUidIdentifier(name); + id = this.dynamicImportIds[alias] = this.scope.generateUidIdentifier( + name, + ); const specifiers = []; @@ -222,7 +230,9 @@ export default class File extends Store { } const ref = getHelper(name); - const uid = this.declarations[name] = this.scope.generateUidIdentifier(name); + const uid = (this.declarations[name] = this.scope.generateUidIdentifier( + name, + )); if (t.isFunctionExpression(ref) && !ref.id) { ref.body._compact = true; @@ -257,7 +267,9 @@ export default class File extends Store { const declar = this.declarations[name]; if (declar) return declar; - const uid = this.declarations[name] = this.scope.generateUidIdentifier("templateObject"); + const uid = (this.declarations[name] = this.scope.generateUidIdentifier( + "templateObject", + )); const helperId = this.addHelper(helperName); const init = t.callExpression(helperId, [strings, raw]); @@ -270,7 +282,11 @@ export default class File extends Store { return uid; } - buildCodeFrameError(node: Object, msg: string, Error: typeof Error = SyntaxError): Error { + buildCodeFrameError( + node: Object, + msg: string, + Error: typeof Error = SyntaxError, + ): Error { const loc = node && (node.loc || node._loc); const err = new Error(msg); @@ -280,7 +296,8 @@ export default class File extends Store { } else { traverse(node, errorVisitor, this.scope, err); - err.message += " (This is an error on an internal node. Probably an internal error"; + err.message += + " (This is an error on an internal node. Probably an internal error"; if (err.loc) { err.message += ". Location has been estimated."; @@ -308,7 +325,7 @@ export default class File extends Store { // single source file to a single output file. const source = outputMapConsumer.sources[0]; - inputMapConsumer.eachMapping(function (mapping) { + inputMapConsumer.eachMapping(function(mapping) { const generatedPosition = outputMapConsumer.generatedPositionFor({ line: mapping.generatedLine, column: mapping.generatedColumn, @@ -318,10 +335,13 @@ export default class File extends Store { mergedGenerator.addMapping({ source: mapping.source, - original: mapping.source == null ? null : { - line: mapping.originalLine, - column: mapping.originalColumn, - }, + original: + mapping.source == null + ? null + : { + line: mapping.originalLine, + column: mapping.originalColumn, + }, generated: generatedPosition, }); @@ -385,15 +405,15 @@ export default class File extends Store { const passes = []; const visitors = []; - for (const [ plugin, pluginOpts ] of pluginPairs.concat(INTERNAL_PLUGINS)) { + for (const [plugin, pluginOpts] of pluginPairs.concat(INTERNAL_PLUGINS)) { const pass = new PluginPass(this, plugin.key, pluginOpts); - passPairs.push([ plugin, pass ]); + passPairs.push([plugin, pass]); passes.push(pass); visitors.push(plugin.visitor); } - for (const [ plugin, pass ] of passPairs) { + for (const [plugin, pass] of passPairs) { const fn = plugin.pre; if (fn) fn.call(pass, this); } @@ -401,16 +421,19 @@ export default class File extends Store { debug(this.opts, "Start transform traverse"); // merge all plugin visitors into a single visitor - const visitor = traverse.visitors.merge(visitors, passes, this.opts.wrapPluginVisitorMethod); + const visitor = traverse.visitors.merge( + visitors, + passes, + this.opts.wrapPluginVisitorMethod, + ); traverse(this.ast, visitor, this.scope); debug(this.opts, "End transform traverse"); - for (const [ plugin, pass ] of passPairs) { + for (const [plugin, pass] of passPairs) { const fn = plugin.post; if (fn) fn.call(pass, this); } - } return this.generate(); @@ -428,7 +451,7 @@ export default class File extends Store { err._babel = true; } - let message = err.message = `${this.opts.filename}: ${err.message}`; + let message = (err.message = `${this.opts.filename}: ${err.message}`); const loc = err.loc; if (loc) { @@ -530,8 +553,11 @@ export default class File extends Store { debug(this.opts, "Generation start"); - const _result = gen(ast, opts.generatorOpts ? Object.assign(opts, opts.generatorOpts) : opts, - this.code); + const _result = gen( + ast, + opts.generatorOpts ? Object.assign(opts, opts.generatorOpts) : opts, + this.code, + ); result.code = _result.code; result.map = _result.map; diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js index aafaff2f92..a0b1db373e 100644 --- a/packages/babel-core/src/transformation/pipeline.js +++ b/packages/babel-core/src/transformation/pipeline.js @@ -5,7 +5,11 @@ import * as t from "babel-types"; import File from "./file"; import loadConfig from "../config"; -export function analyse(code: string, opts: Object = {}, visitor?: Object): ?BabelFileMetadata { +export function analyse( + code: string, + opts: Object = {}, + visitor?: Object, +): ?BabelFileMetadata { opts.code = false; if (visitor) { opts.plugins = opts.plugins || []; @@ -19,14 +23,18 @@ export function transform(code: string, opts?: Object): BabelFileResult { if (config === null) return null; const file = new File(config); - return file.wrap(code, function () { + return file.wrap(code, function() { file.addCode(code); file.parseCode(code); return file.transform(); }); } -export function transformFromAst(ast: Object, code: string, opts: Object): BabelFileResult { +export function transformFromAst( + ast: Object, + code: string, + opts: Object, +): BabelFileResult { const config = loadConfig(opts); if (config === null) return null; @@ -37,14 +45,18 @@ export function transformFromAst(ast: Object, code: string, opts: Object): Babel } const file = new File(config); - return file.wrap(code, function () { + return file.wrap(code, function() { file.addCode(code); file.addAst(ast); return file.transform(); }); } -export function transformFile(filename: string, opts?: Object, callback: Function) { +export function transformFile( + filename: string, + opts?: Object, + callback: Function, +) { if (typeof opts === "function") { callback = opts; opts = {}; @@ -54,13 +66,13 @@ export function transformFile(filename: string, opts?: Object, callback: Functio const config = loadConfig(opts); if (config === null) return callback(null, null); - fs.readFile(filename, function (err, code) { + fs.readFile(filename, function(err, code) { let result; if (!err) { try { const file = new File(config); - result = file.wrap(code, function () { + result = file.wrap(code, function() { file.addCode(code); file.parseCode(code); return file.transform(); @@ -78,7 +90,10 @@ export function transformFile(filename: string, opts?: Object, callback: Functio }); } -export function transformFileSync(filename: string, opts?: Object = {}): string { +export function transformFileSync( + filename: string, + opts?: Object = {}, +): string { opts.filename = filename; const config = loadConfig(opts); if (config === null) return null; @@ -86,7 +101,7 @@ export function transformFileSync(filename: string, opts?: Object = {}): string const code = fs.readFileSync(filename, "utf8"); const file = new File(config); - return file.wrap(code, function () { + return file.wrap(code, function() { file.addCode(code); file.parseCode(code); return file.transform(); diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index 63598ab388..1e8527b96a 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -17,7 +17,7 @@ function assertNotIgnored(result) { // shim function transformAsync(code, opts) { return { - then: function (resolve) { + then: function(resolve) { resolve(babel.transform(code, opts)); }, }; @@ -55,11 +55,14 @@ describe("parser and generator options", function() { it("experimental syntax", function() { const experimental = "var a: number = 1;"; - assert.deepEqual(newTransform(experimental).ast, babel.transform(experimental, { - parserOpts: { - plugins: ["flow"], - }, - }).ast); + assert.deepEqual( + newTransform(experimental).ast, + babel.transform(experimental, { + parserOpts: { + plugins: ["flow"], + }, + }).ast, + ); assert.equal(newTransform(experimental).code, experimental); function newTransformWithPlugins(string) { @@ -74,126 +77,158 @@ describe("parser and generator options", function() { }); } - assert.deepEqual(newTransformWithPlugins(experimental).ast, babel.transform(experimental, { - parserOpts: { - plugins: ["flow"], - }, - }).ast); + assert.deepEqual( + newTransformWithPlugins(experimental).ast, + babel.transform(experimental, { + parserOpts: { + plugins: ["flow"], + }, + }).ast, + ); assert.equal(newTransformWithPlugins(experimental).code, experimental); }); it("other options", function() { const experimental = "if (true) {\n import a from 'a';\n}"; - assert.notEqual(newTransform(experimental).ast, babel.transform(experimental, { - parserOpts: { - allowImportExportEverywhere: true, - }, - }).ast); + assert.notEqual( + newTransform(experimental).ast, + babel.transform(experimental, { + parserOpts: { + allowImportExportEverywhere: true, + }, + }).ast, + ); assert.equal(newTransform(experimental).code, experimental); }); }); -describe("api", function () { - it("analyze", function () { +describe("api", function() { + it("analyze", function() { assert.equal(babel.analyse("foobar;").marked.length, 0); - assert.equal(babel.analyse("foobar;", { - plugins: [new Plugin({ - visitor: { - Program: function (path) { + assert.equal( + babel.analyse("foobar;", { + plugins: [ + new Plugin({ + visitor: { + Program: function(path) { + path.mark("category", "foobar"); + }, + }, + }), + ], + }).marked[0].message, + "foobar", + ); + + assert.equal( + babel.analyse( + "foobar;", + {}, + { + Program: function(path) { path.mark("category", "foobar"); }, }, - })], - }).marked[0].message, "foobar"); - - assert.equal(babel.analyse("foobar;", {}, { - Program: function (path) { - path.mark("category", "foobar"); - }, - }).marked[0].message, "foobar"); - }); - - it("exposes the resolvePlugin method", function() { - assert.throws(() => babel.resolvePlugin("nonexistent-plugin"), - /Cannot find module 'babel-plugin-nonexistent-plugin'/); - }); - - it("exposes the resolvePreset method", function() { - assert.throws(() => babel.resolvePreset("nonexistent-preset"), - /Cannot find module 'babel-preset-nonexistent-preset'/); - }); - - it("transformFile", function (done) { - babel.transformFile(__dirname + "/fixtures/api/file.js", { - babelrc: false, - }, function (err, res) { - if (err) return done(err); - assert.equal(res.code, "foo();"); - done(); - }); - }); - - it("transformFileSync", function () { - assert.equal(babel.transformFileSync(__dirname + "/fixtures/api/file.js", { - babelrc: false, - }).code, "foo();"); - }); - - it("options throw on falsy true", function () { - return assert.throws( - function () { - babel.transform("", { - plugins: [__dirname + "/../../babel-plugin-syntax-jsx", false], - }); - }, - /Error: \[BABEL\] unknown: Unexpected falsy value: false/ + ).marked[0].message, + "foobar", ); }); - it("options merge backwards", function () { + it("exposes the resolvePlugin method", function() { + assert.throws( + () => babel.resolvePlugin("nonexistent-plugin"), + /Cannot find module 'babel-plugin-nonexistent-plugin'/, + ); + }); + + it("exposes the resolvePreset method", function() { + assert.throws( + () => babel.resolvePreset("nonexistent-preset"), + /Cannot find module 'babel-preset-nonexistent-preset'/, + ); + }); + + it("transformFile", function(done) { + babel.transformFile( + __dirname + "/fixtures/api/file.js", + { + babelrc: false, + }, + function(err, res) { + if (err) return done(err); + assert.equal(res.code, "foo();"); + done(); + }, + ); + }); + + it("transformFileSync", function() { + assert.equal( + babel.transformFileSync(__dirname + "/fixtures/api/file.js", { + babelrc: false, + }).code, + "foo();", + ); + }); + + it("options throw on falsy true", function() { + return assert.throws(function() { + babel.transform("", { + plugins: [__dirname + "/../../babel-plugin-syntax-jsx", false], + }); + }, /Error: \[BABEL\] unknown: Unexpected falsy value: false/); + }); + + it("options merge backwards", function() { return transformAsync("", { presets: [__dirname + "/../../babel-preset-es2015"], plugins: [__dirname + "/../../babel-plugin-syntax-jsx"], - }).then(function (result) { - assert.ok(result.options.plugins[0][0].manipulateOptions.toString().indexOf("jsx") >= 0); + }).then(function(result) { + assert.ok( + result.options.plugins[0][0].manipulateOptions + .toString() + .indexOf("jsx") >= 0, + ); }); }); - it("option wrapPluginVisitorMethod", function () { + it("option wrapPluginVisitorMethod", function() { let calledRaw = 0; let calledIntercept = 0; babel.transform("function foo() { bar(foobar); }", { - wrapPluginVisitorMethod: function (pluginAlias, visitorType, callback) { + wrapPluginVisitorMethod: function(pluginAlias, visitorType, callback) { if (pluginAlias !== "foobar") { return callback; } assert.equal(visitorType, "enter"); - return function () { + return function() { calledIntercept++; return callback.apply(this, arguments); }; }, - plugins: [new Plugin({ - name: "foobar", - visitor: { - "Program|Identifier": function () { - calledRaw++; + plugins: [ + new Plugin({ + name: "foobar", + visitor: { + "Program|Identifier": function() { + calledRaw++; + }, }, - }, - })], + }), + ], }); assert.equal(calledRaw, 4); assert.equal(calledIntercept, 4); }); - it("pass per preset", function () { + it("pass per preset", function() { let aliasBaseType = null; function execTest(passPerPreset) { @@ -201,13 +236,15 @@ describe("api", function () { passPerPreset: passPerPreset, presets: [ // First preset with our plugin, "before" - function () { + function() { return { plugins: [ new Plugin({ visitor: { - Function: function (path) { - const alias = path.scope.getProgramParent().path.get("body")[0].node; + Function: function(path) { + const alias = path.scope + .getProgramParent() + .path.get("body")[0].node; if (!babel.types.isTypeAlias(alias)) return; // In case of `passPerPreset` being `false`, the @@ -230,11 +267,12 @@ describe("api", function () { require(__dirname + "/../../babel-preset-es2015"), // Third preset for Flow. - function () { + function() { return { plugins: [ require(__dirname + "/../../babel-plugin-syntax-flow"), - require(__dirname + "/../../babel-plugin-transform-flow-strip-types"), + require(__dirname + + "/../../babel-plugin-transform-flow-strip-types"), ], }; }, @@ -248,13 +286,16 @@ describe("api", function () { assert.equal(aliasBaseType, "NumberTypeAnnotation"); - assert.deepEqual([ - "\"use strict\";", - "", - "var x = function x(y) {", - " return y;", - "};", - ].join("\n"), result.code); + assert.deepEqual( + [ + '"use strict";', + "", + "var x = function x(y) {", + " return y;", + "};", + ].join("\n"), + result.code, + ); // 2. passPerPreset: false @@ -264,14 +305,16 @@ describe("api", function () { assert.equal(aliasBaseType, null); - assert.deepEqual([ - "\"use strict\";", - "", - "var x = function x(y) {", - " return y;", - "};", - ].join("\n"), result.code); - + assert.deepEqual( + [ + '"use strict";', + "", + "var x = function x(y) {", + " return y;", + "};", + ].join("\n"), + result.code, + ); }); it("complex plugin and preset ordering", function() { @@ -279,7 +322,10 @@ describe("api", function () { return { visitor: { Program(path) { - path.pushContainer("body", babel.types.expressionStatement(babel.types.identifier(str))); + path.pushContainer( + "body", + babel.types.expressionStatement(babel.types.identifier(str)), + ); }, }, }; @@ -290,288 +336,345 @@ describe("api", function () { } const result = babel.transform("", { - filename: path.join(__dirname, "fixtures", "config", "complex-plugin-config", "file.js"), - presets: [ - pushPreset("argone"), - pushPreset("argtwo"), - ], + filename: path.join( + __dirname, + "fixtures", + "config", + "complex-plugin-config", + "file.js", + ), + presets: [pushPreset("argone"), pushPreset("argtwo")], env: { development: { passPerPreset: true, - presets: [ - pushPreset("argthree"), - pushPreset("argfour"), - ], + presets: [pushPreset("argthree"), pushPreset("argfour")], env: { development: { passPerPreset: true, - presets: [ - pushPreset("argfive"), - pushPreset("argsix"), - ], + presets: [pushPreset("argfive"), pushPreset("argsix")], }, }, }, }, }); - assert.equal(result.code, [ - "argtwo;", - "argone;", - "eleven;", - "twelve;", - "one;", - "two;", - "five;", - "six;", - "three;", - "four;", - "seventeen;", - "eighteen;", - "nineteen;", - "twenty;", - "thirteen;", - "fourteen;", - "fifteen;", - "sixteen;", - "argfive;", - "argsix;", - "argthree;", - "argfour;", - "seven;", - "eight;", - "nine;", - "ten;", - ].join("\n")); + assert.equal( + result.code, + [ + "argtwo;", + "argone;", + "eleven;", + "twelve;", + "one;", + "two;", + "five;", + "six;", + "three;", + "four;", + "seventeen;", + "eighteen;", + "nineteen;", + "twenty;", + "thirteen;", + "fourteen;", + "fifteen;", + "sixteen;", + "argfive;", + "argsix;", + "argthree;", + "argfour;", + "seven;", + "eight;", + "nine;", + "ten;", + ].join("\n"), + ); }); - it("source map merging", function () { - const result = babel.transform([ - /* eslint-disable max-len */ - "function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }", - "", - "let Foo = function Foo() {", - " _classCallCheck(this, Foo);", - "};", - "", - "//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZG91dCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztJQUFNLEdBQUcsWUFBSCxHQUFHO3dCQUFILEdBQUciLCJmaWxlIjoidW5kZWZpbmVkIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgRm9vIHt9XG4iXX0=", - /* eslint-enable max-len */ - ].join("\n"), { - sourceMap: true, - }); + it("source map merging", function() { + const result = babel.transform( + [ + /* eslint-disable max-len */ + 'function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }', + "", + "let Foo = function Foo() {", + " _classCallCheck(this, Foo);", + "};", + "", + "//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZG91dCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztJQUFNLEdBQUcsWUFBSCxHQUFHO3dCQUFILEdBQUciLCJmaWxlIjoidW5kZWZpbmVkIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgRm9vIHt9XG4iXX0=", + /* eslint-enable max-len */ + ].join("\n"), + { + sourceMap: true, + }, + ); - assert.deepEqual([ - "function _classCallCheck(instance, Constructor) {", - " if (!(instance instanceof Constructor)) {", - " throw new TypeError(\"Cannot call a class as a function\");", - " }", - "}", - "", - "let Foo = function Foo() {", - " _classCallCheck(this, Foo);", - "};", - ].join("\n"), result.code); + assert.deepEqual( + [ + "function _classCallCheck(instance, Constructor) {", + " if (!(instance instanceof Constructor)) {", + ' throw new TypeError("Cannot call a class as a function");', + " }", + "}", + "", + "let Foo = function Foo() {", + " _classCallCheck(this, Foo);", + "};", + ].join("\n"), + result.code, + ); const consumer = new sourceMap.SourceMapConsumer(result.map); - assert.deepEqual(consumer.originalPositionFor({ - line: 7, - column: 4, - }), { - name: null, - source: "stdout", - line: 1, - column: 6, - }); + assert.deepEqual( + consumer.originalPositionFor({ + line: 7, + column: 4, + }), + { + name: null, + source: "stdout", + line: 1, + column: 6, + }, + ); }); - it("code option false", function () { - return transformAsync("foo('bar');", { code: false }).then(function (result) { + it("code option false", function() { + return transformAsync("foo('bar');", { code: false }).then(function( + result, + ) { assert.ok(!result.code); }); }); - it("ast option false", function () { - return transformAsync("foo('bar');", { ast: false }).then(function (result) { + it("ast option false", function() { + return transformAsync("foo('bar');", { ast: false }).then(function(result) { assert.ok(!result.ast); }); }); - it("auxiliaryComment option", function () { + it("auxiliaryComment option", function() { return transformAsync("class Foo {}", { auxiliaryCommentBefore: "before", auxiliaryCommentAfter: "after", - plugins: [function (babel) { - const t = babel.types; - return { - visitor: { - Program: function (path) { - path.unshiftContainer("body", t.expressionStatement(t.identifier("start"))); - path.pushContainer("body", t.expressionStatement(t.identifier("end"))); + plugins: [ + function(babel) { + const t = babel.types; + return { + visitor: { + Program: function(path) { + path.unshiftContainer( + "body", + t.expressionStatement(t.identifier("start")), + ); + path.pushContainer( + "body", + t.expressionStatement(t.identifier("end")), + ); + }, }, - }, - }; - }], - }).then(function (result) { - assert.equal(result.code, - "/*before*/start;\n/*after*/class Foo {}\n/*before*/end;\n/*after*/"); + }; + }, + ], + }).then(function(result) { + assert.equal( + result.code, + "/*before*/start;\n/*after*/class Foo {}\n/*before*/end;\n/*after*/", + ); }); }); - it("modules metadata", function () { + it("modules metadata", function() { return Promise.all([ // eslint-disable-next-line max-len - transformAsync("import { externalName as localName } from \"external\";").then(function (result) { + transformAsync( + 'import { externalName as localName } from "external";', + ).then(function(result) { assert.deepEqual(result.metadata.modules.imports[0], { source: "external", imported: ["externalName"], - specifiers: [{ - kind: "named", - imported: "externalName", - local: "localName", - }], + specifiers: [ + { + kind: "named", + imported: "externalName", + local: "localName", + }, + ], }); }), - transformAsync("import * as localName2 from \"external\";").then(function (result) { + transformAsync('import * as localName2 from "external";').then(function( + result, + ) { assert.deepEqual(result.metadata.modules.imports[0], { source: "external", imported: ["*"], - specifiers: [{ - kind: "namespace", - local: "localName2", - }], + specifiers: [ + { + kind: "namespace", + local: "localName2", + }, + ], }); }), - transformAsync("import localName3 from \"external\";").then(function (result) { + transformAsync('import localName3 from "external";').then(function( + result, + ) { assert.deepEqual(result.metadata.modules.imports[0], { source: "external", imported: ["default"], - specifiers: [{ - kind: "named", - imported: "default", - local: "localName3", - }], + specifiers: [ + { + kind: "named", + imported: "default", + local: "localName3", + }, + ], }); }), - transformAsync("import localName from \"./array\";", { + transformAsync('import localName from "./array";', { resolveModuleSource: function() { return "override-source"; }, - }).then(function (result) { + }).then(function(result) { assert.deepEqual(result.metadata.modules.imports, [ { source: "override-source", imported: ["default"], specifiers: [ { - "kind": "named", - "imported": "default", - "local": "localName", + kind: "named", + imported: "default", + local: "localName", }, ], }, ]); }), - transformAsync("export * as externalName1 from \"external\";", { + transformAsync('export * as externalName1 from "external";', { plugins: [require("../../babel-plugin-syntax-export-extensions")], - }).then(function (result) { + }).then(function(result) { assert.deepEqual(result.metadata.modules.exports, { exported: ["externalName1"], - specifiers: [{ - kind: "external-namespace", - exported: "externalName1", - source: "external", - }], + specifiers: [ + { + kind: "external-namespace", + exported: "externalName1", + source: "external", + }, + ], }); }), - transformAsync("export externalName2 from \"external\";", { + transformAsync('export externalName2 from "external";', { plugins: [require("../../babel-plugin-syntax-export-extensions")], - }).then(function (result) { + }).then(function(result) { assert.deepEqual(result.metadata.modules.exports, { exported: ["externalName2"], - specifiers: [{ - kind: "external", - local: "externalName2", - exported: "externalName2", - source: "external", - }], + specifiers: [ + { + kind: "external", + local: "externalName2", + exported: "externalName2", + source: "external", + }, + ], }); }), - transformAsync("export function namedFunction() {}").then(function (result) { + transformAsync("export function namedFunction() {}").then(function( + result, + ) { assert.deepEqual(result.metadata.modules.exports, { exported: ["namedFunction"], - specifiers: [{ - kind: "local", - local: "namedFunction", - exported: "namedFunction", - }], + specifiers: [ + { + kind: "local", + local: "namedFunction", + exported: "namedFunction", + }, + ], }); }), - transformAsync("export var foo = \"bar\";").then(function (result) { + transformAsync('export var foo = "bar";').then(function(result) { assert.deepEqual(result.metadata.modules.exports, { - "exported": ["foo"], - specifiers: [{ - kind: "local", - local: "foo", - exported: "foo", - }], + exported: ["foo"], + specifiers: [ + { + kind: "local", + local: "foo", + exported: "foo", + }, + ], }); }), - transformAsync("export { localName as externalName3 };").then(function (result) { + transformAsync("export { localName as externalName3 };").then(function( + result, + ) { assert.deepEqual(result.metadata.modules.exports, { exported: ["externalName3"], - specifiers: [{ - kind: "local", - local: "localName", - exported: "externalName3", - }], + specifiers: [ + { + kind: "local", + local: "localName", + exported: "externalName3", + }, + ], }); }), - transformAsync("export { externalName4 } from \"external\";").then(function (result) { + transformAsync('export { externalName4 } from "external";').then(function( + result, + ) { assert.deepEqual(result.metadata.modules.exports, { exported: ["externalName4"], - specifiers: [{ - kind: "external", - local: "externalName4", - exported: "externalName4", - source: "external", - }], + specifiers: [ + { + kind: "external", + local: "externalName4", + exported: "externalName4", + source: "external", + }, + ], }); }), - transformAsync("export * from \"external\";").then(function (result) { + transformAsync('export * from "external";').then(function(result) { assert.deepEqual(result.metadata.modules.exports, { exported: [], - specifiers: [{ - kind: "external-all", - source: "external", - }], + specifiers: [ + { + kind: "external-all", + source: "external", + }, + ], }); }), - transformAsync("export default function defaultFunction() {}").then(function (result) { + transformAsync( + "export default function defaultFunction() {}", + ).then(function(result) { assert.deepEqual(result.metadata.modules.exports, { exported: ["defaultFunction"], - specifiers: [{ - kind: "local", - local: "defaultFunction", - exported: "default", - }], + specifiers: [ + { + kind: "local", + local: "defaultFunction", + exported: "default", + }, + ], }); }), ]); }); - it("ignore option", function () { + it("ignore option", function() { return Promise.all([ transformAsync("", { ignore: ["/foo"], @@ -610,7 +713,7 @@ describe("api", function () { ]); }); - it("only option", function () { + it("only option", function() { return Promise.all([ transformAsync("", { only: ["/foo"], @@ -649,23 +752,23 @@ describe("api", function () { ]); }); - describe("env option", function () { + describe("env option", function() { const oldBabelEnv = process.env.BABEL_ENV; const oldNodeEnv = process.env.NODE_ENV; - setup(function () { + setup(function() { // Tests need to run with the default and specific values for these. They // need to be cleared for each test. delete process.env.BABEL_ENV; delete process.env.NODE_ENV; }); - suiteTeardown(function () { + suiteTeardown(function() { process.env.BABEL_ENV = oldBabelEnv; process.env.NODE_ENV = oldNodeEnv; }); - it("default", function () { + it("default", function() { const result = babel.transform("foo;", { env: { development: { code: false }, @@ -675,7 +778,7 @@ describe("api", function () { assert.equal(result.code, undefined); }); - it("BABEL_ENV", function () { + it("BABEL_ENV", function() { process.env.BABEL_ENV = "foo"; const result = babel.transform("foo;", { env: { @@ -685,7 +788,7 @@ describe("api", function () { assert.equal(result.code, undefined); }); - it("NODE_ENV", function () { + it("NODE_ENV", function() { process.env.NODE_ENV = "foo"; const result = babel.transform("foo;", { env: { @@ -696,41 +799,43 @@ describe("api", function () { }); }); - it("resolveModuleSource option", function () { + it("resolveModuleSource option", function() { /* eslint-disable max-len */ - const actual = "import foo from \"foo-import-default\";\nimport \"foo-import-bare\";\nexport { foo } from \"foo-export-named\";"; - const expected = "import foo from \"resolved/foo-import-default\";\nimport \"resolved/foo-import-bare\";\nexport { foo } from \"resolved/foo-export-named\";"; + const actual = + 'import foo from "foo-import-default";\nimport "foo-import-bare";\nexport { foo } from "foo-export-named";'; + const expected = + 'import foo from "resolved/foo-import-default";\nimport "resolved/foo-import-bare";\nexport { foo } from "resolved/foo-export-named";'; /* eslint-enable max-len */ return transformAsync(actual, { - resolveModuleSource: function (originalSource) { + resolveModuleSource: function(originalSource) { return "resolved/" + originalSource; }, - }).then(function (result) { + }).then(function(result) { assert.equal(result.code.trim(), expected); }); }); - describe("buildExternalHelpers", function () { - it("all", function () { + describe("buildExternalHelpers", function() { + it("all", function() { const script = buildExternalHelpers(); assert.ok(script.indexOf("classCallCheck") >= -1); assert.ok(script.indexOf("inherits") >= 0); }); - it("whitelist", function () { + it("whitelist", function() { const script = buildExternalHelpers(["inherits"]); assert.ok(script.indexOf("classCallCheck") === -1); assert.ok(script.indexOf("inherits") >= 0); }); - it("empty whitelist", function () { + it("empty whitelist", function() { const script = buildExternalHelpers([]); assert.ok(script.indexOf("classCallCheck") === -1); assert.ok(script.indexOf("inherits") === -1); }); - it("underscored", function () { + it("underscored", function() { const script = buildExternalHelpers(["typeof"]); assert.ok(script.indexOf("typeof") >= 0); }); diff --git a/packages/babel-core/test/browserify.js b/packages/babel-core/test/browserify.js index e8e8f27c82..6f91c3f3fc 100644 --- a/packages/babel-core/test/browserify.js +++ b/packages/babel-core/test/browserify.js @@ -5,7 +5,9 @@ import vm from "vm"; describe("browserify", function() { it("babel/register may be used without breaking browserify", function(done) { - const bundler = browserify(path.join(__dirname, "fixtures/browserify/register.js")); + const bundler = browserify( + path.join(__dirname, "fixtures/browserify/register.js"), + ); bundler.bundle(function(err, bundle) { if (err) return done(err); diff --git a/packages/babel-core/test/caching-api.js b/packages/babel-core/test/caching-api.js index 914214540b..d846fd85bb 100644 --- a/packages/babel-core/test/caching-api.js +++ b/packages/babel-core/test/caching-api.js @@ -27,7 +27,6 @@ describe("caching API", () => { return { arg, count: count++ }; }); - assert.deepEqual(fn("one"), { arg: "one", count: 0 }); assert.equal(fn("one"), fn("one")); @@ -210,48 +209,97 @@ describe("caching API", () => { return { arg, val, val2, count: count++ }; }); - assert.deepEqual(fn("one"), { arg: "one", val: "default", val2: "another", count: 0 }); + assert.deepEqual(fn("one"), { + arg: "one", + val: "default", + val2: "another", + count: 0, + }); assert.equal(fn("one"), fn("one")); - assert.deepEqual(fn("two"), { arg: "two", val: "default", val2: "another", count: 1 }); + assert.deepEqual(fn("two"), { + arg: "two", + val: "default", + val2: "another", + count: 1, + }); assert.equal(fn("two"), fn("two")); other = "new"; - assert.deepEqual(fn("one"), { arg: "one", val: "new", val2: "another", count: 2 }); + assert.deepEqual(fn("one"), { + arg: "one", + val: "new", + val2: "another", + count: 2, + }); assert.equal(fn("one"), fn("one")); - assert.deepEqual(fn("two"), { arg: "two", val: "new", val2: "another", count: 3 }); + assert.deepEqual(fn("two"), { + arg: "two", + val: "new", + val2: "another", + count: 3, + }); assert.equal(fn("two"), fn("two")); other = "default"; - assert.deepEqual(fn("one"), { arg: "one", val: "default", val2: "another", count: 4 }); + assert.deepEqual(fn("one"), { + arg: "one", + val: "default", + val2: "another", + count: 4, + }); assert.equal(fn("one"), fn("one")); - assert.deepEqual(fn("two"), { arg: "two", val: "default", val2: "another", count: 5 }); + assert.deepEqual(fn("two"), { + arg: "two", + val: "default", + val2: "another", + count: 5, + }); assert.equal(fn("two"), fn("two")); other = "new"; - assert.deepEqual(fn("one"), { arg: "one", val: "new", val2: "another", count: 6 }); + assert.deepEqual(fn("one"), { + arg: "one", + val: "new", + val2: "another", + count: 6, + }); assert.equal(fn("one"), fn("one")); - assert.deepEqual(fn("two"), { arg: "two", val: "new", val2: "another", count: 7 }); + assert.deepEqual(fn("two"), { + arg: "two", + val: "new", + val2: "another", + count: 7, + }); assert.equal(fn("two"), fn("two")); another = "second"; - assert.deepEqual(fn("one"), { arg: "one", val: "new", val2: "second", count: 8 }); + assert.deepEqual(fn("one"), { + arg: "one", + val: "new", + val2: "second", + count: 8, + }); assert.equal(fn("one"), fn("one")); - assert.deepEqual(fn("two"), { arg: "two", val: "new", val2: "second", count: 9 }); + assert.deepEqual(fn("two"), { + arg: "two", + val: "new", + val2: "second", + count: 9, + }); assert.equal(fn("two"), fn("two")); - }); it("should throw if caching is never configured and not defaulting", () => { - const fn = makeStrongCache(() => { }, false /* autoPermacache */); + const fn = makeStrongCache(() => {}, false /* autoPermacache */); assert.throws(() => fn(), /Error: Caching was left unconfigured./); }); @@ -259,7 +307,7 @@ describe("caching API", () => { it("should auto-permacache by default", () => { let count = 0; - const fn = makeStrongCache((arg) => ({ arg, count: count++ })); + const fn = makeStrongCache(arg => ({ arg, count: count++ })); assert.deepEqual(fn("one"), { arg: "one", count: 0 }); assert.equal(fn("one"), fn("one")); @@ -333,7 +381,10 @@ describe("caching API", () => { it("should throw if you configure .forever after exiting", () => { const fn = makeStrongCache((arg, cache) => cache); - assert.throws(() => fn().forever(), /Cannot change caching after evaluation/); + assert.throws( + () => fn().forever(), + /Cannot change caching after evaluation/, + ); }); it("should throw if you configure .never after exiting", () => { @@ -345,12 +396,18 @@ describe("caching API", () => { it("should throw if you configure .using after exiting", () => { const fn = makeStrongCache((arg, cache) => cache); - assert.throws(() => fn().using(() => null), /Cannot change caching after evaluation/); + assert.throws( + () => fn().using(() => null), + /Cannot change caching after evaluation/, + ); }); it("should throw if you configure .invalidate after exiting", () => { const fn = makeStrongCache((arg, cache) => cache); - assert.throws(() => fn().invalidate(() => null), /Cannot change caching after evaluation/); + assert.throws( + () => fn().invalidate(() => null), + /Cannot change caching after evaluation/, + ); }); }); diff --git a/packages/babel-core/test/config-chain.js b/packages/babel-core/test/config-chain.js index 269e6053f7..3f93a7d18c 100644 --- a/packages/babel-core/test/config-chain.js +++ b/packages/babel-core/test/config-chain.js @@ -4,7 +4,7 @@ import buildConfigChain from "../lib/config/build-config-chain"; function fixture() { const args = [__dirname, "fixtures", "config"]; - for (let i = 0; i < arguments.length; i ++) { + for (let i = 0; i < arguments.length; i++) { args.push(arguments[i]); } return path.join.apply(path, args); @@ -14,11 +14,11 @@ function base() { return process.cwd(); } -describe("buildConfigChain", function () { +describe("buildConfigChain", function() { let oldBabelEnv; let oldNodeEnv; - beforeEach(function () { + beforeEach(function() { oldBabelEnv = process.env.BABEL_ENV; oldNodeEnv = process.env.NODE_ENV; @@ -26,7 +26,7 @@ describe("buildConfigChain", function () { delete process.env.NODE_ENV; }); - afterEach(function () { + afterEach(function() { process.env.BABEL_ENV = oldBabelEnv; process.env.NODE_ENV = oldNodeEnv; }); @@ -52,7 +52,7 @@ describe("buildConfigChain", function () { }); }); - it("dir1", function () { + it("dir1", function() { const chain = buildConfigChain({ filename: fixture("dir1", "src.js"), }); @@ -61,9 +61,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "extended", - ], + plugins: ["extended"], }, alias: fixture("extended.babelrc.json"), loc: fixture("extended.babelrc.json"), @@ -72,9 +70,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "root", - ], + plugins: ["root"], }, alias: fixture(".babelrc"), loc: fixture(".babelrc"), @@ -83,9 +79,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -105,7 +99,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("dir2", function () { + it("dir2", function() { const chain = buildConfigChain({ filename: fixture("dir2", "src.js"), }); @@ -114,9 +108,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -125,9 +117,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "dir2", - ], + plugins: ["dir2"], }, alias: fixture("dir2", ".babelrc"), loc: fixture("dir2", ".babelrc"), @@ -147,7 +137,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("dir3", function () { + it("dir3", function() { const chain = buildConfigChain({ filename: fixture("dir3", "src.js"), }); @@ -156,9 +146,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "extended", - ], + plugins: ["extended"], }, alias: fixture("extended.babelrc.json"), loc: fixture("extended.babelrc.json"), @@ -167,9 +155,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "root", - ], + plugins: ["root"], }, alias: fixture(".babelrc"), loc: fixture(".babelrc"), @@ -178,9 +164,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -200,7 +184,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("env - base", function () { + it("env - base", function() { const chain = buildConfigChain({ filename: fixture("env", "src.js"), }); @@ -209,9 +193,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -220,9 +202,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "env-base", - ], + plugins: ["env-base"], }, alias: fixture("env", ".babelrc"), loc: fixture("env", ".babelrc"), @@ -242,7 +222,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("env - foo", function () { + it("env - foo", function() { process.env.NODE_ENV = "foo"; const chain = buildConfigChain({ @@ -253,9 +233,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -264,9 +242,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "env-base", - ], + plugins: ["env-base"], }, alias: fixture("env", ".babelrc"), loc: fixture("env", ".babelrc"), @@ -275,9 +251,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "env-foo", - ], + plugins: ["env-foo"], }, alias: fixture("env", ".babelrc.env.foo"), loc: fixture("env", ".babelrc.env.foo"), @@ -297,7 +271,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("env - bar", function () { + it("env - bar", function() { process.env.NODE_ENV = "foo"; // overridden process.env.NODE_ENV = "bar"; @@ -309,9 +283,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -320,9 +292,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "env-base", - ], + plugins: ["env-base"], }, alias: fixture("env", ".babelrc"), loc: fixture("env", ".babelrc"), @@ -331,9 +301,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "env-bar", - ], + plugins: ["env-bar"], }, alias: fixture("env", ".babelrc.env.bar"), loc: fixture("env", ".babelrc.env.bar"), @@ -353,8 +321,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - - it("env - foo", function () { + it("env - foo", function() { process.env.NODE_ENV = "foo"; const chain = buildConfigChain({ @@ -394,7 +361,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("js-config", function () { + it("js-config", function() { const chain = buildConfigChain({ filename: fixture("js-config", "src.js"), }); @@ -403,9 +370,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -414,10 +379,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "foo", - "bar", - ], + plugins: ["foo", "bar"], }, alias: fixture("js-config", ".babelrc.js"), loc: fixture("js-config", ".babelrc.js"), @@ -437,7 +399,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("js-config-function", function () { + it("js-config-function", function() { const chain = buildConfigChain({ filename: fixture("js-config-function", "src.js"), }); @@ -446,9 +408,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -477,7 +437,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("js-config-default - should read transpiled export default", function () { + it("js-config-default - should read transpiled export default", function() { const chain = buildConfigChain({ filename: fixture("js-config-default", "src.js"), }); @@ -486,9 +446,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -497,10 +455,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "foo", - "bar", - ], + plugins: ["foo", "bar"], }, alias: fixture("js-config-default", ".babelrc.js"), loc: fixture("js-config-default", ".babelrc.js"), @@ -519,7 +474,7 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("js-config-extended", function () { + it("js-config-extended", function() { const chain = buildConfigChain({ filename: fixture("js-config-extended", "src.js"), }); @@ -528,9 +483,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -539,9 +492,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "extended", - ], + plugins: ["extended"], }, alias: fixture("extended.babelrc.json"), loc: fixture("extended.babelrc.json"), @@ -550,10 +501,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - plugins: [ - "foo", - "bar", - ], + plugins: ["foo", "bar"], }, alias: fixture("js-config-extended", ".babelrc.js"), loc: fixture("js-config-extended", ".babelrc.js"), @@ -573,50 +521,49 @@ describe("buildConfigChain", function () { assert.deepEqual(chain, expected); }); - it("json-pkg-config-no-babel - should not throw if" + - " package.json doesn't contain a `babel` field", function () { - const chain = buildConfigChain({ - filename: fixture("json-pkg-config-no-babel", "src.js"), - }); + it( + "json-pkg-config-no-babel - should not throw if" + + " package.json doesn't contain a `babel` field", + function() { + const chain = buildConfigChain({ + filename: fixture("json-pkg-config-no-babel", "src.js"), + }); - const expected = [ - { - type: "options", - options: { - ignore: [ - "root-ignore", - ], + const expected = [ + { + type: "options", + options: { + ignore: ["root-ignore"], + }, + alias: fixture(".babelignore"), + loc: fixture(".babelignore"), + dirname: fixture(), }, - alias: fixture(".babelignore"), - loc: fixture(".babelignore"), - dirname: fixture(), - }, - { - type: "options", - options: { - plugins: [ - "json", - ], + { + type: "options", + options: { + plugins: ["json"], + }, + alias: fixture("json-pkg-config-no-babel", ".babelrc"), + loc: fixture("json-pkg-config-no-babel", ".babelrc"), + dirname: fixture("json-pkg-config-no-babel"), }, - alias: fixture("json-pkg-config-no-babel", ".babelrc"), - loc: fixture("json-pkg-config-no-babel", ".babelrc"), - dirname: fixture("json-pkg-config-no-babel"), - }, - { - type: "arguments", - options: { - filename: fixture("json-pkg-config-no-babel", "src.js"), + { + type: "arguments", + options: { + filename: fixture("json-pkg-config-no-babel", "src.js"), + }, + alias: "base", + loc: "base", + dirname: base(), }, - alias: "base", - loc: "base", - dirname: base(), - }, - ]; + ]; - assert.deepEqual(chain, expected); - }); + assert.deepEqual(chain, expected); + }, + ); - it("should not ignore file matching negated file pattern", function () { + it("should not ignore file matching negated file pattern", function() { const chain = buildConfigChain({ filename: fixture("ignore-negate", "src.js"), }); @@ -625,9 +572,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -636,10 +581,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "*", - "!src.js", - ], + ignore: ["*", "!src.js"], }, alias: fixture("ignore-negate", ".babelrc"), loc: fixture("ignore-negate", ".babelrc"), @@ -665,7 +607,7 @@ describe("buildConfigChain", function () { assert.equal(chain2, null); }); - it("should not ignore file matching negated folder pattern", function () { + it("should not ignore file matching negated folder pattern", function() { const chain = buildConfigChain({ filename: fixture("ignore-negate-folder", "folder", "src.js"), }); @@ -674,9 +616,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "root-ignore", - ], + ignore: ["root-ignore"], }, alias: fixture(".babelignore"), loc: fixture(".babelignore"), @@ -685,10 +625,7 @@ describe("buildConfigChain", function () { { type: "options", options: { - ignore: [ - "*", - "!folder", - ], + ignore: ["*", "!folder"], }, alias: fixture("ignore-negate-folder", ".babelrc"), loc: fixture("ignore-negate-folder", ".babelrc"), @@ -714,83 +651,71 @@ describe("buildConfigChain", function () { assert.equal(chain2, null); }); - it("js-json-config - should throw an error if both a .babelrc" + - " and a .babelrc.js are present", function () { - assert.throws( - function () { + it( + "js-json-config - should throw an error if both a .babelrc" + + " and a .babelrc.js are present", + function() { + assert.throws(function() { buildConfigChain({ filename: fixture("js-json-config", "src.js"), }); - }, - /Multiple configuration files found\.(.|\n)*\.babelrc(.|\n)*\.babelrc\.js/ - ); - }); + }, /Multiple configuration files found\.(.|\n)*\.babelrc(.|\n)*\.babelrc\.js/); + }, + ); - it("js-pkg-config - should throw an error if both a .babelrc.js" + - " and a package.json with a babel field are present", function () { - assert.throws( - function () { + it( + "js-pkg-config - should throw an error if both a .babelrc.js" + + " and a package.json with a babel field are present", + function() { + assert.throws(function() { buildConfigChain({ filename: fixture("js-pkg-config", "src.js"), }); - }, - /Multiple configuration files found\.(.|\n)*\.babelrc\.js(.|\n)*package\.json/ - ); - }); + }, /Multiple configuration files found\.(.|\n)*\.babelrc\.js(.|\n)*package\.json/); + }, + ); - it("json-pkg-config - should throw an error if both a .babelrc" + - " and a package.json with a babel field are present", function () { - assert.throws( - function () { + it( + "json-pkg-config - should throw an error if both a .babelrc" + + " and a package.json with a babel field are present", + function() { + assert.throws(function() { buildConfigChain({ filename: fixture("json-pkg-config", "src.js"), }); - }, - /Multiple configuration files found\.(.|\n)*\.babelrc(.|\n)*package\.json/ - ); + }, /Multiple configuration files found\.(.|\n)*\.babelrc(.|\n)*package\.json/); + }, + ); + + it("js-config-error", function() { + assert.throws(function() { + buildConfigChain({ + filename: fixture("js-config-error", "src.js"), + }); + }, /Error while loading config/); }); - it("js-config-error", function () { - assert.throws( - function () { - buildConfigChain({ - filename: fixture("js-config-error", "src.js"), - }); - }, - /Error while loading config/ - ); + it("js-config-error2", function() { + assert.throws(function() { + buildConfigChain({ + filename: fixture("js-config-error2", "src.js"), + }); + }, /Configuration should be an exported JavaScript object/); }); - it("js-config-error2", function () { - assert.throws( - function () { - buildConfigChain({ - filename: fixture("js-config-error2", "src.js"), - }); - }, - /Configuration should be an exported JavaScript object/ - ); + it("js-config-error3", function() { + assert.throws(function() { + buildConfigChain({ + filename: fixture("js-config-error3", "src.js"), + }); + }, /Configuration should be an exported JavaScript object/); }); - it("js-config-error3", function () { - assert.throws( - function () { - buildConfigChain({ - filename: fixture("js-config-error3", "src.js"), - }); - }, - /Configuration should be an exported JavaScript object/ - ); - }); - - it("json-config-error", function () { - assert.throws( - function () { - buildConfigChain({ - filename: fixture("json-config-error", "src.js"), - }); - }, - /Error while parsing config/ - ); + it("json-config-error", function() { + assert.throws(function() { + buildConfigChain({ + filename: fixture("json-config-error", "src.js"), + }); + }, /Error while parsing config/); }); }); diff --git a/packages/babel-core/test/evaluation.js b/packages/babel-core/test/evaluation.js index ca86f51839..f055238322 100644 --- a/packages/babel-core/test/evaluation.js +++ b/packages/babel-core/test/evaluation.js @@ -2,20 +2,23 @@ import traverse from "babel-traverse"; import assert from "assert"; import { parse } from "babylon"; -describe("evaluation", function () { +describe("evaluation", function() { function addTest(code, type, value, notConfident) { - it(type + ": " + code, function () { + it(type + ": " + code, function() { const visitor = {}; - visitor[type] = function (path) { + visitor[type] = function(path) { const evaluate = path.evaluate(); assert.equal(evaluate.confident, !notConfident); assert.deepEqual(evaluate.value, value); }; - traverse(parse(code, { - plugins: ["*"], - }), visitor); + traverse( + parse(code, { + plugins: ["*"], + }), + visitor, + ); }); } @@ -56,14 +59,39 @@ describe("evaluation", function () { addTest("'abc' === 'xyz' || 1 === 1", "LogicalExpression", true); addTest("'abc' === 'xyz' || 1 === 10", "LogicalExpression", false); addTest("'abc' === 'abc' || config.flag === 1", "LogicalExpression", true); - addTest("obj.a === 'abc' || config.flag === 1", "LogicalExpression", undefined, true); + addTest( + "obj.a === 'abc' || config.flag === 1", + "LogicalExpression", + undefined, + true, + ); addTest("'abc' !== 'abc' && config.flag === 1", "LogicalExpression", false); addTest("obj.a === 'abc' && 1 === 1", "LogicalExpression", undefined, true); - addTest("'abc' === 'abc' && (1 === 1 || config.flag)", "LogicalExpression", true); - addTest("'abc' === 'xyz' || (1 === 1 && config.flag)", "LogicalExpression", undefined, true); - addTest("'abc' === 'xyz' || (1 === 1 && 'four' === 'four')", "LogicalExpression", true); - addTest("'abc' === 'abc' && (1 === 1 && 'four' === 'four')", "LogicalExpression", true); + addTest( + "'abc' === 'abc' && (1 === 1 || config.flag)", + "LogicalExpression", + true, + ); + addTest( + "'abc' === 'xyz' || (1 === 1 && config.flag)", + "LogicalExpression", + undefined, + true, + ); + addTest( + "'abc' === 'xyz' || (1 === 1 && 'four' === 'four')", + "LogicalExpression", + true, + ); + addTest( + "'abc' === 'abc' && (1 === 1 && 'four' === 'four')", + "LogicalExpression", + true, + ); addTest("({})", "ObjectExpression", {}); addTest("({a: '1'})", "ObjectExpression", { a: "1" }); - addTest("({['a' + 'b']: 10 * 20, 'z': [1, 2, 3]})", "ObjectExpression", { ab: 200, z: [1, 2, 3] }); + addTest("({['a' + 'b']: 10 * 20, 'z': [1, 2, 3]})", "ObjectExpression", { + ab: 200, + z: [1, 2, 3], + }); }); diff --git a/packages/babel-core/test/option-manager.js b/packages/babel-core/test/option-manager.js index cf2fcaa484..3868d456fa 100644 --- a/packages/babel-core/test/option-manager.js +++ b/packages/babel-core/test/option-manager.js @@ -6,55 +6,51 @@ describe("option-manager", () => { it("throws for babel 5 plugin", () => { return assert.throws(() => { manageOptions({ - plugins: [ - ({ Plugin }) => new Plugin("object-assign", {}), - ], + plugins: [({ Plugin }) => new Plugin("object-assign", {})], }); }, /Babel 5 plugin is being run with Babel 6/); }); describe("mergeOptions", () => { it("throws for removed babel 5 options", () => { - return assert.throws( - () => { - manageOptions({ - "randomOption": true, - }); - }, - /Unknown option: base.randomOption/ - ); + return assert.throws(() => { + manageOptions({ + randomOption: true, + }); + }, /Unknown option: base.randomOption/); }); it("throws for removed babel 5 options", () => { return assert.throws( () => { manageOptions({ - "auxiliaryComment": true, - "blacklist": true, + auxiliaryComment: true, + blacklist: true, }); }, // eslint-disable-next-line max-len - /Using removed Babel 5 option: base.auxiliaryComment - Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`/ + /Using removed Babel 5 option: base.auxiliaryComment - Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`/, ); }); it("throws for resolved but erroring preset", () => { - return assert.throws( - () => { - manageOptions({ - "presets": [path.join(__dirname, "fixtures/option-manager/not-a-preset")], - }); - }, - /While processing: .*option-manager(?:\/|\\\\)not-a-preset\.js/ - ); + return assert.throws(() => { + manageOptions({ + presets: [ + path.join(__dirname, "fixtures/option-manager/not-a-preset"), + ], + }); + }, /While processing: .*option-manager(?:\/|\\\\)not-a-preset\.js/); }); }); - describe("presets", function () { + describe("presets", function() { function presetTest(name) { - it(name, function () { + it(name, function() { const { options, passes } = manageOptions({ - "presets": [path.join(__dirname, "fixtures/option-manager/presets", name)], + presets: [ + path.join(__dirname, "fixtures/option-manager/presets", name), + ], }); assert.equal(true, Array.isArray(options.plugins)); @@ -65,10 +61,16 @@ describe("option-manager", () => { } function presetThrowsTest(name, msg) { - it(name, function () { - assert.throws(() => manageOptions({ - "presets": [path.join(__dirname, "fixtures/option-manager/presets", name)], - }), msg); + it(name, function() { + assert.throws( + () => + manageOptions({ + presets: [ + path.join(__dirname, "fixtures/option-manager/presets", name), + ], + }), + msg, + ); }); } @@ -77,7 +79,10 @@ describe("option-manager", () => { presetTest("es2015_default_function"); presetTest("es2015_default_object"); - presetThrowsTest("es2015_named", /Must export a default export when using ES6 modules/); + presetThrowsTest( + "es2015_named", + /Must export a default export when using ES6 modules/, + ); presetThrowsTest("es2015_invalid", /Unsupported format: string/); presetThrowsTest("es5_invalid", /Unsupported format: string/); }); diff --git a/packages/babel-core/test/path.js b/packages/babel-core/test/path.js index dbc30827c5..7e68d893a0 100644 --- a/packages/babel-core/test/path.js +++ b/packages/babel-core/test/path.js @@ -2,152 +2,172 @@ import { transform } from "../lib/index"; import Plugin from "../lib/config/plugin"; import chai from "chai"; -describe("traversal path", function () { - it("replaceWithSourceString", function () { +describe("traversal path", function() { + it("replaceWithSourceString", function() { const expectCode = "function foo() {}"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - FunctionDeclaration: function (path) { - path.replaceWithSourceString("console.whatever()"); + plugins: [ + new Plugin({ + visitor: { + FunctionDeclaration: function(path) { + path.replaceWithSourceString("console.whatever()"); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("console.whatever();"); }); - it("replaceWith (arrow expression body to block statement body)", function () { + it("replaceWith (arrow expression body to block statement body)", function() { const expectCode = "var fn = () => true;"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - ArrowFunctionExpression: function (path) { - path.get("body").replaceWith({ - type: "BlockStatement", - body: [{ - type: "ReturnStatement", - argument: { - type: "BooleanLiteral", - value: true, - }, - }], - }); + plugins: [ + new Plugin({ + visitor: { + ArrowFunctionExpression: function(path) { + path.get("body").replaceWith({ + type: "BlockStatement", + body: [ + { + type: "ReturnStatement", + argument: { + type: "BooleanLiteral", + value: true, + }, + }, + ], + }); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("var fn = () => {\n return true;\n};"); }); - it("replaceWith (arrow block statement body to expression body)", function () { + it("replaceWith (arrow block statement body to expression body)", function() { const expectCode = "var fn = () => { return true; }"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - ArrowFunctionExpression: function (path) { - path.get("body").replaceWith({ - type: "BooleanLiteral", - value: true, - }); + plugins: [ + new Plugin({ + visitor: { + ArrowFunctionExpression: function(path) { + path.get("body").replaceWith({ + type: "BooleanLiteral", + value: true, + }); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("var fn = () => true;"); }); - it("replaceWith (for-in left expression to variable declaration)", function () { + it("replaceWith (for-in left expression to variable declaration)", function() { const expectCode = "for (KEY in right);"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - ForInStatement: function (path) { - path.get("left").replaceWith({ - type: "VariableDeclaration", - kind: "var", - declarations: [{ - type: "VariableDeclarator", - id: { - type: "Identifier", - name: "KEY", - }, - }], - }); + plugins: [ + new Plugin({ + visitor: { + ForInStatement: function(path) { + path.get("left").replaceWith({ + type: "VariableDeclaration", + kind: "var", + declarations: [ + { + type: "VariableDeclarator", + id: { + type: "Identifier", + name: "KEY", + }, + }, + ], + }); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("for (var KEY in right);"); }); - it("replaceWith (for-in left variable declaration to expression)", function () { + it("replaceWith (for-in left variable declaration to expression)", function() { const expectCode = "for (var KEY in right);"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - ForInStatement: function (path) { - path.get("left").replaceWith({ - type: "Identifier", - name: "KEY", - }); + plugins: [ + new Plugin({ + visitor: { + ForInStatement: function(path) { + path.get("left").replaceWith({ + type: "Identifier", + name: "KEY", + }); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("for (KEY in right);"); }); - it("replaceWith (for-loop left expression to variable declaration)", function () { + it("replaceWith (for-loop left expression to variable declaration)", function() { const expectCode = "for (KEY;;);"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - ForStatement: function (path) { - path.get("init").replaceWith({ - type: "VariableDeclaration", - kind: "var", - declarations: [{ - type: "VariableDeclarator", - id: { - type: "Identifier", - name: "KEY", - }, - }], - }); + plugins: [ + new Plugin({ + visitor: { + ForStatement: function(path) { + path.get("init").replaceWith({ + type: "VariableDeclaration", + kind: "var", + declarations: [ + { + type: "VariableDeclarator", + id: { + type: "Identifier", + name: "KEY", + }, + }, + ], + }); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("for (var KEY;;);"); }); - it("replaceWith (for-loop left variable declaration to expression)", function () { + it("replaceWith (for-loop left variable declaration to expression)", function() { const expectCode = "for (var KEY;;);"; const actualCode = transform(expectCode, { - plugins: [new Plugin({ - visitor: { - ForStatement: function (path) { - path.get("init").replaceWith({ - type: "Identifier", - name: "KEY", - }); + plugins: [ + new Plugin({ + visitor: { + ForStatement: function(path) { + path.get("init").replaceWith({ + type: "Identifier", + name: "KEY", + }); + }, }, - }, - })], + }), + ], }).code; chai.expect(actualCode).to.be.equal("for (KEY;;);"); diff --git a/packages/babel-core/test/resolution.js b/packages/babel-core/test/resolution.js index 3df806b515..cf95e0fc43 100644 --- a/packages/babel-core/test/resolution.js +++ b/packages/babel-core/test/resolution.js @@ -2,7 +2,7 @@ import assert from "assert"; import * as babel from "../lib/index"; import path from "path"; -describe("addon resolution", function () { +describe("addon resolution", function() { const base = path.join(__dirname, "fixtures", "resolution"); beforeEach(function() { @@ -20,9 +20,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "module:preset", - ], + presets: ["module:preset"], }); }); @@ -32,9 +30,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "module:plugin", - ], + plugins: ["module:plugin"], }); }); @@ -44,9 +40,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "mod", - ], + presets: ["mod"], }); }); @@ -56,9 +50,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "mod", - ], + plugins: ["mod"], }); }); @@ -68,9 +60,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "babel-preset-mod", - ], + presets: ["babel-preset-mod"], }); }); @@ -80,9 +70,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "babel-plugin-mod", - ], + plugins: ["babel-plugin-mod"], }); }); @@ -92,9 +80,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "@babel/foo", - ], + presets: ["@babel/foo"], }); }); @@ -104,9 +90,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "@babel/foo", - ], + plugins: ["@babel/foo"], }); }); @@ -116,9 +100,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "@babel/preset-foo", - ], + presets: ["@babel/preset-foo"], }); }); @@ -128,9 +110,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "@babel/plugin-foo", - ], + plugins: ["@babel/plugin-foo"], }); }); @@ -140,9 +120,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "@foo/mod", - ], + presets: ["@foo/mod"], }); }); @@ -152,9 +130,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "@foo/mod", - ], + plugins: ["@foo/mod"], }); }); @@ -164,9 +140,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "@foo/babel-preset-mod", - ], + presets: ["@foo/babel-preset-mod"], }); }); @@ -176,9 +150,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "@foo/babel-plugin-mod", - ], + plugins: ["@foo/babel-plugin-mod"], }); }); @@ -188,9 +160,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "./dir/preset.js", - ], + presets: ["./dir/preset.js"], }); }); @@ -200,9 +170,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "./dir/plugin.js", - ], + plugins: ["./dir/plugin.js"], }); }); @@ -212,9 +180,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "mod/preset", - ], + presets: ["mod/preset"], }); }); @@ -224,9 +190,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "mod/plugin", - ], + plugins: ["mod/plugin"], }); }); @@ -236,9 +200,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "@foo/mod/preset", - ], + presets: ["@foo/mod/preset"], }); }); @@ -248,9 +210,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "@foo/mod/plugin", - ], + plugins: ["@foo/mod/plugin"], }); }); @@ -260,9 +220,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "@babel/mod/preset", - ], + presets: ["@babel/mod/preset"], }); }); @@ -272,9 +230,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "@babel/mod/plugin", - ], + plugins: ["@babel/mod/plugin"], }); }); @@ -285,9 +241,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "foo", - ], + presets: ["foo"], }); // eslint-disable-next-line max-len }, /Cannot find module 'babel-preset-foo'.*\n- If you want to resolve "foo", use "module:foo"/); @@ -300,9 +254,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "foo", - ], + plugins: ["foo"], }); // eslint-disable-next-line max-len }, /Cannot find module 'babel-plugin-foo'.*\n- If you want to resolve "foo", use "module:foo"/); @@ -315,9 +267,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "foo", - ], + presets: ["foo"], }); // eslint-disable-next-line max-len }, /Cannot find module 'babel-preset-foo'.*\n- Did you mean "@babel\/foo"\?/); @@ -330,9 +280,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "foo", - ], + plugins: ["foo"], }); // eslint-disable-next-line max-len }, /Cannot find module 'babel-plugin-foo'.*\n- Did you mean "@babel\/foo"\?/); @@ -345,9 +293,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "testplugin", - ], + presets: ["testplugin"], }); // eslint-disable-next-line max-len }, /Cannot find module 'babel-preset-testplugin'.*\n- Did you accidentally pass a preset as a plugin\?/); @@ -360,9 +306,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "testpreset", - ], + plugins: ["testpreset"], }); // eslint-disable-next-line max-len }, /Cannot find module 'babel-plugin-testpreset'.*\n- Did you accidentally pass a plugin as a preset\?/); @@ -375,9 +319,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - presets: [ - "foo", - ], + presets: ["foo"], }); }, /Cannot find module 'babel-preset-foo'/); }); @@ -389,9 +331,7 @@ describe("addon resolution", function () { babel.transform("", { filename: "filename.js", babelrc: false, - plugins: [ - "foo", - ], + plugins: ["foo"], }); }, /Cannot find module 'babel-plugin-foo'/); }); diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index 3c53ef666d..ddd57c2051 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -54,7 +54,7 @@ export default class Buffer { configurable: true, enumerable: true, get() { - return this.map = map.get(); + return (this.map = map.get()); }, set(value) { Object.defineProperty(this, "map", { value, writable: true }); @@ -81,7 +81,11 @@ export default class Buffer { queue(str: string): void { // Drop trailing spaces when a newline is inserted. - if (str === "\n") while (this._queue.length > 0 && SPACES_RE.test(this._queue[0][0])) this._queue.shift(); + if (str === "\n") { + while (this._queue.length > 0 && SPACES_RE.test(this._queue[0][0])) { + this._queue.shift(); + } + } const { line, column, filename, identifierName } = this._sourcePosition; this._queue.unshift([str, line, column, identifierName, filename]); @@ -89,13 +93,26 @@ export default class Buffer { _flush(): void { let item; - while (item = this._queue.pop()) this._append(...item); + while ((item = this._queue.pop())) this._append(...item); } - _append(str: string, line: number, column: number, identifierName: ?string, filename: ?string): void { + _append( + str: string, + line: number, + column: number, + identifierName: ?string, + filename: ?string, + ): void { // If there the line is ending, adding a new mapping marker is redundant if (this._map && str[0] !== "\n") { - this._map.mark(this._position.line, this._position.column, line, column, identifierName, filename); + this._map.mark( + this._position.line, + this._position.column, + line, + column, + identifierName, + filename, + ); } this._buf.push(str); @@ -112,11 +129,15 @@ export default class Buffer { } removeTrailingNewline(): void { - if (this._queue.length > 0 && this._queue[0][0] === "\n") this._queue.shift(); + if (this._queue.length > 0 && this._queue[0][0] === "\n") { + this._queue.shift(); + } } removeLastSemicolon(): void { - if (this._queue.length > 0 && this._queue[0][0] === ";") this._queue.shift(); + if (this._queue.length > 0 && this._queue[0][0] === ";") { + this._queue.shift(); + } } endsWith(suffix: string): boolean { @@ -133,7 +154,8 @@ export default class Buffer { return last === suffix; } - const end = this._last + this._queue.reduce((acc, item) => item[0] + acc, ""); + const end = + this._last + this._queue.reduce((acc, item) => item[0] + acc, ""); if (suffix.length <= end.length) { return end.slice(-suffix.length) === suffix; } @@ -157,10 +179,10 @@ export default class Buffer { const pos = loc ? loc[prop] : null; - this._sourcePosition.identifierName = loc && loc.identifierName || null; + this._sourcePosition.identifierName = (loc && loc.identifierName) || null; this._sourcePosition.line = pos ? pos.line : null; this._sourcePosition.column = pos ? pos.column : null; - this._sourcePosition.filename = loc && loc.filename || null; + this._sourcePosition.filename = (loc && loc.filename) || null; } /** @@ -190,7 +212,9 @@ export default class Buffer { const extra = this._queue.reduce((acc, item) => item[0] + acc, ""); const lastIndex = extra.lastIndexOf("\n"); - return lastIndex === -1 ? this._position.column + extra.length : (extra.length - 1 - lastIndex); + return lastIndex === -1 + ? this._position.column + extra.length + : extra.length - 1 - lastIndex; } getCurrentLine(): number { diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 0f1a9d1651..a6b2a4ff90 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -1,9 +1,12 @@ import * as t from "babel-types"; import * as n from "../node"; - export function UnaryExpression(node: Object) { - if (node.operator === "void" || node.operator === "delete" || node.operator === "typeof") { + if ( + node.operator === "void" || + node.operator === "delete" || + node.operator === "typeof" + ) { this.word(node.operator); this.space(); } else { @@ -51,12 +54,16 @@ export function NewExpression(node: Object, parent: Object) { this.word("new"); this.space(); this.print(node.callee, node); - if (this.format.minified && - node.arguments.length === 0 && - !node.optional && - !t.isCallExpression(parent, { callee: node }) && - !t.isMemberExpression(parent) && - !t.isNewExpression(parent)) return; + if ( + this.format.minified && + node.arguments.length === 0 && + !node.optional && + !t.isCallExpression(parent, { callee: node }) && + !t.isMemberExpression(parent) && + !t.isNewExpression(parent) + ) { + return; + } if (node.optional) { this.token("?."); @@ -123,7 +130,7 @@ export function Import() { } function buildYieldAwait(keyword: string) { - return function (node: Object) { + return function(node: Object) { this.word(keyword); if (node.delegate) { @@ -164,8 +171,10 @@ export function AssignmentPattern(node: Object) { export function AssignmentExpression(node: Object, parent: Object) { // Somewhere inside a for statement `init` node but doesn't usually // needs a paren except for `in` expressions: `for (a in b ? a : b;;)` - const parens = this.inForStatementInitCounter && node.operator === "in" && - !n.needsParens(node, parent); + const parens = + this.inForStatementInitCounter && + node.operator === "in" && + !n.needsParens(node, parent); if (parens) { this.token("("); diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 2425fa15df..1e59e27f95 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -159,7 +159,10 @@ export function FunctionTypeAnnotation(node: Object, parent: Object) { this.token(")"); // this node type is overloaded, not sure why but it makes it EXTREMELY annoying - if (parent.type === "ObjectTypeCallProperty" || parent.type === "DeclareFunction") { + if ( + parent.type === "ObjectTypeCallProperty" || + parent.type === "DeclareFunction" + ) { this.token(":"); } else { this.space(); @@ -183,7 +186,10 @@ export function InterfaceExtends(node: Object) { this.print(node.typeParameters, node); } -export { InterfaceExtends as ClassImplements, InterfaceExtends as GenericTypeAnnotation }; +export { + InterfaceExtends as ClassImplements, + InterfaceExtends as GenericTypeAnnotation, +}; export function _interfaceish(node: Object) { this.print(node.id, node); diff --git a/packages/babel-generator/src/generators/methods.js b/packages/babel-generator/src/generators/methods.js index 4dcc71a251..48903511db 100644 --- a/packages/babel-generator/src/generators/methods.js +++ b/packages/babel-generator/src/generators/methods.js @@ -4,7 +4,7 @@ export function _params(node: Object) { this.print(node.typeParameters, node); this.token("("); this.printList(node.params, node, { - iterator: (node) => { + iterator: node => { if (node.optional) this.token("?"); this.print(node.typeAnnotation, node); }, @@ -79,7 +79,11 @@ export function ArrowFunctionExpression(node: Object) { const firstParam = node.params[0]; - if (node.params.length === 1 && t.isIdentifier(firstParam) && !hasTypes(node, firstParam)) { + if ( + node.params.length === 1 && + t.isIdentifier(firstParam) && + !hasTypes(node, firstParam) + ) { this.print(firstParam, node); } else { this._params(node); @@ -93,6 +97,11 @@ export function ArrowFunctionExpression(node: Object) { } function hasTypes(node, param) { - return node.typeParameters || node.returnType || param.typeAnnotation || param.optional || - param.trailingComments; + return ( + node.typeParameters || + node.returnType || + param.typeAnnotation || + param.optional || + param.trailingComments + ); } diff --git a/packages/babel-generator/src/generators/modules.js b/packages/babel-generator/src/generators/modules.js index f5d33b151a..36ae34a4a8 100644 --- a/packages/babel-generator/src/generators/modules.js +++ b/packages/babel-generator/src/generators/modules.js @@ -91,7 +91,10 @@ function ExportDeclaration(node: Object) { let hasSpecial = false; while (true) { const first = specifiers[0]; - if (t.isExportDefaultSpecifier(first) || t.isExportNamespaceSpecifier(first)) { + if ( + t.isExportDefaultSpecifier(first) || + t.isExportNamespaceSpecifier(first) + ) { hasSpecial = true; this.print(specifiers.shift(), node); if (specifiers.length) { @@ -138,7 +141,10 @@ export function ImportDeclaration(node: Object) { // print "special" specifiers first while (true) { const first = specifiers[0]; - if (t.isImportDefaultSpecifier(first) || t.isImportNamespaceSpecifier(first)) { + if ( + t.isImportDefaultSpecifier(first) || + t.isImportNamespaceSpecifier(first) + ) { this.print(specifiers.shift(), node); if (specifiers.length) { this.token(","); diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index 8aee284a6d..4929659874 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -17,7 +17,8 @@ export function IfStatement(node: Object) { this.token(")"); this.space(); - const needsBlock = node.alternate && t.isIfStatement(getLastStatement(node.consequent)); + const needsBlock = + node.alternate && t.isIfStatement(getLastStatement(node.consequent)); if (needsBlock) { this.token("{"); this.newline(); @@ -80,8 +81,8 @@ export function WhileStatement(node: Object) { this.printBlock(node); } -const buildForXStatement = function (op) { - return function (node: Object) { +const buildForXStatement = function(op) { + return function(node: Object) { this.word("for"); this.space(); if (op === "of" && node.await) { @@ -116,7 +117,7 @@ export function DoWhileStatement(node: Object) { } function buildLabelStatement(prefix, key = "label") { - return function (node: Object) { + return function(node: Object) { this.word(prefix); const label = node[key]; @@ -261,7 +262,10 @@ export function VariableDeclaration(node: Object, parent: Object) { let separator; if (hasInits) { - separator = node.kind === "const" ? constDeclarationIndent : variableDeclarationIndent; + separator = + node.kind === "const" + ? constDeclarationIndent + : variableDeclarationIndent; } // diff --git a/packages/babel-generator/src/generators/types.js b/packages/babel-generator/src/generators/types.js index 9895324062..35724213d9 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -10,9 +10,7 @@ export function RestElement(node: Object) { this.print(node.argument, node); } -export { - RestElement as SpreadElement, -}; +export { RestElement as SpreadElement }; export function ObjectExpression(node: Object) { const props = node.properties; @@ -45,8 +43,11 @@ export function ObjectProperty(node: Object) { this.token("]"); } else { // print `({ foo: foo = 5 } = {})` as `({ foo = 5 } = {});` - if (t.isAssignmentPattern(node.value) && t.isIdentifier(node.key) && - node.key.name === node.value.left.name) { + if ( + t.isAssignmentPattern(node.value) && + t.isIdentifier(node.key) && + node.key.name === node.value.left.name + ) { this.print(node.value, node); return; } @@ -54,10 +55,12 @@ export function ObjectProperty(node: Object) { this.print(node.key, node); // shorthand! - if (node.shorthand && + if ( + node.shorthand && (t.isIdentifier(node.key) && - t.isIdentifier(node.value) && - node.key.name === node.value.name)) { + t.isIdentifier(node.value) && + node.key.name === node.value.name) + ) { return; } } @@ -111,7 +114,7 @@ export function NumericLiteral(node: Object) { const raw = this.getPossibleRaw(node); const value = node.value + ""; if (raw == null) { - this.number(value); // normalize + this.number(value); // normalize } else if (this.format.minified) { this.number(raw.length < value.length ? raw : value); } else { diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index cc8511c935..ef0012053e 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -61,17 +61,23 @@ function normalizeOptions(code, opts): Format { if (format.minified) { format.compact = true; - format.shouldPrintComment = format.shouldPrintComment || (() => format.comments); + format.shouldPrintComment = + format.shouldPrintComment || (() => format.comments); } else { - format.shouldPrintComment = format.shouldPrintComment || ((value) => format.comments || - (value.indexOf("@license") >= 0 || value.indexOf("@preserve") >= 0)); + format.shouldPrintComment = + format.shouldPrintComment || + (value => + format.comments || + (value.indexOf("@license") >= 0 || value.indexOf("@preserve") >= 0)); } if (format.compact === "auto") { format.compact = code.length > 500_000; // 500KB if (format.compact) { - console.error("[BABEL] " + messages.get("codeGeneratorDeopt", opts.filename, "500KB")); + console.error( + "[BABEL] " + messages.get("codeGeneratorDeopt", opts.filename, "500KB"), + ); } } @@ -97,7 +103,7 @@ export class CodeGenerator { } } -export default function (ast: Object, opts: Object, code: string): Object { +export default function(ast: Object, opts: Object, code: string): Object { const gen = new Generator(ast, opts, code); return gen.generate(); } diff --git a/packages/babel-generator/src/node/index.js b/packages/babel-generator/src/node/index.js index c3a17cea6c..c7fb0026a1 100644 --- a/packages/babel-generator/src/node/index.js +++ b/packages/babel-generator/src/node/index.js @@ -7,15 +7,16 @@ function expandAliases(obj) { function add(type, func) { const fn = newObj[type]; - newObj[type] = fn ? function(node, parent, stack) { - const result = fn(node, parent, stack); + newObj[type] = fn + ? function(node, parent, stack) { + const result = fn(node, parent, stack); - return result == null ? func(node, parent, stack) : result; - } : func; + return result == null ? func(node, parent, stack) : result; + } + : func; } for (const type of Object.keys(obj)) { - const aliases = t.FLIPPED_ALIAS_KEYS[type]; if (aliases) { for (const alias of aliases) { @@ -46,8 +47,10 @@ function isOrHasCallExpression(node) { } if (t.isMemberExpression(node)) { - return isOrHasCallExpression(node.object) || - (!node.computed && isOrHasCallExpression(node.property)); + return ( + isOrHasCallExpression(node.object) || + (!node.computed && isOrHasCallExpression(node.property)) + ); } else { return false; } diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index 6879417c38..2f4326ec5e 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -38,11 +38,19 @@ export function UpdateExpression(node: Object, parent: Object): boolean { return t.isMemberExpression(parent) && parent.object === node; } -export function ObjectExpression(node: Object, parent: Object, printStack: Array): boolean { +export function ObjectExpression( + node: Object, + parent: Object, + printStack: Array, +): boolean { return isFirstInStatement(printStack, { considerArrow: true }); } -export function DoExpression(node: Object, parent: Object, printStack: Array): boolean { +export function DoExpression( + node: Object, + parent: Object, + printStack: Array, +): boolean { return isFirstInStatement(printStack); } @@ -55,7 +63,8 @@ export function Binary(node: Object, parent: Object): boolean { } if ( - ((t.isCallExpression(parent) || t.isNewExpression(parent)) && parent.callee === node) || + ((t.isCallExpression(parent) || t.isNewExpression(parent)) && + parent.callee === node) || t.isUnaryLike(parent) || (t.isMemberExpression(parent) && parent.object === node) || t.isAwaitExpression(parent) @@ -72,7 +81,9 @@ export function Binary(node: Object, parent: Object): boolean { if ( // Logical expressions with the same precedence don't need parens. - (parentPos === nodePos && parent.right === node && !t.isLogicalExpression(parent)) || + (parentPos === nodePos && + parent.right === node && + !t.isLogicalExpression(parent)) || parentPos > nodePos ) { return true; @@ -85,11 +96,13 @@ export function Binary(node: Object, parent: Object): boolean { export function BinaryExpression(node: Object, parent: Object): boolean { // let i = (1 in []); // for ((1 in []);;); - return node.operator === "in" && (t.isVariableDeclarator(parent) || t.isFor(parent)); + return ( + node.operator === "in" && + (t.isVariableDeclarator(parent) || t.isFor(parent)) + ); } export function SequenceExpression(node: Object, parent: Object): boolean { - if ( // Although parentheses wouldn"t hurt around sequence // expressions in the head of for loops, traditional style @@ -113,29 +126,40 @@ export function SequenceExpression(node: Object, parent: Object): boolean { } export function YieldExpression(node: Object, parent: Object): boolean { - return t.isBinary(parent) || - t.isUnaryLike(parent) || - t.isCallExpression(parent) || - t.isMemberExpression(parent) || - t.isNewExpression(parent) || - (t.isConditionalExpression(parent) && node === parent.test); - + return ( + t.isBinary(parent) || + t.isUnaryLike(parent) || + t.isCallExpression(parent) || + t.isMemberExpression(parent) || + t.isNewExpression(parent) || + (t.isConditionalExpression(parent) && node === parent.test) + ); } export { YieldExpression as AwaitExpression }; -export function ClassExpression(node: Object, parent: Object, printStack: Array): boolean { +export function ClassExpression( + node: Object, + parent: Object, + printStack: Array, +): boolean { return isFirstInStatement(printStack, { considerDefaultExports: true }); } export function UnaryLike(node: Object, parent: Object): boolean { - return t.isMemberExpression(parent, { object: node }) || - t.isCallExpression(parent, { callee: node }) || - t.isNewExpression(parent, { callee: node }) || - t.isBinaryExpression(parent, { operator: "**", left: node }); + return ( + t.isMemberExpression(parent, { object: node }) || + t.isCallExpression(parent, { callee: node }) || + t.isNewExpression(parent, { callee: node }) || + t.isBinaryExpression(parent, { operator: "**", left: node }) + ); } -export function FunctionExpression(node: Object, parent: Object, printStack: Array): boolean { +export function FunctionExpression( + node: Object, + parent: Object, + printStack: Array, +): boolean { return isFirstInStatement(printStack, { considerDefaultExports: true }); } @@ -167,10 +191,10 @@ export function AssignmentExpression(node: Object): boolean { // Walk up the print stack to deterimine if our node can come first // in statement. -function isFirstInStatement(printStack: Array, { - considerArrow = false, - considerDefaultExports = false, - } = {}): boolean { +function isFirstInStatement( + printStack: Array, + { considerArrow = false, considerDefaultExports = false } = {}, +): boolean { let i = printStack.length - 1; let node = printStack[i]; i--; @@ -179,8 +203,9 @@ function isFirstInStatement(printStack: Array, { if ( t.isExpressionStatement(parent, { expression: node }) || t.isTaggedTemplateExpression(parent) || - considerDefaultExports && t.isExportDefaultDeclaration(parent, { declaration: node }) || - considerArrow && t.isArrowFunctionExpression(parent, { body: node }) + (considerDefaultExports && + t.isExportDefaultDeclaration(parent, { declaration: node })) || + (considerArrow && t.isArrowFunctionExpression(parent, { body: node })) ) { return true; } diff --git a/packages/babel-generator/src/node/whitespace.js b/packages/babel-generator/src/node/whitespace.js index 11dce425e6..ca8406af32 100644 --- a/packages/babel-generator/src/node/whitespace.js +++ b/packages/babel-generator/src/node/whitespace.js @@ -3,7 +3,7 @@ import * as t from "babel-types"; type WhitespaceObject = { before?: boolean, - after?: boolean + after?: boolean, }; /** @@ -45,15 +45,22 @@ function isHelper(node) { } else if (t.isCallExpression(node)) { return isHelper(node.callee); } else if (t.isBinary(node) || t.isAssignmentExpression(node)) { - return (t.isIdentifier(node.left) && isHelper(node.left)) || isHelper(node.right); + return ( + (t.isIdentifier(node.left) && isHelper(node.left)) || isHelper(node.right) + ); } else { return false; } } function isType(node) { - return t.isLiteral(node) || t.isObjectExpression(node) || t.isArrayExpression(node) || - t.isIdentifier(node) || t.isMemberExpression(node); + return ( + t.isLiteral(node) || + t.isObjectExpression(node) || + t.isArrayExpression(node) || + t.isIdentifier(node) || + t.isMemberExpression(node) + ); } /** @@ -61,7 +68,6 @@ function isType(node) { */ export const nodes = { - /** * Test if AssignmentExpression needs whitespace. */ @@ -164,9 +170,10 @@ export const nodes = { * Test if Property needs whitespace. */ -nodes.ObjectProperty = -nodes.ObjectTypeProperty = -nodes.ObjectMethod = function (node: Object, parent): ?WhitespaceObject { +nodes.ObjectProperty = nodes.ObjectTypeProperty = nodes.ObjectMethod = function( + node: Object, + parent, +): ?WhitespaceObject { if (parent.properties[0] === node) { return { before: true, @@ -179,7 +186,6 @@ nodes.ObjectMethod = function (node: Object, parent): ?WhitespaceObject { */ export const list = { - /** * Return VariableDeclaration declarations init properties. */ @@ -216,12 +222,12 @@ export const list = { ["LabeledStatement", true], ["SwitchStatement", true], ["TryStatement", true], -].forEach(function ([type, amounts]) { +].forEach(function([type, amounts]) { if (typeof amounts === "boolean") { amounts = { after: amounts, before: amounts }; } - [type].concat(t.FLIPPED_ALIAS_KEYS[type] || []).forEach(function (type) { - nodes[type] = function () { + [type].concat(t.FLIPPED_ALIAS_KEYS[type] || []).forEach(function(type) { + nodes[type] = function() { return amounts; }; }); diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index b7b319293c..a6fa7bc3fb 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -14,21 +14,21 @@ const ZERO_DECIMAL_INTEGER = /\.0+$/; const NON_DECIMAL_LITERAL = /^0[box]/; export type Format = { - shouldPrintComment: (comment: string) => boolean; - retainLines: boolean; - retainFunctionParens: boolean; - comments: boolean; - auxiliaryCommentBefore: string; - auxiliaryCommentAfter: string; - compact: boolean | "auto"; - minified: boolean; - quotes: "single" | "double"; - concise: boolean; + shouldPrintComment: (comment: string) => boolean, + retainLines: boolean, + retainFunctionParens: boolean, + comments: boolean, + auxiliaryCommentBefore: string, + auxiliaryCommentAfter: string, + compact: boolean | "auto", + minified: boolean, + quotes: "single" | "double", + concise: boolean, indent: { - adjustMultilineComment: boolean; - style: string; - base: number; - } + adjustMultilineComment: boolean, + style: string, + base: number, + }, }; export default class Printer { @@ -107,7 +107,10 @@ export default class Printer { space(force: boolean = false): void { if (this.format.compact) return; - if ((this._buf.hasContent() && !this.endsWith(" ") && !this.endsWith("\n")) || force) { + if ( + (this._buf.hasContent() && !this.endsWith(" ") && !this.endsWith("\n")) || + force + ) { this._space(); } } @@ -149,14 +152,14 @@ export default class Printer { token(str: string): void { // space is mandatory to avoid outputting ")[0].trim(), @@ -40,7 +46,7 @@ function getType(validator) { } else if (validator.oneOfNodeOrValueTypes) { return validator.oneOfNodeOrValueTypes.join(" | "); } else if (validator.oneOf) { - return validator.oneOf.map((val) => util.inspect(val)).join(" | "); + return validator.oneOf.map(val => util.inspect(val)).join(" | "); } else if (validator.chainOf) { if ( validator.chainOf.length === 2 && @@ -54,9 +60,11 @@ function getType(validator) { validator.chainOf[0].type === "string" && validator.chainOf[1].oneOf ) { - return validator.chainOf[1].oneOf.map(function (val) { - return JSON.stringify(val); - }).join(" | "); + return validator.chainOf[1].oneOf + .map(function(val) { + return JSON.stringify(val); + }) + .join(" | "); } } const err = new Error("Unrecognised validator type"); @@ -64,54 +72,72 @@ function getType(validator) { err.validator = validator; throw err; } -Object.keys(types.BUILDER_KEYS).sort().forEach(function (key) { +Object.keys(types.BUILDER_KEYS).sort().forEach(function(key) { readme.push("### " + key[0].toLowerCase() + key.substr(1)); readme.push("```javascript"); - readme.push("t." + key[0].toLowerCase() + key.substr(1) + "(" + types.BUILDER_KEYS[key].join(", ") + ")"); + readme.push( + "t." + + key[0].toLowerCase() + + key.substr(1) + + "(" + + types.BUILDER_KEYS[key].join(", ") + + ")" + ); readme.push("```"); readme.push(""); - readme.push("See also `t.is" + key + "(node, opts)` and `t.assert" + key + "(node, opts)`."); + readme.push( + "See also `t.is" + + key + + "(node, opts)` and `t.assert" + + key + + "(node, opts)`." + ); readme.push(""); if (types.ALIAS_KEYS[key] && types.ALIAS_KEYS[key].length) { - readme.push("Aliases: " + types.ALIAS_KEYS[key].map(function (key) { - return "`" + key + "`"; - }).join(", ")); + readme.push( + "Aliases: " + + types.ALIAS_KEYS[key] + .map(function(key) { + return "`" + key + "`"; + }) + .join(", ") + ); readme.push(""); } - Object.keys(types.NODE_FIELDS[key]).sort(function (fieldA, fieldB) { - const indexA = types.BUILDER_KEYS[key].indexOf(fieldA); - const indexB = types.BUILDER_KEYS[key].indexOf(fieldB); - if (indexA === indexB) return fieldA < fieldB ? -1 : 1; - if (indexA === -1) return 1; - if (indexB === -1) return -1; - return indexA - indexB; - }) - .forEach(function (field) { - const defaultValue = types.NODE_FIELDS[key][field].default; - const fieldDescription = ["`" + field + "`"]; - const validator = types.NODE_FIELDS[key][field].validate; - if (customTypes[key] && customTypes[key][field]) { - fieldDescription.push(customTypes[key][field]); - } else if (validator) { - try { - fieldDescription.push(": `" + getType(validator) + "`"); - } catch (ex) { - if (ex.code === "UNEXPECTED_VALIDATOR_TYPE") { - console.log("Unrecognised validator type for " + key + "." + field); - console.dir(ex.validator, { depth: 10, colors: true }); + Object.keys(types.NODE_FIELDS[key]) + .sort(function(fieldA, fieldB) { + const indexA = types.BUILDER_KEYS[key].indexOf(fieldA); + const indexB = types.BUILDER_KEYS[key].indexOf(fieldB); + if (indexA === indexB) return fieldA < fieldB ? -1 : 1; + if (indexA === -1) return 1; + if (indexB === -1) return -1; + return indexA - indexB; + }) + .forEach(function(field) { + const defaultValue = types.NODE_FIELDS[key][field].default; + const fieldDescription = ["`" + field + "`"]; + const validator = types.NODE_FIELDS[key][field].validate; + if (customTypes[key] && customTypes[key][field]) { + fieldDescription.push(customTypes[key][field]); + } else if (validator) { + try { + fieldDescription.push(": `" + getType(validator) + "`"); + } catch (ex) { + if (ex.code === "UNEXPECTED_VALIDATOR_TYPE") { + console.log("Unrecognised validator type for " + key + "." + field); + console.dir(ex.validator, { depth: 10, colors: true }); + } } } - } - if ( - defaultValue !== null || - types.NODE_FIELDS[key][field].optional - ) { - fieldDescription.push(" (default: `" + util.inspect(defaultValue) + "`)"); - } else { - fieldDescription.push(" (required)"); - } - readme.push(" - " + fieldDescription.join("")); - }); + if (defaultValue !== null || types.NODE_FIELDS[key][field].optional) { + fieldDescription.push( + " (default: `" + util.inspect(defaultValue) + "`)" + ); + } else { + fieldDescription.push(" (required)"); + } + readme.push(" - " + fieldDescription.join("")); + }); readme.push(""); readme.push("---"); diff --git a/scripts/generate-interfaces.js b/scripts/generate-interfaces.js index 3d1d395a93..0f32a750dc 100644 --- a/scripts/generate-interfaces.js +++ b/scripts/generate-interfaces.js @@ -51,7 +51,7 @@ const lines = []; for (const type in t.NODE_FIELDS) { const fields = t.NODE_FIELDS[type]; - const struct = ["type: \"" + type + "\";"]; + const struct = ['type: "' + type + '";']; const args = []; for (const fieldName in fields) { @@ -65,9 +65,11 @@ for (const type in t.NODE_FIELDS) { const validate = field.validate; if (validate) { if (validate.oneOf) { - typeAnnotation = validate.oneOf.map(function (val) { - return JSON.stringify(val); - }).join(" | "); + typeAnnotation = validate.oneOf + .map(function(val) { + return JSON.stringify(val); + }) + .join(" | "); } if (validate.type) { @@ -79,7 +81,9 @@ for (const type in t.NODE_FIELDS) { } if (validate.oneOfNodeTypes) { - const types = validate.oneOfNodeTypes.map((type) => `${NODE_PREFIX}${type}`); + const types = validate.oneOfNodeTypes.map( + type => `${NODE_PREFIX}${type}` + ); typeAnnotation = types.join(" | "); if (suffix === "?") typeAnnotation = "?" + typeAnnotation; } @@ -101,18 +105,24 @@ for (const type in t.NODE_FIELDS) { // Flow chokes on super() :/ if (type !== "Super") { lines.push( - `declare function ${type[0].toLowerCase() + type.slice(1)}(${args.join(", ")}): ${NODE_PREFIX}${type};` + `declare function ${type[0].toLowerCase() + type.slice(1)}(${args.join( + ", " + )}): ${NODE_PREFIX}${type};` ); } } for (let i = 0; i < t.TYPES.length; i++) { - lines.push(`declare function is${t.TYPES[i]}(node: Object, opts?: Object): boolean;`); + lines.push( + `declare function is${t.TYPES[i]}(node: Object, opts?: Object): boolean;` + ); } for (const type in t.FLIPPED_ALIAS_KEYS) { const types = t.FLIPPED_ALIAS_KEYS[type]; - code += `type ${NODE_PREFIX}${type} = ${types.map((type) => `${NODE_PREFIX}${type}`).join(" | ")};\n`; + code += `type ${NODE_PREFIX}${type} = ${types + .map(type => `${NODE_PREFIX}${type}`) + .join(" | ")};\n`; } code += `\ndeclare module "babel-types" {