diff --git a/vendor/docdown/src/DocDown/Entry.php b/vendor/docdown/src/DocDown/Entry.php index aacd9b86..87a8c19a 100644 --- a/vendor/docdown/src/DocDown/Entry.php +++ b/vendor/docdown/src/DocDown/Entry.php @@ -196,7 +196,7 @@ public function getName() { * @returns {Array} The entry `param` data. */ public function getParams( $index = null ) { - preg_match_all('#\*\s*@param\s+\{([^}]+)\}\s+(\[[^]]+\]|[$\w]+)\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#i', $this->entry, $result); + preg_match_all('#\*\s*@param\s+\{([^}]+)\}\s+(\[.+\]|[$\w]+)\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#i', $this->entry, $result); if (count($result = array_filter(array_slice($result, 1)))) { // repurpose array foreach ($result as $param) { diff --git a/vendor/docdown/src/DocDown/Generator.php b/vendor/docdown/src/DocDown/Generator.php index 2756b44b..6c1873d8 100644 --- a/vendor/docdown/src/DocDown/Generator.php +++ b/vendor/docdown/src/DocDown/Generator.php @@ -208,6 +208,7 @@ public function generate() { $openTag = "\n\n"; $closeTag = "\n\n"; $result = array('# ' . $this->options['title']); + $toc = 'toc'; // initialize $api array foreach ($this->entries as $entry) { @@ -304,10 +305,15 @@ function sortCompare($a, $b) { $compiling = $compiling ? ($result[] = $closeTag) : true; + // assign TOC hash + if (count($result) == 2) { + $toc = $member; + } + // add root entry array_push( $result, - $openTag, '## ' . (count($result) == 2 ? '' : '') . '`' . $member . '`', + $openTag, '## ' . (count($result) == 2 ? '' : '') . '`' . $member . '`', Generator::interpolate('* [`' . $member . '`](##{hash})', $entry) ); @@ -401,7 +407,7 @@ function sortCompare($a, $b) { } // close tags add TOC link reference - array_push($result, $closeTag, $closeTag, '', ' [1]: #toc "Jump back to the TOC."'); + array_push($result, $closeTag, $closeTag, '', ' [1]: #' . $toc . ' "Jump back to the TOC."'); // cleanup whitespace return trim(preg_replace('/ +\n/', "\n", join($result, "\n"))); diff --git a/vendor/platform.js/README.md b/vendor/platform.js/README.md index eb56ff77..e83e43fb 100644 --- a/vendor/platform.js/README.md +++ b/vendor/platform.js/README.md @@ -1,4 +1,4 @@ -# Platform.js v1.0.0-pre +# Platform.js v1.0.0 A platform detection library that works on nearly all JavaScript platforms1. @@ -16,6 +16,10 @@ The documentation for Platform.js can be viewed here: [/doc/README.md](https://g For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/platform.js/wiki/Roadmap). +## Support + +Platform.js has been tested in at least Adobe AIR 3.1, Chrome 5-21, Firefox 1.5-13, IE 6-9, Opera 9.25-12.01, Safari 3-6, Node.js 0.8.6, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5. + ## Installation and usage In a browser or Adobe AIR: @@ -83,11 +87,6 @@ info.os; // 'Mac OS X 10.7.2' info.description; // 'Opera 11.52 (identifying as Firefox 4.0) on Mac OS X 10.7.2' ~~~ -## Footnotes - - 1. Platform.js has been tested in at least Adobe AIR 2.6, Chrome 5-15, Firefox 1.5-8, IE 6-10, Opera 9.25-11.52, Safari 2-5.1.1, Node.js 0.4.8-0.6.1, Narwhal 0.3.2, RingoJS 0.7-0.8, and Rhino 1.7RC3. - - ## Author * [John-David Dalton](http://allyoucanleet.com/) diff --git a/vendor/platform.js/platform.js b/vendor/platform.js/platform.js index 722fd3f1..a8a5482b 100644 --- a/vendor/platform.js/platform.js +++ b/vendor/platform.js/platform.js @@ -1,5 +1,5 @@ /*! - * Platform.js v1.0.0-pre + * Platform.js v1.0.0 * Copyright 2010-2012 John-David Dalton * Available under MIT license */ @@ -297,7 +297,7 @@ 'Opera Mini', 'Opera', 'Chrome', - { 'label': 'Chrome Mobile', 'pattern': 'CrMo' }, + { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' }, { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' }, { 'label': 'IE', 'pattern': 'MSIE' }, 'Safari' @@ -512,12 +512,11 @@ /*------------------------------------------------------------------------*/ /** - * Return platform description when the platform object is coerced to a string. + * Returns `platform.description` when the platform object is coerced to a string. * * @name toString * @memberOf platform - * @type Function - * @returns {String} The platform description. + * @returns {String} Returns `platform.description` if available, else an empty string. */ function toStringPlatform() { return this.description || ''; @@ -573,7 +572,7 @@ // detect non-Opera versions (order is important) if (!version) { version = getVersion([ - '(?:Cloud9|CrMo|Opera ?Mini|Raven|Silk(?!/[\\d.]+$))', + '(?:Cloud9|CriOS|CrMo|Opera ?Mini|Raven|Silk(?!/[\\d.]+$))', 'Version', qualify(name), '(?:Firefox|Minefield|NetFront)' @@ -708,7 +707,7 @@ )) ) && !reOpera.test(data = parse.call(forOwn, ua.replace(reOpera, '') + ';')) && data.name) { - // when "indentifying" the UA contains both Opera and the other browser's name + // when "indentifying", the UA contains both Opera and the other browser's name data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : ''); if (reOpera.test(name)) { if (/IE/.test(data) && os == 'Mac OS') { @@ -716,7 +715,7 @@ } data = 'identify' + data; } - // when "masking" the UA contains only the other browser's name + // when "masking", the UA contains only the other browser's name else { data = 'mask' + data; if (operaClass) { @@ -760,7 +759,7 @@ data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : '5'); } else { layout[1] = 'like Chrome'; - data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 535.21 ? 18 : '19'); + data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : '21'); } // add the postfix of ".x" or "+" for approximate versions layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+'); @@ -769,6 +768,30 @@ version = data; } } + // detect Opera desktop modes + if (name == 'Opera' && (data = /(?:zbov|zvav)$/.exec(os))) { + name += ' '; + description.unshift('desktop mode'); + if (data == 'zvav') { + name += 'Mini'; + version = null; + } else { + name += 'Mobile'; + } + } + // detect Chrome desktop mode + else if (name == 'Safari' && /Chrome/.exec(layout[1])) { + description.unshift('desktop mode'); + name = 'Chrome Mobile'; + version = null; + + if (/Mac OS X/.test(os)) { + manufacturer = 'Apple'; + os = 'iOS 4.3+'; + } else { + os = null; + } + } // strip incorrect OS versions if (version && version.indexOf(data = /[\d.]+$/.exec(os)) == 0 && ua.indexOf('/' + data + '-') > -1) { @@ -793,9 +816,25 @@ if (product) { description.push((/^on /.test(description[description.length -1]) ? '' : 'on ') + product); } + // parse OS into an object + if (os) { + data = / ([\d.+]+)$/.exec(os); + os = { + 'architecture': 32, + 'family': data ? os.replace(data[0], '') : os, + 'version': data ? data[1] : null, + 'toString': function() { + var version = this.version; + return this.family + (version ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : ''); + } + }; + } // add browser/OS architecture - if ((data = /\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i).test(arch) && !/\bi686\b/i.test(arch)) { - os = os && os + (data.test(os) ? '' : ' 64-bit'); + if ((data = / (?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch)) && !/\bi686\b/i.test(arch)) { + if (os) { + os.architecture = 64; + os.family = os.family.replace(data, ''); + } if (name && (/WOW64/i.test(ua) || (useFeatures && /\w(?:86|32)$/.test(nav.cpuClass || nav.platform)))) { description.unshift('32-bit'); @@ -834,11 +873,46 @@ * The name of the operating system. * * @memberOf platform - * @type String|Null + * @type Object */ - 'os': os && (name && - !(os == os.split(' ')[0] && (os == name.split(' ')[0] || product)) && - description.push(product ? '(' + os + ')' : 'on ' + os), os), + 'os': os + ? (name && + !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product)) && + description.push(product ? '(' + os + ')' : 'on ' + os), os) + : { + + /** + * The CPU architecture the OS is built for. + * + * @memberOf platform.os + * @type String|Null + */ + 'architecture': null, + + /** + * The family of the OS. + * + * @memberOf platform.os + * @type String|Null + */ + 'family': null, + + /** + * The version of the OS. + * + * @memberOf platform.os + * @type String|Null + */ + 'version': null, + + /** + * Returns the OS string. + * + * @memberOf platform.os + * @returns {String} The OS string. + */ + 'toString': function() { return 'null'; } + }, /** * The platform description. diff --git a/vendor/qunit-clib/README.md b/vendor/qunit-clib/README.md index daacb5e5..8c4259b4 100644 --- a/vendor/qunit-clib/README.md +++ b/vendor/qunit-clib/README.md @@ -1,12 +1,16 @@ -# QUnit CLIB v1.0.0-pre +# QUnit CLIB v1.0.0 ## command-line interface boilerplate -QUnit CLIB helps extend QUnit's CLI support to many common CLI environments1. +QUnit CLIB helps extend QUnit's CLI support to many common CLI environments. ## Screenshot ![QUnit CLIB brings QUnit to your favorite shell.](http://i.imgur.com/jpu9l.png) +## Support + +QUnit CLIB has been tested in at least Node.js 0.4.8-0.8.6, Narwhal v0.3.2, RingoJS v0.8.0, and Rhino v1.7RC3-RC5. + ## Usage ~~~ js @@ -41,23 +45,11 @@ QUnit CLIB helps extend QUnit's CLI support to many common CLI environments }(typeof global == 'object' && global || this)); ~~~ -## Cloning this repo - -To clone this repository just use: - -~~~ bash -git clone https://github.com/jdalton/qunit-clib.git -cd qunit-clib -~~~ - -Feel free to fork and send pull requests if you see improvements! - ## Footnotes - 1. QUnit CLIB has been tested in at least Node.js v0.4.8-0.6.1, Narwhal v0.3.2, RingoJS v0.7.0-0.8.0, and Rhino v1.7RC3. - + 1. QUnit v1.3.0 does not work with Narwhal or Ringo < v0.8.0 - 2. QUnit v1.3.0 does not work with Narwhal or Ringo < v0.8.0 + 2. Rhino v1.7RC4 does not support timeout fallbacks `clearTimeout` and `setTimeout` ## Author diff --git a/vendor/qunit-clib/qunit-clib.js b/vendor/qunit-clib/qunit-clib.js index c5ff6532..e487c03e 100644 --- a/vendor/qunit-clib/qunit-clib.js +++ b/vendor/qunit-clib/qunit-clib.js @@ -1,5 +1,5 @@ /*! - * QUnit CLI Boilerplate v1.0.0-pre + * QUnit CLI Boilerplate v1.0.0 * Copyright 2011-2012 John-David Dalton * Based on a gist by Jörn Zaefferer * Available under MIT license @@ -92,6 +92,8 @@ * @returns {Number} The the ID of the timeout. */ function schedule(fn, delay, args, repeated) { + // Rhino 1.7RC4 will error assigning `task` below + // https://bugzilla.mozilla.org/show_bug.cgi?id=775566 var task = ids[++counter] = new JavaAdapter(java.util.TimerTask, { 'run': function() { fn.apply(global, args); diff --git a/vendor/requirejs/require.js b/vendor/requirejs/require.js index a96ce43f..34cfe231 100644 --- a/vendor/requirejs/require.js +++ b/vendor/requirejs/require.js @@ -1,21 +1,25 @@ /** vim: et:ts=4:sw=4:sts=4 - * @license RequireJS 2.0.4 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. + * @license RequireJS 2.0.5 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/requirejs for details */ -/*jslint regexp: true, nomen: true */ +//Not using strict: uneven strict support in browsers, #392, and causes +//problems with requirejs.exec()/transpiler plugins that may not be strict. +/*jslint regexp: true, nomen: true, sloppy: true */ /*global window, navigator, document, importScripts, jQuery, setTimeout, opera */ var requirejs, require, define; (function (global) { - 'use strict'; - - var version = '2.0.4', + var req, s, head, baseElement, dataMain, src, + interactiveScript, currentlyAddingScript, mainScript, subPath, + version = '2.0.5', commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, jsSuffixRegExp = /\.js$/, currDirRegExp = /^\.\//, - ostring = Object.prototype.toString, + op = Object.prototype, + ostring = op.toString, + hasOwn = op.hasOwnProperty, ap = Array.prototype, aps = ap.slice, apsp = ap.splice, @@ -33,9 +37,7 @@ var requirejs, require, define; contexts = {}, cfg = {}, globalDefQueue = [], - useInteractive = false, - req, s, head, baseElement, dataMain, src, - interactiveScript, currentlyAddingScript, mainScript, subPath; + useInteractive = false; function isFunction(it) { return ostring.call(it) === '[object Function]'; @@ -76,7 +78,7 @@ var requirejs, require, define; } function hasProp(obj, prop) { - return obj.hasOwnProperty(prop); + return hasOwn.call(obj, prop); } /** @@ -152,7 +154,7 @@ var requirejs, require, define; //look up paths relative to the moduleName var args = aps.call(arguments, 0), lastArg; if (enableBuildCallback && - isFunction((lastArg = args[args.length - 1]))) { + isFunction((lastArg = args[args.length - 1]))) { lastArg.__requireJsBuild = true; } args.push(relMap); @@ -169,14 +171,14 @@ var requirejs, require, define; ], function (item) { var prop = item[1] || item[0]; req[item[0]] = context ? makeContextModuleFunc(context[prop], relMap) : - //If no context, then use default context. Reference from - //contexts instead of early binding to default context, so - //that during builds, the latest instance of the default - //context with its config gets used. - function () { - var ctx = contexts[defContextName]; - return ctx[prop].apply(ctx, arguments); - }; + //If no context, then use default context. Reference from + //contexts instead of early binding to default context, so + //that during builds, the latest instance of the default + //context with its config gets used. + function () { + var ctx = contexts[defContextName]; + return ctx[prop].apply(ctx, arguments); + }; }); } @@ -221,7 +223,9 @@ var requirejs, require, define; } function newContext(contextName) { - var config = { + var inCheckLoaded, Module, context, handlers, + checkLoadedTimeoutId, + config = { waitSeconds: 7, baseUrl: './', paths: {}, @@ -239,9 +243,7 @@ var requirejs, require, define; //should be executed, by the order they //load. Important for consistent cycle resolution //behavior. - waitAry = [], - inCheckLoaded, Module, context, handlers, - checkLoadedTimeoutId; + waitAry = []; /** * Trims the . and .. from an array of path segments. @@ -254,7 +256,7 @@ var requirejs, require, define; */ function trimDots(ary) { var i, part; - for (i = 0; ary[i]; i+= 1) { + for (i = 0; ary[i]; i += 1) { part = ary[i]; if (part === '.') { ary.splice(i, 1); @@ -287,12 +289,12 @@ var requirejs, require, define; * @returns {String} normalized name */ function normalize(name, baseName, applyMap) { - var baseParts = baseName && baseName.split('/'), + var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment, + foundMap, foundI, foundStarMap, starI, + baseParts = baseName && baseName.split('/'), normalizedBaseParts = baseParts, map = config.map, - starMap = map && map['*'], - pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment, - foundMap; + starMap = map && map['*']; //Adjust any relative paths. if (name && name.charAt(0) === '.') { @@ -343,28 +345,41 @@ var requirejs, require, define; for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; - //baseName segment has config, find if it has one for + //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; + foundI = i; break; } } } } - if (!foundMap && starMap && starMap[nameSegment]) { - foundMap = starMap[nameSegment]; - } - if (foundMap) { - nameParts.splice(0, i, foundMap); - name = nameParts.join('/'); break; } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); } } @@ -375,7 +390,7 @@ var requirejs, require, define; if (isBrowser) { each(scripts(), function (scriptNode) { if (scriptNode.getAttribute('data-requiremodule') === name && - scriptNode.getAttribute('data-requirecontext') === context.contextName) { + scriptNode.getAttribute('data-requirecontext') === context.contextName) { scriptNode.parentNode.removeChild(scriptNode); return true; } @@ -412,13 +427,13 @@ var requirejs, require, define; * @returns {Object} */ function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) { - var index = name ? name.indexOf('!') : -1, + var url, pluginModule, suffix, + index = name ? name.indexOf('!') : -1, prefix = null, parentName = parentModuleMap ? parentModuleMap.name : null, originalName = name, isDefine = true, - normalizedName = '', - url, pluginModule, suffix; + normalizedName = ''; //If no name, then it means it is a require call, generate an //internal name. @@ -471,8 +486,8 @@ var requirejs, require, define; originalName: originalName, isDefine: isDefine, id: (prefix ? - prefix + '!' + normalizedName : - normalizedName) + suffix + prefix + '!' + normalizedName : + normalizedName) + suffix }; } @@ -492,7 +507,7 @@ var requirejs, require, define; mod = registry[id]; if (hasProp(defined, id) && - (!mod || mod.defineEmitComplete)) { + (!mod || mod.defineEmitComplete)) { if (name === 'defined') { fn(defined[id]); } @@ -659,7 +674,7 @@ var requirejs, require, define; traced[id] = mod; - each(depArray, function(depMap) { + each(depArray, function (depMap) { var depId = depMap.id, depMod = registry[depId], value; @@ -699,13 +714,13 @@ var requirejs, require, define; } function checkLoaded() { - var waitInterval = config.waitSeconds * 1000, + var map, modId, err, usingPathFallback, + waitInterval = config.waitSeconds * 1000, //It is possible to disable the wait interval by using waitSeconds of 0. expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(), noLoads = [], stillLoading = false, - needCycleCheck = true, - map, modId, err, usingPathFallback; + needCycleCheck = true; //Do not bother if this call was a result of a cycle break. if (inCheckLoaded) { @@ -819,7 +834,7 @@ var requirejs, require, define; }; Module.prototype = { - init: function(depMaps, factory, errback, options) { + init: function (depMaps, factory, errback, options) { options = options || {}; //Do not do more inits if already done. Can happen if there @@ -916,7 +931,7 @@ var requirejs, require, define; } }, - load: function() { + load: function () { var url = this.map.url; //Regular dependency. @@ -937,11 +952,11 @@ var requirejs, require, define; return; } - var id = this.map.id, + var err, cjsModule, + id = this.map.id, depExports = this.depExports, exports = this.exports, - factory = this.factory, - err, cjsModule; + factory = this.factory; if (!this.inited) { this.fetch(); @@ -974,9 +989,9 @@ var requirejs, require, define; //favor a non-undefined return value over exports use. cjsModule = this.module; if (cjsModule && - cjsModule.exports !== undefined && - //Make sure it is not already the exports value - cjsModule.exports !== this.exports) { + cjsModule.exports !== undefined && + //Make sure it is not already the exports value + cjsModule.exports !== this.exports) { exports = cjsModule.exports; } else if (exports === undefined && this.usingExports) { //exports already set the defined value. @@ -1032,15 +1047,15 @@ var requirejs, require, define; } }, - callPlugin: function() { + callPlugin: function () { var map = this.map, id = map.id, pluginMap = makeModuleMap(map.prefix, null, false, true); on(pluginMap, 'defined', bind(this, function (plugin) { - var name = this.map.name, - parentName = this.map.parentMap ? this.map.parentMap.name : null, - load, normalizedMap, normalizedMod; + var load, normalizedMap, normalizedMod, + name = this.map.name, + parentName = this.map.parentMap ? this.map.parentMap.name : null; //If current map is not normalized, wait for that //normalized name to load instead of continuing. @@ -1057,12 +1072,12 @@ var requirejs, require, define; false, true); on(normalizedMap, - 'defined', bind(this, function (value) { - this.init([], function () { return value; }, null, { - enabled: true, - ignore: true - }); - })); + 'defined', bind(this, function (value) { + this.init([], function () { return value; }, null, { + enabled: true, + ignore: true + }); + })); normalizedMod = registry[normalizedMap.id]; if (normalizedMod) { if (this.events.error) { @@ -1127,9 +1142,9 @@ var requirejs, require, define; //Use parentName here since the plugin's name is not reliable, //could be some weird string with no path that actually wants to //reference the parentName's path. - plugin.load(map.name, makeRequire(map.parentMap, true, function (deps, cb) { + plugin.load(map.name, makeRequire(map.parentMap, true, function (deps, cb, er) { deps.rjsSkipMap = true; - return context.require(deps, cb); + return context.require(deps, cb, er); }), load, config); })); @@ -1209,7 +1224,7 @@ var requirejs, require, define; this.check(); }, - on: function(name, cb) { + on: function (name, cb) { var cbs = this.events[name]; if (!cbs) { cbs = this.events[name] = []; @@ -1362,7 +1377,12 @@ var requirejs, require, define; //update the maps for them, since their info, like URLs to load, //may have changed. eachProp(registry, function (mod, id) { - mod.map = makeModuleMap(id); + //If module already has init called, since it is too + //late to modify them, and ignore unnormalized ones + //since they are transient. + if (!mod.inited && !mod.map.unnormalized) { + mod.map = makeModuleMap(id); + } }); //If a deps array or a config callback is specified, then call @@ -1471,6 +1491,10 @@ var requirejs, require, define; }, undef: function (id) { + //Bind any waiting define() calls to this context, + //fix for #408 + takeGlobalQueue(); + var map = makeModuleMap(id, null, true), mod = registry[id]; @@ -1509,9 +1533,9 @@ var requirejs, require, define; * @param {String} moduleName the name of the module to potentially complete. */ completeLoad: function (moduleName) { - var shim = config.shim[moduleName] || {}, - shExports = shim.exports && shim.exports.exports, - found, args, mod; + var found, args, mod, + shim = config.shim[moduleName] || {}, + shExports = shim.exports && shim.exports.exports; takeGlobalQueue(); @@ -1538,9 +1562,7 @@ var requirejs, require, define; //of those calls/init calls changes the registry. mod = registry[moduleName]; - if (!found && - !defined[moduleName] && - mod && !mod.inited) { + if (!found && !defined[moduleName] && mod && !mod.inited) { if (config.enforceDefine && (!shExports || !getGlobal(shExports))) { if (hasPathFallback(moduleName)) { return; @@ -1633,7 +1655,8 @@ var requirejs, require, define; } //Join the path parts together, then figure out if baseUrl is needed. - url = syms.join('/') + (ext || '.js'); + url = syms.join('/'); + url += (ext || (/\?/.test(url) ? '' : '.js')); url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url; } @@ -1670,7 +1693,7 @@ var requirejs, require, define; //all old browsers will be supported, but this one was easy enough //to support and still makes sense. if (evt.type === 'load' || - (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) { + (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) { //Reset interactive script so a script node is not held onto for //to long. interactiveScript = null; @@ -1710,8 +1733,8 @@ var requirejs, require, define; req = requirejs = function (deps, callback, errback, optional) { //Find the right context, use default - var contextName = defContextName, - context, config; + var context, config, + contextName = defContextName; // Determine if have config object in the call. if (!isArray(deps) && typeof deps !== 'string') { @@ -1810,8 +1833,8 @@ var requirejs, require, define; if (isBrowser) { //In the browser so use a script tag node = config.xhtml ? - document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') : - document.createElement('script'); + document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') : + document.createElement('script'); node.type = config.scriptType || 'text/javascript'; node.charset = 'utf-8'; node.async = true; @@ -1828,15 +1851,15 @@ var requirejs, require, define; //UNFORTUNATELY Opera implements attachEvent but does not follow the script //script execution mode. if (node.attachEvent && - //Check if node.attachEvent is artificially added by custom script or - //natively supported by browser - //read https://github.com/jrburke/requirejs/issues/187 - //if we can NOT find [native code] then it must NOT natively supported. - //in IE8, node.attachEvent does not have toString() - //Note the test for "[native code" with no closing brace, see: - //https://github.com/jrburke/requirejs/issues/273 - !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && - !isOpera) { + //Check if node.attachEvent is artificially added by custom script or + //natively supported by browser + //read https://github.com/jrburke/requirejs/issues/187 + //if we can NOT find [native code] then it must NOT natively supported. + //in IE8, node.attachEvent does not have toString() + //Note the test for "[native code" with no closing brace, see: + //https://github.com/jrburke/requirejs/issues/273 + !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && + !isOpera) { //Probably IE. IE (at least 6-8) do not fire //script onload right after executing the script, so //we cannot tie the anonymous define call to a name.