aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/purs-module-map.js
diff options
context:
space:
mode:
authorCyril Sobierajewicz <cyril.sobierajewicz@fretlink.com>2018-12-03 16:07:05 +0100
committerCyril Sobierajewicz <cyril.sobierajewicz@fretlink.com>2018-12-03 16:07:05 +0100
commitd3f40b6f0b0f507308f8dfd91e9cf6d4745dbce8 (patch)
treed2239387b964c107986f0b5b92ed5bd2e0d0a673 /lib/purs-module-map.js
parent5c2f4e966ffec127ec561431187886c9053b01b9 (diff)
downloadpurs-loader-d3f40b6f0b0f507308f8dfd91e9cf6d4745dbce8.tar.gz
purs-loader-d3f40b6f0b0f507308f8dfd91e9cf6d4745dbce8.tar.zst
purs-loader-d3f40b6f0b0f507308f8dfd91e9cf6d4745dbce8.zip
Build v3.3.1
Diffstat (limited to 'lib/purs-module-map.js')
-rw-r--r--lib/purs-module-map.js78
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
3var path = require('path');
4
5var Promise = require('bluebird');
6
7var fs = Promise.promisifyAll(require('fs'));
8
9var globby = require('globby');
10
11var debug = require('debug')('purs-loader');
12
13var srcModuleRegex = /(?:^|\n)module\s+([\w\.]+)/i;
14
15var importModuleRegex = /(?:^|\n)\s*import\s+([\w\.]+)/ig;
16
17module.exports.matchModule = function matchModule(str) {
18 var matches = str.match(srcModuleRegex);
19 return matches && matches[1];
20};
21
22module.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
29module.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
68module.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