1 |
|
2 |
|
3 |
|
4 | 'use strict';
|
5 |
|
6 | const execa = require('execa')
|
7 | const dargs = require('dargs')
|
8 | const tempy = require('tempy')
|
9 | const {readFileSync} = require('fs')
|
10 | const loaderUtils = require('loader-utils')
|
11 |
|
12 | module.exports = function CarmiLoader() {
|
13 | const callback = this.async()
|
14 | const statsPath = tempy.file({extension: 'json'})
|
15 | const tempOutputPath = tempy.file({extension: 'js'})
|
16 | const loaderOptions = loaderUtils.getOptions(this) || {}
|
17 |
|
18 | const options = {
|
19 | source: this.getDependencies()[0],
|
20 | stats: statsPath,
|
21 | format: 'cjs',
|
22 | output: tempOutputPath,
|
23 | ...loaderOptions
|
24 | }
|
25 |
|
26 | let compiled;
|
27 |
|
28 | execa('node', [require.resolve('./bin/carmi'), ...dargs(options)])
|
29 | .then(() => {
|
30 | compiled = readFileSync(tempOutputPath, 'utf8')
|
31 | })
|
32 | .finally(() => {
|
33 | Object.keys(require(statsPath)).forEach(filePath => {
|
34 |
|
35 |
|
36 | this.addDependency(filePath)
|
37 | });
|
38 | })
|
39 | .then(() => {
|
40 | callback(null, compiled)
|
41 | })
|
42 | };
|