diff --git a/src/babel/transformation/file/index.js b/src/babel/transformation/file/index.js index c31196bf09..e3757ac860 100644 --- a/src/babel/transformation/file/index.js +++ b/src/babel/transformation/file/index.js @@ -29,6 +29,8 @@ import * as t from "../../types"; export default class File { constructor(opts = {}, pipeline) { + this.transformerDependencies = {}; + this.dynamicImportTypes = {}; this.dynamicImportIds = {}; this.dynamicImports = []; @@ -221,13 +223,21 @@ export default class File { } stack = beforePlugins.concat(stack, afterPlugins); - // register - this.transformerStack = this.mergeStack(stack.concat(secondaryStack)); + // build transformer stack + stack = stack.concat(secondaryStack); + // build dependency graph + for (var pass of (stack: Array)) { + for (var dep of (pass.transformer.dependencies: Array)) { + this.transformerDependencies[dep] = pass.key; + } + } + // collapse stack categories + this.transformerStack = this.collapseStack(stack); } - mergeStack(_stack) { + collapseStack(_stack) { var stack = []; var ignore = []; diff --git a/src/babel/transformation/transformer-pass.js b/src/babel/transformation/transformer-pass.js index 715ba6de2e..62e91cd7ca 100644 --- a/src/babel/transformation/transformer-pass.js +++ b/src/babel/transformation/transformer-pass.js @@ -10,23 +10,24 @@ export default class TransformerPass { constructor(file: File, transformer: Transformer) { this.transformer = transformer; this.handlers = transformer.handlers; - this.skipKey = transformer.skipKey; this.file = file; this.ran = false; + this.key = transformer.key; } canTransform(): boolean { - return this.file.pipeline.canTransform(this.transformer, this.file.opts); + return this.file.transformerDependencies[this.key] || + this.file.pipeline.canTransform(this.transformer, this.file.opts); } transform() { var file = this.file; - file.log.debug(`Start transformer ${this.transformer.key}`); + file.log.debug(`Start transformer ${this.key}`); traverse(file.ast, this.handlers, file.scope, file); - file.log.debug(`Finish transformer ${this.transformer.key}`); + file.log.debug(`Finish transformer ${this.key}`); this.ran = true; } diff --git a/src/babel/transformation/transformer.js b/src/babel/transformation/transformer.js index a5fac03bf9..3f700974d9 100644 --- a/src/babel/transformation/transformer.js +++ b/src/babel/transformation/transformer.js @@ -26,6 +26,7 @@ export default class Transformer { this.manipulateOptions = take("manipulateOptions"); this.metadata = take("metadata") || {}; + this.dependencies = this.metadata.dependencies || []; this.parser = take("parser"); this.post = take("post"); this.pre = take("pre"); diff --git a/src/babel/transformation/transformers/es7/class-properties.js b/src/babel/transformation/transformers/es7/class-properties.js index 871398b386..ca95104fab 100644 --- a/src/babel/transformation/transformers/es7/class-properties.js +++ b/src/babel/transformation/transformers/es7/class-properties.js @@ -1,3 +1,4 @@ export var metadata = { - stage: 0 + stage: 0, + dependencies: ["es6.classes"] }; diff --git a/src/babel/transformation/transformers/es7/decorators.js b/src/babel/transformation/transformers/es7/decorators.js index af98294cf8..aaa54b0ee2 100644 --- a/src/babel/transformation/transformers/es7/decorators.js +++ b/src/babel/transformation/transformers/es7/decorators.js @@ -3,6 +3,7 @@ import * as defineMap from "../../helpers/define-map"; import * as t from "../../../types"; export var metadata = { + dependencies: ["es6.classes"], optional: true, stage: 1 }; diff --git a/src/babel/transformation/transformers/es7/object-rest-spread.js b/src/babel/transformation/transformers/es7/object-rest-spread.js index e6fe46b993..7b9f448f9c 100644 --- a/src/babel/transformation/transformers/es7/object-rest-spread.js +++ b/src/babel/transformation/transformers/es7/object-rest-spread.js @@ -3,13 +3,10 @@ import * as t from "../../../types"; export var metadata = { - stage: 1 + stage: 1, + dependencies: ["es6.destructuring"] }; -export function manipulateOptions(opts) { - if (opts.whitelist) opts.whitelist.push("es6.destructuring"); -} - var hasSpread = function (node) { for (var i = 0; i < node.properties.length; i++) { if (t.isSpreadProperty(node.properties[i])) { diff --git a/src/babel/transformation/transformers/other/async-to-generator.js b/src/babel/transformation/transformers/other/async-to-generator.js index 7789fd2506..b5a54b478d 100644 --- a/src/babel/transformation/transformers/other/async-to-generator.js +++ b/src/babel/transformation/transformers/other/async-to-generator.js @@ -3,7 +3,8 @@ import remapAsyncToGenerator from "../../helpers/remap-async-to-generator"; export { manipulateOptions } from "./bluebird-coroutines"; export var metadata = { - optional: true + optional: true, + dependencies: ["es7.asyncFunctions", "es6.classes"] }; exports.Function = function (node, parent, scope, file) { diff --git a/src/babel/transformation/transformers/other/bluebird-coroutines.js b/src/babel/transformation/transformers/other/bluebird-coroutines.js index cb4f99e09a..2d1c467edd 100644 --- a/src/babel/transformation/transformers/other/bluebird-coroutines.js +++ b/src/babel/transformation/transformers/other/bluebird-coroutines.js @@ -2,12 +2,12 @@ import remapAsyncToGenerator from "../../helpers/remap-async-to-generator"; import * as t from "../../../types"; export function manipulateOptions(opts) { - opts.optional.push("es7.asyncFunctions"); opts.blacklist.push("regenerator"); } export var metadata = { - optional: true + optional: true, + dependencies: ["es7.asyncFunctions", "es6.classes"] }; exports.Function = function (node, parent, scope, file) {