diff --git a/packages/babel-preset-es2015/src/index.js b/packages/babel-preset-es2015/src/index.js index f62ae53395..67b055982a 100644 --- a/packages/babel-preset-es2015/src/index.js +++ b/packages/babel-preset-es2015/src/index.js @@ -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, +}); diff --git a/packages/babel-preset-es2016/src/index.js b/packages/babel-preset-es2016/src/index.js index a726112769..3ce3c75985 100644 --- a/packages/babel-preset-es2016/src/index.js +++ b/packages/babel-preset-es2016/src/index.js @@ -1,5 +1,7 @@ -module.exports = { +import transformExponentiationOperator from "babel-plugin-transform-exponentiation-operator"; + +export default { plugins: [ - require("babel-plugin-transform-exponentiation-operator"), + transformExponentiationOperator ] }; diff --git a/packages/babel-preset-es2017/src/index.js b/packages/babel-preset-es2017/src/index.js index 7c827e47c0..8c83b453c2 100644 --- a/packages/babel-preset-es2017/src/index.js +++ b/packages/babel-preset-es2017/src/index.js @@ -1,6 +1,9 @@ -module.exports = { +import syntaxTrailingFunctionCommas from "babel-plugin-syntax-trailing-function-commas"; +import transformAsyncToGenerator from "babel-plugin-transform-async-to-generator"; + +export default { plugins: [ - require("babel-plugin-syntax-trailing-function-commas"), - require("babel-plugin-transform-async-to-generator") + syntaxTrailingFunctionCommas, + transformAsyncToGenerator ] }; diff --git a/packages/babel-preset-latest/src/index.js b/packages/babel-preset-latest/src/index.js index f6470efbdd..8571beea98 100644 --- a/packages/babel-preset-latest/src/index.js +++ b/packages/babel-preset-latest/src/index.js @@ -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 }; -}; +} diff --git a/packages/babel-preset-react/src/index.js b/packages/babel-preset-react/src/index.js index 3e4086bffc..55dd6bbd8d 100644 --- a/packages/babel-preset-react/src/index.js +++ b/packages/babel-preset-react/src/index.js @@ -1,16 +1,26 @@ -module.exports = { +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: [ - 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"), + transformReactJSX, + transformFlowStripTypes, + transformSyntaxFlow, + transformSyntaxJSX, + transformReactDisplayName ], env: { development: { plugins: [ - // require("babel-plugin-transform-react-jsx-source"), - // require("babel-plugin-transform-react-jsx-self") + // transformReactJSXSource, + // transformReactJSXSelf ] } } diff --git a/packages/babel-preset-stage-0/src/index.js b/packages/babel-preset-stage-0/src/index.js index ecf74a998d..b9b65f10a0 100644 --- a/packages/babel-preset-stage-0/src/index.js +++ b/packages/babel-preset-stage-0/src/index.js @@ -1,9 +1,14 @@ -module.exports = { +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: [ - require("babel-preset-stage-1") + presetStage1 ], plugins: [ - require("babel-plugin-transform-do-expressions"), - require("babel-plugin-transform-function-bind") + transformDoExpressions, + transformFunctionBind ] }; diff --git a/packages/babel-preset-stage-1/src/index.js b/packages/babel-preset-stage-1/src/index.js index 8beaaebb92..47c5cea3bc 100644 --- a/packages/babel-preset-stage-1/src/index.js +++ b/packages/babel-preset-stage-1/src/index.js @@ -1,9 +1,14 @@ -module.exports = { +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: [ - require("babel-preset-stage-2") + presetStage2 ], plugins: [ - require("babel-plugin-transform-class-constructor-call"), - require("babel-plugin-transform-export-extensions") + transformClassConstructorCall, + transformExportExtensions ] }; diff --git a/packages/babel-preset-stage-2/src/index.js b/packages/babel-preset-stage-2/src/index.js index 6bca6809b0..9806a625cb 100644 --- a/packages/babel-preset-stage-2/src/index.js +++ b/packages/babel-preset-stage-2/src/index.js @@ -1,10 +1,16 @@ -module.exports = { +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: [ - require("babel-preset-stage-3") + presetStage3 ], plugins: [ - require("babel-plugin-transform-class-properties"), - require("babel-plugin-transform-object-rest-spread"), - require("babel-plugin-transform-decorators") + transformClassProperties, + transformObjectRestSpread, + transformDecorators ] }; diff --git a/packages/babel-preset-stage-3/src/index.js b/packages/babel-preset-stage-3/src/index.js index 7e41978255..3eaa913ebd 100644 --- a/packages/babel-preset-stage-3/src/index.js +++ b/packages/babel-preset-stage-3/src/index.js @@ -1,7 +1,11 @@ -module.exports = { +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: [ - require("babel-plugin-syntax-trailing-function-commas"), - require("babel-plugin-transform-async-to-generator"), - require("babel-plugin-transform-exponentiation-operator") + syntaxTrailingFunctionCommas, + transformAsyncToGenerator, + transformExponentiationOperator ] };