Merge pull request #4566 from loganfsmyth/fix-3695

Allow presets to be ES6 default exports.
This commit is contained in:
Logan Smyth 2016-09-25 12:52:42 -07:00 committed by GitHub
commit 66a4aec1f9
24 changed files with 198 additions and 125 deletions

View File

@ -281,6 +281,9 @@ export default class OptionManager {
val = require(presetLoc);
}
// If the imported preset is a transpiled ES2015 module, grab the default export.
if (typeof val === "object" && val.__esModule) val = val.default;
// For compatibility with babel-core < 6.13.x, allow presets to export an object with a
// a 'buildPreset' function that will return the preset itself, while still exporting a
// simple object (rather than a function), for supporting old Babel versions.

View File

@ -1,29 +1,37 @@
/**
* This file is a bit of a mess. If you're looking at it as a reference for how to write a preset,
* I'd recommend looking only at `function preset(){}` and ignoring the rest, unless your new preset
* really needs to work on babel-core < 6.13.x, which is unlikely.
* This file is not the canonical way of writing a Babel preset since it strives for
* backward compatibility with babel-core < v6.13.x. If you're looking at it as a
* reference for how to write a preset, it's probably best to look at the other presets
* such as babel-preset-es2016 & babel-preset-latest noting that the former example
* exports via a default object and the latter via a default function.
*/
/**
* This preset was originally an object, before function-based configurable presets were introduced.
* For backward-compatibility with anything that may have been loading this preset and expecting
* it to be a simple Babel config object, we maintain the old config here.
*/
module.exports = preset({});
import transformES2015TemplateLiterals from "babel-plugin-transform-es2015-template-literals";
import transformES2015Literals from "babel-plugin-transform-es2015-literals";
import transformES2015FunctionName from "babel-plugin-transform-es2015-function-name";
import transformES2015ArrowFunctions from "babel-plugin-transform-es2015-arrow-functions";
import transformES2015BlockScopedFunctions from "babel-plugin-transform-es2015-block-scoped-functions";
import transformES2015Classes from "babel-plugin-transform-es2015-classes";
import transformES2015ObjectSuper from "babel-plugin-transform-es2015-object-super";
import transformES2015ShorthandProperties from "babel-plugin-transform-es2015-shorthand-properties";
import transformES2015DuplicateKeys from "babel-plugin-transform-es2015-duplicate-keys";
import transformES2015ComputedProperties from "babel-plugin-transform-es2015-computed-properties";
import transformES2015ForOf from "babel-plugin-transform-es2015-for-of";
import transformES2015StickyRegex from "babel-plugin-transform-es2015-sticky-regex";
import transformES2015UnicodeRegex from "babel-plugin-transform-es2015-unicode-regex";
import checkES2015Constants from "babel-plugin-check-es2015-constants";
import transformES2015Spread from "babel-plugin-transform-es2015-spread";
import transformES2015Parameters from "babel-plugin-transform-es2015-parameters";
import transformES2015Destructuring from "babel-plugin-transform-es2015-destructuring";
import transformES2015BlockScoping from "babel-plugin-transform-es2015-block-scoping";
import transformES2015TypeofSymbol from "babel-plugin-transform-es2015-typeof-symbol";
import transformES2015ModulesCommonJS from "babel-plugin-transform-es2015-modules-commonjs";
import transformES2015ModulesSystemJS from "babel-plugin-transform-es2015-modules-systemjs";
import transformES2015ModulesAMD from "babel-plugin-transform-es2015-modules-amd";
import transformES2015ModulesUMD from "babel-plugin-transform-es2015-modules-umd";
import transformRegenerator from "babel-plugin-transform-regenerator";
// For backward compatibility with babel-core < v6.13.x, we use the 'buildPreset' property
// of the preset object for the preset creation function.
Object.defineProperty(module.exports, "buildPreset", {
configurable: true,
writable: true,
// We make this non-enumerable so old versions of babel-core won't see it as an unknown property,
// while allowing new versions to see it as a preset builder function.
enumerable: false,
value: preset,
});
function preset(context, opts) {
function preset(context, opts = {}) {
const moduleTypes = ["commonjs", "amd", "umd", "systemjs"];
let loose = false;
let modules = "commonjs";
@ -42,34 +50,56 @@ function preset(context, opts) {
"or a module type which be be one of: 'commonjs' (default), 'amd', 'umd', 'systemjs'");
}
// be DRY
const optsLoose = { loose };
return {
plugins: [
[require("babel-plugin-transform-es2015-template-literals"), { loose, spec }],
require("babel-plugin-transform-es2015-literals"),
require("babel-plugin-transform-es2015-function-name"),
[require("babel-plugin-transform-es2015-arrow-functions"), { spec }],
require("babel-plugin-transform-es2015-block-scoped-functions"),
[require("babel-plugin-transform-es2015-classes"), { loose }],
require("babel-plugin-transform-es2015-object-super"),
require("babel-plugin-transform-es2015-shorthand-properties"),
require("babel-plugin-transform-es2015-duplicate-keys"),
[require("babel-plugin-transform-es2015-computed-properties"), { loose }],
[require("babel-plugin-transform-es2015-for-of"), { loose }],
require("babel-plugin-transform-es2015-sticky-regex"),
require("babel-plugin-transform-es2015-unicode-regex"),
require("babel-plugin-check-es2015-constants"),
[require("babel-plugin-transform-es2015-spread"), { loose }],
require("babel-plugin-transform-es2015-parameters"),
[require("babel-plugin-transform-es2015-destructuring"), { loose }],
require("babel-plugin-transform-es2015-block-scoping"),
require("babel-plugin-transform-es2015-typeof-symbol"),
modules === "commonjs" && [require("babel-plugin-transform-es2015-modules-commonjs"), { loose }],
modules === "systemjs" && [require("babel-plugin-transform-es2015-modules-systemjs"), { loose }],
modules === "amd" && [require("babel-plugin-transform-es2015-modules-amd"), { loose }],
modules === "umd" && [require("babel-plugin-transform-es2015-modules-umd"), { loose }],
[require("babel-plugin-transform-regenerator"), { async: false, asyncGenerators: false }]
// filter out falsy values
].filter(Boolean)
[transformES2015TemplateLiterals, { loose, spec }],
transformES2015Literals,
transformES2015FunctionName,
[transformES2015ArrowFunctions, { spec }],
transformES2015BlockScopedFunctions,
[transformES2015Classes, optsLoose],
transformES2015ObjectSuper,
transformES2015ShorthandProperties,
transformES2015DuplicateKeys,
[transformES2015ComputedProperties, optsLoose],
[transformES2015ForOf, optsLoose],
transformES2015StickyRegex,
transformES2015UnicodeRegex,
checkES2015Constants,
[transformES2015Spread, optsLoose],
transformES2015Parameters,
[transformES2015Destructuring, optsLoose],
transformES2015BlockScoping,
transformES2015TypeofSymbol,
modules === "commonjs" && [transformES2015ModulesCommonJS, optsLoose],
modules === "systemjs" && [transformES2015ModulesSystemJS, optsLoose],
modules === "amd" && [transformES2015ModulesAMD, optsLoose],
modules === "umd" && [transformES2015ModulesUMD, optsLoose],
[transformRegenerator, { async: false, asyncGenerators: false }]
].filter(Boolean) // filter out falsy values
};
}
/**
* This preset was originally an object, before function-based configurable presets were introduced.
* For backward-compatibility with anything that may have been loading this preset and expecting
* it to be a simple Babel config object, we export the old config here via default object.
*/
const oldConfig = preset({});
export default oldConfig;
// However, for backward compatibility with babel-core < v6.13.x, we use the 'buildPreset'
// property of the preset object for the preset creation function with the enumerability
// caveat mentioned below.
Object.defineProperty(oldConfig, "buildPreset", {
configurable: true,
writable: true,
// We make this non-enumerable so old versions of babel-core won't see it as an unknown property,
// while allowing new versions to see it as a preset builder function.
enumerable: false,
value: preset,
});

