From e16a1657ab481c5913684eb05e8adca7d7852210 Mon Sep 17 00:00:00 2001 From: Justin Johansson Date: Fri, 2 Sep 2016 16:46:49 +0930 Subject: [PATCH 1/3] Align all babel-preset-xxx packages dir structures with status quo --- packages/babel-preset-es2016/package.json | 2 +- packages/babel-preset-es2016/{ => src}/index.js | 0 packages/babel-preset-es2017/package.json | 2 +- packages/babel-preset-es2017/{ => src}/index.js | 0 packages/babel-preset-react/package.json | 2 +- packages/babel-preset-react/{ => src}/index.js | 0 packages/babel-preset-stage-0/package.json | 2 +- packages/babel-preset-stage-0/{ => src}/index.js | 0 packages/babel-preset-stage-1/package.json | 2 +- packages/babel-preset-stage-1/{ => src}/index.js | 0 packages/babel-preset-stage-2/package.json | 2 +- packages/babel-preset-stage-2/{ => src}/index.js | 0 packages/babel-preset-stage-3/package.json | 2 +- packages/babel-preset-stage-3/{ => src}/index.js | 0 14 files changed, 7 insertions(+), 7 deletions(-) rename packages/babel-preset-es2016/{ => src}/index.js (100%) rename packages/babel-preset-es2017/{ => src}/index.js (100%) rename packages/babel-preset-react/{ => src}/index.js (100%) rename packages/babel-preset-stage-0/{ => src}/index.js (100%) rename packages/babel-preset-stage-1/{ => src}/index.js (100%) rename packages/babel-preset-stage-2/{ => src}/index.js (100%) rename packages/babel-preset-stage-3/{ => src}/index.js (100%) diff --git a/packages/babel-preset-es2016/package.json b/packages/babel-preset-es2016/package.json index 6ff9c9120f..b9c94f87f6 100644 --- a/packages/babel-preset-es2016/package.json +++ b/packages/babel-preset-es2016/package.json @@ -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" } diff --git a/packages/babel-preset-es2016/index.js b/packages/babel-preset-es2016/src/index.js similarity index 100% rename from packages/babel-preset-es2016/index.js rename to packages/babel-preset-es2016/src/index.js diff --git a/packages/babel-preset-es2017/package.json b/packages/babel-preset-es2017/package.json index ace2b58312..f66c70526f 100644 --- a/packages/babel-preset-es2017/package.json +++ b/packages/babel-preset-es2017/package.json @@ -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" diff --git a/packages/babel-preset-es2017/index.js b/packages/babel-preset-es2017/src/index.js similarity index 100% rename from packages/babel-preset-es2017/index.js rename to packages/babel-preset-es2017/src/index.js diff --git a/packages/babel-preset-react/package.json b/packages/babel-preset-react/package.json index 408f75ea27..97e1ccb457 100644 --- a/packages/babel-preset-react/package.json +++ b/packages/babel-preset-react/package.json @@ -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", diff --git a/packages/babel-preset-react/index.js b/packages/babel-preset-react/src/index.js similarity index 100% rename from packages/babel-preset-react/index.js rename to packages/babel-preset-react/src/index.js diff --git a/packages/babel-preset-stage-0/package.json b/packages/babel-preset-stage-0/package.json index 575f3d959f..3b86680069 100644 --- a/packages/babel-preset-stage-0/package.json +++ b/packages/babel-preset-stage-0/package.json @@ -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", diff --git a/packages/babel-preset-stage-0/index.js b/packages/babel-preset-stage-0/src/index.js similarity index 100% rename from packages/babel-preset-stage-0/index.js rename to packages/babel-preset-stage-0/src/index.js diff --git a/packages/babel-preset-stage-1/package.json b/packages/babel-preset-stage-1/package.json index 7d02e52a94..df2ed803ad 100644 --- a/packages/babel-preset-stage-1/package.json +++ b/packages/babel-preset-stage-1/package.json @@ -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", diff --git a/packages/babel-preset-stage-1/index.js b/packages/babel-preset-stage-1/src/index.js similarity index 100% rename from packages/babel-preset-stage-1/index.js rename to packages/babel-preset-stage-1/src/index.js diff --git a/packages/babel-preset-stage-2/package.json b/packages/babel-preset-stage-2/package.json index d0d1c1ff6a..22e8e0dc36 100644 --- a/packages/babel-preset-stage-2/package.json +++ b/packages/babel-preset-stage-2/package.json @@ -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", diff --git a/packages/babel-preset-stage-2/index.js b/packages/babel-preset-stage-2/src/index.js similarity index 100% rename from packages/babel-preset-stage-2/index.js rename to packages/babel-preset-stage-2/src/index.js diff --git a/packages/babel-preset-stage-3/package.json b/packages/babel-preset-stage-3/package.json index 94d256c1fd..b75506a1a0 100644 --- a/packages/babel-preset-stage-3/package.json +++ b/packages/babel-preset-stage-3/package.json @@ -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", diff --git a/packages/babel-preset-stage-3/index.js b/packages/babel-preset-stage-3/src/index.js similarity index 100% rename from packages/babel-preset-stage-3/index.js rename to packages/babel-preset-stage-3/src/index.js From ef794198e9145d78329fe3e6ca1cd7e408b954fa Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Sun, 25 Sep 2016 11:22:42 -0700 Subject: [PATCH 2/3] Allow presets to be ES6 exports. --- .../src/transformation/file/options/option-manager.js | 3 +++ 1 file changed, 3 insertions(+) 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 ad4fbf4ed9..808f8947f4 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -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. From bae59470da406811773aaae5e1c8ce578be50597 Mon Sep 17 00:00:00 2001 From: Justin Johansson Date: Fri, 2 Sep 2016 20:36:27 +0930 Subject: [PATCH 3/3] Upgraded all babel-preset-xxxs but babel-preset-es2015 to export syntax --- packages/babel-preset-es2015/src/index.js | 126 +++++++++++++-------- packages/babel-preset-es2016/src/index.js | 6 +- packages/babel-preset-es2017/src/index.js | 9 +- packages/babel-preset-latest/src/index.js | 19 ++-- packages/babel-preset-react/src/index.js | 26 +++-- packages/babel-preset-stage-0/src/index.js | 13 ++- packages/babel-preset-stage-1/src/index.js | 13 ++- packages/babel-preset-stage-2/src/index.js | 16 ++- packages/babel-preset-stage-3/src/index.js | 12 +- 9 files changed, 155 insertions(+), 85 deletions(-) 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 ] };