]> git.immae.eu Git - github/fretlink/purs-loader.git/blobdiff - src/to-javascript.js
Handle multiple forced compiles on rebuild
[github/fretlink/purs-loader.git] / src / to-javascript.js
index b0b9ddab409d03036213150e9daea599a6ef4e02..d0934d5ed46e19fd6da9be41c1109f7cbcf517da 100644 (file)
@@ -10,7 +10,11 @@ const jsStringEscape = require('js-string-escape');
 
 const difference = require('lodash.difference');
 
-const debug = require('debug')('purs-loader');
+const debug_ = require('debug');
+
+const debug = debug_('purs-loader');
+
+const debugVerbose = debug_('purs-loader:verbose');
 
 const PsModuleMap = require('./PsModuleMap');
 
@@ -42,7 +46,7 @@ function updatePsModuleMap(psModule) {
 
  // Reference the bundle.
 function makeBundleJS(psModule) {
-  const bundleOutput = psMoudle.options.bundleOutput;
+  const bundleOutput = psModule.options.bundleOutput;
 
   const name = psModule.name;
 
@@ -74,11 +78,20 @@ function makeJS(psModule, psModuleMap, js) {
 
   const result = js
     .replace(requireRE, (m, p1) => {
-      const escapedPath = jsStringEscape(psModuleMap[p1].src);
+      const moduleValue = psModuleMap[p1];
 
-      replacedImports.push(p1);
+      if (!moduleValue) {
+        debug('module %s was not found in the map, replacing require with null', p1);
 
-      return `require("${escapedPath}")`;
+        return 'null';
+      }
+      else {
+        const escapedPath = jsStringEscape(moduleValue.src);
+
+        replacedImports.push(p1);
+
+        return `require("${escapedPath}")`;
+      }
     })
     .replace(foreignRE, () => {
       const escapedPath = jsStringEscape(psModuleMap[name].ffi);
@@ -87,19 +100,26 @@ function makeJS(psModule, psModuleMap, js) {
     })
   ;
 
-  debug('imports %o', imports);
-
-  debug('replaced imports %o', replacedImports);
-
   const additionalImports = difference(imports, replacedImports);
 
-  debug('additional imports for %s: %o', name, additionalImports);
+  if (additionalImports.length) {
+    debugVerbose('additional imports for %s: %o', name, additionalImports);
+  }
 
   const additionalImportsResult = additionalImports.map(import_ => {
-    const escapedPath = jsStringEscape(psModuleMap[import_].src);
+    const moduleValue = psModuleMap[import_];
+
+    if (!moduleValue) {
+      debug('module %s was not found in the map, skipping require', import_);
+
+      return null;
+    }
+    else {
+      const escapedPath = jsStringEscape(moduleValue.src);
 
-    return `var ${import_.replace(/\./g, '_')} = require("${escapedPath}")`;
-  }).join('\n');
+      return `var ${import_.replace(/\./g, '_')} = require("${escapedPath}")`;
+    }
+  }).filter(a => a !== null).join('\n');
 
   const result_ = result + (additionalImports.length ? '\n' + additionalImportsResult : '');
 
@@ -113,13 +133,13 @@ module.exports = function toJavaScript(psModule) {
 
   const bundlePath = path.resolve(options.bundleOutput);
 
-  const jsPath = cache.bundle ? bundlePath : psModule.jsPath;
+  const jsPath = options.bundle ? bundlePath : psModule.jsPath;
 
   const js = fs.readFileAsync(jsPath, 'utf8').catch(() => '');
 
   const psModuleMap = updatePsModuleMap(psModule);
 
-  debug('loading JavaScript for %s', psModule.name);
+  debugVerbose('loading JavaScript for %s', psModule.name);
 
   return Promise.props({js: js, psModuleMap: psModuleMap}).then(result =>
     options.bundle ?