]>
Commit | Line | Data |
---|---|---|
1 | 'use strict'; | |
2 | ||
3 | const path = require('path'); | |
4 | ||
5 | const Promise = require('bluebird'); | |
6 | ||
7 | const fs = Promise.promisifyAll(require('fs')); | |
8 | ||
9 | const globby = require('globby'); | |
10 | ||
11 | const debug = require('debug')('purs-loader') | |
12 | ||
13 | const srcModuleRegex = /(?:^|\n)module\s+([\w\.]+)/i | |
14 | ||
15 | function match(str) { | |
16 | const matches = str.match(srcModuleRegex); | |
17 | return matches && matches[1]; | |
18 | } | |
19 | module.exports.match = match; | |
20 | ||
21 | function makeMapEntry(filePurs) { | |
22 | const dirname = path.dirname(filePurs); | |
23 | ||
24 | const basename = path.basename(filePurs, '.purs'); | |
25 | ||
26 | const fileJs = path.join(dirname, `${basename}.js`); | |
27 | ||
28 | const result = Promise.props({ | |
29 | filePurs: fs.readFileAsync(filePurs, 'utf8'), | |
30 | fileJs: fs.readFileAsync(fileJs, 'utf8').catch(() => undefined) | |
31 | }).then(fileMap => { | |
32 | const sourcePurs = fileMap.filePurs; | |
33 | ||
34 | const sourceJs = fileMap.fileJs; | |
35 | ||
36 | const moduleName = match(sourcePurs); | |
37 | ||
38 | const map = {}; | |
39 | ||
40 | map[moduleName] = map[moduleName] || {}; | |
41 | ||
42 | map[moduleName].src = path.resolve(filePurs); | |
43 | ||
44 | if (sourceJs) { | |
45 | map[moduleName].ffi = path.resolve(fileJs); | |
46 | } | |
47 | ||
48 | return map; | |
49 | }); | |
50 | ||
51 | return result; | |
52 | } | |
53 | module.exports.makeMapEntry = makeMapEntry; | |
54 | ||
55 | function makeMap(src) { | |
56 | debug('loading PureScript source and FFI files from %o', src); | |
57 | ||
58 | const globs = [].concat(src); | |
59 | ||
60 | return globby(globs).then(paths => | |
61 | Promise.all(paths.map(makeMapEntry)).then(result => | |
62 | result.reduce(Object.assign, {}) | |
63 | ) | |
64 | ); | |
65 | } | |
66 | module.exports.makeMap = makeMap; |