UNPKG

2.66 kBJavaScriptView Raw
1var fs = require('node-fs');
2var path = require('path');
3var jsp = require('uglify-js').parser;
4var pro = require('uglify-js').uglify;
5var stylus = require('stylus');
6var jade = require('jade');
7var _ = require('underscore')._;
8
9var locals = require('./locals');
10
11var builders = {
12 javascript: buildJavaScript,
13 stylus: buildStylus,
14 jade: buildJade
15};
16
17module.exports = function build(root, config, names) {
18 config = config || {};
19 var file = path.join(root, 'mason.json');
20 var assets = require(file);
21
22 console.log('Mason: building assets in ' + file + '...');
23
24 names = names || Object.keys(assets);
25 names.forEach(function(name) {
26 var asset = assets[name];
27 var builder = asset && builders[asset.type];
28 if (builder) builder(root, name, asset, config);
29 });
30};
31
32function concatFiles(files) {
33 var total = '';
34 for (var i = 0; i < files.length; i++) {
35 contents = fs.readFileSync(files[i]);
36 // protect against missing semis... TODO: delegate this responsibility to the uglifier
37 total += contents + ';';
38 }
39 return total;
40}
41
42function writeFile(file_path, contents) {
43 var dir = path.dirname(file_path);
44 fs.mkdirSync(dir, 0777, true);
45 fs.writeFileSync(file_path, contents);
46}
47
48function compressJS(code) {
49 // parse the JS code into AST
50 var ast = jsp.parse(code);
51 // mangle names
52 ast = pro.ast_mangle(ast);
53 // compress
54 ast = pro.ast_squeeze(ast);
55 // generate JS from the compressed AST
56 return pro.gen_code(ast);
57}
58
59function buildJavaScript(root, name, asset, config) {
60 var sourceFiles = _.map(asset.source.src, function(src) {
61 return path.join(root, asset.source.base, src);
62 });
63 var destFile = path.join(root, asset.dest.base, asset.dest.src);
64
65 console.log(' -> ' + destFile);
66 var code = concatFiles(sourceFiles);
67 var compressed = compressJS(code);
68 writeFile(destFile, compressed);
69}
70
71function buildStylus(root, name, asset) {
72 var sourceFile = path.join(root, asset.source);
73 var destFile = path.join(root, asset.dest.base, asset.dest.src);
74
75 console.log(' -> ' + destFile);
76 var contents = fs.readFileSync(sourceFile, 'utf-8');
77 stylus(contents)
78 .set('filename', sourceFile)
79 .render(function(err, css) {
80 if (err) throw err;
81 writeFile(destFile, css);
82 });
83}
84
85function buildJade(root, name, asset, config) {
86 var sourceFile = path.join(root, asset.source);
87 var destFile = path.join(root, asset.dest.base, asset.dest.src);
88
89 console.log(' -> ' + destFile);
90 var contents = fs.readFileSync(sourceFile, 'utf-8');
91 var fn = jade.compile(contents, {
92 filename: sourceFile
93 });
94 var compiled = fn(locals(root, config));
95 writeFile(destFile, compiled);
96}
\No newline at end of file