]> git.immae.eu Git - github/fretlink/purs-loader.git/commitdiff
Handle multiple forced compiles on rebuild
authoreric thul <thul.eric@gmail.com>
Sun, 23 Apr 2017 22:17:27 +0000 (18:17 -0400)
committereric <thul.eric@gmail.com>
Sun, 23 Apr 2017 22:20:22 +0000 (18:20 -0400)
Resolves #90

src/bundle.js
src/compile.js
src/ide.js
src/index.js

index 3f55f012d01dbc32082fbd93d256abe6c12845aa..99633f1ba3ac1488618d73c7f021633f0a03593a 100644 (file)
@@ -27,7 +27,7 @@ module.exports = function bundle(options, bundleModules) {
 
   bundleModules.forEach(name => bundleArgs.push('--module', name))
 
-  debug('bundle: %s %o', bundleCommand, bundleArgs);
+  debug('bundle: %s %O', bundleCommand, bundleArgs);
 
   return (new Promise((resolve, reject) => {
     debug('bundling PureScript...')
index 707605c6a4724ed3c2fa4c3a222ddb211bde141c..6759bf3949bdaf1cfa68a318ddcf19754f15f9aa 100644 (file)
@@ -24,7 +24,7 @@ module.exports = function compile(psModule) {
 
   const stderr = [];
 
-  debug('compile %s %o', compileCommand, compileArgs)
+  debug('compile %s %O', compileCommand, compileArgs)
 
   return new Promise((resolve, reject) => {
     debug('compiling PureScript...')
index ac80789c1ad377ca180afd974e273081b91eaa0d..a2ccbe32ac90e9022872b0fafd93f29210d9dc62 100644 (file)
@@ -44,7 +44,7 @@ function spawnIdeClient(body, options) {
 
   const stdout = [];
 
-  debug('ide client %s %o %o', ideClientCommand, ideClientArgs, body);
+  debug('ide client %s %o %O', ideClientCommand, ideClientArgs, body);
 
   return new Promise((resolve, reject) => {
     const ideClient = spawn(ideClientCommand, ideClientArgs);
@@ -211,7 +211,7 @@ module.exports.rebuild = function rebuild(psModule) {
     try {
       const parsed = JSON.parse(response);
 
-      debugVerbose('parsed JSON response: %o', parsed);
+      debugVerbose('parsed JSON response: %O', parsed);
 
       return Promise.resolve(parsed);
     }
@@ -224,7 +224,7 @@ module.exports.rebuild = function rebuild(psModule) {
     const result = Array.isArray(parsed.result) ? parsed.result : [];
 
     return Promise.map(result, (item, i) => {
-      debugVerbose('formatting result %o', item);
+      debugVerbose('formatting result %O', item);
 
       return formatIdeResult(item, options, i, result.length);
     }).then(formatted => ({
@@ -254,7 +254,7 @@ module.exports.rebuild = function rebuild(psModule) {
 
           return isModuleNotFound || isUnknownModule || isUnknownModuleImport;
       })) {
-        debug('failed to rebuild because the module is unknown')
+        debug('module %s was not rebuilt because the module is unknown', psModule.name);
 
         return Promise.reject(new UnknownModuleError());
       }
index 19a549e3aa06b8bbf15b1f87991c6260ebabdfdc..f77e5f84d478d2a6c75d4b105089bd9f70dd271f 100644 (file)
@@ -137,8 +137,8 @@ module.exports = function purescriptLoader(source, map) {
         psModuleMap: cache.psModuleMap,
         warnings: [],
         errors: [],
-        compilationStarted: cache.compilationStarted,
-        compilationFinished: cache.compilationFinished,
+        compilationStarted: false,
+        compilationFinished: false,
         installed: cache.installed,
         srcOption: cache.srcOption
       };
@@ -217,8 +217,20 @@ module.exports = function purescriptLoader(source, map) {
     };
 
     const rebuild = () =>
-      ide.rebuild(psModule).catch(error => {
+      ide.rebuild(psModule)
+      .then(() =>
+        toJavaScript(psModule)
+          .then(psModule.load)
+          .catch(psModule.reject)
+      )
+      .catch(error => {
         if (error instanceof ide.UnknownModuleError) {
+          // Store the modules that trigger a recompile due to an
+          // unknown module error. We need to wait until compilation is
+          // done before loading these files.
+
+          cache.deferred.push(psModule);
+
           if (!cache.compilationStarted) {
             cache.compilationStarted = true;
 
@@ -233,28 +245,37 @@ module.exports = function purescriptLoader(source, map) {
                   cache.psModuleMap = map;
                 })
               )
-              .then(() => ide.load(psModule))
-              .then(() => psModule)
+              .then(() =>
+                Promise.map(cache.deferred, psModule =>
+                  ide.load(psModule)
+                    .then(() => toJavaScript(psModule))
+                    .then(psModule.load)
+                )
+              )
+              .catch(error => {
+                cache.deferred[0].reject(error);
+
+                cache.deferred.slice(1).forEach(psModule => {
+                  psModule.reject(new Error('purs-loader failed'));
+                })
+              })
             ;
           }
           else {
-            return Promise.resolve(psModule);
+            // The compilation has started. We must wait until it is
+            // done in order to ensure the module map contains all of
+            // the unknown modules.
           }
         }
         else {
           debug('ide rebuild failed due to an unhandled error: %o', error);
 
-          return Promise.reject(error);
+          psModule.reject(error);
         }
       })
     ;
 
-    connect()
-      .then(rebuild)
-      .then(toJavaScript)
-      .then(psModule.load)
-      .catch(psModule.reject)
-    ;
+    connect().then(rebuild);
   }
   else if (cache.compilationFinished) {
     debugVerbose('compilation is already finished, loading module %s', psModule.name);
@@ -292,7 +313,8 @@ module.exports = function purescriptLoader(source, map) {
         )
         .then(() =>
           Promise.map(cache.deferred, psModule =>
-            toJavaScript(psModule).then(psModule.load)
+            toJavaScript(psModule)
+              .then(psModule.load)
           )
         )
         .catch(error => {