/
pack.js
110 lines (109 loc) · 4.56 KB
/
pack.js
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
var encoding = 'utf-8';
var path = require('path');
var fs = require("fs");
var cleanCSS = require('clean-css');
var less = require("less");
module.exports = function() {
return {
onPackCallback: null,
asset: null,
css: function(files) {
try {
var content = this.mergeFiles(files);
if(this.asset.minify) content = cleanCSS.process(content);
this.output(content);
} catch (err) {
console.log("Error packing CSS", err);
}
},
js: function(files) {
try {
var content = this.mergeFiles(files);
if(this.asset.minify) {
var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;
var ast = jsp.parse(content); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
content = pro.gen_code(ast); // compressed code here
}
this.output(content);
} catch (err) {
for(var i=0; i<files.length; i++) {
try {
var file = files[i];
file = path.normalize(process.cwd() + '/' + file);
var content = fs.readFileSync(file, encoding);
var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;
var ast = jsp.parse(content); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
content = pro.gen_code(ast); // compressed code here
} catch(singleFileErr) {
console.log("Error packing JavaScript", {message: singleFileErr.message, line: singleFileErr.line, file: files[i]});
}
}
}
},
less: function() {
try {
var lessConfig = {},
self = this;
fs.readFile(process.cwd() + "/" + this.asset.pack, 'utf8', function(err, indexless) {
if(err) throw err;
var parser = new(less.Parser)({
paths: [process.cwd() +"/" + self.asset.watch],
rootpath: process.cwd() + "/" + path.dirname(self.asset.pack),
relativeUrls: false,
strictImports: false
});
parser.parse(indexless, function (err, tree) {
if (err) {
console.log("Error packing LESS", {message: err.message, line: err.line, file: err.filename});
return;
}
content = tree.toCSS({
compress: self.asset.minify,
yuicompress: self.asset.minify
});
self.output(content);
});
});
} catch(err) {
console.log("Error packing LESS", err);
}
},
def: function(files) {
try {
var content = this.mergeFiles(files);
this.output(content);
} catch(err) {
console.log("Error packing", err);
}
},
mergeFiles: function(files) {
var content = files.map(function(file) {
file = path.normalize(process.cwd() + '/' + file);
return fs.readFileSync(file, encoding);
});
content = content.join('\n');
return content;
},
output: function(content) {
console.log("----- save: " + this.asset.output);
fs.writeFileSync(process.cwd() + '/' + this.asset.output, content);
if(this.onPackCallback) this.onPackCallback(this.asset.output);
},
packit: function(a, files, callback) {
if(!Array.isArray(files)) files = [files];
this.asset = a;
this.onPackCallback = callback;
if(this[this.asset.type]) {
this[this.asset.type](files);
} else {
this.def(files);
}
}
}
}