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"
},
build: {
all:{
all: {
dest: "dist/jquery.js",
src: [
"src/intro.js",
@ -105,14 +105,31 @@ module.exports = function( grunt ) {
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
},
@ -225,7 +242,6 @@ module.exports = function( grunt ) {
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(),
@ -245,7 +261,7 @@ module.exports = function( grunt ) {
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();
@ -260,7 +276,6 @@ module.exports = function( grunt ) {
});
// Special concat/build task to handle various jQuery build requirements
//
grunt.registerMultiTask(
"build",
"Concatenate source (include/exclude modules with +/- flags), embed date/version",
@ -438,7 +453,7 @@ module.exports = function( grunt ) {
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
@ -466,19 +481,17 @@ module.exports = function( grunt ) {
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" );
}
@ -499,6 +512,24 @@ module.exports = function( grunt ) {
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");
@ -508,7 +539,7 @@ module.exports = function( grunt ) {
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" ] );

View File

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