]> git.immae.eu Git - github/fretlink/purs-loader.git/blob - src/Psc.js
Use emitError and emitWarning
[github/fretlink/purs-loader.git] / src / Psc.js
1 'use strict';
2
3 const path = require('path');
4
5 const Promise = require('bluebird')
6
7 const fs = Promise.promisifyAll(require('fs'))
8
9 const spawn = require('cross-spawn')
10
11 const debug = require('debug')('purs-loader');
12
13 const dargs = require('./dargs');
14
15 function compile(psModule) {
16 const options = psModule.options
17 const cache = psModule.cache
18 const stderr = []
19
20 if (cache.compilationStarted) return Promise.resolve(psModule)
21
22 cache.compilationStarted = true
23
24 const args = dargs(Object.assign({
25 _: options.src,
26 output: options.output,
27 }, options.pscArgs))
28
29 debug('spawning compiler %s %o', options.psc, args)
30
31 return (new Promise((resolve, reject) => {
32 debug('compiling PureScript...')
33
34 const compilation = spawn(options.psc, args)
35
36 compilation.stdout.on('data', data => stderr.push(data.toString()))
37 compilation.stderr.on('data', data => stderr.push(data.toString()))
38
39 compilation.on('close', code => {
40 debug('finished compiling PureScript.')
41 cache.compilationFinished = true
42 if (code !== 0) {
43 const errorMessage = stderr.join('');
44 if (errorMessage.length) {
45 psModule.emitError(errorMessage);
46 }
47 reject(new Error('compilation failed'))
48 } else {
49 const warningMessage = stderr.join('');
50 if (options.warnings && warningMessage.length) {
51 psModule.emitWarning(warningMessage);
52 }
53 resolve(psModule)
54 }
55 })
56 }))
57 .then(compilerOutput => {
58 if (options.bundle) {
59 return bundle(options, cache).then(() => psModule)
60 }
61 return psModule
62 })
63 }
64 module.exports.compile = compile;
65
66 function bundle(options, cache) {
67 if (cache.bundle) return Promise.resolve(cache.bundle)
68
69 const stdout = []
70 const stderr = cache.bundle = []
71
72 const args = dargs(Object.assign({
73 _: [path.join(options.output, '*', '*.js')],
74 output: options.bundleOutput,
75 namespace: options.bundleNamespace,
76 }, options.pscBundleArgs))
77
78 cache.bundleModules.forEach(name => args.push('--module', name))
79
80 debug('spawning bundler %s %o', options.pscBundle, args.join(' '))
81
82 return (new Promise((resolve, reject) => {
83 debug('bundling PureScript...')
84
85 const compilation = spawn(options.pscBundle, args)
86
87 compilation.stdout.on('data', data => stdout.push(data.toString()))
88 compilation.stderr.on('data', data => stderr.push(data.toString()))
89 compilation.on('close', code => {
90 debug('finished bundling PureScript.')
91 if (code !== 0) {
92 const errorMessage = stderr.join('');
93 if (errorMessage.length) {
94 psModule.emitError(errorMessage);
95 }
96 return reject(new Error('bundling failed'))
97 }
98 cache.bundle = stderr
99 resolve(fs.appendFileAsync(options.bundleOutput, `module.exports = ${options.bundleNamespace}`))
100 })
101 }))
102 }