diff options
Diffstat (limited to 'lib/purs-module-map.js')
-rw-r--r-- | lib/purs-module-map.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/purs-module-map.js b/lib/purs-module-map.js new file mode 100644 index 0000000..cb06322 --- /dev/null +++ b/lib/purs-module-map.js | |||
@@ -0,0 +1,78 @@ | |||
1 | 'use strict'; | ||
2 | |||
3 | var path = require('path'); | ||
4 | |||
5 | var Promise = require('bluebird'); | ||
6 | |||
7 | var fs = Promise.promisifyAll(require('fs')); | ||
8 | |||
9 | var globby = require('globby'); | ||
10 | |||
11 | var debug = require('debug')('purs-loader'); | ||
12 | |||
13 | var srcModuleRegex = /(?:^|\n)module\s+([\w\.]+)/i; | ||
14 | |||
15 | var importModuleRegex = /(?:^|\n)\s*import\s+([\w\.]+)/ig; | ||
16 | |||
17 | module.exports.matchModule = function matchModule(str) { | ||
18 | var matches = str.match(srcModuleRegex); | ||
19 | return matches && matches[1]; | ||
20 | }; | ||
21 | |||
22 | module.exports.matchImports = function matchImports(str) { | ||
23 | var matches = str.match(importModuleRegex); | ||
24 | return (matches || []).map(function (a) { | ||
25 | return a.replace(/\n?\s*import\s+/i, ''); | ||
26 | }); | ||
27 | }; | ||
28 | |||
29 | module.exports.makeMapEntry = function makeMapEntry(filePurs) { | ||
30 | var dirname = path.dirname(filePurs); | ||
31 | |||
32 | var basename = path.basename(filePurs, '.purs'); | ||
33 | |||
34 | var fileJs = path.join(dirname, basename + '.js'); | ||
35 | |||
36 | var result = Promise.props({ | ||
37 | filePurs: fs.readFileAsync(filePurs, 'utf8'), | ||
38 | fileJs: fs.readFileAsync(fileJs, 'utf8').catch(function () { | ||
39 | return undefined; | ||
40 | }) | ||
41 | }).then(function (fileMap) { | ||
42 | var sourcePurs = fileMap.filePurs; | ||
43 | |||
44 | var sourceJs = fileMap.fileJs; | ||
45 | |||
46 | var moduleName = module.exports.matchModule(sourcePurs); | ||
47 | |||
48 | var imports = module.exports.matchImports(sourcePurs); | ||
49 | |||
50 | var map = {}; | ||
51 | |||
52 | map[moduleName] = map[moduleName] || {}; | ||
53 | |||
54 | map[moduleName].src = path.resolve(filePurs); | ||
55 | |||
56 | map[moduleName].imports = imports; | ||
57 | |||
58 | if (sourceJs) { | ||
59 | map[moduleName].ffi = path.resolve(fileJs); | ||
60 | } | ||
61 | |||
62 | return map; | ||
63 | }); | ||
64 | |||
65 | return result; | ||
66 | }; | ||
67 | |||
68 | module.exports.makeMap = function makeMap(src) { | ||
69 | debug('loading PureScript source and FFI files from %o', src); | ||
70 | |||
71 | var globs = [].concat(src); | ||
72 | |||
73 | return globby(globs).then(function (paths) { | ||
74 | return Promise.all(paths.map(module.exports.makeMapEntry)).then(function (result) { | ||
75 | return result.reduce(Object.assign, {}); | ||
76 | }); | ||
77 | }); | ||
78 | }; \ No newline at end of file | ||