diff --git a/src/babel/transformation/file/options.json b/src/babel/transformation/file/options.json index e8e3498761..2b13bb102b 100644 --- a/src/babel/transformation/file/options.json +++ b/src/babel/transformation/file/options.json @@ -25,6 +25,10 @@ "type": "string" }, + "getModuleName": { + "hidden": true + }, + "retainLines": { "hidden": true, "type": "boolean", diff --git a/src/babel/transformation/modules/_default.js b/src/babel/transformation/modules/_default.js index 9c511b07ff..d519d086f3 100644 --- a/src/babel/transformation/modules/_default.js +++ b/src/babel/transformation/modules/_default.js @@ -184,7 +184,10 @@ export default class DefaultFormatter { getModuleName() { var opts = this.file.opts; - if (opts.moduleId) return opts.moduleId; + // moduleId is n/a if a `getModuleName()` is provided + if (opts.moduleId && !opts.getModuleName) { + return opts.moduleId; + } var filenameRelative = opts.filenameRelative; var moduleName = ""; @@ -213,7 +216,13 @@ export default class DefaultFormatter { // normalize path separators moduleName = moduleName.replace(/\\/g, "/"); - return moduleName; + if (opts.getModuleName) { + // If return is falsy, assume they want us to use + // our generated default name + return opts.getModuleName(moduleName) || moduleName; + } else { + return moduleName; + } } _pushStatement(ref, nodes) { diff --git a/test/core/api.js b/test/core/api.js index 7e83b24d06..c7dfa2a6d7 100644 --- a/test/core/api.js +++ b/test/core/api.js @@ -18,6 +18,77 @@ suite("api", function () { assert.ok(!result.ast); }); + suite("getModuleName() {} option", function () { + // As of this commit, `getModuleName` is the only option that isn't JSON + // compatible which is why it's not inside /test/core/fixtures/transformation + + function getModuleNameTest(moduleFormat, expected) { + var result = transform("foo('bar');", { + filename: "foo/bar/index", + modules: moduleFormat, + moduleIds: true, + getModuleName: function (name) { + return name.replace(/\/index$/, ""); + } + }); + + assert.equal(result.code, expected); + } + + test("{ modules: \"amd\" }", function () { + var expected = [ + "define('foo/bar', ['exports'], function (exports) {", + " 'use strict';", + "", + " foo('bar');", + "});" + ].join("\n"); + + getModuleNameTest("amd", expected); + }); + + test("{ modules: \"umd\" }", function () { + var expected = [ + "(function (global, factory) {", + " if (typeof define === 'function' && define.amd) {", + " define('foo/bar', ['exports'], factory);", + " } else if (typeof exports !== 'undefined') {", + " factory(exports);", + " } else {", + " var mod = {", + " exports: {}", + " };", + " factory(mod.exports);", + " global.fooBar = mod.exports;", + " }", + "})(this, function (exports) {", + " 'use strict';", + "", + " foo('bar');", + "});", + ].join("\n"); + + getModuleNameTest("umd", expected); + }); + + test("{ modules: \"system\" }", function () { + var expected = [ + "System.register('foo/bar', [], function (_export) {", + " return {", + " setters: [],", + " execute: function () {", + " 'use strict';", + "", + " foo('bar');", + " }", + " };", + "});", + ].join("\n"); + + getModuleNameTest("system", expected); + }); + }); + test("addHelper unknown", function () { var file = new File({}, transform.pipeline); assert.throws(function () {