UNPKG

1.16 kBJavaScriptView Raw
1const NativeModule = require('module')
2
3module.exports = async function(source, map) {
4 this.cacheable()
5 const done = this.async()
6
7 const exec = (code, filename) => {
8 delete require.cache[filename]
9 const module = new NativeModule(filename, this)
10 module.paths = NativeModule._nodeModulePaths(this.context)
11 module.filename = filename
12 module._compile(transpileEsModules(code, filename), filename)
13 return module.exports.default || module.exports
14 }
15
16 try {
17 const exported = exec(source, this.resourcePath)
18 const result = await exported.call(this)
19 done(null, `${JSON.stringify(result)}`, map)
20 } catch (error) {
21 done(error)
22 }
23}
24
25function transpileEsModules(code, filename) {
26 const RE = /\b(import|export)\b/
27 if (!RE.test(code)) {
28 return code
29 }
30 // Use babel-preset-env to transpile potentional `import/export` statements
31 return require('@babel/core').transform(code, {
32 filename,
33 babelrc: false,
34 configFile: false,
35 presets: [
36 [
37 require.resolve('@babel/preset-env'),
38 {
39 targets: {
40 node: 'current'
41 }
42 }
43 ]
44 ]
45 }).code
46}