43 lines
1.5 KiB
JavaScript
43 lines
1.5 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
const babel = require("@babel/core");
|
||
|
module.exports = function injectCaller(opts, target) {
|
||
|
if (!supportsCallerOption()) return opts;
|
||
|
return Object.assign({}, opts, {
|
||
|
caller: Object.assign({
|
||
|
name: "babel-loader",
|
||
|
// Provide plugins with insight into webpack target.
|
||
|
// https://github.com/babel/babel-loader/issues/787
|
||
|
target,
|
||
|
// Webpack >= 2 supports ESM and dynamic import.
|
||
|
supportsStaticESM: true,
|
||
|
supportsDynamicImport: true,
|
||
|
// Webpack 5 supports TLA behind a flag. We enable it by default
|
||
|
// for Babel, and then webpack will throw an error if the experimental
|
||
|
// flag isn't enabled.
|
||
|
supportsTopLevelAwait: true
|
||
|
}, opts.caller)
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// TODO: We can remove this eventually, I'm just adding it so that people have
|
||
|
// a little time to migrate to the newer RCs of @babel/core without getting
|
||
|
// hard-to-diagnose errors about unknown 'caller' options.
|
||
|
let supportsCallerOptionFlag = undefined;
|
||
|
function supportsCallerOption() {
|
||
|
if (supportsCallerOptionFlag === undefined) {
|
||
|
try {
|
||
|
// Rather than try to match the Babel version, we just see if it throws
|
||
|
// when passed a 'caller' flag, and use that to decide if it is supported.
|
||
|
babel.loadPartialConfig({
|
||
|
caller: undefined,
|
||
|
babelrc: false,
|
||
|
configFile: false
|
||
|
});
|
||
|
supportsCallerOptionFlag = true;
|
||
|
} catch (err) {
|
||
|
supportsCallerOptionFlag = false;
|
||
|
}
|
||
|
}
|
||
|
return supportsCallerOptionFlag;
|
||
|
}
|