From 62def8da19e24feb4b14e7353247303e1abee995 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 12:02:38 -0700 Subject: [PATCH 01/16] Make presets consistently resolve string values relative to their config file location. --- .../file/options/option-manager.js | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js index df43555c5f..aed04a7b50 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -261,7 +261,15 @@ export default class OptionManager { }); } else { // Otherwise, just merge presets options into the main options. - this.mergePresets(opts.presets, dirname); + this.resolvePresets(opts.presets, dirname, (preset, presetLoc) => { + this.mergeOptions({ + options: preset, + alias: presetLoc, + loc: presetLoc, + dirname: dirname, + }); + }); + delete opts.presets; } } @@ -276,21 +284,6 @@ export default class OptionManager { } } - /** - * Merges all presets into the main options in case we are not in the - * "pass per preset" mode. Otherwise, options are calculated per preset. - */ - mergePresets(presets: Array, dirname: string) { - this.resolvePresets(presets, dirname, (presetOpts, presetLoc) => { - this.mergeOptions({ - options: presetOpts, - alias: presetLoc, - loc: presetLoc, - dirname: path.dirname(presetLoc || ""), - }); - }); - } - /** * Resolves presets options which can be either direct object data, * or a module name to require. From 344f0a68c94b56e26910e29d417fdf538dbf0c84 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 12:10:59 -0700 Subject: [PATCH 02/16] Centralize preset processing from two loops to one. --- .../file/options/option-manager.js | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js index aed04a7b50..ca62ba40d6 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -247,31 +247,21 @@ export default class OptionManager { if (opts.presets) { if (!Array.isArray(rawOpts.presets)) throw new Error(`${alias}.presets should be an array`); - // If we're in the "pass per preset" mode, we resolve the presets - // and keep them for further execution to calculate the options. - if (opts.passPerPreset) { - opts.presets = this.resolvePresets(opts.presets, dirname, (preset, presetLoc) => { - this.mergeOptions({ - options: preset, - extending: preset, - alias: presetLoc, - loc: presetLoc, - dirname: dirname, - }); - }); - } else { - // Otherwise, just merge presets options into the main options. - this.resolvePresets(opts.presets, dirname, (preset, presetLoc) => { - this.mergeOptions({ - options: preset, - alias: presetLoc, - loc: presetLoc, - dirname: dirname, - }); - }); + opts.presets = this.resolvePresets(opts.presets, dirname, (preset, presetLoc) => { + this.mergeOptions({ + options: preset, - delete opts.presets; - } + // For `passPerPreset` we merge child options back into the preset object instead of the root. + extending: opts.passPerPreset ? preset : null, + alias: presetLoc, + loc: presetLoc, + dirname: dirname, + }); + }); + + // If not passPerPreset, the plugins have all been merged into the parent config so the presets + // list is not needed. + if (!opts.passPerPreset) delete opts.presets; } // Merge them into current extending options in case of top-level From bf13ed4da0282aa3fce8f2805c23df35f26cfd80 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 15:52:37 -0700 Subject: [PATCH 03/16] Limit where certain arguments are allowed in Babel config. --- .../file/options/build-config-chain.js | 6 ++++ .../file/options/option-manager.js | 20 +++++++++++ packages/babel-core/test/config-chain.js | 34 +++++++++++++++++++ packages/babel-preset-react/src/index.js | 12 ------- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/packages/babel-core/src/transformation/file/options/build-config-chain.js b/packages/babel-core/src/transformation/file/options/build-config-chain.js index df05a06443..fee82d03c1 100644 --- a/packages/babel-core/src/transformation/file/options/build-config-chain.js +++ b/packages/babel-core/src/transformation/file/options/build-config-chain.js @@ -28,6 +28,7 @@ export default function buildConfigChain(opts: Object = {}) { try { builder.mergeConfig({ + type: "arguments", options: opts, alias: "base", dirname: process.cwd(), @@ -185,6 +186,7 @@ class ConfigChainBuilder { if (lines.length) { this.mergeConfig({ + type: "options", options: { ignore: lines }, alias: loc, dirname: path.dirname(loc), @@ -231,6 +233,7 @@ class ConfigChainBuilder { } this.mergeConfig({ + type: "options", options, alias: loc, dirname: path.dirname(loc), @@ -240,6 +243,7 @@ class ConfigChainBuilder { } mergeConfig({ + type, options, alias, loc, @@ -266,6 +270,7 @@ class ConfigChainBuilder { delete options.env; this.mergeConfig({ + type, options: envOpts, alias: `${alias}.env.${envKey}`, dirname: dirname, @@ -273,6 +278,7 @@ class ConfigChainBuilder { } this.configs.push({ + type, options, alias, loc, diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js index ca62ba40d6..2700b94f8b 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -25,6 +25,7 @@ type PluginObject = { }; type MergeOptions = { + type: "arguments"|"options"|"preset", options?: Object, extending?: Object, alias: string, @@ -188,6 +189,7 @@ export default class OptionManager { */ mergeOptions({ + type, options: rawOpts, extending: extendingOpts, alias, @@ -213,6 +215,23 @@ export default class OptionManager { dirname = dirname || process.cwd(); loc = loc || alias; + if (type !== "arguments") { + if (opts.filename !== undefined) { + throw new Error(`${alias}.filename is only allowed as a root argument`); + } + + if (opts.babelrc !== undefined) { + throw new Error(`${alias}.babelrc is only allowed as a root argument`); + } + } + + if (type === "preset") { + if (opts.only !== undefined) throw new Error(`${alias}.only is not supported in a preset`); + if (opts.ignore !== undefined) throw new Error(`${alias}.ignore is not supported in a preset`); + if (opts.extends !== undefined) throw new Error(`${alias}.extends is not supported in a preset`); + if (opts.env !== undefined) throw new Error(`${alias}.env is not supported in a preset`); + } + if (opts.sourceMap !== undefined) { if (opts.sourceMaps !== undefined) { throw new Error(`Both ${alias}.sourceMap and .sourceMaps have been set`); @@ -249,6 +268,7 @@ export default class OptionManager { opts.presets = this.resolvePresets(opts.presets, dirname, (preset, presetLoc) => { this.mergeOptions({ + type: "preset", options: preset, // For `passPerPreset` we merge child options back into the preset object instead of the root. diff --git a/packages/babel-core/test/config-chain.js b/packages/babel-core/test/config-chain.js index a9cc6bd2e9..d43e57142c 100644 --- a/packages/babel-core/test/config-chain.js +++ b/packages/babel-core/test/config-chain.js @@ -40,6 +40,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { plugins: [ "extended", @@ -50,6 +51,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "root", @@ -60,6 +62,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { ignore: [ "root-ignore", @@ -70,6 +73,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "arguments", options: { filename: fixture("dir1", "src.js"), }, @@ -89,6 +93,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -99,6 +104,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "dir2", @@ -109,6 +115,7 @@ describe("buildConfigChain", function () { dirname: fixture("dir2"), }, { + type: "arguments", options: { filename: fixture("dir2", "src.js"), }, @@ -128,6 +135,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -138,6 +146,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "env-base", @@ -148,6 +157,7 @@ describe("buildConfigChain", function () { dirname: fixture("env"), }, { + type: "arguments", options: { filename: fixture("env", "src.js"), }, @@ -169,6 +179,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -179,6 +190,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "env-base", @@ -189,6 +201,7 @@ describe("buildConfigChain", function () { dirname: fixture("env"), }, { + type: "options", options: { plugins: [ "env-foo", @@ -199,6 +212,7 @@ describe("buildConfigChain", function () { dirname: fixture("env"), }, { + type: "arguments", options: { filename: fixture("env", "src.js"), }, @@ -221,6 +235,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -231,6 +246,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "env-base", @@ -241,6 +257,7 @@ describe("buildConfigChain", function () { dirname: fixture("env"), }, { + type: "options", options: { plugins: [ "env-bar", @@ -251,6 +268,7 @@ describe("buildConfigChain", function () { dirname: fixture("env"), }, { + type: "arguments", options: { filename: fixture("env", "src.js"), }, @@ -273,6 +291,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { plugins: ["pkg-plugin"], }, @@ -281,6 +300,7 @@ describe("buildConfigChain", function () { dirname: fixture("pkg"), }, { + type: "options", options: { ignore: ["pkg-ignore"], }, @@ -289,6 +309,7 @@ describe("buildConfigChain", function () { dirname: fixture("pkg"), }, { + type: "arguments", options: { filename: fixture("pkg", "src.js"), }, @@ -308,6 +329,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -318,6 +340,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "foo", @@ -329,6 +352,7 @@ describe("buildConfigChain", function () { dirname: fixture("js-config"), }, { + type: "arguments", options: { filename: fixture("js-config", "src.js"), }, @@ -348,6 +372,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -358,6 +383,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "foo", @@ -369,6 +395,7 @@ describe("buildConfigChain", function () { dirname: fixture("js-config-default"), }, { + type: "arguments", options: { filename: fixture("js-config-default", "src.js"), }, @@ -387,6 +414,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -397,6 +425,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "extended", @@ -407,6 +436,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "foo", @@ -418,6 +448,7 @@ describe("buildConfigChain", function () { dirname: fixture("js-config-extended"), }, { + type: "arguments", options: { filename: fixture("js-config-extended", "src.js"), }, @@ -438,6 +469,7 @@ describe("buildConfigChain", function () { const expected = [ { + type: "options", options: { ignore: [ "root-ignore", @@ -448,6 +480,7 @@ describe("buildConfigChain", function () { dirname: fixture(), }, { + type: "options", options: { plugins: [ "json", @@ -458,6 +491,7 @@ describe("buildConfigChain", function () { dirname: fixture("json-pkg-config-no-babel"), }, { + type: "arguments", options: { filename: fixture("json-pkg-config-no-babel", "src.js"), }, diff --git a/packages/babel-preset-react/src/index.js b/packages/babel-preset-react/src/index.js index 5b953685aa..99bc2eac3b 100644 --- a/packages/babel-preset-react/src/index.js +++ b/packages/babel-preset-react/src/index.js @@ -3,10 +3,6 @@ import transformReactJSX from "babel-plugin-transform-react-jsx"; import transformSyntaxJSX from "babel-plugin-syntax-jsx"; import transformReactDisplayName from "babel-plugin-transform-react-display-name"; -// These imports not yet used... -// import transformReactJSXSource from "babel-plugin-transform-react-jsx-source"; -// import transformReactJSXSelf from "babel-plugin-transform-react-jsx-self"; - export default function () { return { presets: [ @@ -17,13 +13,5 @@ export default function () { transformSyntaxJSX, transformReactDisplayName, ], - env: { - development: { - plugins: [ - // transformReactJSXSource, - // transformReactJSXSelf - ], - }, - }, }; } From 38720ae3092cb1da063e676af62d0d1095fbdab1 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 22:34:25 -0700 Subject: [PATCH 04/16] Remove store subclassing from Plugin class. --- packages/babel-core/src/transformation/plugin.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/babel-core/src/transformation/plugin.js b/packages/babel-core/src/transformation/plugin.js index 75665c1552..86cfa8d4a9 100644 --- a/packages/babel-core/src/transformation/plugin.js +++ b/packages/babel-core/src/transformation/plugin.js @@ -1,15 +1,12 @@ import OptionManager from "./file/options/option-manager"; import * as messages from "babel-messages"; -import Store from "../store"; import traverse from "babel-traverse"; import clone from "lodash/clone"; const GLOBAL_VISITOR_PROPS = ["enter", "exit"]; -export default class Plugin extends Store { +export default class Plugin { constructor(plugin: Object, key?: string) { - super(); - this.initialized = false; this.raw = Object.assign({}, plugin); this.key = this.take("name") || key; From 05ee30c9f74a374072e26a8c889ee89bf15137cc Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 22:40:49 -0700 Subject: [PATCH 05/16] Use the standard option parser to load the internal plugins. --- packages/babel-core/src/transformation/file/index.js | 9 +++++---- .../src/transformation/internal-plugins/block-hoist.js | 5 ++--- .../transformation/internal-plugins/shadow-functions.js | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 9d5af49ff0..6268f2aa45 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -16,16 +16,17 @@ import path from "path"; import * as t from "babel-types"; import resolve from "../../helpers/resolve"; +import OptionManager from "./options/option-manager"; import blockHoistPlugin from "../internal-plugins/block-hoist"; import shadowFunctionsPlugin from "../internal-plugins/shadow-functions"; const shebangRegex = /^#!.*/; -const INTERNAL_PLUGINS = [ - [blockHoistPlugin], - [shadowFunctionsPlugin], -]; +const INTERNAL_PLUGINS = new OptionManager().init({ + babelrc: false, + plugins: [ blockHoistPlugin, shadowFunctionsPlugin ], +}).plugins; const errorVisitor = { enter(path, state) { diff --git a/packages/babel-core/src/transformation/internal-plugins/block-hoist.js b/packages/babel-core/src/transformation/internal-plugins/block-hoist.js index 35dee65312..4813b18d22 100644 --- a/packages/babel-core/src/transformation/internal-plugins/block-hoist.js +++ b/packages/babel-core/src/transformation/internal-plugins/block-hoist.js @@ -1,7 +1,6 @@ -import Plugin from "../plugin"; import sortBy from "lodash/sortBy"; -export default new Plugin({ +export default { /** * [Please add a description.] * @@ -39,4 +38,4 @@ export default new Plugin({ }, }, }, -}); +}; diff --git a/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js b/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js index ce50d21c01..45122a0a3f 100644 --- a/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js +++ b/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js @@ -1,4 +1,3 @@ -import Plugin from "../plugin"; import * as t from "babel-types"; const SUPER_THIS_BOUND = Symbol("super this bound"); @@ -15,7 +14,7 @@ const superVisitor = { }, }; -export default new Plugin({ +export default { name: "internal.shadowFunctions", visitor: { @@ -29,7 +28,7 @@ export default new Plugin({ } }, }, -}); +}; function shouldShadow(path, shadowPath) { if (path.is("_forceShadow")) { From 6c4810cea5d622fb2d913abecfc96553f02a5d61 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:03:55 -0700 Subject: [PATCH 06/16] Move Plugin class to be part of config loading, independent of File. --- .../src/transformation/file/index.js | 28 +++++++++++-------- .../file/options/option-manager.js | 2 +- .../{ => file/options}/plugin.js | 2 +- .../babel-core/src/transformation/pipeline.js | 3 +- .../src/transformation/plugin-pass.js | 8 ++---- packages/babel-core/test/api.js | 2 +- packages/babel-core/test/path.js | 2 +- 7 files changed, 25 insertions(+), 22 deletions(-) rename packages/babel-core/src/transformation/{ => file/options}/plugin.js (97%) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 6268f2aa45..d7270d45bc 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -389,16 +389,25 @@ export default class File extends Store { transform(): BabelFileResult { for (const pluginPairs of this.pluginPasses) { + const passPairs = []; const passes = []; const visitors = []; for (const [ plugin, pluginOpts ] of pluginPairs.concat(INTERNAL_PLUGINS)) { - const pass = new PluginPass(this, plugin, pluginOpts); + const pass = new PluginPass(this, plugin.key, pluginOpts); + + passPairs.push([ plugin, pass ]); passes.push(pass); visitors.push(plugin.visitor); + + if (plugin.pre) plugin.pre.call(pass, this); + } + + for (const [ plugin, pass ] of passPairs) { + const fn = plugin.pre; + if (fn) fn.call(pass, this); } - this.call("pre", passes); util.debug(this.opts, "Start transform traverse"); // merge all plugin visitors into a single visitor @@ -406,7 +415,12 @@ export default class File extends Store { traverse(this.ast, visitor, this.scope); util.debug(this.opts, "End transform traverse"); - this.call("post", passes); + + for (const [ plugin, pass ] of passPairs) { + const fn = plugin.post; + if (fn) fn.call(pass, this); + } + } return this.generate(); @@ -459,14 +473,6 @@ export default class File extends Store { this.addAst(ast); } - call(key: "pre" | "post", pluginPasses: Array) { - for (const pass of pluginPasses) { - const plugin = pass.plugin; - const fn = plugin[key]; - if (fn) fn.call(pass, this); - } - } - parseInputSourceMap(code: string): string { const opts = this.opts; diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js index 2700b94f8b..bf7ace2d22 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -1,5 +1,5 @@ import * as context from "../../../index"; -import Plugin from "../../plugin"; +import Plugin from "./plugin"; import * as messages from "babel-messages"; import resolvePlugin from "../../../helpers/resolve-plugin"; import resolvePreset from "../../../helpers/resolve-preset"; diff --git a/packages/babel-core/src/transformation/plugin.js b/packages/babel-core/src/transformation/file/options/plugin.js similarity index 97% rename from packages/babel-core/src/transformation/plugin.js rename to packages/babel-core/src/transformation/file/options/plugin.js index 86cfa8d4a9..fb637d7cee 100644 --- a/packages/babel-core/src/transformation/plugin.js +++ b/packages/babel-core/src/transformation/file/options/plugin.js @@ -1,4 +1,4 @@ -import OptionManager from "./file/options/option-manager"; +import OptionManager from "./option-manager"; import * as messages from "babel-messages"; import traverse from "babel-traverse"; import clone from "lodash/clone"; diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js index 9bf718a47e..73c2645ec1 100644 --- a/packages/babel-core/src/transformation/pipeline.js +++ b/packages/babel-core/src/transformation/pipeline.js @@ -2,7 +2,6 @@ import fs from "fs"; import normalizeAst from "../helpers/normalize-ast"; -import Plugin from "./plugin"; import File from "./file"; import OptionManager from "./file/options/option-manager"; @@ -10,7 +9,7 @@ export function analyse(code: string, opts: Object = {}, visitor?: Object): ?Bab opts.code = false; if (visitor) { opts.plugins = opts.plugins || []; - opts.plugins.push(new Plugin({ visitor })); + opts.plugins.push({ visitor }); } return transform(code, opts).metadata; } diff --git a/packages/babel-core/src/transformation/plugin-pass.js b/packages/babel-core/src/transformation/plugin-pass.js index 5e7ddb205d..7564d85007 100644 --- a/packages/babel-core/src/transformation/plugin-pass.js +++ b/packages/babel-core/src/transformation/plugin-pass.js @@ -1,18 +1,16 @@ -import type Plugin from "./plugin"; import Store from "../store"; import File from "./file"; export default class PluginPass extends Store { - constructor(file: File, plugin: Plugin, options: Object = {}) { + constructor(file: File, key: string, options: Object = {}) { super(); - this.plugin = plugin; - this.key = plugin.key; + + this.key = key; this.file = file; this.opts = options; } key: string; - plugin: Plugin; file: File; opts: Object; diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index 6f345592c5..cb2e991bf1 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -2,7 +2,7 @@ import * as babel from "../lib/index"; import buildExternalHelpers from "../lib/tools/build-external-helpers"; import sourceMap from "source-map"; import assert from "assert"; -import Plugin from "../lib/transformation/plugin"; +import Plugin from "../lib/transformation/file/options/plugin"; import generator from "babel-generator"; function assertIgnored(result) { diff --git a/packages/babel-core/test/path.js b/packages/babel-core/test/path.js index f84d7eef8e..76270ca3ed 100644 --- a/packages/babel-core/test/path.js +++ b/packages/babel-core/test/path.js @@ -1,5 +1,5 @@ import { transform } from "../lib/index"; -import Plugin from "../lib/transformation/plugin"; +import Plugin from "../lib/transformation/file/options/plugin"; import chai from "chai"; describe("traversal path", function () { From 12a2124d16e14221e8c351df07faad159e3c34bb Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:11:03 -0700 Subject: [PATCH 07/16] Move the deeply nested option logic to a toplevel folder. --- .../file/options => config}/build-config-chain.js | 4 ++-- .../file/options => config}/option-manager.js | 10 +++++----- .../{transformation/file/options => config}/plugin.js | 0 .../{transformation/file/options => config}/removed.js | 0 packages/babel-core/src/index.js | 2 +- packages/babel-core/src/transformation/file/index.js | 2 +- packages/babel-core/src/transformation/pipeline.js | 2 +- packages/babel-core/test/api.js | 2 +- packages/babel-core/test/config-chain.js | 2 +- packages/babel-core/test/option-manager.js | 2 +- packages/babel-core/test/path.js | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) rename packages/babel-core/src/{transformation/file/options => config}/build-config-chain.js (98%) rename packages/babel-core/src/{transformation/file/options => config}/option-manager.js (97%) rename packages/babel-core/src/{transformation/file/options => config}/plugin.js (100%) rename packages/babel-core/src/{transformation/file/options => config}/removed.js (100%) diff --git a/packages/babel-core/src/transformation/file/options/build-config-chain.js b/packages/babel-core/src/config/build-config-chain.js similarity index 98% rename from packages/babel-core/src/transformation/file/options/build-config-chain.js rename to packages/babel-core/src/config/build-config-chain.js index fee82d03c1..2516184410 100644 --- a/packages/babel-core/src/transformation/file/options/build-config-chain.js +++ b/packages/babel-core/src/config/build-config-chain.js @@ -1,5 +1,5 @@ -import * as babel from "../../../index"; -import resolve from "../../../helpers/resolve"; +import * as babel from "../index"; +import resolve from "../helpers/resolve"; import json5 from "json5"; import path from "path"; import fs from "fs"; diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/config/option-manager.js similarity index 97% rename from packages/babel-core/src/transformation/file/options/option-manager.js rename to packages/babel-core/src/config/option-manager.js index bf7ace2d22..6cd3845f57 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -1,15 +1,15 @@ -import * as context from "../../../index"; +import * as context from "../index"; import Plugin from "./plugin"; import * as messages from "babel-messages"; -import resolvePlugin from "../../../helpers/resolve-plugin"; -import resolvePreset from "../../../helpers/resolve-preset"; +import resolvePlugin from "../helpers/resolve-plugin"; +import resolvePreset from "../helpers/resolve-preset"; import defaults from "lodash/defaults"; import cloneDeepWith from "lodash/cloneDeepWith"; -import merge from "../../../helpers/merge"; +import merge from "../helpers/merge"; import removed from "./removed"; import buildConfigChain from "./build-config-chain"; import path from "path"; -import * as util from "../../../util"; +import * as util from "../util"; type PluginObject = { pre?: Function; diff --git a/packages/babel-core/src/transformation/file/options/plugin.js b/packages/babel-core/src/config/plugin.js similarity index 100% rename from packages/babel-core/src/transformation/file/options/plugin.js rename to packages/babel-core/src/config/plugin.js diff --git a/packages/babel-core/src/transformation/file/options/removed.js b/packages/babel-core/src/config/removed.js similarity index 100% rename from packages/babel-core/src/transformation/file/options/removed.js rename to packages/babel-core/src/config/removed.js diff --git a/packages/babel-core/src/index.js b/packages/babel-core/src/index.js index f3fa340eb5..1cf098c66e 100644 --- a/packages/babel-core/src/index.js +++ b/packages/babel-core/src/index.js @@ -11,7 +11,7 @@ export * as types from "babel-types"; export traverse from "babel-traverse"; export template from "babel-template"; -export OptionManager from "./transformation/file/options/option-manager"; +export OptionManager from "./config/option-manager"; export function Plugin(alias) { throw new Error(`The (${alias}) Babel 5 plugin is being run with Babel 6.`); diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index d7270d45bc..69897e7632 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -16,7 +16,7 @@ import path from "path"; import * as t from "babel-types"; import resolve from "../../helpers/resolve"; -import OptionManager from "./options/option-manager"; +import OptionManager from "../../config/option-manager"; import blockHoistPlugin from "../internal-plugins/block-hoist"; import shadowFunctionsPlugin from "../internal-plugins/shadow-functions"; diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js index 73c2645ec1..8f0815e6f8 100644 --- a/packages/babel-core/src/transformation/pipeline.js +++ b/packages/babel-core/src/transformation/pipeline.js @@ -3,7 +3,7 @@ import fs from "fs"; import normalizeAst from "../helpers/normalize-ast"; import File from "./file"; -import OptionManager from "./file/options/option-manager"; +import OptionManager from "../config/option-manager"; export function analyse(code: string, opts: Object = {}, visitor?: Object): ?BabelFileMetadata { opts.code = false; diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index cb2e991bf1..85c8d9eeaa 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -2,7 +2,7 @@ import * as babel from "../lib/index"; import buildExternalHelpers from "../lib/tools/build-external-helpers"; import sourceMap from "source-map"; import assert from "assert"; -import Plugin from "../lib/transformation/file/options/plugin"; +import Plugin from "../lib/config/plugin"; import generator from "babel-generator"; function assertIgnored(result) { diff --git a/packages/babel-core/test/config-chain.js b/packages/babel-core/test/config-chain.js index d43e57142c..c50046ff1d 100644 --- a/packages/babel-core/test/config-chain.js +++ b/packages/babel-core/test/config-chain.js @@ -1,6 +1,6 @@ import assert from "assert"; import path from "path"; -import buildConfigChain from "../lib/transformation/file/options/build-config-chain"; +import buildConfigChain from "../lib/config/build-config-chain"; function fixture() { const args = [__dirname, "fixtures", "config"]; diff --git a/packages/babel-core/test/option-manager.js b/packages/babel-core/test/option-manager.js index 126ed83c27..a2cfd86faf 100644 --- a/packages/babel-core/test/option-manager.js +++ b/packages/babel-core/test/option-manager.js @@ -1,5 +1,5 @@ import assert from "assert"; -import OptionManager from "../lib/transformation/file/options/option-manager"; +import OptionManager from "../lib/config/option-manager"; import path from "path"; describe("option-manager", () => { diff --git a/packages/babel-core/test/path.js b/packages/babel-core/test/path.js index 76270ca3ed..dbc30827c5 100644 --- a/packages/babel-core/test/path.js +++ b/packages/babel-core/test/path.js @@ -1,5 +1,5 @@ import { transform } from "../lib/index"; -import Plugin from "../lib/transformation/file/options/plugin"; +import Plugin from "../lib/config/plugin"; import chai from "chai"; describe("traversal path", function () { From 3e2d731d50d0925c08cef006f603199b3bbdfb34 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:15:53 -0700 Subject: [PATCH 08/16] Move the Store class to be inside transformation. --- packages/babel-core/src/transformation/file/index.js | 2 +- packages/babel-core/src/transformation/plugin-pass.js | 2 +- packages/babel-core/src/{ => transformation}/store.js | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename packages/babel-core/src/{ => transformation}/store.js (100%) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 69897e7632..d47702ca45 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -9,7 +9,7 @@ import sourceMap from "source-map"; import generate from "babel-generator"; import codeFrame from "babel-code-frame"; import traverse from "babel-traverse"; -import Store from "../../store"; +import Store from "../store"; import { parse } from "babylon"; import * as util from "../../util"; import path from "path"; diff --git a/packages/babel-core/src/transformation/plugin-pass.js b/packages/babel-core/src/transformation/plugin-pass.js index 7564d85007..c0a6626cf5 100644 --- a/packages/babel-core/src/transformation/plugin-pass.js +++ b/packages/babel-core/src/transformation/plugin-pass.js @@ -1,4 +1,4 @@ -import Store from "../store"; +import Store from "./store"; import File from "./file"; export default class PluginPass extends Store { diff --git a/packages/babel-core/src/store.js b/packages/babel-core/src/transformation/store.js similarity index 100% rename from packages/babel-core/src/store.js rename to packages/babel-core/src/transformation/store.js From b71569ff6cd4ee36c01db79017c7ac79f27c175b Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:25:04 -0700 Subject: [PATCH 09/16] Remove unneeded util.js file. --- .../babel-core/src/config/option-manager.js | 8 +++++-- .../src/transformation/file/index.js | 24 ++++++++++++------- packages/babel-core/src/util.js | 17 ------------- 3 files changed, 21 insertions(+), 28 deletions(-) delete mode 100644 packages/babel-core/src/util.js diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index 6cd3845f57..05859e29cb 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -9,7 +9,6 @@ import merge from "../helpers/merge"; import removed from "./removed"; import buildConfigChain from "./build-config-chain"; import path from "path"; -import * as util from "../util"; type PluginObject = { pre?: Function; @@ -373,7 +372,12 @@ export default class OptionManager { this.mergeOptions(config); } } catch (e) { - e.message = util.message(opts, e.message); + // 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)) { + e.message = `[BABEL] ${opts.filename || "unknown"}: ${e.message}`; + } + throw e; } diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index d47702ca45..d07b7c64da 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -11,9 +11,9 @@ import codeFrame from "babel-code-frame"; import traverse from "babel-traverse"; import Store from "../store"; import { parse } from "babylon"; -import * as util from "../../util"; import path from "path"; import * as t from "babel-types"; +import buildDebug from "debug"; import resolve from "../../helpers/resolve"; import OptionManager from "../../config/option-manager"; @@ -21,6 +21,12 @@ import OptionManager from "../../config/option-manager"; import blockHoistPlugin from "../internal-plugins/block-hoist"; import shadowFunctionsPlugin from "../internal-plugins/shadow-functions"; +const babelDebug = buildDebug("babel:file"); + +export function debug(opts: Object, msg: string) { + babelDebug(`${opts.filename || "unknown"}: ${msg}`); +} + const shebangRegex = /^#!.*/; const INTERNAL_PLUGINS = new OptionManager().init({ @@ -362,9 +368,9 @@ export default class File extends Store { } } - util.debug(this.opts, "Parse start"); + debug(this.opts, "Parse start"); const ast = parseCode(code, parserOpts || this.parserOpts); - util.debug(this.opts, "Parse stop"); + debug(this.opts, "Parse stop"); return ast; } @@ -382,9 +388,9 @@ export default class File extends Store { } addAst(ast) { - util.debug(this.opts, "Start set AST"); + debug(this.opts, "Start set AST"); this._addAst(ast); - util.debug(this.opts, "End set AST"); + debug(this.opts, "End set AST"); } transform(): BabelFileResult { @@ -408,13 +414,13 @@ export default class File extends Store { if (fn) fn.call(pass, this); } - util.debug(this.opts, "Start transform traverse"); + debug(this.opts, "Start transform traverse"); // merge all plugin visitors into a single visitor const visitor = traverse.visitors.merge(visitors, passes, this.opts.wrapPluginVisitorMethod); traverse(this.ast, visitor, this.scope); - util.debug(this.opts, "End transform traverse"); + debug(this.opts, "End transform traverse"); for (const [ plugin, pass ] of passPairs) { const fn = plugin.post; @@ -543,14 +549,14 @@ export default class File extends Store { } } - util.debug(this.opts, "Generation start"); + debug(this.opts, "Generation start"); const _result = gen(ast, opts.generatorOpts ? Object.assign(opts, opts.generatorOpts) : opts, this.code); result.code = _result.code; result.map = _result.map; - util.debug(this.opts, "Generation end"); + debug(this.opts, "Generation end"); if (this.shebang) { // add back shebang diff --git a/packages/babel-core/src/util.js b/packages/babel-core/src/util.js deleted file mode 100644 index 3caa4be75e..0000000000 --- a/packages/babel-core/src/util.js +++ /dev/null @@ -1,17 +0,0 @@ -import buildDebug from "debug"; - -export { inherits, inspect } from "util"; - -const debugBabel = buildDebug("babel"); - -export function debug(opts: Object, msg: string) { - debugBabel(message(opts, msg)); -} - -export function message(opts: Object, msg: string) { - // There are a few case where throws 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(msg)) return msg; - - return `[BABEL] ${opts.filename || "unknown"}: ${msg}`; -} From 7b5d4fe069008180c317ad7eeef9343fece0eab6 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:37:23 -0700 Subject: [PATCH 10/16] Resolve parser and generator plugins in configuration resolution. --- .../babel-core/src/config/option-manager.js | 21 +++++++++++++++ .../src/transformation/file/index.js | 26 +------------------ 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index 05859e29cb..c0631d1e7b 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -1,6 +1,7 @@ import * as context from "../index"; import Plugin from "./plugin"; import * as messages from "babel-messages"; +import resolve from "../helpers/resolve"; import resolvePlugin from "../helpers/resolve-plugin"; import resolvePreset from "../helpers/resolve-preset"; import defaults from "lodash/defaults"; @@ -254,6 +255,26 @@ export default class OptionManager { } } + if (opts.parserOpts && typeof opts.parserOpts.parser === "string") { + const parser = resolve(opts.parserOpts.parser, dirname); + if (parser) { + opts.parserOpts.parser = require(parser).parse; + } else { + throw new Error(`Couldn't find parser ${opts.parserOpts.parser} with "parse" method ` + + `relative to directory ${dirname}`); + } + } + + if (opts.generatorOpts && typeof opts.generatorOpts.generator === "string") { + const generator = resolve(opts.generatorOpts.generator, dirname); + if (generator) { + opts.generatorOpts.generator = require(generator).print; + } else { + throw new Error(`Couldn't find generator ${opts.generatorOpts.generator} with "print" method ` + + `relative to directory ${dirname}`); + } + } + // resolve plugins if (opts.plugins) { if (!Array.isArray(rawOpts.plugins)) throw new Error(`${alias}.plugins should be an array`); diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index d07b7c64da..c8afe6afec 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -11,11 +11,9 @@ import codeFrame from "babel-code-frame"; import traverse from "babel-traverse"; import Store from "../store"; import { parse } from "babylon"; -import path from "path"; import * as t from "babel-types"; import buildDebug from "debug"; -import resolve from "../../helpers/resolve"; import OptionManager from "../../config/option-manager"; import blockHoistPlugin from "../internal-plugins/block-hoist"; @@ -347,18 +345,7 @@ export default class File extends Store { parserOpts = Object.assign({}, this.parserOpts, parserOpts); if (parserOpts.parser) { - if (typeof parserOpts.parser === "string") { - const dirname = path.dirname(this.opts.filename) || process.cwd(); - const parser = resolve(parserOpts.parser, dirname); - if (parser) { - parseCode = require(parser).parse; - } else { - throw new Error(`Couldn't find parser ${parserOpts.parser} with "parse" method ` + - `relative to directory ${dirname}`); - } - } else { - parseCode = parserOpts.parser; - } + parseCode = parserOpts.parser; parserOpts.parser = { parse(source) { @@ -536,17 +523,6 @@ export default class File extends Store { let gen = generate; if (opts.generatorOpts && opts.generatorOpts.generator) { gen = opts.generatorOpts.generator; - - if (typeof gen === "string") { - const dirname = path.dirname(this.opts.filename) || process.cwd(); - const generator = resolve(gen, dirname); - if (generator) { - gen = require(generator).print; - } else { - throw new Error(`Couldn't find generator ${gen} with "print" method relative ` + - `to directory ${dirname}`); - } - } } debug(this.opts, "Generation start"); From f3f907bdb39f1eb559c38eddbef738edfd2d2677 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:41:06 -0700 Subject: [PATCH 11/16] Remove unneeded helper file. --- .../babel-core/src/helpers/normalize-ast.js | 23 ------------------- .../babel-core/src/transformation/pipeline.js | 8 +++++-- 2 files changed, 6 insertions(+), 25 deletions(-) delete mode 100644 packages/babel-core/src/helpers/normalize-ast.js diff --git a/packages/babel-core/src/helpers/normalize-ast.js b/packages/babel-core/src/helpers/normalize-ast.js deleted file mode 100644 index d2c91cef91..0000000000 --- a/packages/babel-core/src/helpers/normalize-ast.js +++ /dev/null @@ -1,23 +0,0 @@ -import * as t from "babel-types"; - -/** - * Normalize an AST. - * - * - Wrap `Program` node with a `File` node. - */ - -export default function ( - ast: Object, - comments?: Array, - tokens?: Array, -) { - if (ast) { - if (ast.type === "Program") { - return t.file(ast, comments || [], tokens || []); - } else if (ast.type === "File") { - return ast; - } - } - - throw new Error("Not a valid ast?"); -} diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js index 8f0815e6f8..7c2db49cc9 100644 --- a/packages/babel-core/src/transformation/pipeline.js +++ b/packages/babel-core/src/transformation/pipeline.js @@ -1,7 +1,7 @@ /* global BabelFileResult, BabelFileMetadata */ import fs from "fs"; -import normalizeAst from "../helpers/normalize-ast"; +import * as t from "babel-types"; import File from "./file"; import OptionManager from "../config/option-manager"; @@ -30,7 +30,11 @@ export function transformFromAst(ast: Object, code: string, opts: Object): Babel opts = new OptionManager().init(opts); if (opts === null) return null; - ast = normalizeAst(ast); + if (ast && ast.type === "Program") { + return t.file(ast, [], []); + } else if (!ast || ast.type !== "File") { + throw new Error("Not a valid ast?"); + } const file = new File(opts); return file.wrap(code, function () { From 3c63431c7ed269be28942d556529fd7c5cbe0030 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 15 Mar 2017 23:47:32 -0700 Subject: [PATCH 12/16] Move config loading helpers into config folder. --- packages/babel-core/src/config/build-config-chain.js | 2 +- .../babel-core/src/{ => config}/helpers/environment.js | 0 .../src/{ => config}/helpers/get-possible-plugin-names.js | 0 .../src/{ => config}/helpers/get-possible-preset-names.js | 0 packages/babel-core/src/{ => config}/helpers/merge.js | 0 .../{ => config}/helpers/resolve-from-possible-names.js | 0 .../babel-core/src/{ => config}/helpers/resolve-plugin.js | 0 .../babel-core/src/{ => config}/helpers/resolve-preset.js | 0 packages/babel-core/src/{ => config}/helpers/resolve.js | 0 packages/babel-core/src/config/option-manager.js | 8 ++++---- packages/babel-core/src/index.js | 6 +++--- packages/babel-core/test/get-possible-plugin-names.js | 2 +- packages/babel-core/test/get-possible-preset-names.js | 2 +- 13 files changed, 10 insertions(+), 10 deletions(-) rename packages/babel-core/src/{ => config}/helpers/environment.js (100%) rename packages/babel-core/src/{ => config}/helpers/get-possible-plugin-names.js (100%) rename packages/babel-core/src/{ => config}/helpers/get-possible-preset-names.js (100%) rename packages/babel-core/src/{ => config}/helpers/merge.js (100%) rename packages/babel-core/src/{ => config}/helpers/resolve-from-possible-names.js (100%) rename packages/babel-core/src/{ => config}/helpers/resolve-plugin.js (100%) rename packages/babel-core/src/{ => config}/helpers/resolve-preset.js (100%) rename packages/babel-core/src/{ => config}/helpers/resolve.js (100%) diff --git a/packages/babel-core/src/config/build-config-chain.js b/packages/babel-core/src/config/build-config-chain.js index 2516184410..a8659f0960 100644 --- a/packages/babel-core/src/config/build-config-chain.js +++ b/packages/babel-core/src/config/build-config-chain.js @@ -1,5 +1,5 @@ import * as babel from "../index"; -import resolve from "../helpers/resolve"; +import resolve from "./helpers/resolve"; import json5 from "json5"; import path from "path"; import fs from "fs"; diff --git a/packages/babel-core/src/helpers/environment.js b/packages/babel-core/src/config/helpers/environment.js similarity index 100% rename from packages/babel-core/src/helpers/environment.js rename to packages/babel-core/src/config/helpers/environment.js diff --git a/packages/babel-core/src/helpers/get-possible-plugin-names.js b/packages/babel-core/src/config/helpers/get-possible-plugin-names.js similarity index 100% rename from packages/babel-core/src/helpers/get-possible-plugin-names.js rename to packages/babel-core/src/config/helpers/get-possible-plugin-names.js diff --git a/packages/babel-core/src/helpers/get-possible-preset-names.js b/packages/babel-core/src/config/helpers/get-possible-preset-names.js similarity index 100% rename from packages/babel-core/src/helpers/get-possible-preset-names.js rename to packages/babel-core/src/config/helpers/get-possible-preset-names.js diff --git a/packages/babel-core/src/helpers/merge.js b/packages/babel-core/src/config/helpers/merge.js similarity index 100% rename from packages/babel-core/src/helpers/merge.js rename to packages/babel-core/src/config/helpers/merge.js diff --git a/packages/babel-core/src/helpers/resolve-from-possible-names.js b/packages/babel-core/src/config/helpers/resolve-from-possible-names.js similarity index 100% rename from packages/babel-core/src/helpers/resolve-from-possible-names.js rename to packages/babel-core/src/config/helpers/resolve-from-possible-names.js diff --git a/packages/babel-core/src/helpers/resolve-plugin.js b/packages/babel-core/src/config/helpers/resolve-plugin.js similarity index 100% rename from packages/babel-core/src/helpers/resolve-plugin.js rename to packages/babel-core/src/config/helpers/resolve-plugin.js diff --git a/packages/babel-core/src/helpers/resolve-preset.js b/packages/babel-core/src/config/helpers/resolve-preset.js similarity index 100% rename from packages/babel-core/src/helpers/resolve-preset.js rename to packages/babel-core/src/config/helpers/resolve-preset.js diff --git a/packages/babel-core/src/helpers/resolve.js b/packages/babel-core/src/config/helpers/resolve.js similarity index 100% rename from packages/babel-core/src/helpers/resolve.js rename to packages/babel-core/src/config/helpers/resolve.js diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index c0631d1e7b..cb501f00b8 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -1,12 +1,12 @@ import * as context from "../index"; import Plugin from "./plugin"; import * as messages from "babel-messages"; -import resolve from "../helpers/resolve"; -import resolvePlugin from "../helpers/resolve-plugin"; -import resolvePreset from "../helpers/resolve-preset"; +import resolve from "./helpers/resolve"; +import resolvePlugin from "./helpers/resolve-plugin"; +import resolvePreset from "./helpers/resolve-preset"; import defaults from "lodash/defaults"; import cloneDeepWith from "lodash/cloneDeepWith"; -import merge from "../helpers/merge"; +import merge from "./helpers/merge"; import removed from "./removed"; import buildConfigChain from "./build-config-chain"; import path from "path"; diff --git a/packages/babel-core/src/index.js b/packages/babel-core/src/index.js index 1cf098c66e..b763161e16 100644 --- a/packages/babel-core/src/index.js +++ b/packages/babel-core/src/index.js @@ -1,10 +1,10 @@ export File from "./transformation/file"; export buildExternalHelpers from "./tools/build-external-helpers"; -export resolvePlugin from "./helpers/resolve-plugin"; -export resolvePreset from "./helpers/resolve-preset"; +export resolvePlugin from "./config/helpers/resolve-plugin"; +export resolvePreset from "./config/helpers/resolve-preset"; export { version } from "../package"; -export { getEnv } from "./helpers/environment"; +export { getEnv } from "./config/helpers/environment"; export * as messages from "babel-messages"; export * as types from "babel-types"; diff --git a/packages/babel-core/test/get-possible-plugin-names.js b/packages/babel-core/test/get-possible-plugin-names.js index 7ce8644769..d0c14e69f9 100644 --- a/packages/babel-core/test/get-possible-plugin-names.js +++ b/packages/babel-core/test/get-possible-plugin-names.js @@ -1,5 +1,5 @@ import assert from "assert"; -import getPossiblePluginNames from "../lib/helpers/get-possible-plugin-names"; +import getPossiblePluginNames from "../lib/config/helpers/get-possible-plugin-names"; describe("getPossiblePluginNames", function () { it("adds the babel-plugin prefix", function() { diff --git a/packages/babel-core/test/get-possible-preset-names.js b/packages/babel-core/test/get-possible-preset-names.js index 40052fdfbb..0630f0fb71 100644 --- a/packages/babel-core/test/get-possible-preset-names.js +++ b/packages/babel-core/test/get-possible-preset-names.js @@ -1,5 +1,5 @@ import assert from "assert"; -import getPossiblePresetNames from "../lib/helpers/get-possible-preset-names"; +import getPossiblePresetNames from "../lib/config/helpers/get-possible-preset-names"; describe("getPossiblePresetNames", function () { it("adds the babel-preset prefix", function() { From a15de198888aa6d29a9a741fc753722776a054f7 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 16 Mar 2017 00:03:14 -0700 Subject: [PATCH 13/16] Encapsulate config loading in config/ index file. --- package.json | 2 +- packages/babel-core/src/config/index.js | 30 +++++++++++++++++++ packages/babel-core/src/index.js | 15 +++++++++- .../src/transformation/file/index.js | 18 ++++------- .../babel-core/src/transformation/pipeline.js | 26 ++++++++-------- 5 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 packages/babel-core/src/config/index.js diff --git a/package.json b/package.json index b4ebcee5a0..673ada54f5 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "eslint": "^3.9.0", "eslint-config-babel": "^6.0.0", "eslint-plugin-flowtype": "^2.20.0", - "flow-bin": "^0.34.0", + "flow-bin": "^0.41.0", "gulp": "^3.9.0", "gulp-babel": "^6.0.0", "gulp-newer": "^1.0.0", diff --git a/packages/babel-core/src/config/index.js b/packages/babel-core/src/config/index.js new file mode 100644 index 0000000000..3c8f49a157 --- /dev/null +++ b/packages/babel-core/src/config/index.js @@ -0,0 +1,30 @@ +import type Plugin from "./plugin"; +import OptionManager from "./option-manager"; + +export type ResolvedConfig = { + options: Object, + passes: Array>, +}; + +/** + * Standard API for loading Babel configuration data. Not for public consumption. + */ +export default function loadConfig(opts: Object): ResolvedConfig|null { + const mergedOpts = new OptionManager().init(opts); + if (!mergedOpts) return null; + + let passes = []; + if (mergedOpts.plugins) { + passes.push(mergedOpts.plugins); + } + + // With "passPerPreset" enabled there may still be presets in the options. + if (mergedOpts.presets) { + passes = passes.concat(mergedOpts.presets.map((preset) => preset.plugins).filter(Boolean)); + } + + return { + options: mergedOpts, + passes, + }; +} diff --git a/packages/babel-core/src/index.js b/packages/babel-core/src/index.js index b763161e16..75741c26be 100644 --- a/packages/babel-core/src/index.js +++ b/packages/babel-core/src/index.js @@ -11,7 +11,20 @@ export * as types from "babel-types"; export traverse from "babel-traverse"; export template from "babel-template"; -export OptionManager from "./config/option-manager"; +import loadConfig from "./config"; + +export function loadOptions(opts): Object|null { + const config = loadConfig(opts); + + return config ? config.options : null; +} + +// For easier backward-compatibility, provide an API like the one we exposed in Babel 6. +export class OptionManager { + init(opts) { + return loadOptions(opts); + } +} export function Plugin(alias) { throw new Error(`The (${alias}) Babel 5 plugin is being run with Babel 6.`); diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index c8afe6afec..0bdcb23a11 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -14,7 +14,7 @@ import { parse } from "babylon"; import * as t from "babel-types"; import buildDebug from "debug"; -import OptionManager from "../../config/option-manager"; +import loadConfig, { type ResolvedConfig } from "../../config"; import blockHoistPlugin from "../internal-plugins/block-hoist"; import shadowFunctionsPlugin from "../internal-plugins/shadow-functions"; @@ -27,10 +27,10 @@ export function debug(opts: Object, msg: string) { const shebangRegex = /^#!.*/; -const INTERNAL_PLUGINS = new OptionManager().init({ +const INTERNAL_PLUGINS = loadConfig({ babelrc: false, plugins: [ blockHoistPlugin, shadowFunctionsPlugin ], -}).plugins; +}).passes[0]; const errorVisitor = { enter(path, state) { @@ -43,17 +43,11 @@ const errorVisitor = { }; export default class File extends Store { - constructor(opts: Object = {}) { + constructor({ options, passes }: ResolvedConfig) { super(); - let passes = []; - if (opts.plugins) passes.push(opts.plugins); - - // With "passPerPreset" enabled there may still be presets in the options. - if (opts.presets) passes = passes.concat(opts.presets.map((preset) => preset.plugins).filter(Boolean)); - this.pluginPasses = passes; - this.opts = opts; + this.opts = options; this.parserOpts = { sourceType: this.opts.sourceType, @@ -64,7 +58,7 @@ export default class File extends Store { for (const pluginPairs of passes) { for (const [ plugin ] of pluginPairs) { if (plugin.manipulateOptions) { - plugin.manipulateOptions(opts, this.parserOpts, this); + plugin.manipulateOptions(this.opts, this.parserOpts, this); } } } diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js index 7c2db49cc9..24066e9b1c 100644 --- a/packages/babel-core/src/transformation/pipeline.js +++ b/packages/babel-core/src/transformation/pipeline.js @@ -3,7 +3,7 @@ import fs from "fs"; import * as t from "babel-types"; import File from "./file"; -import OptionManager from "../config/option-manager"; +import loadConfig from "../config"; export function analyse(code: string, opts: Object = {}, visitor?: Object): ?BabelFileMetadata { opts.code = false; @@ -15,10 +15,10 @@ export function analyse(code: string, opts: Object = {}, visitor?: Object): ?Bab } export function transform(code: string, opts?: Object): BabelFileResult { - opts = new OptionManager().init(opts); - if (opts === null) return null; + const config = loadConfig(opts); + if (config === null) return null; - const file = new File(opts); + const file = new File(config); return file.wrap(code, function () { file.addCode(code); file.parseCode(code); @@ -27,8 +27,8 @@ export function transform(code: string, opts?: Object): BabelFileResult { } export function transformFromAst(ast: Object, code: string, opts: Object): BabelFileResult { - opts = new OptionManager().init(opts); - if (opts === null) return null; + const config = loadConfig(opts); + if (config === null) return null; if (ast && ast.type === "Program") { return t.file(ast, [], []); @@ -36,7 +36,7 @@ export function transformFromAst(ast: Object, code: string, opts: Object): Babel throw new Error("Not a valid ast?"); } - const file = new File(opts); + const file = new File(config); return file.wrap(code, function () { file.addCode(code); file.addAst(ast); @@ -51,15 +51,15 @@ export function transformFile(filename: string, opts?: Object, callback: Functio } opts.filename = filename; - opts = new OptionManager().init(opts); - if (opts === null) return callback(null, null); + const config = loadConfig(opts); + if (config === null) return callback(null, null); fs.readFile(filename, function (err, code) { let result; if (!err) { try { - const file = new File(opts); + const file = new File(config); result = file.wrap(code, function () { file.addCode(code); file.parseCode(code); @@ -80,11 +80,11 @@ export function transformFile(filename: string, opts?: Object, callback: Functio export function transformFileSync(filename: string, opts?: Object = {}): string { opts.filename = filename; - opts = new OptionManager().init(opts); - if (opts === null) return null; + const config = loadConfig(opts); + if (config === null) return null; const code = fs.readFileSync(filename, "utf8"); - const file = new File(opts); + const file = new File(config); return file.wrap(code, function () { file.addCode(code); From 534f621183d23160f4e4bac1bd204602d03615b6 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 17 Mar 2017 10:41:19 -0400 Subject: [PATCH 14/16] remove unused use of removed util class --- packages/babel-runtime/scripts/build-dist.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/babel-runtime/scripts/build-dist.js b/packages/babel-runtime/scripts/build-dist.js index 3aee330207..5e73c94c67 100644 --- a/packages/babel-runtime/scripts/build-dist.js +++ b/packages/babel-runtime/scripts/build-dist.js @@ -25,7 +25,6 @@ paths.forEach(function (path) { var helpers = require("babel-helpers"); var babel = require("../../babel-core"); -var util = require("../../babel-core/lib/util"); var t = require("../../babel-types"); function relative(filename) { From 4901f3342392ef2c738cf30c4d9a5341eca1215e Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 21 Mar 2017 13:03:54 -0400 Subject: [PATCH 15/16] remove unnecessary call --- packages/babel-core/src/transformation/file/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 0bdcb23a11..dc940b53de 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -386,8 +386,6 @@ export default class File extends Store { passPairs.push([ plugin, pass ]); passes.push(pass); visitors.push(plugin.visitor); - - if (plugin.pre) plugin.pre.call(pass, this); } for (const [ plugin, pass ] of passPairs) { From 7551a8e666297778692cb330a1e3fc6c28ce5e24 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 21 Mar 2017 13:04:54 -0400 Subject: [PATCH 16/16] Update yarn.lock --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b730d5b88e..0fc054e20d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1926,9 +1926,9 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -flow-bin@^0.34.0: - version "0.34.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.34.0.tgz#093ed36981e8fafc39d16f0b0878d0968aa80fad" +flow-bin@^0.41.0: + version "0.41.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.41.0.tgz#8badac9a19da45004997e599bd316518db489b2e" for-in@^0.1.5: version "0.1.6"