@jsenv/plugin-transpilation
Version:
54 lines (49 loc) • 1.88 kB
JavaScript
import { injectJsImport } from "@jsenv/ast";
import { pathToFileURL } from "node:url";
import {
babelHelperNameFromUrl,
getBabelHelperFileUrl,
} from "./babel_helper_directory/babel_helper_directory.js";
// named import approach found here:
// https://github.com/rollup/rollup-plugin-babel/blob/18e4232a450f320f44c651aa8c495f21c74d59ac/src/helperPlugin.js#L1
// for reference this is how it's done to reference
// a global babel helper object instead of using
// a named import
// https://github.com/babel/babel/blob/99f4f6c3b03c7f3f67cf1b9f1a21b80cfd5b0224/packages/babel-plugin-external-helpers/src/index.js
export const babelPluginBabelHelpersAsJsenvImports = (
babel,
{ getImportSpecifier },
) => {
return {
name: "babel-helper-as-jsenv-import",
pre: (file) => {
const cachedHelpers = {};
file.set("helperGenerator", (name) => {
// the list of possible helpers name
// https://github.com/babel/babel/blob/99f4f6c3b03c7f3f67cf1b9f1a21b80cfd5b0224/packages/babel-helpers/src/helpers.js#L13
if (!file.availableHelper(name)) {
return undefined;
}
if (cachedHelpers[name]) {
return cachedHelpers[name];
}
const filePath = file.opts.filename;
const fileUrl = pathToFileURL(filePath).href;
if (babelHelperNameFromUrl(fileUrl) === name) {
return undefined;
}
const babelHelperImportSpecifier = getBabelHelperFileUrl(name);
const helper = injectJsImport({
programPath: file.path,
from: getImportSpecifier(babelHelperImportSpecifier),
nameHint: `_${name}`,
// disable interop, useless as we work only with js modules
importedType: "es6",
// importedInterop: "uncompiled",
});
cachedHelpers[name] = helper;
return helper;
});
},
};
};