]> git.immae.eu Git - github/fretlink/purs-loader.git/blobdiff - src/index.js
Version 3.0.0
[github/fretlink/purs-loader.git] / src / index.js
index 19a549e3aa06b8bbf15b1f87991c6260ebabdfdc..4c5abd20a1e894ed827c1640b7c0a6c64bac9e12 100644 (file)
@@ -72,7 +72,10 @@ module.exports = function purescriptLoader(source, map) {
 
       const cmd = spawn(pscPackageCommand, pscPackageArgs);
 
-      if (cmd.status !== 0) {
+      if (cmd.error) {
+        throw new Error(cmd.error);
+      }
+      else if (cmd.status !== 0) {
         const error = cmd.stdout.toString();
 
         throw new Error(error);
@@ -105,9 +108,12 @@ module.exports = function purescriptLoader(source, map) {
     pscArgs: {},
     pscBundle: null,
     pscBundleArgs: {},
+    pscIdeClient: null,
+    pscIdeClientArgs: {},
+    pscIdeServer: null,
+    pscIdeServerArgs: {},
     pscIde: false,
     pscIdeColors: loaderOptions.psc === 'psa',
-    pscIdeArgs: {},
     pscPackage: false,
     bundleOutput: 'output/bundle.js',
     bundleNamespace: 'PS',
@@ -137,10 +143,10 @@ 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
+        srcOption: []
       };
     });
 
@@ -217,8 +223,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 +251,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 +319,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 => {