]> git.immae.eu Git - github/fretlink/purs-loader.git/blobdiff - src/index.js
initial psc-package support (#82)
[github/fretlink/purs-loader.git] / src / index.js
index 7c296508a4e8b81cdb683d6351fd78b849f86984..249f4723a249e540c13656fbb8245413081bee03 100644 (file)
@@ -10,6 +10,8 @@ const PsModuleMap = require('./PsModuleMap');
 const Psc = require('./Psc');
 const PscIde = require('./PscIde');
 const dargs = require('./dargs');
+const spawn = require('cross-spawn').sync
+const eol = require('os').EOL
 
 const requireRegex = /require\(['"]\.\.\/([\w\.]+)['"]\)/g
 
@@ -19,15 +21,30 @@ module.exports = function purescriptLoader(source, map) {
   const query = loaderUtils.parseQuery(this.query)
   const webpackOptions = this.options.purescriptLoader || {}
 
-  const options = Object.assign({
+  const depsPaths = (pscPackage => {
+    if (pscPackage) {
+      debug('calling psc-package...')
+
+      return spawn('psc-package', ['sources']).stdout.toString().split(eol).filter(v => v != '')
+    }
+    else {
+      return [ path.join('bower_components', 'purescript-*', 'src', '**', '*.purs') ]
+    }
+  })
+
+  let options = Object.assign(webpackOptions, query)
+
+  const defaultDeps = depsPaths(options.pscPackage)
+  const defaultOptions = {
     context: config.context,
     psc: 'psc',
     pscArgs: {},
     pscBundle: 'psc-bundle',
     pscBundleArgs: {},
     pscIde: false,
-    pscIdeColors: webpackOptions.psc === 'psa' || query.psc === 'psa',
+    pscIdeColors: options.psc === 'psa',
     pscIdeArgs: {},
+    pscPackage: false,
     bundleOutput: 'output/bundle.js',
     bundleNamespace: 'PS',
     bundle: false,
@@ -35,18 +52,26 @@ module.exports = function purescriptLoader(source, map) {
     output: 'output',
     src: [
       path.join('src', '**', '*.purs'),
-      path.join('bower_components', 'purescript-*', 'src', '**', '*.purs')
+      ...defaultDeps
     ]
-  }, webpackOptions, query)
+  }
 
   this.cacheable && this.cacheable()
 
   let cache = config.purescriptLoaderCache = config.purescriptLoaderCache || {
     rebuild: false,
     deferred: [],
-    bundleModules: []
+    bundleModules: [],
+    warnings: [],
+    errors: []
+  }
+
+  if (options.pscPackage && options.src) {
+    options.src = options.src.concat(defaultDeps) // append psc-package-provided source paths with users'
   }
 
+  options = Object.assign(defaultOptions, options)
+
   if (!config.purescriptLoaderInstalled) {
     config.purescriptLoaderInstalled = true
 
@@ -59,9 +84,24 @@ module.exports = function purescriptLoader(source, map) {
         deferred: [],
         bundleModules: [],
         ideServer: cache.ideServer,
-        psModuleMap: cache.psModuleMap
+        psModuleMap: cache.psModuleMap,
+        warnings: [],
+        errors: []
       }
-    })
+    });
+
+    // add psc warnings to webpack compilation warnings
+    this._compiler.plugin('after-compile', (compilation, callback) => {
+      cache.warnings.forEach(warning => {
+        compilation.warnings.push(warning);
+      });
+
+      cache.errors.forEach(error => {
+        compilation.errors.push(error);
+      });
+
+      callback()
+    });
   }
 
   const psModuleName = PsModuleMap.match(source)
@@ -74,8 +114,16 @@ module.exports = function purescriptLoader(source, map) {
     jsPath: path.resolve(path.join(options.output, psModuleName, 'index.js')),
     options: options,
     cache: cache,
-    emitWarning: warning => this.emitWarning(warning),
-    emitError: error => this.emitError(error)
+    emitWarning: warning => {
+      if (options.warnings && warning.length) {
+        cache.warnings.push(warning);
+      }
+    },
+    emitError: error => {
+      if (error.length) {
+        cache.errors.push(error);
+      }
+    }
   }
 
   debug('loader called', psModule.name)