aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/index.js
diff options
context:
space:
mode:
authoreric thul <thul.eric@gmail.com>2017-02-12 18:05:07 -0500
committereric thul <thul.eric@gmail.com>2017-02-19 12:09:16 -0500
commit8e21ab0ab3f8ba9d129f1cf3b59f87d7a2b5bfc2 (patch)
tree0db1cffab8462d919299ab87eba42200748be632 /src/index.js
parenta3c358f80f8197d5a1d05e42916cd5593b5b2dd5 (diff)
downloadpurs-loader-8e21ab0ab3f8ba9d129f1cf3b59f87d7a2b5bfc2.tar.gz
purs-loader-8e21ab0ab3f8ba9d129f1cf3b59f87d7a2b5bfc2.tar.zst
purs-loader-8e21ab0ab3f8ba9d129f1cf3b59f87d7a2b5bfc2.zip
Ensure that all imported files are watched
In order to handle the case where a new PureScript file is imported, but fails to compile, the purs-loader now tracks imports for each PureScript file in order to append any additional imports to the resulting JS. This ensures that webpack will watch the new file even before it successfully compiles.
Diffstat (limited to 'src/index.js')
-rw-r--r--src/index.js61
1 files changed, 1 insertions, 60 deletions
diff --git a/src/index.js b/src/index.js
index 249f472..3f5e6a8 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,18 +3,15 @@
3const debug = require('debug')('purs-loader') 3const debug = require('debug')('purs-loader')
4const loaderUtils = require('loader-utils') 4const loaderUtils = require('loader-utils')
5const Promise = require('bluebird') 5const Promise = require('bluebird')
6const fs = Promise.promisifyAll(require('fs'))
7const path = require('path') 6const path = require('path')
8const jsStringEscape = require('js-string-escape')
9const PsModuleMap = require('./PsModuleMap'); 7const PsModuleMap = require('./PsModuleMap');
10const Psc = require('./Psc'); 8const Psc = require('./Psc');
11const PscIde = require('./PscIde'); 9const PscIde = require('./PscIde');
10const toJavaScript = require('./to-javascript');
12const dargs = require('./dargs'); 11const dargs = require('./dargs');
13const spawn = require('cross-spawn').sync 12const spawn = require('cross-spawn').sync
14const eol = require('os').EOL 13const eol = require('os').EOL
15 14
16const requireRegex = /require\(['"]\.\.\/([\w\.]+)['"]\)/g
17
18module.exports = function purescriptLoader(source, map) { 15module.exports = function purescriptLoader(source, map) {
19 const callback = this.async() 16 const callback = this.async()
20 const config = this.options 17 const config = this.options
@@ -164,59 +161,3 @@ module.exports = function purescriptLoader(source, map) {
164 }) 161 })
165 } 162 }
166} 163}
167
168function updatePsModuleMap(psModule) {
169 const options = psModule.options
170 const cache = psModule.cache
171 const filePurs = psModule.srcPath
172 if (!cache.psModuleMap) {
173 debug('module mapping does not exist');
174 return PsModuleMap.makeMap(options.src).then(map => {
175 cache.psModuleMap = map;
176 return cache.psModuleMap;
177 });
178 }
179 else {
180 return PsModuleMap.makeMapEntry(filePurs).then(result => {
181 const map = Object.assign(cache.psModuleMap, result)
182 cache.psModuleMap = map;
183 return cache.psModuleMap;
184 });
185 }
186}
187
188// The actual loader is executed *after* purescript compilation.
189function toJavaScript(psModule) {
190 const options = psModule.options
191 const cache = psModule.cache
192 const bundlePath = path.resolve(options.bundleOutput)
193 const jsPath = cache.bundle ? bundlePath : psModule.jsPath
194
195 debug('loading JavaScript for', psModule.name)
196
197 return Promise.props({
198 js: fs.readFileAsync(jsPath, 'utf8'),
199 psModuleMap: updatePsModuleMap(psModule)
200 }).then(result => {
201 let js = ''
202
203 if (options.bundle) {
204 // if bundling, return a reference to the bundle
205 js = 'module.exports = require("'
206 + jsStringEscape(path.relative(psModule.srcDir, options.bundleOutput))
207 + '")["' + psModule.name + '"]'
208 } else {
209 // replace require paths to output files generated by psc with paths
210 // to purescript sources, which are then also run through this loader.
211 js = result.js
212 .replace(requireRegex, (m, p1) => {
213 return 'require("' + jsStringEscape(result.psModuleMap[p1].src) + '")'
214 })
215 .replace(/require\(['"]\.\/foreign['"]\)/g, (m, p1) => {
216 return 'require("' + jsStringEscape(result.psModuleMap[psModule.name].ffi) + '")'
217 })
218 }
219
220 return js
221 })
222}