| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | const vm = require("vm"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-25 16:37:35 +08:00
										 |  |  | const SYNTHETIC_MODULES_STORE = "__SYNTHETIC_MODULES_STORE"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = async (something, context, unlinked) => { | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | 	if ( | 
					
						
							| 
									
										
										
										
											2024-06-11 20:32:02 +08:00
										 |  |  | 		// eslint-disable-next-line n/no-unsupported-features/node-builtins
 | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | 		something instanceof (vm.Module || /* node.js 10 */ vm.SourceTextModule) | 
					
						
							|  |  |  | 	) { | 
					
						
							|  |  |  | 		return something; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-06-25 16:37:35 +08:00
										 |  |  | 	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 => | 
					
						
							| 
									
										
										
										
											2021-09-02 23:23:02 +08:00
										 |  |  | 				`const _${name} = ${SYNTHETIC_MODULES_STORE}[${i}]${ | 
					
						
							|  |  |  | 					name === "default" ? "" : `[${JSON.stringify(name)}]` | 
					
						
							|  |  |  | 				}; export { _${name} as ${name}};`
 | 
					
						
							| 
									
										
										
										
											2021-06-25 16:37:35 +08:00
										 |  |  | 		) | 
					
						
							|  |  |  | 		.join("\n"); | 
					
						
							|  |  |  | 	const m = new vm.SourceTextModule(code, { | 
					
						
							|  |  |  | 		context | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	if (unlinked) return m; | 
					
						
							| 
									
										
										
										
											2021-06-24 22:44:14 +08:00
										 |  |  | 	await m.link(() => {}); | 
					
						
							|  |  |  | 	if (m.instantiate) m.instantiate(); | 
					
						
							|  |  |  | 	await m.evaluate(); | 
					
						
							|  |  |  | 	return m; | 
					
						
							|  |  |  | }; |