]>
git.immae.eu Git - github/fretlink/purs-loader.git/blob - src/Psc.js
3 const path
= require('path');
5 const Promise
= require('bluebird')
7 const fs
= Promise
.promisifyAll(require('fs'))
9 const spawn
= require('cross-spawn')
11 const debug
= require('debug')('purs-loader');
13 const dargs
= require('./dargs');
15 function compile(psModule
) {
16 const options
= psModule
.options
17 const cache
= psModule
.cache
20 if (cache
.compilationStarted
) return Promise
.resolve(psModule
)
22 cache
.compilationStarted
= true
24 const args
= dargs(Object
.assign({
26 output: options
.output
,
29 debug('spawning compiler %s %o', options
.psc
, args
)
31 return (new Promise((resolve
, reject
) => {
32 debug('compiling PureScript...')
34 const compilation
= spawn(options
.psc
, args
)
36 compilation
.stderr
.on('data', data
=> {
37 stderr
.push(data
.toString());
40 compilation
.on('close', code
=> {
41 debug('finished compiling PureScript.')
42 cache
.compilationFinished
= true
44 const errorMessage
= stderr
.join('');
45 if (errorMessage
.length
) {
46 psModule
.emitError(errorMessage
);
48 reject(new Error('compilation failed'))
50 const warningMessage
= stderr
.join('');
51 if (options
.warnings
&& warningMessage
.length
) {
52 psModule
.emitWarning(warningMessage
);
58 .then(compilerOutput
=> {
60 return bundle(options
, cache
).then(() => psModule
)
65 module
.exports
.compile
= compile
;
67 function bundle(options
, cache
) {
68 if (cache
.bundle
) return Promise
.resolve(cache
.bundle
)
71 const stderr
= cache
.bundle
= []
73 const args
= dargs(Object
.assign({
74 _: [path
.join(options
.output
, '*', '*.js')],
75 output: options
.bundleOutput
,
76 namespace: options
.bundleNamespace
,
77 }, options
.pscBundleArgs
))
79 cache
.bundleModules
.forEach(name
=> args
.push('--module', name
))
81 debug('spawning bundler %s %o', options
.pscBundle
, args
.join(' '))
83 return (new Promise((resolve
, reject
) => {
84 debug('bundling PureScript...')
86 const compilation
= spawn(options
.pscBundle
, args
)
88 compilation
.stdout
.on('data', data
=> stdout
.push(data
.toString()))
89 compilation
.stderr
.on('data', data
=> stderr
.push(data
.toString()))
90 compilation
.on('close', code
=> {
91 debug('finished bundling PureScript.')
93 const errorMessage
= stderr
.join('');
94 if (errorMessage
.length
) {
95 psModule
.emitError(errorMessage
);
97 return reject(new Error('bundling failed'))
100 resolve(fs
.appendFileAsync(options
.bundleOutput
, `module.exports = ${options.bundleNamespace}`))