]> git.immae.eu Git - github/fretlink/purs-loader.git/blobdiff - src/bundle.js
Support for PureScript 0.11
[github/fretlink/purs-loader.git] / src / bundle.js
diff --git a/src/bundle.js b/src/bundle.js
new file mode 100644 (file)
index 0000000..6627ffe
--- /dev/null
@@ -0,0 +1,59 @@
+'use strict';
+
+const path = require('path');
+
+const Promise = require('bluebird')
+
+const fs = Promise.promisifyAll(require('fs'))
+
+const spawn = require('cross-spawn')
+
+const debug = require('debug')('purs-loader');
+
+const dargs = require('./dargs');
+
+module.exports = function bundle(options, cache) {
+  if (cache.bundle) return Promise.resolve(cache.bundle)
+
+  const stdout = []
+
+  const stderr = cache.bundle = []
+
+  const bundleCommand = options.pscBundle || 'purs';
+
+  const bundleArgs = (options.pscBundle ? [] : [ 'bundle' ]).concat(dargs(Object.assign({
+    _: [path.join(options.output, '*', '*.js')],
+    output: options.bundleOutput,
+    namespace: options.bundleNamespace,
+  }, options.pscBundleArgs)));
+
+  cache.bundleModules.forEach(name => bundleArgs.push('--module', name))
+
+  debug('spawning bundler %s %o', bundleCommand, bundleArgs);
+
+  return (new Promise((resolve, reject) => {
+    debug('bundling PureScript...')
+
+    const compilation = spawn(bundleCommand, bundleArgs)
+
+    compilation.stdout.on('data', data => stdout.push(data.toString()))
+
+    compilation.stderr.on('data', data => stderr.push(data.toString()))
+
+    compilation.on('close', code => {
+      debug('finished bundling PureScript.')
+
+      if (code !== 0) {
+        const errorMessage = stderr.join('');
+        if (errorMessage.length) {
+          psModule.emitError(errorMessage);
+        }
+        return reject(new Error('bundling failed'))
+      }
+
+      cache.bundle = stderr
+
+      resolve(fs.appendFileAsync(options.bundleOutput, `module.exports = ${options.bundleNamespace}`))
+    })
+  }))
+};