Merge pull request #4729 from rmacklin/add-resolvePlugin-and-resolvePreset

Add resolvePlugin and resolvePreset methods to babel-core API
This commit is contained in:
Logan Smyth 2016-12-20 08:42:27 -08:00 committed by GitHub
commit ce0c620a9f
10 changed files with 77 additions and 36 deletions

View File

@ -5,6 +5,8 @@ export { default as File } from "../transformation/file";
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";

View File

@ -0,0 +1,3 @@
export default function getPossiblePluginNames(pluginName: string): Array<string> {
return [`babel-plugin-${pluginName}`, pluginName];
}

View File

@ -0,0 +1,13 @@
export default function getPossiblePresetNames(presetName: string): Array<string> {
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;
}

View File

@ -0,0 +1,5 @@
import resolve from "./resolve";
export default function resolveFromPossibleNames(possibleNames: Array<string>, dirname: string): ?string {
return possibleNames.reduce((accum, curr) => accum || resolve(curr, dirname), null);
}

View File

@ -0,0 +1,6 @@
import resolveFromPossibleNames from "./resolve-from-possible-names";
import getPossiblePluginNames from "./get-possible-plugin-names";
export default function resolvePlugin(pluginName: string, dirname: string = process.cwd()): ?string {
return resolveFromPossibleNames(getPossiblePluginNames(pluginName), dirname);
}

View File

@ -0,0 +1,6 @@
import resolveFromPossibleNames from "./resolve-from-possible-names";
import getPossiblePresetNames from "./get-possible-preset-names";
export default function resolvePreset(presetName: string, dirname: string = process.cwd()): ?string {
return resolveFromPossibleNames(getPossiblePresetNames(presetName), dirname);
}

View File

@ -5,7 +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";
@ -123,7 +124,7 @@ export default class OptionManager {
// allow plugins to be specified as strings
if (typeof plugin === "string") {
let pluginLoc = resolve(`babel-plugin-${plugin}`, dirname) || resolve(plugin, dirname);
let pluginLoc = resolvePlugin(plugin, dirname);
if (pluginLoc) {
plugin = require(pluginLoc);
} else {
@ -261,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 ` +

View File

@ -114,6 +114,14 @@ describe("api", function () {
}).marked[0].message, "foobar");
});
it("exposes the resolvePlugin method", 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);
@ -255,28 +263,6 @@ describe("api", function () {
});
it("handles preset shortcuts (adds babel-preset-)", function () {
return assert.throws(
function () {
babel.transform("", {
presets: ["@babel/es2015"]
});
},
/Couldn\'t find preset \"\@babel\/babel\-preset\-es2015\" relative to directory/
);
});
it("handles preset shortcuts 2 (adds babel-preset-)", function () {
return assert.throws(
function () {
babel.transform("", {
presets: ["@babel/react/optimizations"]
});
},
/Couldn\'t find preset \"\@babel\/babel\-preset\-react\/optimizations\" relative to directory/
);
});
it("source map merging", function () {
let result = babel.transform([
"function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }",

View File

@ -0,0 +1,8 @@
let assert = require("assert");
let getPossiblePluginNames = require("../lib/helpers/get-possible-plugin-names");
describe("getPossiblePluginNames", function () {
it("adds the babel-plugin prefix", function() {
assert.deepEqual(getPossiblePluginNames("foobar"), ["babel-plugin-foobar", "foobar"]);
});
});

View File

@ -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"
]);
});
});