aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoreric thul <thul.eric@gmail.com>2017-04-23 18:17:27 -0400
committereric <thul.eric@gmail.com>2017-04-23 18:20:22 -0400
commit78e2b0d91f5eb98674c5b05db0ef2c4f417581c0 (patch)
treed76942d9da52f7b72747ac2c825b80e8c27b57fb
parente17196589a380eed3ffc47705f8c6c87f99b58c2 (diff)
downloadpurs-loader-78e2b0d91f5eb98674c5b05db0ef2c4f417581c0.tar.gz
purs-loader-78e2b0d91f5eb98674c5b05db0ef2c4f417581c0.tar.zst
purs-loader-78e2b0d91f5eb98674c5b05db0ef2c4f417581c0.zip
Handle multiple forced compiles on rebuild
Resolves #90
-rw-r--r--src/bundle.js2
-rw-r--r--src/compile.js2
-rw-r--r--src/ide.js8
-rw-r--r--src/index.js50
4 files changed, 42 insertions, 20 deletions
diff --git a/src/bundle.js b/src/bundle.js
index 3f55f01..99633f1 100644
--- a/src/bundle.js
+++ b/src/bundle.js
@@ -27,7 +27,7 @@ module.exports = function bundle(options, bundleModules) {
27 27
28 bundleModules.forEach(name => bundleArgs.push('--module', name)) 28 bundleModules.forEach(name => bundleArgs.push('--module', name))
29 29
30 debug('bundle: %s %o', bundleCommand, bundleArgs); 30 debug('bundle: %s %O', bundleCommand, bundleArgs);
31 31
32 return (new Promise((resolve, reject) => { 32 return (new Promise((resolve, reject) => {
33 debug('bundling PureScript...') 33 debug('bundling PureScript...')
diff --git a/src/compile.js b/src/compile.js
index 707605c..6759bf3 100644
--- a/src/compile.js
+++ b/src/compile.js
@@ -24,7 +24,7 @@ module.exports = function compile(psModule) {
24 24
25 const stderr = []; 25 const stderr = [];
26 26
27 debug('compile %s %o', compileCommand, compileArgs) 27 debug('compile %s %O', compileCommand, compileArgs)
28 28
29 return new Promise((resolve, reject) => { 29 return new Promise((resolve, reject) => {
30 debug('compiling PureScript...') 30 debug('compiling PureScript...')
diff --git a/src/ide.js b/src/ide.js
index ac80789..a2ccbe3 100644
--- a/src/ide.js
+++ b/src/ide.js
@@ -44,7 +44,7 @@ function spawnIdeClient(body, options) {
44 44
45 const stdout = []; 45 const stdout = [];
46 46
47 debug('ide client %s %o %o', ideClientCommand, ideClientArgs, body); 47 debug('ide client %s %o %O', ideClientCommand, ideClientArgs, body);
48 48
49 return new Promise((resolve, reject) => { 49 return new Promise((resolve, reject) => {
50 const ideClient = spawn(ideClientCommand, ideClientArgs); 50 const ideClient = spawn(ideClientCommand, ideClientArgs);
@@ -211,7 +211,7 @@ module.exports.rebuild = function rebuild(psModule) {
211 try { 211 try {
212 const parsed = JSON.parse(response); 212 const parsed = JSON.parse(response);
213 213
214 debugVerbose('parsed JSON response: %o', parsed); 214 debugVerbose('parsed JSON response: %O', parsed);
215 215
216 return Promise.resolve(parsed); 216 return Promise.resolve(parsed);
217 } 217 }
@@ -224,7 +224,7 @@ module.exports.rebuild = function rebuild(psModule) {
224 const result = Array.isArray(parsed.result) ? parsed.result : []; 224 const result = Array.isArray(parsed.result) ? parsed.result : [];
225 225
226 return Promise.map(result, (item, i) => { 226 return Promise.map(result, (item, i) => {
227 debugVerbose('formatting result %o', item); 227 debugVerbose('formatting result %O', item);
228 228
229 return formatIdeResult(item, options, i, result.length); 229 return formatIdeResult(item, options, i, result.length);
230 }).then(formatted => ({ 230 }).then(formatted => ({
@@ -254,7 +254,7 @@ module.exports.rebuild = function rebuild(psModule) {
254 254
255 return isModuleNotFound || isUnknownModule || isUnknownModuleImport; 255 return isModuleNotFound || isUnknownModule || isUnknownModuleImport;
256 })) { 256 })) {
257 debug('failed to rebuild because the module is unknown') 257 debug('module %s was not rebuilt because the module is unknown', psModule.name);
258 258
259 return Promise.reject(new UnknownModuleError()); 259 return Promise.reject(new UnknownModuleError());
260 } 260 }
diff --git a/src/index.js b/src/index.js
index 19a549e..f77e5f8 100644
--- a/src/index.js
+++ b/src/index.js
@@ -137,8 +137,8 @@ module.exports = function purescriptLoader(source, map) {
137 psModuleMap: cache.psModuleMap, 137 psModuleMap: cache.psModuleMap,
138 warnings: [], 138 warnings: [],
139 errors: [], 139 errors: [],
140 compilationStarted: cache.compilationStarted, 140 compilationStarted: false,
141 compilationFinished: cache.compilationFinished, 141 compilationFinished: false,
142 installed: cache.installed, 142 installed: cache.installed,
143 srcOption: cache.srcOption 143 srcOption: cache.srcOption
144 }; 144 };
@@ -217,8 +217,20 @@ module.exports = function purescriptLoader(source, map) {
217 }; 217 };
218 218
219 const rebuild = () => 219 const rebuild = () =>
220 ide.rebuild(psModule).catch(error => { 220 ide.rebuild(psModule)
221 .then(() =>
222 toJavaScript(psModule)
223 .then(psModule.load)
224 .catch(psModule.reject)
225 )
226 .catch(error => {
221 if (error instanceof ide.UnknownModuleError) { 227 if (error instanceof ide.UnknownModuleError) {
228 // Store the modules that trigger a recompile due to an
229 // unknown module error. We need to wait until compilation is
230 // done before loading these files.
231
232 cache.deferred.push(psModule);
233
222 if (!cache.compilationStarted) { 234 if (!cache.compilationStarted) {
223 cache.compilationStarted = true; 235 cache.compilationStarted = true;
224 236
@@ -233,28 +245,37 @@ module.exports = function purescriptLoader(source, map) {
233 cache.psModuleMap = map; 245 cache.psModuleMap = map;
234 }) 246 })
235 ) 247 )
236 .then(() => ide.load(psModule)) 248 .then(() =>
237 .then(() => psModule) 249 Promise.map(cache.deferred, psModule =>
250 ide.load(psModule)
251 .then(() => toJavaScript(psModule))
252 .then(psModule.load)
253 )
254 )
255 .catch(error => {
256 cache.deferred[0].reject(error);
257
258 cache.deferred.slice(1).forEach(psModule => {
259 psModule.reject(new Error('purs-loader failed'));
260 })
261 })
238 ; 262 ;
239 } 263 }
240 else { 264 else {
241 return Promise.resolve(psModule); 265 // The compilation has started. We must wait until it is
266 // done in order to ensure the module map contains all of
267 // the unknown modules.
242 } 268 }
243 } 269 }
244 else { 270 else {
245 debug('ide rebuild failed due to an unhandled error: %o', error); 271 debug('ide rebuild failed due to an unhandled error: %o', error);
246 272
247 return Promise.reject(error); 273 psModule.reject(error);
248 } 274 }
249 }) 275 })
250 ; 276 ;
251 277
252 connect() 278 connect().then(rebuild);
253 .then(rebuild)
254 .then(toJavaScript)
255 .then(psModule.load)
256 .catch(psModule.reject)
257 ;
258 } 279 }
259 else if (cache.compilationFinished) { 280 else if (cache.compilationFinished) {
260 debugVerbose('compilation is already finished, loading module %s', psModule.name); 281 debugVerbose('compilation is already finished, loading module %s', psModule.name);
@@ -292,7 +313,8 @@ module.exports = function purescriptLoader(source, map) {
292 ) 313 )
293 .then(() => 314 .then(() =>
294 Promise.map(cache.deferred, psModule => 315 Promise.map(cache.deferred, psModule =>
295 toJavaScript(psModule).then(psModule.load) 316 toJavaScript(psModule)
317 .then(psModule.load)
296 ) 318 )
297 ) 319 )
298 .catch(error => { 320 .catch(error => {