Skip to content

Instantly share code, notes, and snippets.

@willbailey
Created March 7, 2011 20:20
Show Gist options
  • Save willbailey/859132 to your computer and use it in GitHub Desktop.
Save willbailey/859132 to your computer and use it in GitHub Desktop.
#!/usr/bin/env node
var fs = require('fs');
var exec = require('child_process').exec;
// handle args
var continuous = process.argv.indexOf('--watch') !== -1 ? true : false;
var minify = process.argv.indexOf('--minify') !== -1 ? true : false;
var releaseTarget = __dirname + '/release/';
var jsTarget = releaseTarget + 'bolt.js';
var cssTarget = releaseTarget + 'bolt.css';
var sources = [__dirname + '/vendor/iscroll.js',
__dirname + '/vendor/JX.js',
__dirname + '/vendor/_.js',
__dirname + '/src'];
try {
fs.mkdirSync(releaseTarget, 0755);
} catch (e) {
}
var listFiles = function(path, match) {
var files = [];
var stats = fs.statSync(path);
if (stats.isDirectory()) {
var paths = fs.readdirSync(path);
paths.forEach(function(subpath) {
files = files.concat(listFiles(path + '/' + subpath, match));
});
} else {
if (path.match(match)) {
files.push(path);
}
}
return files;
};
var lastChange = {};
var detectChanges = function(files) {
var changed = false;
files.forEach(function(file) {
var stats = fs.statSync(file);
if (!lastChange[file] || lastChange[file] < stats.mtime) {
lastChange[file] = stats.mtime;
changed = true;
}
});
return changed;
};
var compileCSS = function(files) {
files = files.sort();
var contents = [];
files.forEach(function(file) {
var content = fs.readFileSync(file,'utf8');
contents.push(content);
});
fs.writeFileSync(cssTarget, contents.join(''));
}
var compileImages = function(files) {
files.forEach(function(file) {
cmd = 'cp ' + file + ' ' + releaseTarget;
exec(cmd, function() {});
});
}
var minifyJS = function(code) {
var jsp = require('uglify-js').parser;
var pro = require('uglify-js').uglify;
var ast = jsp.parse(code); // 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
code = pro.gen_code(ast); // compressed code here
return code;
}
var compileJS = function(files, stripRegex) {
var contents = [];
var cjsAPI = '';
cjsAPI += 'var global = this;\n';
cjsAPI += 'function requireCss(){}\n';
cjsAPI += 'function require(index) {\n';
cjsAPI += ' index = index.replace(\'./\',\'\');\n';
cjsAPI += ' if (!require.cache[index]) {\n';
cjsAPI += ' var module = require.cache[index] = {exports: {}};\n';
cjsAPI += ' require.modules[index].call(module.exports, global, module);\n';
cjsAPI += ' }\n';
cjsAPI += ' return require.cache[index].exports;\n';
cjsAPI += '}\n';
cjsAPI += 'require.modules = {};\n';
cjsAPI += 'require.cache = {};\n';
contents.push(cjsAPI);
files.forEach(function(file) {
var content = fs.readFileSync(file,'utf8');
var moduleName = file.replace(stripRegex, '');
moduleName = moduleName.replace(/.js$/, '');
var code = 'require.modules[\'' + moduleName + '\'] = (function(global, module){'
code += '\nvar exports = this;\n' + content + '\n})\n';
contents.push(code);
});
var code = contents.join('');
if (minify) {
code = minifyJS(code);
}
fs.writeFileSync(jsTarget, code);
};
var recompileIfChanged = function(sources) {
var files = [];
sources.forEach(function(src) {
files = files.concat(listFiles(src, /js$|png$|gif$|jpg$|css$/));
});
var js = [], css = [], images = [];
files.forEach(function(file) {
if (file.match(/css$/)) {
css.push(file);
} else if (file.match(/js$/)) {
js.push(file);
} else if (file.match(/png$|jpg$|gif$/)) {
images.push(file);
}
});
var changed = detectChanges(js);
if (changed) {
console.log('compiling js...');
compileJS(js, new RegExp(__dirname + '/(src|vendor)/'));
}
changed = detectChanges(css);
if (changed) {
console.log('compiling css...');
compileCSS(css);
}
changed = detectChanges(images);
if (changed) {
console.log('compiling images...');
compileImages(images);
}
}
if (continuous) {
while(true) {
recompileIfChanged(sources);
}
} else {
recompileIfChanged(sources);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment