From db28c18458ef8f62e80d9cc9ddbeb2be0a943a92 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 22 Nov 2017 18:23:28 -0800 Subject: [PATCH 1/6] Disallow nested '.env' blocks since they are useless. --- packages/babel-core/src/config/options.js | 3 +++ packages/babel-core/test/api.js | 8 -------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/babel-core/src/config/options.js b/packages/babel-core/src/config/options.js index 5ca278b14b..450f52b8e8 100644 --- a/packages/babel-core/src/config/options.js +++ b/packages/babel-core/src/config/options.js @@ -206,6 +206,9 @@ export function validate(type: OptionsType, opts: {}): ValidatedOptions { if (type !== "arguments" && ROOT_VALIDATORS[key]) { throw new Error(`.${key} is only allowed in root programmatic options`); } + if (type === "env" && key === "env") { + throw new Error(`.${key} is not allowed inside another env block`); + } const validator = COMMON_VALIDATORS[key] || diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index cad0308862..215a8960f1 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -296,12 +296,6 @@ describe("api", function() { development: { passPerPreset: true, presets: [pushPreset("argthree"), pushPreset("argfour")], - env: { - development: { - passPerPreset: true, - presets: [pushPreset("argfive"), pushPreset("argsix")], - }, - }, }, }, }); @@ -327,8 +321,6 @@ describe("api", function() { "fourteen;", "fifteen;", "sixteen;", - "argfive;", - "argsix;", "argthree;", "argfour;", "seven;", From 18ea5aca51c82fcddaca0d0b1ff91a8995d955ec Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 22 Nov 2017 18:24:59 -0800 Subject: [PATCH 2/6] Expose a 'cwd' option for Babel's root options. --- packages/babel-core/src/config/build-config-chain.js | 5 +++-- packages/babel-core/src/config/option-manager.js | 7 +++++-- packages/babel-core/src/config/options.js | 2 ++ packages/babel-core/test/config-chain.js | 6 +++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/babel-core/src/config/build-config-chain.js b/packages/babel-core/src/config/build-config-chain.js index ab253cf8dc..27d6ac99c0 100644 --- a/packages/babel-core/src/config/build-config-chain.js +++ b/packages/babel-core/src/config/build-config-chain.js @@ -39,16 +39,17 @@ type ConfigPart = }; export default function buildConfigChain( + cwd: string, opts: ValidatedOptions, envName: string, ): Array | null { - const filename = opts.filename ? path.resolve(opts.filename) : null; + const filename = opts.filename ? path.resolve(cwd, opts.filename) : null; const builder = new ConfigChainBuilder( filename ? new LoadedFile(filename) : null, ); try { - builder.mergeConfigArguments(opts, process.cwd(), envName); + builder.mergeConfigArguments(opts, cwd, envName); // resolve all .babelrc files if (opts.babelrc !== false && filename) { diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index d7c7c958c5..25e810c083 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -1,5 +1,6 @@ // @flow +import path from "path"; import * as context from "../index"; import Plugin, { validatePluginObject } from "./plugin"; import merge from "lodash/merge"; @@ -103,9 +104,10 @@ class OptionManager { init(inputOpts: {}) { const args = validate("arguments", inputOpts); - const { envName = getEnv() } = args; + const { envName = getEnv(), cwd = "." } = args; + const absoluteCwd = path.resolve(cwd); - const configChain = buildConfigChain(args, envName); + const configChain = buildConfigChain(absoluteCwd, args, envName); if (!configChain) return null; try { @@ -134,6 +136,7 @@ class OptionManager { .map(plugins => ({ plugins })); opts.passPerPreset = opts.presets.length > 0; opts.envName = envName; + opts.cwd = absoluteCwd; return { options: opts, diff --git a/packages/babel-core/src/config/options.js b/packages/babel-core/src/config/options.js index 450f52b8e8..9aec95dfa8 100644 --- a/packages/babel-core/src/config/options.js +++ b/packages/babel-core/src/config/options.js @@ -17,6 +17,7 @@ import { } from "./option-assertions"; const ROOT_VALIDATORS: ValidatorSet = { + cwd: (assertString: Validator<$PropertyType>), filename: (assertString: Validator< $PropertyType, >), @@ -128,6 +129,7 @@ const COMMON_VALIDATORS: ValidatorSet = { export type InputOptions = ValidatedOptions; export type ValidatedOptions = { + cwd?: string, filename?: string, filenameRelative?: string, babelrc?: boolean, diff --git a/packages/babel-core/test/config-chain.js b/packages/babel-core/test/config-chain.js index d4bb482212..4b4ea20ff0 100644 --- a/packages/babel-core/test/config-chain.js +++ b/packages/babel-core/test/config-chain.js @@ -1,10 +1,14 @@ import assert from "assert"; import fs from "fs"; import path from "path"; -import buildConfigChain from "../lib/config/build-config-chain"; +import buildConfigChainFn from "../lib/config/build-config-chain"; const DEFAULT_ENV = "development"; +function buildConfigChain(opts, envName) { + return buildConfigChainFn(process.cwd(), opts, envName); +} + function fixture() { const args = [__dirname, "fixtures", "config"]; for (let i = 0; i < arguments.length; i++) { From 1d0a3d67722e445992d403d58dc57bf51c09ed02 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 22 Nov 2017 18:27:12 -0800 Subject: [PATCH 3/6] Remove duplicated assertion. Covered by validate() --- packages/babel-core/src/config/option-manager.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index 25e810c083..8ee3fe99b5 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -366,13 +366,6 @@ function createDescriptor( ); } - if (options != null && typeof options !== "object") { - throw new Error( - "Plugin/Preset options must be an object, null, or undefined", - ); - } - options = options || undefined; - return { alias: filepath || `${alias}$${index}`, value, From b5cb78d33a2bf96ded37a6f5fc8a03d5a04d3676 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Fri, 24 Nov 2017 16:56:05 -0800 Subject: [PATCH 4/6] Move plugin pass initialization logic a bit. --- .../babel-core/src/config/option-manager.js | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index 8ee3fe99b5..9df8002061 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -46,36 +46,29 @@ class OptionManager { * - `loc` is used to point to the original config. * - `dirname` is used to resolve plugins relative to it. */ - - mergeOptions(config: MergeOptions, pass?: Array, envName: string) { + mergeOptions(config: MergeOptions, pass: Array, envName: string) { const result = loadConfig(config); const plugins = result.plugins.map(descriptor => loadPluginDescriptor(descriptor, envName), ); - const presets = result.presets.map(descriptor => - loadPresetDescriptor(descriptor, envName), - ); - - const passPerPreset = config.options.passPerPreset; - pass = pass || this.passes[0]; + const presets = result.presets.map(descriptor => ({ + pass: config.options.passPerPreset ? [] : pass, + preset: loadPresetDescriptor(descriptor, envName), + })); // resolve presets if (presets.length > 0) { - let presetPasses = null; - if (passPerPreset) { - presetPasses = presets.map(() => []); - // The passes are created in the same order as the preset list, but are inserted before any - // existing additional passes. - this.passes.splice(1, 0, ...presetPasses); - } + // The passes are created in the same order as the preset list, but are inserted before any + // existing additional passes. + this.passes.splice( + 1, + 0, + ...presets.map(o => o.pass).filter(p => p !== pass), + ); - presets.forEach((presetConfig, i) => { - this.mergeOptions( - presetConfig, - presetPasses ? presetPasses[i] : pass, - envName, - ); + presets.forEach(({ preset, pass }) => { + this.mergeOptions(preset, pass, envName); }); } @@ -112,7 +105,7 @@ class OptionManager { try { for (const config of configChain) { - this.mergeOptions(config, undefined, envName); + this.mergeOptions(config, this.passes[0], envName); } } catch (e) { // There are a few case where thrown errors will try to annotate themselves multiple times, so From 6cb9d20a0a054d60447e881b12d28e889f79de7f Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Fri, 24 Nov 2017 16:58:56 -0800 Subject: [PATCH 5/6] Tie presets pass metadata to descriptors. --- packages/babel-core/src/config/option-manager.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/babel-core/src/config/option-manager.js b/packages/babel-core/src/config/option-manager.js index 9df8002061..42c1ac4e1f 100644 --- a/packages/babel-core/src/config/option-manager.js +++ b/packages/babel-core/src/config/option-manager.js @@ -53,7 +53,7 @@ class OptionManager { loadPluginDescriptor(descriptor, envName), ); const presets = result.presets.map(descriptor => ({ - pass: config.options.passPerPreset ? [] : pass, + pass: descriptor.ownPass ? [] : pass, preset: loadPresetDescriptor(descriptor, envName), })); @@ -143,6 +143,7 @@ type BasicDescriptor = { options: {} | void, dirname: string, alias: string, + ownPass?: boolean, }; type LoadedDescriptor = { @@ -173,6 +174,7 @@ const loadConfig = makeWeakCache((config: MergeOptions): { createDescriptor(preset, loadPreset, config.dirname, { index, alias: config.alias, + ownPass: config.options.passPerPreset, }), ); @@ -316,9 +318,11 @@ function createDescriptor( { index, alias, + ownPass, }: { index: number, alias: string, + ownPass?: boolean, }, ): BasicDescriptor { let options; @@ -364,6 +368,7 @@ function createDescriptor( value, options, dirname, + ownPass, }; } From c635ff9c3249cf45023b1b8bfea26d7f57623308 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Fri, 24 Nov 2017 18:16:29 -0800 Subject: [PATCH 6/6] Remove duplicate from plugin list. --- packages/babel-preset-es2015/test/fixtures/traceur/options.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/babel-preset-es2015/test/fixtures/traceur/options.json b/packages/babel-preset-es2015/test/fixtures/traceur/options.json index ea93819975..02c0b709d1 100644 --- a/packages/babel-preset-es2015/test/fixtures/traceur/options.json +++ b/packages/babel-preset-es2015/test/fixtures/traceur/options.json @@ -1,7 +1,6 @@ { "plugins": [ "transform-exponentiation-operator", - "transform-regenerator", "transform-template-literals", "transform-literals", "transform-arrow-functions",