diff --git a/src/babel/transformation/file/option-parsers.js b/src/babel/transformation/file/option-parsers.js index d1ee8feba9..c693c0c306 100644 --- a/src/babel/transformation/file/option-parsers.js +++ b/src/babel/transformation/file/option-parsers.js @@ -11,6 +11,10 @@ export function transformerList(key, val) { return transform._ensureTransformerNames(key, val); } +export function number(key, val) { + return +val; +} + export function boolean(key, val) { return !!val; } diff --git a/src/babel/transformation/file/options.json b/src/babel/transformation/file/options.json index 8d344b6476..d426fe3211 100644 --- a/src/babel/transformation/file/options.json +++ b/src/babel/transformation/file/options.json @@ -42,11 +42,11 @@ "hidden": true }, - "experimental": { - "description": "Enable all ES7+ transformers", + "stage": { + "description": "", "shorthand": "e", - "type": "boolean", - "default": false + "type": "number", + "default": 2 }, "blacklist": { diff --git a/src/babel/transformation/transformer-pass.js b/src/babel/transformation/transformer-pass.js index ccc30b03d8..8c0baabbeb 100644 --- a/src/babel/transformation/transformer-pass.js +++ b/src/babel/transformation/transformer-pass.js @@ -32,8 +32,9 @@ export default class TransformerPass { var whitelist = opts.whitelist; if (whitelist) return includes(whitelist, key); - // experimental - if (transformer.metadata.experimental && opts.experimental) return true; + // stage + var stage = transformer.metadata.stage; + if (stage != null && stage >= opts.stage) return true; // optional if (transformer.metadata.optional && !includes(opts.optional, key)) return false; diff --git a/src/babel/transformation/transformer.js b/src/babel/transformation/transformer.js index e5df3296bb..88ecae6029 100644 --- a/src/babel/transformation/transformer.js +++ b/src/babel/transformation/transformer.js @@ -30,6 +30,10 @@ export default class Transformer { this.post = take("post"); this.pre = take("pre"); + if (this.metadata.stage != null) { + this.metadata.optional = true; + } + this.handlers = this.normalize(transformer); this.opts ||= {}; this.key = transformerKey; diff --git a/src/babel/transformation/transformers/es7/async-functions.js b/src/babel/transformation/transformers/es7/async-functions.js index 6ef6177fb6..486130cebe 100644 --- a/src/babel/transformation/transformers/es7/async-functions.js +++ b/src/babel/transformation/transformers/es7/async-functions.js @@ -1,6 +1,5 @@ export var metadata = { - experimental: true, - optional: true + stage: 1 }; export function check() { diff --git a/src/babel/transformation/transformers/es7/class-properties.js b/src/babel/transformation/transformers/es7/class-properties.js index 6ef6177fb6..8c8d7bb805 100644 --- a/src/babel/transformation/transformers/es7/class-properties.js +++ b/src/babel/transformation/transformers/es7/class-properties.js @@ -1,6 +1,5 @@ export var metadata = { - experimental: true, - optional: true + stage: 0 }; export function check() { diff --git a/src/babel/transformation/transformers/es7/comprehensions.js b/src/babel/transformation/transformers/es7/comprehensions.js index cddcc16516..53ff7ce919 100644 --- a/src/babel/transformation/transformers/es7/comprehensions.js +++ b/src/babel/transformation/transformers/es7/comprehensions.js @@ -4,8 +4,7 @@ import * as util from "../../../util"; import * as t from "../../../types"; export var metadata = { - experimental: true, - optional: true + stage: 0 }; export function ComprehensionExpression(node, parent, scope, file) { diff --git a/src/babel/transformation/transformers/es7/decorators.js b/src/babel/transformation/transformers/es7/decorators.js index 1761c24b0a..4353ce600c 100644 --- a/src/babel/transformation/transformers/es7/decorators.js +++ b/src/babel/transformation/transformers/es7/decorators.js @@ -1,4 +1,5 @@ export var metadata = { experimental: true, - optional: true + optional: true, + stage: 1 }; diff --git a/src/babel/transformation/transformers/es7/do-expressions.js b/src/babel/transformation/transformers/es7/do-expressions.js index f413402446..e587061e3d 100644 --- a/src/babel/transformation/transformers/es7/do-expressions.js +++ b/src/babel/transformation/transformers/es7/do-expressions.js @@ -2,7 +2,8 @@ import * as t from "../../../types"; export var metadata = { experimental: true, - optional: true + optional: true, + stage: 0 }; export var check = t.isDoExpression; diff --git a/src/babel/transformation/transformers/es7/exponentiation-operator.js b/src/babel/transformation/transformers/es7/exponentiation-operator.js index a2cf7bd27b..a88252741b 100644 --- a/src/babel/transformation/transformers/es7/exponentiation-operator.js +++ b/src/babel/transformation/transformers/es7/exponentiation-operator.js @@ -3,6 +3,10 @@ import build from "../../helpers/build-binary-assignment-operator-transformer"; import * as t from "../../../types"; +export var metadata = { + stage: 2 +}; + var MATH_POW = t.memberExpression(t.identifier("Math"), t.identifier("pow")); build(exports, { diff --git a/src/babel/transformation/transformers/es7/export-extensions.js b/src/babel/transformation/transformers/es7/export-extensions.js index 0203c30aa5..9cb3aaba68 100644 --- a/src/babel/transformation/transformers/es7/export-extensions.js +++ b/src/babel/transformation/transformers/es7/export-extensions.js @@ -2,6 +2,10 @@ import * as t from "../../../types"; +export var metadata = { + stage: 0 +}; + export function check(node) { return t.isExportDefaultSpecifier(node) || t.isExportNamespaceSpecifier(node); } diff --git a/src/babel/transformation/transformers/es7/object-rest-spread.js b/src/babel/transformation/transformers/es7/object-rest-spread.js index a193d7aab8..e6fe46b993 100644 --- a/src/babel/transformation/transformers/es7/object-rest-spread.js +++ b/src/babel/transformation/transformers/es7/object-rest-spread.js @@ -3,8 +3,7 @@ import * as t from "../../../types"; export var metadata = { - experimental: true, - optional: true + stage: 1 }; export function manipulateOptions(opts) { diff --git a/test/core/fixtures/transformation/es6-block-scoping/exec-collision-array-comprehension/options.json b/test/core/fixtures/transformation/es6-block-scoping/exec-collision-array-comprehension/options.json index 252f473a73..b0b9a96ef0 100644 --- a/test/core/fixtures/transformation/es6-block-scoping/exec-collision-array-comprehension/options.json +++ b/test/core/fixtures/transformation/es6-block-scoping/exec-collision-array-comprehension/options.json @@ -1,3 +1,3 @@ { - "experimental": true + "stage": 0 } diff --git a/test/core/fixtures/transformation/es6-destructuring/es7-object-rest/options.json b/test/core/fixtures/transformation/es6-destructuring/es7-object-rest/options.json index 252f473a73..b0b9a96ef0 100644 --- a/test/core/fixtures/transformation/es6-destructuring/es7-object-rest/options.json +++ b/test/core/fixtures/transformation/es6-destructuring/es7-object-rest/options.json @@ -1,3 +1,3 @@ { - "experimental": true + "stage": 0 } diff --git a/test/core/fixtures/transformation/es7-comprehensions/options.json b/test/core/fixtures/transformation/es7-comprehensions/options.json index eaf1e3ba7b..408f26ae20 100644 --- a/test/core/fixtures/transformation/es7-comprehensions/options.json +++ b/test/core/fixtures/transformation/es7-comprehensions/options.json @@ -1,4 +1,4 @@ { - "experimental": true, + "stage": 0, "blacklist": ["es6.tailCall"] } diff --git a/test/core/fixtures/transformation/es7-object-spread/options.json b/test/core/fixtures/transformation/es7-object-spread/options.json index 252f473a73..b0b9a96ef0 100644 --- a/test/core/fixtures/transformation/es7-object-spread/options.json +++ b/test/core/fixtures/transformation/es7-object-spread/options.json @@ -1,3 +1,3 @@ { - "experimental": true + "stage": 0 } diff --git a/test/core/fixtures/transformation/runtime/options.json b/test/core/fixtures/transformation/runtime/options.json index d660db05c2..22710d637f 100644 --- a/test/core/fixtures/transformation/runtime/options.json +++ b/test/core/fixtures/transformation/runtime/options.json @@ -1,4 +1,4 @@ { "optional": ["runtime"], - "experimental": true + "stage": 0 } diff --git a/test/core/generation.js b/test/core/generation.js index 9084e0b4b4..66990a7895 100644 --- a/test/core/generation.js +++ b/test/core/generation.js @@ -29,7 +29,6 @@ _.each(helper.get("generation"), function (testSuite) { var actualAst = parse({ filename: actual.loc, nonStandard: true, - experimental: true, strictMode: false, sourceType: "module", features: { diff --git a/test/core/regenerator.js b/test/core/regenerator.js index 191de469bc..9d35c16d38 100644 --- a/test/core/regenerator.js +++ b/test/core/regenerator.js @@ -12,7 +12,7 @@ suite("regenerator", function () { setup(function () { require("../../register")({ blacklist: ["strict"], - experimental: true + stage: 0 }); }); diff --git a/test/core/traceur.js b/test/core/traceur.js index 0fdc29d50d..d542a7c49e 100644 --- a/test/core/traceur.js +++ b/test/core/traceur.js @@ -94,7 +94,7 @@ require("./_transformation-helper")({ ] }, { optional: ["es6.symbols"], - experimental: true + stage: 0 }, function (opts, task) { if (!_.contains(task.exec.loc, "module.js")) { opts.blacklist = ["strict"];