srcFile: "src/sizzle/dist/sizzle.js"
},
build: {
- all:{
+ all: {
dest: "dist/jquery.js",
src: [
"src/intro.js",
tasks: "dev"
},
+ "pre-uglify": {
+ all: {
+ files: {
+ "dist/jquery.pre-min.js": [ "dist/jquery.js" ]
+ },
+ options: {
+ banner: "/*! jQuery v<%= pkg.version %> | " +
+ "(c) 2005, 2013 jQuery Foundation, Inc. | " +
+ "jquery.org/license\n" +
+ "//@ sourceMappingURL=jquery.min.map\n" +
+ "*/"
+ }
+ }
+ },
uglify: {
all: {
files: {
- "dist/jquery.min.js": [ "dist/jquery.js" ]
+ "dist/jquery.min.js": [ "dist/jquery.pre-min.js" ]
},
options: {
- banner: "/*! jQuery v<%= pkg.version %> | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license */",
+ // Keep our hard-coded banner
+ preserveComments: "some",
sourceMap: "dist/jquery.min.map",
+ sourceMappingURL: "jquery.min.map",
+ report: "min",
beautify: {
ascii_only: true
},
grunt.log.writeln( "File '" + name + "' created." );
});
-
// Special "alias" task to make custom build creation less grawlix-y
grunt.registerTask( "custom", function() {
var done = this.async(),
grunt.util.spawn({
cmd: process.platform === "win32" ? "grunt.cmd" : "grunt",
- args: [ "build:*:*:" + modules, "uglify", "dist" ]
+ args: [ "build:*:*:" + modules, "pre-uglify", "uglify", "dist" ]
}, function( err, result ) {
if ( err ) {
grunt.verbose.error();
});
// Special concat/build task to handle various jQuery build requirements
- //
grunt.registerMultiTask(
"build",
"Concatenate source (include/exclude modules with +/- flags), embed date/version",
nonascii = false;
distpaths.forEach(function( filename ) {
- var i, c, map,
+ var i, c,
text = fs.readFileSync( filename, "utf8" );
// Ensure files use only \n for line endings, not \r\n
if ( /\.map$/.test( filename ) ) {
text = text.replace( /"dist\//g, "\"" );
fs.writeFileSync( filename, text, "utf-8" );
+
+ // Use our hard-coded sourceMap directive instead of the autogenerated one (#13274; #13776)
} else if ( /\.min\.js$/.test( filename ) ) {
- // Wrap sourceMap directive in multiline comments (#13274)
- text = text.replace( /\n?(\/\/@\s*sourceMappingURL=)(.*)/,
- function( _, directive, path ) {
- map = "\n" + directive + path.replace( /^dist\//, "" );
- return "";
+ i = 0;
+ text = text.replace( /(?:\/\*|)\n?\/\/@\s*sourceMappingURL=.*(\n\*\/|)/g,
+ function( match ) {
+ if ( i++ ) {
+ return "";
+ }
+ return match;
});
- if ( map ) {
- text = text.replace( /(^\/\*[\w\W]*?)\s*\*\/|$/,
- function( _, comment ) {
- return ( comment || "\n/*" ) + map + "\n*/";
- });
- }
fs.writeFileSync( filename, text, "utf-8" );
}
return !nonascii;
});
+ // 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.replace( /^\/\*!(?:.|\n)*?\*\/\n?/gm, "" );
+ }).join("\n");
+
+ // Write temp file (with optional banner)
+ grunt.file.write( mapping.dest, ( banner || "" ) + input );
+ });
+ });
+
// Load grunt tasks from NPM packages
grunt.loadNpmTasks("grunt-compare-size");
grunt.loadNpmTasks("grunt-git-authors");
grunt.loadNpmTasks("grunt-contrib-uglify");
// Default grunt
- grunt.registerTask( "default", [ "update_submodules", "selector", "build:*:*", "jshint", "uglify", "dist:*", "compare_size" ] );
+ grunt.registerTask( "default", [ "update_submodules", "selector", "build:*:*", "jshint", "pre-uglify", "uglify", "dist:*", "compare_size" ] );
// Short list as a high frequency watch task
grunt.registerTask( "dev", [ "selector", "build:*:*", "jshint" ] );