diff --git a/packages/babel-core/src/api/node.js b/packages/babel-core/src/api/node.js index 7899ed2fd4..a9e4792465 100644 --- a/packages/babel-core/src/api/node.js +++ b/packages/babel-core/src/api/node.js @@ -6,6 +6,7 @@ export { default as options } from "../transformation/file/options/config"; export { default as buildExternalHelpers } from "../tools/build-external-helpers"; export { default as template } from "babel-template"; export { default as resolvePlugin } from "../helpers/resolve-plugin"; +export { default as resolvePreset } from "../helpers/resolve-preset"; export { version } from "../../package"; import * as util from "../util"; diff --git a/packages/babel-core/src/helpers/get-possible-preset-names.js b/packages/babel-core/src/helpers/get-possible-preset-names.js new file mode 100644 index 0000000000..b9fb1726bd --- /dev/null +++ b/packages/babel-core/src/helpers/get-possible-preset-names.js @@ -0,0 +1,13 @@ +export default function getPossiblePresetNames(presetName: string): Array { + let possibleNames = [`babel-preset-${presetName}`, presetName]; + + // trying to resolve @organization shortcat + // @foo/es2015 -> @foo/babel-preset-es2015 + let matches = presetName.match(/^(@[^/]+)\/(.+)$/); + if (matches) { + let [, orgName, presetPath] = matches; + possibleNames.push(`${orgName}/babel-preset-${presetPath}`); + } + + return possibleNames; +} diff --git a/packages/babel-core/src/helpers/resolve-preset.js b/packages/babel-core/src/helpers/resolve-preset.js new file mode 100644 index 0000000000..a7c1784ce9 --- /dev/null +++ b/packages/babel-core/src/helpers/resolve-preset.js @@ -0,0 +1,6 @@ +import resolve from "./resolve"; +import getPossiblePresetNames from "./get-possible-preset-names"; + +export default function resolvePreset(presetName: string, dirname: string = process.cwd()): ?string { + return getPossiblePresetNames(presetName).reduce((accum, curr) => accum || resolve(curr, dirname), null); +} diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js index 06a4ff6fe6..3b0c78993b 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -5,8 +5,8 @@ import type Logger from "../logger"; import Plugin from "../../plugin"; import * as messages from "babel-messages"; import { normaliseOptions } from "./index"; -import resolve from "../../../helpers/resolve"; import resolvePlugin from "../../../helpers/resolve-plugin"; +import resolvePreset from "../../../helpers/resolve-preset"; import cloneDeepWith from "lodash/cloneDeepWith"; import clone from "lodash/clone"; import merge from "../../../helpers/merge"; @@ -262,18 +262,7 @@ export default class OptionManager { let presetLoc; try { if (typeof val === "string") { - presetLoc = resolve(`babel-preset-${val}`, dirname) || resolve(val, dirname); - - // trying to resolve @organization shortcat - // @foo/es2015 -> @foo/babel-preset-es2015 - if (!presetLoc) { - let matches = val.match(/^(@[^/]+)\/(.+)$/); - if (matches) { - let [, orgName, presetPath] = matches; - val = `${orgName}/babel-preset-${presetPath}`; - presetLoc = resolve(val, dirname); - } - } + presetLoc = resolvePreset(val, dirname); if (!presetLoc) { throw new Error(`Couldn't find preset ${JSON.stringify(val)} relative to directory ` + diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index d0fbadd48e..55fc0d013a 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -118,6 +118,10 @@ describe("api", function () { assert.equal(babel.resolvePlugin("nonexistent-plugin"), null); }); + it("exposes the resolvePreset method", function() { + assert.equal(babel.resolvePreset("nonexistent-preset"), null); + }); + it("transformFile", function (done) { babel.transformFile(__dirname + "/fixtures/api/file.js", {}, function (err, res) { if (err) return done(err); @@ -266,7 +270,7 @@ describe("api", function () { presets: ["@babel/es2015"] }); }, - /Couldn\'t find preset \"\@babel\/babel\-preset\-es2015\" relative to directory/ + /Couldn\'t find preset \"\@babel\/es2015\" relative to directory/ ); }); @@ -277,7 +281,7 @@ describe("api", function () { presets: ["@babel/react/optimizations"] }); }, - /Couldn\'t find preset \"\@babel\/babel\-preset\-react\/optimizations\" relative to directory/ + /Couldn\'t find preset \"\@babel\/react\/optimizations\" relative to directory/ ); }); diff --git a/packages/babel-core/test/get-possible-preset-names.js b/packages/babel-core/test/get-possible-preset-names.js new file mode 100644 index 0000000000..88f9166c83 --- /dev/null +++ b/packages/babel-core/test/get-possible-preset-names.js @@ -0,0 +1,22 @@ +let assert = require("assert"); +let getPossiblePresetNames = require("../lib/helpers/get-possible-preset-names"); + +describe("getPossiblePresetNames", function () { + it("adds the babel-preset prefix", function() { + assert.deepEqual(getPossiblePresetNames("foobar"), ["babel-preset-foobar", "foobar"]); + }); + + it("inserts babel-preset after @org/", function() { + assert.deepEqual(getPossiblePresetNames("@babel/es2015"), [ + "babel-preset-@babel/es2015", + "@babel/es2015", + "@babel/babel-preset-es2015" + ]); + + assert.deepEqual(getPossiblePresetNames("@babel/react/optimizations"), [ + "babel-preset-@babel/react/optimizations", + "@babel/react/optimizations", + "@babel/babel-preset-react/optimizations" + ]); + }); +});