Fix #13776: Add banner before generating source map. Close gh-1246.

This commit is contained in:
Richard Gibson 2013-04-18 13:19:22 -04:00
parent aae7abfeb6
commit 9d16fe6283
2 changed files with 51 additions and 20 deletions

View File

@ -41,7 +41,7 @@ module.exports = function( grunt ) {
srcFile: "src/sizzle/dist/sizzle.js" srcFile: "src/sizzle/dist/sizzle.js"
}, },
build: { build: {
all:{ all: {
dest: "dist/jquery.js", dest: "dist/jquery.js",
src: [ src: [
"src/intro.js", "src/intro.js",
@ -105,14 +105,31 @@ module.exports = function( grunt ) {
tasks: "dev" 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: { uglify: {
all: { all: {
files: { files: {
"dist/jquery.min.js": [ "dist/jquery.js" ] "dist/jquery.min.js": [ "dist/jquery.pre-min.js" ]
}, },
options: { 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", sourceMap: "dist/jquery.min.map",
sourceMappingURL: "jquery.min.map",
report: "min",
beautify: { beautify: {
ascii_only: true ascii_only: true
}, },
@ -225,7 +242,6 @@ module.exports = function( grunt ) {
grunt.log.writeln( "File '" + name + "' created." ); grunt.log.writeln( "File '" + name + "' created." );
}); });
// Special "alias" task to make custom build creation less grawlix-y // Special "alias" task to make custom build creation less grawlix-y
grunt.registerTask( "custom", function() { grunt.registerTask( "custom", function() {
var done = this.async(), var done = this.async(),
@ -245,7 +261,7 @@ module.exports = function( grunt ) {
grunt.util.spawn({ grunt.util.spawn({
cmd: process.platform === "win32" ? "grunt.cmd" : "grunt", cmd: process.platform === "win32" ? "grunt.cmd" : "grunt",
args: [ "build:*:*:" + modules, "uglify", "dist" ] args: [ "build:*:*:" + modules, "pre-uglify", "uglify", "dist" ]
}, function( err, result ) { }, function( err, result ) {
if ( err ) { if ( err ) {
grunt.verbose.error(); grunt.verbose.error();
@ -260,7 +276,6 @@ module.exports = function( grunt ) {
}); });
// Special concat/build task to handle various jQuery build requirements // Special concat/build task to handle various jQuery build requirements
//
grunt.registerMultiTask( grunt.registerMultiTask(
"build", "build",
"Concatenate source (include/exclude modules with +/- flags), embed date/version", "Concatenate source (include/exclude modules with +/- flags), embed date/version",
@ -438,7 +453,7 @@ module.exports = function( grunt ) {
nonascii = false; nonascii = false;
distpaths.forEach(function( filename ) { distpaths.forEach(function( filename ) {
var i, c, map, var i, c,
text = fs.readFileSync( filename, "utf8" ); text = fs.readFileSync( filename, "utf8" );
// Ensure files use only \n for line endings, not \r\n // Ensure files use only \n for line endings, not \r\n
@ -466,19 +481,17 @@ module.exports = function( grunt ) {
if ( /\.map$/.test( filename ) ) { if ( /\.map$/.test( filename ) ) {
text = text.replace( /"dist\//g, "\"" ); text = text.replace( /"dist\//g, "\"" );
fs.writeFileSync( filename, text, "utf-8" ); 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 ) ) { } else if ( /\.min\.js$/.test( filename ) ) {
// Wrap sourceMap directive in multiline comments (#13274) i = 0;
text = text.replace( /\n?(\/\/@\s*sourceMappingURL=)(.*)/, text = text.replace( /(?:\/\*|)\n?\/\/@\s*sourceMappingURL=.*(\n\*\/|)/g,
function( _, directive, path ) { function( match ) {
map = "\n" + directive + path.replace( /^dist\//, "" ); if ( i++ ) {
return ""; return "";
}
return match;
}); });
if ( map ) {
text = text.replace( /(^\/\*[\w\W]*?)\s*\*\/|$/,
function( _, comment ) {
return ( comment || "\n/*" ) + map + "\n*/";
});
}
fs.writeFileSync( filename, text, "utf-8" ); fs.writeFileSync( filename, text, "utf-8" );
} }
@ -499,6 +512,24 @@ module.exports = function( grunt ) {
return !nonascii; 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 // Load grunt tasks from NPM packages
grunt.loadNpmTasks("grunt-compare-size"); grunt.loadNpmTasks("grunt-compare-size");
grunt.loadNpmTasks("grunt-git-authors"); grunt.loadNpmTasks("grunt-git-authors");
@ -508,7 +539,7 @@ module.exports = function( grunt ) {
grunt.loadNpmTasks("grunt-contrib-uglify"); grunt.loadNpmTasks("grunt-contrib-uglify");
// Default grunt // 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 // Short list as a high frequency watch task
grunt.registerTask( "dev", [ "selector", "build:*:*", "jshint" ] ); grunt.registerTask( "dev", [ "selector", "build:*:*", "jshint" ] );

View File

@ -28,7 +28,7 @@
"grunt-update-submodules": "0.2.0", "grunt-update-submodules": "0.2.0",
"grunt-contrib-watch": "0.3.1", "grunt-contrib-watch": "0.3.1",
"grunt-contrib-jshint": "0.3.0", "grunt-contrib-jshint": "0.3.0",
"grunt-contrib-uglify": "0.1.2", "grunt-contrib-uglify": "0.2.0",
"grunt": "0.4.1", "grunt": "0.4.1",
"gzip-js": "0.3.1", "gzip-js": "0.3.1",
"testswarm": "0.2.2" "testswarm": "0.2.2"