webpack/test/helpers/asModule.js

35 lines
1004 B
JavaScript

"use strict";
const vm = require("vm");
const SYNTHETIC_MODULES_STORE = "__SYNTHETIC_MODULES_STORE";
const [major] = process.versions.node.split(".").map(Number);
module.exports = async (something, context, unlinked) => {
if (
something instanceof (vm.Module || /* node.js 10 */ vm.SourceTextModule)
) {
return something;
}
context[SYNTHETIC_MODULES_STORE] = context[SYNTHETIC_MODULES_STORE] || [];
const i = context[SYNTHETIC_MODULES_STORE].length;
context[SYNTHETIC_MODULES_STORE].push(something);
const code = [...new Set(["default", ...Object.keys(something)])]
.map(
(name) =>
`const _${name} = ${SYNTHETIC_MODULES_STORE}[${i}]${
name === "default" ? "" : `[${JSON.stringify(name)}]`
}; export { _${name} as ${name}};`
)
.join("\n");
const m = new vm.SourceTextModule(code, {
context
});
if (unlinked) return m;
await m.link(() => {});
// node.js 10 needs instantiate
if (major === 10 && m.instantiate) m.instantiate();
await m.evaluate();
return m;
};