diff --git a/experimental/babel-preset-env/README.md b/experimental/babel-preset-env/README.md index 6cbf145efb..af477fa29f 100644 --- a/experimental/babel-preset-env/README.md +++ b/experimental/babel-preset-env/README.md @@ -384,6 +384,25 @@ The starting point where the config search for browserslist will start, and asce Toggles whether or not [browserslist config sources](https://github.com/ai/browserslist#queries) are used, which includes searching for any browserslist files or referencing the browserslist key inside package.json. This is useful for projects that use a browserslist config for files that won't be compiled with Babel. +### `shippedProposals` + +`boolean`, defaults to `false` + +Toggles enabling support for builtin/feature proposals that have shipped in browsers. If your target environments have native support for a feature proposal, its matching parser syntax plugin is enabled instead of performing any transform. Note that this _does not_ enable the same transformations as [`babel-preset-stage3`](https://babeljs.io/docs/plugins/preset-stage-3/), since proposals can continue to change before landing in browsers. + +The following are currently supported: + +**Builtins** + +- [Promise.prototype.finally](https://github.com/tc39/proposal-promise-finally) + +**Features** + +- [Asynchronous Iterators](https://github.com/tc39/proposal-async-iteration) +- [Object rest/spread properties](https://github.com/tc39/proposal-object-rest-spread) +- [Optional catch binding](https://github.com/tc39/proposal-optional-catch-binding) +- [Unicode property escapes in regular expressions](https://github.com/tc39/proposal-regexp-unicode-property-escapes) + --- ## Examples diff --git a/experimental/babel-preset-env/data/built-in-features.js b/experimental/babel-preset-env/data/built-in-features.js index a3d46edec1..446dc1d557 100644 --- a/experimental/babel-preset-env/data/built-in-features.js +++ b/experimental/babel-preset-env/data/built-in-features.js @@ -187,6 +187,6 @@ const es2017 = { "es7.string.pad-end": "String padding / String.prototype.padEnd", }; -const stage3 = require("./stage3").builtIns; +const proposals = require("./shipped-proposals").builtIns; -module.exports = Object.assign({}, es2015, es2016, es2017, stage3); +module.exports = Object.assign({}, es2015, es2016, es2017, proposals); diff --git a/experimental/babel-preset-env/data/plugin-features.js b/experimental/babel-preset-env/data/plugin-features.js index 9ccb8e7446..d55a080713 100644 --- a/experimental/babel-preset-env/data/plugin-features.js +++ b/experimental/babel-preset-env/data/plugin-features.js @@ -135,6 +135,6 @@ const es2017 = { } }; -const stage3 = require("./stage3").plugins; +const proposals = require("./shipped-proposals").features; -module.exports = Object.assign({}, es2015, es2016, es2017, stage3); +module.exports = Object.assign({}, es2015, es2016, es2017, proposals); diff --git a/experimental/babel-preset-env/data/stage3.js b/experimental/babel-preset-env/data/shipped-proposals.js similarity index 74% rename from experimental/babel-preset-env/data/stage3.js rename to experimental/babel-preset-env/data/shipped-proposals.js index 10b9ee9657..051770940c 100644 --- a/experimental/babel-preset-env/data/stage3.js +++ b/experimental/babel-preset-env/data/shipped-proposals.js @@ -1,8 +1,11 @@ +// These mappings represent the builtin/feature proposals that have been +// shipped by browsers, and are enabled by the `shippedProposals` option. + const builtIns = { "es7.promise.finally": "Promise.prototype.finally" }; -const plugins = { +const features = { "transform-async-generator-functions": "Asynchronous Iterators", "transform-object-rest-spread": "object rest/spread properties", "transform-optional-catch-binding": "optional catch binding", @@ -16,4 +19,4 @@ const pluginSyntaxMap = new Map([ ["transform-unicode-property-regex", null], ]); -module.exports = { builtIns, plugins, pluginSyntaxMap }; +module.exports = { builtIns, features, pluginSyntaxMap }; diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index bb05fcd1b6..1ca18587e8 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -8,10 +8,10 @@ import moduleTransformations from "./module-transformations"; import normalizeOptions from "./normalize-options.js"; import pluginList from "../data/plugins.json"; import { - builtIns as stage3BuiltIns, - plugins as stage3Plugins, + builtIns as proposalBuiltIns, + features as proposalPlugins, pluginSyntaxMap, -} from "../data/stage3.js"; +} from "../data/shipped-proposals.js"; import useBuiltInsEntryPlugin from "./use-built-ins-entry-plugin"; import addUsedBuiltInsPlugin from "./use-built-ins-plugin"; import getTargets from "./targets-parser"; @@ -31,11 +31,15 @@ const getPlugin = (pluginName: string) => { return plugin; }; -const builtInsListWithoutStage3 = filterStageFromList( +const builtInsListWithoutProposals = filterStageFromList( builtInsList, - stage3BuiltIns, + proposalBuiltIns, +); + +const pluginListWithoutProposals = filterStageFromList( + pluginList, + proposalPlugins, ); -const pluginListWithoutStage3 = filterStageFromList(pluginList, stage3Plugins); export const isPluginRequired = ( supportedEnvironments: Targets, @@ -123,10 +127,10 @@ const filterItems = ( if (isPluginRequired(targets, list[item])) { result.add(item); } else { - const stage3Syntax = pluginSyntaxMap.get(item); + const shippedProposalsSyntax = pluginSyntaxMap.get(item); - if (stage3Syntax) { - result.add(stage3Syntax); + if (shippedProposalsSyntax) { + result.add(shippedProposalsSyntax); } } } @@ -154,8 +158,8 @@ export default function buildPreset( include: optionsInclude, loose, modules, + shippedProposals, spec, - stage3, targets: optionsTargets, useBuiltIns, } = normalizeOptions(opts); @@ -182,7 +186,7 @@ export default function buildPreset( const transformTargets = forceAllTransforms || hasUglifyTarget ? {} : targets; const transformations = filterItems( - stage3 ? pluginList : pluginListWithoutStage3, + shippedProposals ? pluginList : pluginListWithoutProposals, include.plugins, exclude.plugins, transformTargets, @@ -195,7 +199,7 @@ export default function buildPreset( polyfillTargets = getBuiltInTargets(targets); polyfills = filterItems( - stage3 ? builtInsList : builtInsListWithoutStage3, + shippedProposals ? builtInsList : builtInsListWithoutProposals, include.builtIns, exclude.builtIns, polyfillTargets, diff --git a/experimental/babel-preset-env/src/normalize-options.js b/experimental/babel-preset-env/src/normalize-options.js index db2126c4de..9c0b2ed139 100644 --- a/experimental/babel-preset-env/src/normalize-options.js +++ b/experimental/babel-preset-env/src/normalize-options.js @@ -163,8 +163,12 @@ export default function normalizeOptions(opts: Options) { include: validateIncludesAndExcludes(opts.include, "include"), loose: validateBoolOption("loose", opts.loose, false), modules: validateModulesOption(opts.modules), + shippedProposals: validateBoolOption( + "shippedProposals", + opts.shippedProposals, + false, + ), spec: validateBoolOption("loose", opts.spec, false), - stage3: validateBoolOption("stage3", opts.stage3, false), targets: opts.targets, useBuiltIns: validateUseBuiltInsOption(opts.useBuiltIns), }; diff --git a/experimental/babel-preset-env/src/types.js b/experimental/babel-preset-env/src/types.js index f944dfb91a..2c3ab4c8ce 100644 --- a/experimental/babel-preset-env/src/types.js +++ b/experimental/babel-preset-env/src/types.js @@ -20,8 +20,8 @@ export type Options = { include: Array, loose: boolean, modules: ModuleOption, + shippedProposals: boolean, spec: boolean, - stage3: boolean, targets: Targets, useBuiltIns: BuiltInsOption, }; diff --git a/experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/in/in.js b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/in/in.js similarity index 100% rename from experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/in/in.js rename to experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/in/in.js diff --git a/experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/options.json b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/options.json similarity index 83% rename from experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/options.json rename to experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/options.json index c22b41c7f6..a7fc993ff3 100644 --- a/experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/options.json +++ b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/options.json @@ -5,7 +5,7 @@ "targets": { "browsers": "chrome 60" }, - "stage3": true, + "shippedProposals": true, "useBuiltIns": "entry" }] ] diff --git a/experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/stdout.txt b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/stdout.txt similarity index 100% rename from experimental/babel-preset-env/test/debug-fixtures/stage3-chrome60/stdout.txt rename to experimental/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/stdout.txt diff --git a/experimental/babel-preset-env/test/debug-fixtures/stage3/in/in.js b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals/in/in.js similarity index 100% rename from experimental/babel-preset-env/test/debug-fixtures/stage3/in/in.js rename to experimental/babel-preset-env/test/debug-fixtures/shippedProposals/in/in.js diff --git a/experimental/babel-preset-env/test/debug-fixtures/stage3/options.json b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals/options.json similarity index 75% rename from experimental/babel-preset-env/test/debug-fixtures/stage3/options.json rename to experimental/babel-preset-env/test/debug-fixtures/shippedProposals/options.json index e067aa814a..40884decf8 100644 --- a/experimental/babel-preset-env/test/debug-fixtures/stage3/options.json +++ b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals/options.json @@ -2,7 +2,7 @@ "presets": [ ["../../lib", { "debug": true, - "stage3": true, + "shippedProposals": true, "useBuiltIns": "entry" }] ] diff --git a/experimental/babel-preset-env/test/debug-fixtures/stage3/stdout.txt b/experimental/babel-preset-env/test/debug-fixtures/shippedProposals/stdout.txt similarity index 100% rename from experimental/babel-preset-env/test/debug-fixtures/stage3/stdout.txt rename to experimental/babel-preset-env/test/debug-fixtures/shippedProposals/stdout.txt diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/actual.js similarity index 100% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/actual.js rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/actual.js diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/expected.js similarity index 100% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/expected.js rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/expected.js diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/options.json similarity index 72% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/options.json rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/options.json index 8939d0ca92..8a799417be 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-entry/options.json +++ b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-entry/options.json @@ -1,7 +1,7 @@ { "presets": [ ["../../../../lib", { - "stage3": true, + "shippedProposals": true, "useBuiltIns": "entry" }] ] diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/actual.js similarity index 100% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/actual.js rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/actual.js diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/expected.js similarity index 100% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/expected.js rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/expected.js diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/options.json similarity index 72% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/options.json rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/options.json index 92aae6a1be..d1b9e87480 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/stage3-use-builtins-usage/options.json +++ b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals-use-builtins-usage/options.json @@ -1,7 +1,7 @@ { "presets": [ ["../../../../lib", { - "stage3": true, + "shippedProposals": true, "useBuiltIns": "usage" }] ] diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/actual.js similarity index 100% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3/actual.js rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/actual.js diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/expected.js similarity index 100% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3/expected.js rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/expected.js diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/stage3/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/options.json similarity index 64% rename from experimental/babel-preset-env/test/fixtures/preset-options/stage3/options.json rename to experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/options.json index e104293f62..897e16fb7c 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/stage3/options.json +++ b/experimental/babel-preset-env/test/fixtures/preset-options/shippedProposals/options.json @@ -1,7 +1,7 @@ { "presets": [ ["../../../../lib", { - "stage3": true + "shippedProposals": true }] ] }