ninjs-rjs
Version:
requirejs build wrapper
78 lines (64 loc) • 2.62 kB
JavaScript
/**
* RequireJS Build
* App Rjs (RequireJS, r.js optimizer) Task
* builds/optimizes js (based on require/AMD)
*/
const _ = require('ninjs-lodash')
const requirejs = require('requirejs')
const OPTIMIZE_VALS = _.$('rjs.optimize_options')
const OPTIMIZE_MAP = _.$('rjs.file_suffix_map')
const RESULT_KEY_ORDER = _.$('rjs.result_key_order')
const DEF_OPTIONS = _.$('rjs.options')
exports = module.exports = {
render: render,
renderApp: renderApp
}
// run rjs optimizer
function render(options, callback) {
let start = _.now()
let params = _.mcopy(DEF_OPTIONS, options)
let path = _.get(params, 'out') || ''
return requirejs.optimize(params, (result) => {
let files = _.drop(_.compact(result.replace('----------------', '').split('\n')))
files = _.map(files, (file) => { return _.path.resolve(file) })
let stat = _.statSync(path)
let bytes = _.get(stat, 'size') || 0
_.done({ path: path, files: files, duration: _.nowDiff(start), bytes:bytes, size: _.bytes(bytes) }, callback)
},
(err) => { return _.fail(err, callback) })
}
// run rjs optimizer for each optimize options
// scripts.js -> non-optimized build useful for debugging build output
// scripts.min.js -> uglify build
function renderApp(options, callback) {
let { baseUrl, out } = options
if(!baseUrl) return _.fail('Invalid baseUrl', callback)
if(!out) return _.fail('Invalid out', callback)
let start = _.now()
let ex = _.path.ex(out)
let dir = ex ? _.path.dir(out) : dir
let name = ex ? _.path.name(out) : 'scripts'
let res = { baseUrl: baseUrl, out: out, duration: 0, bytes: 0, size: '', files: [], results: {} }
let tasks = _.reduce(OPTIMIZE_VALS, (result, v) => {
let mapped = _.get(OPTIMIZE_MAP, v) || ''
let optimizeVal = mapped ? `${name}.${mapped}.js` : `${name}.js`
result[v] = _.async.apply(render, _.mcopy(options, { optimize: v, out: _.path.join(dir, optimizeVal) }))
res.results[v] = { path: "", duration: 0, bytes: 0, size: "" }
return result
}, {})
return _.async.parallel(tasks, (err, result) => {
if(err) return _.fail(err, callback)
_.each(OPTIMIZE_VALS, (v) => {
let oResult = _.get(result, v)
res.files = _.get(oResult, 'files') || []
res.results[v] = _.omit(oResult, ['files'])
})
_.each(res.files, (file) => {
let bytes = _.get(_.statSync(file), 'size') || 0
res.bytes = res.bytes + bytes
})
_.assign(res, { size: _.bytes(res.bytes), duration: _.nowDiff(start) })
_.done(res, callback)
})
}