diff --git a/src/babel/transformation/file/index.js b/src/babel/transformation/file/index.js index 709d68beeb..76ccd08cd6 100644 --- a/src/babel/transformation/file/index.js +++ b/src/babel/transformation/file/index.js @@ -219,7 +219,12 @@ export default class File { // init plugins! var beforePlugins = []; var afterPlugins = []; - var pluginManager = new PluginManager(this, this.transformers, beforePlugins, afterPlugins); + var pluginManager = new PluginManager({ + file: this, + transformers: this.transformers, + before: beforePlugins, + after: afterPlugins + }); for (var i = 0; i < file.opts.plugins.length; i++) { pluginManager.add(file.opts.plugins[i]); } diff --git a/src/babel/transformation/file/plugin-manager.js b/src/babel/transformation/file/plugin-manager.js index 4d5b9aa242..61c580748e 100644 --- a/src/babel/transformation/file/plugin-manager.js +++ b/src/babel/transformation/file/plugin-manager.js @@ -18,18 +18,18 @@ export default class PluginManager { return transformer; } - constructor(file, transformers, before, after) { + constructor({ file, transformers, before, after } = { transformers: {}, before: [], after: [] }) { this.transformers = transformers; this.file = file; this.before = before; this.after = after; } - subnormaliseString(name) { + subnormaliseString(key, _position) { // this is a plugin in the form of "foobar" or "foobar:after" // where the optional colon is the delimiter for plugin position in the transformer stack - var [name, position] = name.split(":"); + var [name, position = _position] = key.split(":"); var loc = util.resolveRelative(name) || util.resolveRelative(`babel-plugin-${name}`); if (loc) { @@ -42,7 +42,7 @@ export default class PluginManager { } } - validate(plugin) { + validate(name, plugin) { // validate transformer key var key = plugin.key; if (this.transformers[key]) { @@ -69,7 +69,7 @@ export default class PluginManager { } if (typeof name === "string") { - ({ plugin, position } = this.subnormaliseString(name)); + ({ plugin, position } = this.subnormaliseString(name, position)); } } else { throw new TypeError(messages.get("pluginIllegalKind", typeof name, name)); @@ -89,7 +89,7 @@ export default class PluginManager { } // - this.validate(plugin); + this.validate(name, plugin); // build! var pass = this.transformers[plugin.key] = plugin.buildPass(this.file); diff --git a/test/core/api.js b/test/core/api.js index 9662ca8cd0..310b5a3029 100644 --- a/test/core/api.js +++ b/test/core/api.js @@ -1,6 +1,8 @@ require("../../lib/babel/api/node"); var buildExternalHelpers = require("../../lib/babel/tools/build-external-helpers"); +var PluginManager = require("../../lib/babel/transformation/file/plugin-manager"); +var Transformer = require("../../lib/babel/transformation/transformer"); var transform = require("../../lib/babel/transformation"); var assert = require("assert"); var File = require("../../lib/babel/transformation/file"); @@ -51,4 +53,40 @@ suite("api", function () { assert.ok(script.indexOf("inherits") === -1); }); }); + + suite("plugins", function () { + test("unknown plugin", function () { + assert.throws(function () { + new PluginManager().subnormaliseString("foo bar"); + }, /Unknown plugin/); + }); + + test("key collision", function () { + assert.throws(function () { + new PluginManager({ + transformers: { "es6.arrowFunctions": true } + }).validate("foobar", { key: "es6.arrowFunctions" }); + }, /collides with another/); + }); + + test("not transformer", function () { + assert.throws(function () { + new PluginManager().validate("foobar", {}); + }, /didn't export a Transformer instance/); + + assert.throws(function () { + new PluginManager().validate("foobar", ""); + }, /didn't export a Transformer instance/); + + assert.throws(function () { + new PluginManager().validate("foobar", []); + }, /didn't export a Transformer instance/); + }); + + test("object request"); + + test("string request"); + + test("transformer request"); + }); });