diff options
-rw-r--r-- | README.md | 8 | ||||
-rw-r--r-- | src/index.js | 34 |
2 files changed, 28 insertions, 14 deletions
@@ -37,6 +37,8 @@ const webpackConfig = { | |||
37 | } | 37 | } |
38 | ``` | 38 | ``` |
39 | 39 | ||
40 | ### Options | ||
41 | |||
40 | Default options: | 42 | Default options: |
41 | 43 | ||
42 | ```javascript | 44 | ```javascript |
@@ -45,6 +47,7 @@ Default options: | |||
45 | pscArgs: {}, | 47 | pscArgs: {}, |
46 | pscBundle: 'psc-bundle', | 48 | pscBundle: 'psc-bundle', |
47 | pscBundleArgs: {}, | 49 | pscBundleArgs: {}, |
50 | pscIde: false, // instant rebuilds using psc-ide-server (experimental) | ||
48 | pscIdeColors: false, // defaults to true if psc === 'psa' | 51 | pscIdeColors: false, // defaults to true if psc === 'psa' |
49 | bundleOutput: 'output/bundle.js', | 52 | bundleOutput: 'output/bundle.js', |
50 | bundleNamespace: 'PS', | 53 | bundleNamespace: 'PS', |
@@ -61,3 +64,8 @@ Default options: | |||
61 | ], | 64 | ], |
62 | } | 65 | } |
63 | ``` | 66 | ``` |
67 | |||
68 | ### Instant rebuilds (experimental) | ||
69 | |||
70 | Experimental support for instant rebuilds using `psc-ide-server` can be enabled | ||
71 | via the `pscIde: true` option. | ||
diff --git a/src/index.js b/src/index.js index 17951d3..9db8a63 100644 --- a/src/index.js +++ b/src/index.js | |||
@@ -25,6 +25,7 @@ module.exports = function purescriptLoader(source, map) { | |||
25 | pscArgs: {}, | 25 | pscArgs: {}, |
26 | pscBundle: 'psc-bundle', | 26 | pscBundle: 'psc-bundle', |
27 | pscBundleArgs: {}, | 27 | pscBundleArgs: {}, |
28 | pscIde: false, | ||
28 | pscIdeColors: webpackOptions.psc === 'psa' || query.psc === 'psa', | 29 | pscIdeColors: webpackOptions.psc === 'psa' || query.psc === 'psa', |
29 | pscIdeArgs: {}, | 30 | pscIdeArgs: {}, |
30 | bundleOutput: 'output/bundle.js', | 31 | bundleOutput: 'output/bundle.js', |
@@ -56,7 +57,7 @@ module.exports = function purescriptLoader(source, map) { | |||
56 | // invalidate loader cache when bundle is marked as invalid (in watch mode) | 57 | // invalidate loader cache when bundle is marked as invalid (in watch mode) |
57 | this._compiler.plugin('invalid', () => { | 58 | this._compiler.plugin('invalid', () => { |
58 | cache = config.purescriptLoaderCache = { | 59 | cache = config.purescriptLoaderCache = { |
59 | rebuild: true, | 60 | rebuild: options.pscIde, |
60 | deferred: [], | 61 | deferred: [], |
61 | ideServer: cache.ideServer | 62 | ideServer: cache.ideServer |
62 | } | 63 | } |
@@ -216,13 +217,19 @@ function rebuild(psModule) { | |||
216 | const ideClient = spawn('psc-ide-client', args) | 217 | const ideClient = spawn('psc-ide-client', args) |
217 | 218 | ||
218 | ideClient.stdout.once('data', data => { | 219 | ideClient.stdout.once('data', data => { |
219 | const res = JSON.parse(data.toString()) | 220 | let res = null |
220 | debug(res) | ||
221 | 221 | ||
222 | if (!Array.isArray(res.result)) { | 222 | try { |
223 | res = JSON.parse(data.toString()) | ||
224 | debug(res) | ||
225 | } catch (err) { | ||
226 | return reject(err) | ||
227 | } | ||
228 | |||
229 | if (res && !Array.isArray(res.result)) { | ||
223 | return res.resultType === 'success' | 230 | return res.resultType === 'success' |
224 | ? resolve(psModule) | 231 | ? resolve(psModule) |
225 | : reject(res) | 232 | : reject('psc-ide rebuild failed') |
226 | } | 233 | } |
227 | 234 | ||
228 | Promise.map(res.result, (item, i) => { | 235 | Promise.map(res.result, (item, i) => { |
@@ -231,8 +238,15 @@ function rebuild(psModule) { | |||
231 | }) | 238 | }) |
232 | .then(compileMessages => { | 239 | .then(compileMessages => { |
233 | if (res.resultType === 'error') { | 240 | if (res.resultType === 'error') { |
241 | if (res.result.some(item => item.errorCode === 'UnknownModule')) { | ||
242 | console.log('Unknown module, attempting full recompile') | ||
243 | return compile(psModule) | ||
244 | .then(() => request({ command: 'load' })) | ||
245 | .then(resolve) | ||
246 | .catch(() => reject('psc-ide rebuild failed')) | ||
247 | } | ||
234 | cache.errors = compileMessages | 248 | cache.errors = compileMessages |
235 | reject(res) | 249 | reject('psc-ide rebuild failed') |
236 | } else { | 250 | } else { |
237 | cache.warnings = compileMessages | 251 | cache.warnings = compileMessages |
238 | resolve(psModule) | 252 | resolve(psModule) |
@@ -251,14 +265,6 @@ function rebuild(psModule) { | |||
251 | params: { | 265 | params: { |
252 | file: psModule.srcPath, | 266 | file: psModule.srcPath, |
253 | } | 267 | } |
254 | }).catch(res => { | ||
255 | if (res.resultType === 'error') { | ||
256 | if (res.result.some(item => item.errorCode === 'UnknownModule')) { | ||
257 | console.log('Unknown module, attempting full recompile') | ||
258 | return compile(psModule).then(() => request({ command: 'load' })) | ||
259 | } | ||
260 | } | ||
261 | return Promise.resolve(psModule) | ||
262 | }) | 268 | }) |
263 | } | 269 | } |
264 | 270 | ||