UNPKG

2.95 kBJavaScriptView Raw
1// Dependencies ---------------------------------------------------------------
2var path = require('path'),
3 less = require('less'),
4 jade = require('jade'),
5 uglifyjs = require('uglify-js'),
6 Task = require('../lib/task/Task'),
7 util = require('../lib/util');
8
9
10// Built-in compilers ---------------------------------------------------------
11var types = {
12
13 js: {
14
15 mode: Task.Each,
16
17 data: function(e) {
18 return !e.options.compress;
19 },
20
21 map: function(e, file) {
22 if (e.options.compress) {
23 return [file.replace(/\.js$/, '.min.js'), file + '.map'];
24
25 } else {
26 return file;
27 }
28 },
29
30 run: function(e, done) {
31
32 if (e.options.compress) {
33
34 var m = uglifyjs.minify(e.path, {
35 sourceRoot: path.dirname(e.options.dest),
36 outSourceMap: path.basename(e.path)
37 });
38
39 // TODO copy source files so they can be found by the dev tools
40 done(null, [
41 m.code + '\n//@ sourceMappingURL=' + path.basename(e.mapped[1])
42 + '\n//# sourceMappingURL=' + path.basename(e.mapped[1]),
43
44 m.map.toString()
45 ]);
46
47 } else {
48 done(null, e.data.toString());
49 }
50
51 }
52
53 },
54
55 less: {
56
57 mode: Task.Each,
58 data: true,
59
60 map: function(e, file) {
61 return file.replace(/\.less$/, '.css');
62 },
63
64 run: function(e, done) {
65
66 var parser = new less.Parser({
67 paths: [e.options.src],
68 filename: e.source
69 });
70
71 // TODO support source maps
72 parser.parse(e.data.toString(), function(err, tree) {
73 done(err, err || tree.toCSS({
74 sourceMap: true,
75 compress: e.options.compress
76 }));
77 });
78
79 }
80
81 },
82
83 jade: {
84
85 mode: Task.Each,
86 data: true,
87
88 map: function(e, file) {
89 return file.replace(/\.jade$/, '.html');
90 },
91
92 run: function(e, done) {
93
94 try {
95 var locals = util.merge(e.config, {
96 pretty: !e.options.compress,
97 substrat: e.substrat
98 });
99
100 done(null, jade.render(e.data.toString(), locals));
101
102 } catch(err) {
103 done(err);
104 }
105
106 }
107
108 }
109
110};
111
112
113// Factory --------------------------------------------------------------------
114module.exports = {
115
116 task: function(pattern, type, config) {
117
118 if (!types.hasOwnProperty(type)) {
119 throw new Error('No compiler found for type "' + type + '"');
120
121 } else {
122 return new Task('Compile: ' + type, pattern, types[type], config);
123 }
124
125 }
126
127};
128