47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
import { declare } from "@babel/helper-plugin-utils";
|
|
import { types as t } from "@babel/core";
|
|
|
|
export default declare((api, options) => {
|
|
api.assertVersion(7);
|
|
|
|
const { helperVersion = "7.0.0-beta.0", whitelist = false } = options;
|
|
|
|
if (
|
|
whitelist !== false &&
|
|
(!Array.isArray(whitelist) || whitelist.some(w => typeof w !== "string"))
|
|
) {
|
|
throw new Error(
|
|
".whitelist must be undefined, false, or an array of strings",
|
|
);
|
|
}
|
|
|
|
const helperWhitelist = whitelist ? new Set(whitelist) : null;
|
|
|
|
return {
|
|
pre(file) {
|
|
file.set("helperGenerator", name => {
|
|
// If the helper didn't exist yet at the version given, we bail
|
|
// out and let Babel either insert it directly, or throw an error
|
|
// so that plugins can handle that case properly.
|
|
if (
|
|
file.availableHelper &&
|
|
!file.availableHelper(name, helperVersion)
|
|
) {
|
|
return;
|
|
}
|
|
|
|
// babelCore.buildExternalHelpers() allows a whitelist of helpers that
|
|
// will be inserted into the external helpers list. That same whitelist
|
|
// should be passed into the plugin here in that case, so that we can
|
|
// avoid referencing 'babelHelpers.XX' when the helper does not exist.
|
|
if (helperWhitelist && !helperWhitelist.has(name)) return;
|
|
|
|
return t.memberExpression(
|
|
t.identifier("babelHelpers"),
|
|
t.identifier(name),
|
|
);
|
|
});
|
|
},
|
|
};
|
|
});
|