Created
March 7, 2011 20:20
-
-
Save willbailey/859132 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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