+ if (CACHE_VAR.rebuild) {
+ const connect = () => {
+ if (!CACHE_VAR.ideServer) {
+ CACHE_VAR.ideServer = true;
+
+ return ide.connect(psModule)
+ .then(ideServer => {
+ CACHE_VAR.ideServer = ideServer;
+ return psModule;
+ })
+ .then(ide.loadWithRetry)
+ .catch(error => {
+ if (CACHE_VAR.ideServer.kill) {
+ debug('ide failed to initially load modules, stopping the ide server process');
+
+ CACHE_VAR.ideServer.kill();
+ }
+
+ CACHE_VAR.ideServer = null;
+
+ return Promise.reject(error);
+ })
+ ;
+ }
+ else {
+ return Promise.resolve(psModule);
+ }
+ };
+
+ const rebuild = () =>
+ ide.rebuild(psModule)
+ .then(() =>
+ toJavaScript(psModule)
+ .then(js => sourceMaps(psModule, js))
+ .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_VAR.deferred.push(psModule);
+
+ if (!CACHE_VAR.compilationStarted) {
+ CACHE_VAR.compilationStarted = true;
+
+ return compile(psModule)
+ .then(() => {
+ CACHE_VAR.compilationFinished = true;
+ })
+ .then(() =>
+ Promise.map(CACHE_VAR.deferred, psModule =>
+ ide.load(psModule)
+ .then(() => toJavaScript(psModule))
+ .then(js => sourceMaps(psModule, js))
+ .then(psModule.load)
+ )
+ )
+ .catch(error => {
+ CACHE_VAR.compilationFailed = true;
+
+ CACHE_VAR.deferred[0].reject(error);
+
+ CACHE_VAR.deferred.slice(1).forEach(psModule => {
+ psModule.reject(new Error('purs-loader failed'));
+ })
+ })
+ ;
+ } else if (CACHE_VAR.compilationFailed) {
+ CACHE_VAR.deferred.pop().reject(new Error('purs-loader failed'));
+ } else {
+ // 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);