UNPKG

1.19 kBJavaScriptView Raw
1// Usage: `require('carmi/loader!./file.carmi')`
2// or just setup as a default loader for `.carmi.js$` files
3
4'use strict';
5
6const execa = require('execa')
7const dargs = require('dargs')
8const tempy = require('tempy')
9const {readFileSync} = require('fs')
10const loaderUtils = require('loader-utils')
11
12module.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 // Add those modules as loader dependencies
35 // See https://webpack.js.org/contribute/writing-a-loader/#loader-dependencies
36 this.addDependency(filePath)
37 });
38 })
39 .then(() => {
40 callback(null, compiled)
41 })
42};