]>
Commit | Line | Data |
---|---|---|
d3f40b6f CS |
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 | }; |