@@ -0,0 +1,50 @@
module.exports = function( grunt ) {

"use strict";

grunt.registerTask( "testswarm", function( commit, configFile ) {
var jobName,
testswarm = require( "testswarm" ),
runs = {},
done = this.async(),
pull = /PR-(\d+)/.exec( commit ),
config = grunt.file.readJSON( configFile ).jquery,
tests = grunt.config([ this.name, "tests" ]);

if ( pull ) {
jobName = "jQuery pull <a href='https://github.com/jquery/jquery/pull/" +
pull[ 1 ] + "'>#" + pull[ 1 ] + "</a>";
} else {
jobName = "jQuery commit #<a href='https://github.com/jquery/jquery/commit/" +
commit + "'>" + commit.substr( 0, 10 ) + "</a>";
}

tests.forEach(function( test ) {
runs[ test ] = config.testUrl + commit + "/test/index.html?module=" + test;
});

testswarm.createClient( {
url: config.swarmUrl,
pollInterval: 10000,
timeout: 1000 * 60 * 30
} )
.addReporter( testswarm.reporters.cli )
.auth( {
id: config.authUsername,
token: config.authToken
})
.addjob(
{
name: jobName,
runs: runs,
runMax: config.runMax,
browserSets: config.browserSets
}, function( err, passed ) {
if ( err ) {
grunt.log.error( err );
}
done( passed );
}
);
});
};
@@ -0,0 +1,54 @@
module.exports = function( grunt ) {

"use strict";

var fs = require( "fs" );

// Work around grunt-contrib-uglify sourceMap issues (jQuery #13776)
grunt.registerMultiTask( "pre-uglify", function() {
var banner = this.options().banner;

this.files.forEach(function( mapping ) {
// Join src
var input = mapping.src.map(function( file ) {
var contents = grunt.file.read( file );

// Strip banners
return contents
// Remove the main jQuery banner, it'll be replaced by the new banner anyway.
.replace( /^\/\*![\W\w]*?\*\/\n?/g, "" )
// Strip other banners preserving line count.
.replace( /^\/\*!(?:.|\n)*?\*\/\n?/gm, function ( match ) {
return match.replace( /[^\n]/gm, "" );
});
}).join("\n");

// Write temp file (with optional banner)
grunt.file.write( mapping.dest, ( banner || "" ) + input );
});
});

// Change the map file to point back to jquery.js instead of jquery.pre-min.js.
// The problem is caused by the pre-uglify task.
// Also, remove temporary files.
grunt.registerMultiTask( "post-uglify", function() {
this.files.forEach(function( mapping ) {
var mapFileName = mapping.src[ 0 ];

// Rename the file to a temporary name.
fs.renameSync( mapFileName, mapping.dest);
grunt.file.write( mapFileName, grunt.file.read( mapping.dest )
// The uglify task erroneously prepends dist/ to file names.
.replace( /"dist\//g, "\"" )
// Refer to the source jquery.js, not the temporary jquery.pre-min.js.
.replace( /\.pre-min\./g, "." )
// There's already a pragma at the beginning of the file, remove the one at the end.
.replace( /\/\/@ sourceMappingURL=jquery\.min\.map$/g, "" ));
});

// Remove temporary files.
this.options().tempFiles.forEach(function( fileName ) {
fs.unlink( fileName );
});
});
};