forked from influx6/jsconcat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjsconcat.js
executable file
·141 lines (108 loc) · 2.93 KB
/
jsconcat.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
var JsConcat = (function(fs,path,uglify){
var _uglify = uglify.uglify;
var _parser = uglify.parser;
var _isType = function(o,type){
return Object.prototype.toString.call(o).match(/\s([a-zA-Z]+)/)[1].toLowerCase() === type;
};
var getPath = function(p){
return fs.readFileSync(p,'utf8');
};
var _normalize_string = function(s){
return s.replace(/\s/g,"");
};
var _normalize_path = function(dir,root){
dir = _normalize_string(dir);
if(!root){
return path.normalize(path.resolve(dir));
}
return path.normalize(path.resolve(root,dir));
};
var initBuildDir = function(dir){
var p = _normalize_path(dir);
if(fs.existsSync(p)){
return true;
}else{
fs.mkdir(p);
}
};
var _getRequireConfig = function(config){
if(typeof config.src_dir != 'string' && typeof config.build_dir != 'string'){
throw new Error("Src_Dir and Build_dir are not strings!");
}
var config = config;
initBuildDir(config.build_dir);
return config;
};
var each = function(obj,callback,scope){
var attr;
if(_isType(obj,"array") || _isType(obj,"string")){
for(var i = 0; i < obj.length; i ++){
callback.call(scope,obj[i],obj,i);
}
}
else {
for(attr in obj){
callback.call(scope, attr,obj);
}
};
};
var _getStream = function(o,read,options){
if(!read){
return fs.createWriteStream(o,options)
}
else{
return fs.createReadStream(o,options);
}
};
var _use_uglify = function(code,build){
var ast,gen;
try{
ast = _parser.parse(code);
ast = _uglify.ast_mangle(ast);
ast = _uglify.ast_squeeze(ast,{no_warnings: false});
ast = _uglify.ast_squeeze_more(ast);
gen = _uglify.gen_code(ast);
return gen;
}catch(e){
e.message = "Error: " + e.message+ " at line: "+ e.line + " in file: "+build;
throw e.message;
}
};
var _compileConfig = function(config,build){
var config = _getRequireConfig(config);
var src_dir = _normalize_path(config.src_dir);
var dump="",input;
each(config.src, function(o,obj){
input = path.join(src_dir,o);
var data = getData(input);
_use_uglify(data,o);
dump += data;
});
if(config.uglify){
_compressConfig(dump,build,config.name);
}else{
fs.writeFileSync(build,dump);
}
}
var getData = function(file){
return fs.readFileSync(file,'utf8').toString();
};
var removefile = function(file){
fs.unlink(file);
};
var _compressConfig = function(data,build,file){
if(typeof data == 'string'){
var uglified = _use_uglify(data,file);
fs.writeFileSync(build,uglified,'utf8');
}
}
var compile = function(config){
var build_dir = _normalize_path(config.build_dir);
var build_file = path.join(build_dir,config.name);
var status = fs.existsSync(build_file);
if(status){ removefile(build_file); }
_compileConfig(config,build_file);
};
return { compile: compile }
})(require('fs'),require('path'),require('uglify-js'));
module.exports.JsConcat = JsConcat;