]> git.immae.eu Git - github/fretlink/purs-loader.git/blame - lib/purs-module-map.js
Merge remote-tracking branch 'fretlink/master' into latest
[github/fretlink/purs-loader.git] / lib / purs-module-map.js
CommitLineData
d3f40b6f
CS
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};