module.exports = function( grunt ) {
"use strict";
var fs = require( "fs" ),
requirejs = require( "requirejs" ),
pkg = require( "../package.json" ),
srcFolder = __dirname + "/../src/",
rdefineEnd = /\n\}\s*?\);[^}\w]*$/,
read = function( fileName ) {
return grunt.file.read( srcFolder + fileName );
},
wrapper = read( "wrapper.js" ).split( /\/\/ \@CODE\n\/\/[^\n]+\n/ ),
config = {
baseUrl: "src",
name: pkg.name,
paths: {
jquery : 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min'
},
optimize: "none",
findNestedDependencies: true,
skipModuleInsertion: true,
skipSemiColonInsertion: true,
wrap: {
start: wrapper[ 0 ].replace( /\/\*jshint .* \*\/\n/, "" ),
end: wrapper[ 1 ]
},
rawText: {},
onBuildWrite: convert
};
function convert( name, path, contents ) {
var amdName;
if ( /.\/var\//.test( path.replace( process.cwd(), "" ) ) ) {
contents = contents
.replace( /define\([\w\W]*?return undefined\s*;/, " var " + ( /var\/([\w-]+)/.exec( name )[ 1 ] ) + ";" )
.replace( /define\([\w\W]*?return/, " var " + ( /var\/([\w-]+)/.exec( name )[ 1 ] ) + " =" )
.replace( rdefineEnd, "" );
} else if ( /.\/function\//.test( path.replace( process.cwd(), "" ) ) ) {
contents = contents
.replace( /define\([\w\W]*?return function/, " function " + ( /function\/([\w-]+)/.exec( name )[ 1 ] ) + "")
.replace( rdefineEnd, "" );
contents = contents
.replace( /define\(\[[^\]]*\]\)[\W\n]+$/, "" );
} else {
contents = contents
.replace( /\s*return\s+[^\}]+(\}\s*?\);[^\w\}]*)$/, "$1" )
.replace( /\s*exports\.\w+\s*=\s*\w+;/g, "" );
contents = contents
.replace( /define\([^{]*?{/, "" )
.replace( rdefineEnd, "" );
contents = contents
.replace( /\/\*\s*ExcludeStart\s*\*\/[\w\W]*?\/\*\s*ExcludeEnd\s*\*\//ig, "" )
.replace( /\/\/\s*BuildExclude\n\r?[\w\W]*?\n\r?/ig, "" );
contents = contents
.replace( /define\(\[[^\]]*\]\)[\W\n]+$/, "" );
}
if ( ( amdName = grunt.option( "amd" ) ) != null && /^exports\/amd$/.test( name ) ) {
contents = contents
.replace( new RegExp('/(\s*)"' + pkg.name + '"(\,\s*)/'),
amdName ? "$1\"" + amdName + "\"$2" : "" );
}
return contents;
}
grunt.registerMultiTask(
"build",
"Concatenate source, remove sub AMD definitions, " +
"(include/exclude modules with +/- flags), embed date/version",
function() {
var flag, index,
done = this.async(),
flags = this.flags,
name = grunt.option( "filename" ),
minimum = this.data.minimum,
removeWith = this.data.removeWith,
excluded = [],
included = [],
version = grunt.config( "pkg.version" ),
excludeList = function( list, prepend ) {
if ( list ) {
prepend = prepend ? prepend + "/" : "";
list.forEach( function( module ) {
if ( module === "var" ) {
excludeList(
fs.readdirSync( srcFolder + prepend + module ), prepend + module
);
return;
}
if ( prepend ) {
if ( !( module = /([\w-\/]+)\.js$/.exec( module ) ) ) {
return;
}
module = prepend + module[ 1 ];
}
if ( excluded.indexOf( module ) === -1 ) {
excluder( "-" + module );
}
} );
}
},
excluder = function( flag ) {
var m = /^(\+|\-|)([\w\/-]+)$/.exec( flag ),
exclude = m[ 1 ] === "-",
module = m[ 2 ];
if ( exclude ) {
if ( minimum.indexOf( module ) === -1 ) {
if ( excluded.indexOf( module ) === -1 ) {
grunt.log.writeln( flag );
excluded.push( module );
try {
excludeList( fs.readdirSync( srcFolder + module ), module );
} catch ( e ) {
grunt.verbose.writeln( e );
}
}
excludeList( removeWith[ module ] );
} else {
grunt.log.error( "Module \"" + module + "\" is a minimum requirement." );
if ( module === "selector" ) {
grunt.log.error(
"If you meant to replace Sizzle, use -sizzle instead."
);
}
}
} else {
grunt.log.writeln( flag );
included.push( module );
}
};
name = name ? ( "dist/" + name ) : this.data.dest;
if ( process.env.COMMIT ) {
version += " " + process.env.COMMIT;
}
delete flags[ "*" ];
for ( flag in flags ) {
excluder( flag );
}
grunt.verbose.writeflags( excluded, "Excluded" );
grunt.verbose.writeflags( included, "Included" );
if ( excluded.length ) {
version += " -" + excluded.join( ",-" );
grunt.config.set( "pkg.version", version );
grunt.verbose.writeln( "Version changed to " + version );
config.excludeShallow = excluded;
}
config.include = included;
config.out = function( compiled ) {
compiled = compiled
.replace( /@VERSION/g, version )
.replace( /@DATE/g, ( new Date() ).toISOString().replace( /:\d+\.\d+Z$/, "Z" ) );
grunt.file.write( name, compiled );
};
requirejs.optimize( config, function( response ) {
grunt.verbose.writeln( response );
grunt.log.ok( "File '" + name + "' created." );
done();
}, function( err ) {
done( err );
} );
} );
};