mirror of https://github.com/webpack/webpack.git
35 lines
1004 B
JavaScript
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;
|
|
};
|