codecombat/scripts/minify.coffee
2015-11-04 13:41:13 -08:00

61 lines
1.6 KiB
CoffeeScript

path = require 'path'
fs = require 'fs-extra'
_ = require 'lodash'
async = require 'async'
cores = require('os').cpus().length
child_process = require 'child_process'
root = path.join(__dirname, '..', 'public','javascripts');
dest = path.join(__dirname, '..', 'public','javascripts-min');
console.log root
dirStack = [path.join(root)]
files = []
while dirStack.length
dir = dirStack.pop()
contents = fs.readdirSync(dir)
for file in contents
fullPath = "#{dir}/#{file}"
stat = fs.statSync(fullPath)
if stat.isDirectory()
dirStack.push(fullPath)
else if /\.js$/.test(file)
files.push fullPath.replace root + '/', ''
jobs = _.map files, (file) ->
(cb2) ->
fpath = path.join(root, file)
dpath = path.join(dest, file)
smArgs = []
if fs.existsSync fpath + '.map'
smArgs = [
'--in-source-map', fpath + '.map',
'--source-map', dpath + '.map',
'--source-map-include-sources',
'--source-map-url', '/javascripts/' + file.replace('/\\/g', '/') + '.map'
]
args = [fpath, '-m', '-r', 'require' , '-b', 'beautify=false,semicolons=false'].concat smArgs, ['-o', dpath]
async.waterfall [
_.bind(fs.mkdirs, fs, path.dirname dpath),
(last, cb) ->
child = child_process.spawn 'uglifyjs', args, stdio:'inherit'
child.on 'close', (code) ->
if code == 0 then cb null
else cb code
child.on 'error', (err) ->
cb err
], cb2
async.parallelLimit jobs, cores, (err, res)->
if err
console.log "ERROR:", err
else
console.log "Done, minified " + jobs.length + " files."
fs.renameSync(root, root + "-old")
fs.renameSync(dest, root)
fs.removeSync(root + "-old")