amd-optimize
Version:
An AMD (i.e. RequireJS) optimizer that's stream-friendly. Made for gulp. (WIP)
125 lines (99 loc) • 3.14 kB
text/coffeescript
_ = require("lodash")
b = require("ast-types").builders
escodegen = require("escodegen")
through = require("through2")
path = require("path")
vinylSourcemapsApply = require("vinyl-sourcemaps-apply")
module.exports = fixModule = (options = {}) ->
options = _.defaults(options,
wrapShim : true
)
through.obj( (module, enc, done) ->
if module.isShallow
done()
return
ast = module.file.ast
delete module.file.ast
if not module.hasDefine
defineReturnStatement = b.returnStatement(
if module.exports
b.identifier(module.exports)
else
null
)
if options.wrapShim and module.isShimmed
defineBody = ast.body.concat([defineReturnStatement])
else
defineBody = [defineReturnStatement]
defineCall = b.callExpression(
b.identifier("define")
[
b.literal(module.name)
b.arrayExpression(module.deps.map( (dep) -> b.literal(dep.name) ))
b.functionExpression(
null
[]
b.blockStatement(defineBody)
)
]
)
if options.wrapShim and module.isShimmed
ast.body = [b.expressionStatement(
defineCall
)]
else
ast.body.push(
b.expressionStatement(defineCall)
)
else if module.isAnonymous
module.astNodes.forEach((astNode) =>
if astNode.callee.name == "define" and
(
astNode.arguments.length == 1 or
(astNode.arguments.length == 2 and astNode.arguments[0].type == "ArrayExpression")
)
astNode.arguments = [
b.literal(module.name)
b.arrayExpression(module.deps.map( (dep) -> b.literal(dep.name) ))
_.last(astNode.arguments)
]
)
if module.hasDefine and module.isShimmed
ast.body = [b.expressionStatement(
b.callExpression(
b.memberExpression(
b.functionExpression(
null
[]
b.blockStatement(
ast.body
)
)
b.identifier("call")
false
)
[]
)
)]
sourceFile = module.file.clone()
sourceFile.sourceMap = module.file.sourceMap
if sourceFile.sourceMap
generatedCode = escodegen.generate(
ast,
comment: options.preserveComments
sourceMap : true
sourceMapWithCode : true
file : sourceFile.sourceMap.file
)
sourceFile.contents = new Buffer(generatedCode.code, "utf8")
vinylSourcemapsApply(sourceFile, generatedCode.map.toJSON())
else
sourceFile = module.file.clone()
sourceFile.contents = new Buffer(escodegen.generate(ast, { comment: options.preserveComments }), "utf8")
@push(sourceFile)
done()
)