From 1f67d07c60c37e60052db37fc03d42af482c2d03 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Thu, 4 Jul 2013 14:00:26 -0400 Subject: [PATCH] Support CommonJS environments by accentuating the need for a window with a document. Fixes #13768. --- Gruntfile.js | 2 -- src/exports.js | 24 ------------------------ src/intro.js | 36 +++++++++++++++++++++++++++++++++++- src/outro.js | 6 +++++- 4 files changed, 40 insertions(+), 28 deletions(-) delete mode 100644 src/exports.js diff --git a/Gruntfile.js b/Gruntfile.js index 952515b46..d582451b7 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -68,8 +68,6 @@ module.exports = function( grunt ) { { flag: "offset", src: "src/offset.js", needs: ["css"] }, { flag: "dimensions", src: "src/dimensions.js", needs: ["css"] }, { flag: "deprecated", src: "src/deprecated.js" }, - - "src/exports.js", "src/outro.js" ] } diff --git a/src/exports.js b/src/exports.js deleted file mode 100644 index 2d5c56f8a..000000000 --- a/src/exports.js +++ /dev/null @@ -1,24 +0,0 @@ -if ( typeof module === "object" && module && typeof module.exports === "object" ) { - // Expose jQuery as module.exports in loaders that implement the Node - // module pattern (including browserify). Do not create the global, since - // the user will be storing it themselves locally, and globals are frowned - // upon in the Node module world. - module.exports = jQuery; -} else { - // Register as a named AMD module, since jQuery can be concatenated with other - // files that may use define, but not via a proper concatenation script that - // understands anonymous AMD modules. A named AMD is safest and most robust - // way to register. Lowercase jquery is used because AMD module names are - // derived from file names, and jQuery is normally delivered in a lowercase - // file name. Do this after creating the global so that if an AMD module wants - // to call noConflict to hide this version of jQuery, it will work. - if ( typeof define === "function" && define.amd ) { - define( "jquery", [], function () { return jQuery; } ); - } -} - -// If there is a window object, that at least has a document property, -// define jQuery and $ identifiers -if ( typeof window === "object" && typeof window.document === "object" ) { - window.jQuery = window.$ = jQuery; -} diff --git a/src/intro.js b/src/intro.js index c9b1dcdad..64032d4ca 100644 --- a/src/intro.js +++ b/src/intro.js @@ -11,7 +11,41 @@ * * Date: @DATE */ -(function( window, undefined ) { + +(function ( window, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // Expose a jQuery-making factory as module.exports in loaders that implement the Node + // module pattern (including browserify). + // This accentuates the need for a real window in the environment + // e.g. var jQuery = require("jquery")(window); + module.exports = function( w ) { + w = w || window; + if ( !w.document ) { + throw new Error("jQuery requires a window with a document"); + } + return factory( w ); + }; + } else { + // Execute the factory to produce jQuery + var jQuery = factory( window ); + + // Register as a named AMD module, since jQuery can be concatenated with other + // files that may use define, but not via a proper concatenation script that + // understands anonymous AMD modules. A named AMD is safest and most robust + // way to register. Lowercase jquery is used because AMD module names are + // derived from file names, and jQuery is normally delivered in a lowercase + // file name. Do this after creating the global so that if an AMD module wants + // to call noConflict to hide this version of jQuery, it will work. + if ( typeof define === "function" && define.amd ) { + define( "jquery", [], function() { + return jQuery; + }); + } + } + +// Pass this, window may not be defined yet +}(this, function ( window, undefined ) { // Can't do this because several apps including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if diff --git a/src/outro.js b/src/outro.js index ac484391c..20cec437c 100644 --- a/src/outro.js +++ b/src/outro.js @@ -1,2 +1,6 @@ +// Expose jQuery and $ identifiers, even in +// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (#13566) +return (window.jQuery = window.$ = jQuery); -})( window ); +}));