/
javascripts
executable file
·132 lines (110 loc) · 3.57 KB
/
javascripts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env node
var babel = require('babel-core');
var browserify = require('browserify');
var fse = require('fs-extra');
var log = require('./log');
var path = require('path');
'use strict';
/**
* Create a transpiler object binded to a `srcDirectory` and a `distDirectory`
*/
function getTranspiler(srcDirectory, distDirectory, isAllowed, babelOptions, browserifyOptions) {
/**
* Returns the name of the target transpiled file
*/
function getTarget(filename) {
var relFilename = path.relative(srcDirectory, filename);
var outFilename = path.join(distDirectory, relFilename);
return outFilename;
}
/**
* returns the transpiler to be consumed.
*/
var transpiler = {
/**
* Transpile the given file from es6 to es5. If the given stack is not empty
* call the method recursively till its empty. When the stack is empty,
* execute the callback.
*/
transpile: function(filename, stack, callback) {
/**
* If stack is not empty transpile the next entry, else execute the
* callback if any.
*/
function next() {
if (stack && stack.length > 0)
transpiler.transpile(stack.shift(), stack, callback);
else if (stack.length === 0 && callback)
callback();
}
if (filename === undefined || !isAllowed(filename))
return next();
var outFilename = getTarget(filename);
var startTime = new Date().getTime();
babel.transformFile(filename, babelOptions, function(err, result) {
if (err)
return log.transpileError(err);
fse.outputFile(outFilename, result.code, function(err) {
if (err)
return console.error(err.message);
log.transpileSuccess(filename, outFilename, startTime);
next();
});
});
},
/**
* Transform a given file to it's browserified version, client only.
* Only clients have their browserified counterparts, each folder in `src/client`
* is considered has a separate browserified client file. The `index.js` in each
* folder defines the entry point of the particular client. The browserified
* file is name after the name of the folder.
*/
bundle: function(entryPoint, outFilename, callback) {
if (entryPoint === undefined || !isAllowed(entryPoint))
return;
var bundler = browserify(entryPoint, browserifyOptions);
var startTime = new Date().getTime();
log.bundleStart(outFilename);
fse.ensureFileSync(outFilename); // ensure file exists
var writeStream = fse.createWriteStream(outFilename);
bundler
.bundle()
.on('error', function(err) {
log.bundleError(outFilename, err);
})
.on('end', function() {
log.bundleSuccess(outFilename, startTime);
})
.pipe(writeStream);
writeStream.on('finish', function() {
if (callback)
callback();
});
},
/**
* Delete the transpiled file.
*/
delete: function(filename, callback) {
var outFilename = getTarget(filename);
fse.stat(outFilename, function(err, stats) {
if (err)
return console.log(err.message);
if (stats.isFile()) {
fse.remove(outFilename, function(err) {
if (err)
return console.log(err.message);
log.deleteFile(outFilename);
if (callback)
callback();
});
} else {
callback();
}
});
},
};
return transpiler;
}
module.exports = {
getTranspiler: getTranspiler
};