View File

@ -1,5 +0,0 @@
module.exports = {
plugins: [
require("babel-plugin-transform-exponentiation-operator"),
]
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-es2016",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-transform-exponentiation-operator": "^6.3.13"
}

View File

@ -0,0 +1,7 @@
import transformExponentiationOperator from "babel-plugin-transform-exponentiation-operator";
export default {
plugins: [
transformExponentiationOperator
]
};

View File

@ -1,6 +0,0 @@
module.exports = {
plugins: [
require("babel-plugin-syntax-trailing-function-commas"),
require("babel-plugin-transform-async-to-generator")
]
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-es2017",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-syntax-trailing-function-commas": "^6.8.0",
"babel-plugin-transform-async-to-generator": "^6.8.0"

View File

@ -0,0 +1,9 @@
import syntaxTrailingFunctionCommas from "babel-plugin-syntax-trailing-function-commas";
import transformAsyncToGenerator from "babel-plugin-transform-async-to-generator";
export default {
plugins: [
syntaxTrailingFunctionCommas,
transformAsyncToGenerator
]
};

View File

@ -1,11 +1,16 @@
const { buildPreset } = require("babel-preset-es2015");
import presetES2015 from "babel-preset-es2015";
import presetES2016 from "babel-preset-es2016";
import presetES2017 from "babel-preset-es2017";
module.exports = function preset(context, opts = {}) {
// Rather than exporting a default object to represent the preset, we can
// also export a default function instead, as this preset demonstrates.
// This allows one to further configure a preset by way of specific options.
export default function (context, opts = {}) {
return {
presets: [
opts.es2015 !== false && [buildPreset, opts.es2015],
opts.es2016 !== false && require("babel-preset-es2016"),
opts.es2017 !== false && require("babel-preset-es2017")
].filter(Boolean)
opts.es2015 !== false && [presetES2015.buildPreset, opts.es2015],
opts.es2016 !== false && presetES2016,
opts.es2017 !== false && presetES2017
].filter(Boolean) // filter out falsy values
};
};
}

