1 | const NativeModule = require('module')
|
2 |
|
3 | module.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 |
|
25 | function transpileEsModules(code, filename) {
|
26 | const RE = /\b(import|export)\b/
|
27 | if (!RE.test(code)) {
|
28 | return code
|
29 | }
|
30 |
|
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 | }
|