]>
git.immae.eu Git - github/fretlink/purs-loader.git/blob - index.js
3 var os
= require('os');
5 var cp
= require('child_process');
7 var path
= require('path')
9 var fs
= require('fs');
11 var glob
= require('glob');
13 var lodash
= require('lodash');
15 var chalk
= require('chalk');
17 var lu
= require('loader-utils');
19 var cwd
= process
.cwd();
21 var MODULE_RE
= /(?:^|\n)module\s+([\w\.]+)/i;
23 var IMPORT_RE
= /^\s*import\s+(?:qualified\s+)?([\w\.]+)/i;
25 var BOWER_PATTERN
= path
.join('bower_components', 'purescript-*', 'src');
27 var PSC_MAKE
= 'psc-make';
29 var OUTPUT
= 'output';
32 'no-prelude': '--no-prelude',
33 'no-opts': '--no-opts',
34 'no-magic-do': '--no-magic-do',
36 'verbose-errors': '--verbose-errors',
40 function pattern(root
) {
41 var as
= [ BOWER_PATTERN
, root
];
42 return path
.join('{' + as
.join(',') + '}', '**', '*.purs');
45 function mkOptions(query
) {
46 return lodash
.foldl(lodash
.keys(query
), function(acc
, k
){
47 var h = function(v
){return acc
.concat(query
[k
] && OPTIONS
[k
] ? [v
] : []);}
48 if (k
=== OUTPUT
) return h(OPTIONS
[k
] + '=' + query
[k
]);
49 else return h(OPTIONS
[k
]);
53 function mkGraph(files
) {
56 files
.forEach(function(file
){
57 var source
= fs
.readFileSync(file
, {encoding: 'utf-8'});
59 var result
= MODULE_RE
.exec(source
);
61 var module
= result
? result
[1] : null;
64 lodash
.foldl(source
.split(os
.EOL
), function(b
, a
){
65 var result
= IMPORT_RE
.exec(a
);
66 if (result
) b
.push(result
[1]);
74 imports: imports
|| []
82 function findDeps(graph
, module
) {
83 function go(acc
, module
){
84 var node
= graph
[module
];
86 var imports
= node
&& node
.imports
;
88 if (lodash
.isEmpty(imports
)) return acc
;
91 lodash
.map(imports
, function(i
){
92 return go(acc
.concat(imports
), i
);
95 return lodash
.flatten(deps
);
99 return lodash
.unique(go([], module
));
102 function loader(source
) {
103 this.cacheable
&& this.cacheable();
105 this.clearDependencies();
107 this.addDependency(this.resourcePath
);
109 var callback
= this.async();
111 var request
= lu
.getRemainingRequest(this)
113 var root
= path
.dirname(path
.relative(cwd
, request
));
115 var query
= lu
.parseQuery(this.query
);
117 var opts
= mkOptions(query
);
121 glob(pattern(root
), function(e
, files
){
122 if (e
!== null) callback(e
);
124 var cmd
= cp
.spawn(PSC_MAKE
, opts
.concat(files
));
126 var graph
= mkGraph(files
);
128 cmd
.on('close', function(e
){
131 var result
= MODULE_RE
.exec(source
);
133 var module
= result
? result
[1] : '';
135 var dependencies
= findDeps(graph
, module
);
137 var indexPath
= path
.join(query
[OUTPUT
] || OUTPUT
, module
, 'index.js');
139 fs
.readFile(indexPath
, 'utf-8', function(e
, output
){
142 dependencies
.forEach(function(dep
){
143 var module
= graph
[dep
];
144 if (module
) that
.addDependency(path
.resolve(module
.file
));
147 callback(null, output
);
153 cmd
.stdout
.on('data', function(stdout
){
154 console
.log('Stdout from \'' + chalk
.cyan(PSC_MAKE
) + '\'\n' + chalk
.magenta(stdout
));
157 cmd
.stderr
.on('data', function(stderr
){
158 console
.log('Stderr from \'' + chalk
.cyan(PSC_MAKE
) + '\'\n' + chalk
.magenta(stderr
));
164 module
.exports
= loader
;