View File

@ -1,17 +0,0 @@
module.exports = {
plugins: [
require("babel-plugin-transform-react-jsx"),
require("babel-plugin-transform-flow-strip-types"),
require("babel-plugin-syntax-flow"),
require("babel-plugin-syntax-jsx"),
require("babel-plugin-transform-react-display-name"),
],
env: {
development: {
plugins: [
// require("babel-plugin-transform-react-jsx-source"),
// require("babel-plugin-transform-react-jsx-self")
]
}
}
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-react",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-syntax-flow": "^6.3.13",
"babel-plugin-syntax-jsx": "^6.3.13",

View File

@ -0,0 +1,27 @@
import transformReactJSX from "babel-plugin-transform-react-jsx";
import transformFlowStripTypes from "babel-plugin-transform-flow-strip-types";
import transformSyntaxFlow from "babel-plugin-syntax-flow";
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 {
plugins: [
transformReactJSX,
transformFlowStripTypes,
transformSyntaxFlow,
transformSyntaxJSX,
transformReactDisplayName
],
env: {
development: {
plugins: [
// transformReactJSXSource,
// transformReactJSXSelf
]
}
}
};

View File

@ -1,9 +0,0 @@
module.exports = {
presets: [
require("babel-preset-stage-1")
],
plugins: [
require("babel-plugin-transform-do-expressions"),
require("babel-plugin-transform-function-bind")
]
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-stage-0",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-transform-do-expressions": "^6.3.13",
"babel-plugin-transform-function-bind": "^6.3.13",

View File

@ -0,0 +1,14 @@
import presetStage1 from "babel-preset-stage-1";
import transformDoExpressions from "babel-plugin-transform-do-expressions";
import transformFunctionBind from "babel-plugin-transform-function-bind";
export default {
presets: [
presetStage1
],
plugins: [
transformDoExpressions,
transformFunctionBind
]
};

View File

@ -1,9 +0,0 @@
module.exports = {
presets: [
require("babel-preset-stage-2")
],
plugins: [
require("babel-plugin-transform-class-constructor-call"),
require("babel-plugin-transform-export-extensions")
]
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-stage-1",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-transform-class-constructor-call": "^6.3.13",
"babel-plugin-transform-export-extensions": "^6.3.13",

View File

@ -0,0 +1,14 @@
import presetStage2 from "babel-preset-stage-2";
import transformClassConstructorCall from "babel-plugin-transform-class-constructor-call";
import transformExportExtensions from "babel-plugin-transform-export-extensions";
export default {
presets: [
presetStage2
],
plugins: [
transformClassConstructorCall,
transformExportExtensions
]
};

View File

@ -1,10 +0,0 @@
module.exports = {
presets: [
require("babel-preset-stage-3")
],
plugins: [
require("babel-plugin-transform-class-properties"),
require("babel-plugin-transform-object-rest-spread"),
require("babel-plugin-transform-decorators")
]
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-stage-2",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-transform-class-properties": "^6.3.13",
"babel-plugin-transform-decorators": "^6.13.0",

View File

@ -0,0 +1,16 @@
import presetStage3 from "babel-preset-stage-3";
import transformClassProperties from "babel-plugin-transform-class-properties";
import transformObjectRestSpread from "babel-plugin-transform-object-rest-spread";
import transformDecorators from "babel-plugin-transform-decorators";
export default {
presets: [
presetStage3
],
plugins: [
transformClassProperties,
transformObjectRestSpread,
transformDecorators
]
};

View File

@ -1,7 +0,0 @@
module.exports = {
plugins: [
require("babel-plugin-syntax-trailing-function-commas"),
require("babel-plugin-transform-async-to-generator"),
require("babel-plugin-transform-exponentiation-operator")
]
};

View File

@ -6,7 +6,7 @@
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-stage-3",
"main": "index.js",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-syntax-trailing-function-commas": "^6.3.13",
"babel-plugin-transform-async-to-generator": "^6.3.13",

View File

@ -0,0 +1,11 @@
import syntaxTrailingFunctionCommas from "babel-plugin-syntax-trailing-function-commas";
import transformAsyncToGenerator from "babel-plugin-transform-async-to-generator";
import transformExponentiationOperator from "babel-plugin-transform-exponentiation-operator";
export default {
plugins: [
syntaxTrailingFunctionCommas,
transformAsyncToGenerator,
transformExponentiationOperator
]
};