Update vendors.

Former-commit-id: e88301bddf23f177a2d14f2c729877eaede022e5
This commit is contained in:
John-David Dalton
2012-10-09 20:11:57 -07:00
parent d1178defe0
commit 9086d189b9
8 changed files with 370 additions and 498 deletions

View File

@@ -286,11 +286,11 @@ $(document).ready(function() {
test("dispose", 0, function() { test("dispose", 0, function() {
var View = Backbone.View.extend({ var View = Backbone.View.extend({
events: { events: {
click: function() { fail(); } click: function() { ok(false); }
}, },
initialize: function() { initialize: function() {
this.model.on('all x', function(){ fail(); }, this); this.model.on('all x', function(){ ok(false); }, this);
this.collection.on('all x', function(){ fail(); }, this); this.collection.on('all x', function(){ ok(false); }, this);
} }
}); });

View File

@@ -83,6 +83,9 @@ class Generator {
if (!isset($options['lang'])) { if (!isset($options['lang'])) {
$options['lang'] = 'js'; $options['lang'] = 'js';
} }
if (!isset($options['toc'])) {
$options['toc'] = 'properties';
}
$this->options = $options; $this->options = $options;
$this->source = str_replace(PHP_EOL, "\n", $options['source']); $this->source = str_replace(PHP_EOL, "\n", $options['source']);
@@ -279,7 +282,7 @@ class Generator {
*/ */
public function generate() { public function generate() {
$api = array(); $api = array();
$byCategory = @$this->options['toc'] == 'categories'; $byCategory = $this->options['toc'] == 'categories';
$categories = array(); $categories = array();
$closeTag = $this->closeTag; $closeTag = $this->closeTag;
$compiling = false; $compiling = false;
@@ -339,7 +342,7 @@ class Generator {
} }
// add properties to each entry // add properties to each entry
foreach ($api as $key => $entry) { foreach ($api as $entry) {
$entry->hash = $this->getHash($entry); $entry->hash = $this->getHash($entry);
$entry->href = $this->getLineUrl($entry); $entry->href = $this->getLineUrl($entry);
@@ -408,7 +411,7 @@ class Generator {
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
// add categories // add categories
foreach ($api as $key => $entry) { foreach ($api as $entry) {
$categories[$entry->getCategory()][] = $entry; $categories[$entry->getCategory()][] = $entry;
foreach (array('static', 'plugin') as $kind) { foreach (array('static', 'plugin') as $kind) {
foreach ($entry->{$kind} as $subentry) { foreach ($entry->{$kind} as $subentry) {
@@ -435,7 +438,7 @@ class Generator {
// compile TOC by categories // compile TOC by categories
if ($byCategory) { if ($byCategory) {
foreach ($categories as $key => $entries) { foreach ($categories as $category => $entries) {
if ($compiling) { if ($compiling) {
$result[] = $closeTag; $result[] = $closeTag;
} else { } else {
@@ -443,12 +446,12 @@ class Generator {
} }
// assign TOC hash // assign TOC hash
if (count($result) == 2) { if (count($result) == 2) {
$toc = $key; $toc = $category;
} }
// add category // add category
array_push( array_push(
$result, $result,
$openTag, '## ' . (count($result) == 2 ? '<a id="' . $toc . '"></a>' : '') . '`' . $key . '`' $openTag, '## ' . (count($result) == 2 ? '<a id="' . $toc . '"></a>' : '') . '`' . $category . '`'
); );
// add entries // add entries
foreach ($entries as $entry) { foreach ($entries as $entry) {
@@ -458,8 +461,8 @@ class Generator {
} }
// compile TOC by namespace // compile TOC by namespace
else { else {
foreach ($api as $key => $entry) { foreach ($api as $entry) {
if ($compiling) { if ($compiling) {
$result[] = $closeTag; $result[] = $closeTag;
} else { } else {
$compiling = true; $compiling = true;
@@ -488,7 +491,8 @@ class Generator {
); );
} }
foreach ($entry->{$kind} as $subentry) { foreach ($entry->{$kind} as $subentry) {
$result[] = Generator::interpolate('* [`' . $member . '#{separator}#{name}`](##{hash})', $subentry); $subentry->member = $member;
$result[] = Generator::interpolate('* [`#{member}#{separator}#{name}`](##{hash})', $subentry);
} }
} }
} }
@@ -503,16 +507,16 @@ class Generator {
$result[] = $openTag; $result[] = $openTag;
if ($byCategory) { if ($byCategory) {
foreach ($categories as $key => $entries) { foreach ($categories as $category => $entries) {
if ($compiling) { if ($compiling) {
$result[] = $closeTag; $result[] = $closeTag;
} else { } else {
$compiling = true; $compiling = true;
} }
if ($key != 'Methods' && $key != 'Properties') { if ($category != 'Methods' && $category != 'Properties') {
$key = '“' . $key . '” Methods'; $category = '“' . $category . '” Methods';
} }
array_push($result, $openTag, '## `' . $key . '`'); array_push($result, $openTag, '## `' . $category . '`');
$this->addEntries($result, $entries); $this->addEntries($result, $entries);
} }
} }

View File

@@ -1,4 +1,4 @@
[QUnit](http://qunitjs.com) - A JavaScript Unit Testing framework. [QUnit](http://docs.jquery.com/QUnit) - A JavaScript Unit Testing framework.
================================ ================================
QUnit is a powerful, easy-to-use, JavaScript test suite. It's used by the jQuery QUnit is a powerful, easy-to-use, JavaScript test suite. It's used by the jQuery
@@ -35,8 +35,7 @@ the change, run `grunt` to lint and test it, then commit, push and create a pull
Include some background for the change in the commit message and `Fixes #nnn`, referring Include some background for the change in the commit message and `Fixes #nnn`, referring
to the issue number you're addressing. to the issue number you're addressing.
To run `grunt`, you need `node` and `npm`, then `npm install grunt -g`. That gives you a global To run `grunt`, you need `node` and `npm`, then `npm install grunt -g`.
grunt binary. For additional grunt tasks, also run `npm install`.
Releases Releases
-------- --------
@@ -48,12 +47,3 @@ tag, update them again to the next version, commit and push commits and tags
Put the 'v' in front of the tag, e.g. `v1.8.0`. Clean up the changelog, removing merge commits Put the 'v' in front of the tag, e.g. `v1.8.0`. Clean up the changelog, removing merge commits
or whitespace cleanups. or whitespace cleanups.
To upload to code.jquery.com (replace $version accordingly):
scp -q qunit/qunit.js jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/qunit/qunit-$version.js
scp -q qunit/qunit.css jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/qunit/qunit-$version.css
Then update /var/www/html/code.jquery.com/index.html and purge it with:
curl -s http://code.origin.jquery.com/?reload

View File

@@ -1,11 +1,11 @@
/** /**
* QUnit v1.10.0 - A JavaScript Unit Testing Framework * QUnit v1.9.0 - A JavaScript Unit Testing Framework
* *
* http://qunitjs.com * http://docs.jquery.com/QUnit
* *
* Copyright 2012 jQuery Foundation and other contributors * Copyright (c) 2012 John Resig, Jörn Zaefferer
* Released under the MIT license. * Dual licensed under the MIT (MIT-LICENSE.txt)
* http://jquery.org/license * or GPL (GPL-LICENSE.txt) licenses.
*/ */
/** Font Family and Sizes */ /** Font Family and Sizes */
@@ -20,7 +20,7 @@
/** Resets */ /** Resets */
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { #qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
@@ -67,7 +67,6 @@
padding: 0.5em 0 0.5em 2em; padding: 0.5em 0 0.5em 2em;
color: #5E740B; color: #5E740B;
background-color: #eee; background-color: #eee;
overflow: hidden;
} }
#qunit-userAgent { #qunit-userAgent {
@@ -77,9 +76,6 @@
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
} }
#qunit-modulefilter-container {
float: right;
}
/** Tests: Pass/Fail */ /** Tests: Pass/Fail */

View File

@@ -1,11 +1,11 @@
/** /**
* QUnit v1.10.0 - A JavaScript Unit Testing Framework * QUnit v1.9.0 - A JavaScript Unit Testing Framework
* *
* http://qunitjs.com * http://docs.jquery.com/QUnit
* *
* Copyright 2012 jQuery Foundation and other contributors * Copyright (c) 2012 John Resig, Jörn Zaefferer
* Released under the MIT license. * Dual licensed under the MIT (MIT-LICENSE.txt)
* http://jquery.org/license * or GPL (GPL-LICENSE.txt) licenses.
*/ */
(function( window ) { (function( window ) {
@@ -17,8 +17,6 @@ var QUnit,
fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""), fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
toString = Object.prototype.toString, toString = Object.prototype.toString,
hasOwn = Object.prototype.hasOwnProperty, hasOwn = Object.prototype.hasOwnProperty,
// Keep a local reference to Date (GH-283)
Date = window.Date,
defined = { defined = {
setTimeout: typeof window.setTimeout !== "undefined", setTimeout: typeof window.setTimeout !== "undefined",
sessionStorage: (function() { sessionStorage: (function() {
@@ -306,8 +304,7 @@ QUnit = {
// call on start of module test to prepend name to all tests // call on start of module test to prepend name to all tests
module: function( name, testEnvironment ) { module: function( name, testEnvironment ) {
config.currentModule = name; config.currentModule = name;
config.currentModuleTestEnvironment = testEnvironment; config.currentModuleTestEnviroment = testEnvironment;
config.modules[name] = true;
}, },
asyncTest: function( testName, expected, callback ) { asyncTest: function( testName, expected, callback ) {
@@ -339,7 +336,7 @@ QUnit = {
async: async, async: async,
callback: callback, callback: callback,
module: config.currentModule, module: config.currentModule,
moduleTestEnvironment: config.currentModuleTestEnvironment, moduleTestEnvironment: config.currentModuleTestEnviroment,
stack: sourceFromStacktrace( 2 ) stack: sourceFromStacktrace( 2 )
}); });
@@ -352,11 +349,7 @@ QUnit = {
// Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
expect: function( asserts ) { expect: function( asserts ) {
if (arguments.length === 1) { config.current.expected = asserts;
config.current.expected = asserts;
} else {
return config.current.expected;
}
}, },
start: function( count ) { start: function( count ) {
@@ -422,8 +415,6 @@ QUnit.assert = {
var source, var source,
details = { details = {
module: config.current.module,
name: config.current.testName,
result: result, result: result,
message: msg message: msg
}; };
@@ -609,9 +600,6 @@ config = {
} }
], ],
// Set of all modules.
modules: {},
// logging callback queues // logging callback queues
begin: [], begin: [],
done: [], done: [],
@@ -722,10 +710,17 @@ extend( QUnit, {
}, },
// Resets the test setup. Useful for tests that modify the DOM. // Resets the test setup. Useful for tests that modify the DOM.
// If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
reset: function() { reset: function() {
var fixture = id( "qunit-fixture" ); var fixture;
if ( fixture ) {
fixture.innerHTML = config.fixture; if ( window.jQuery ) {
jQuery( "#qunit-fixture" ).html( config.fixture );
} else {
fixture = id( "qunit-fixture" );
if ( fixture ) {
fixture.innerHTML = config.fixture;
}
} }
}, },
@@ -786,8 +781,6 @@ extend( QUnit, {
var output, source, var output, source,
details = { details = {
module: config.current.module,
name: config.current.testName,
result: result, result: result,
message: message, message: message,
actual: actual, actual: actual,
@@ -833,8 +826,6 @@ extend( QUnit, {
var output, var output,
details = { details = {
module: config.current.module,
name: config.current.testName,
result: false, result: false,
message: message message: message
}; };
@@ -925,9 +916,7 @@ QUnit.load = function() {
runLoggingCallbacks( "begin", QUnit, {} ); runLoggingCallbacks( "begin", QUnit, {} );
// Initialize the config, saving the execution queue // Initialize the config, saving the execution queue
var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter, var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes,
numModules = 0,
moduleFilterHtml = "",
urlConfigHtml = "", urlConfigHtml = "",
oldconfig = extend( {}, config ); oldconfig = extend( {}, config );
@@ -951,15 +940,6 @@ QUnit.load = function() {
urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>"; urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
} }
moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " + ( config.module === undefined ? "selected" : "" ) + ">< All Modules ></option>";
for ( i in config.modules ) {
if ( config.modules.hasOwnProperty( i ) ) {
numModules += 1;
moduleFilterHtml += "<option value='" + encodeURIComponent(i) + "' " + ( config.module === i ? "selected" : "" ) + ">" + i + "</option>";
}
}
moduleFilterHtml += "</select>";
// `userAgent` initialized at top of scope // `userAgent` initialized at top of scope
userAgent = id( "qunit-userAgent" ); userAgent = id( "qunit-userAgent" );
if ( userAgent ) { if ( userAgent ) {
@@ -1022,19 +1002,6 @@ QUnit.load = function() {
window.location = QUnit.url( params ); window.location = QUnit.url( params );
}); });
toolbar.appendChild( urlConfigCheckboxes ); toolbar.appendChild( urlConfigCheckboxes );
if (numModules > 1) {
moduleFilter = document.createElement( 'span' );
moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
moduleFilter.innerHTML = moduleFilterHtml;
addEvent( moduleFilter, "change", function() {
var selectBox = moduleFilter.getElementsByTagName("select")[0],
selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
});
toolbar.appendChild(moduleFilter);
}
} }
// `main` initialized at top of scope // `main` initialized at top of scope
@@ -1072,9 +1039,9 @@ window.onerror = function ( error, filePath, linerNr ) {
} }
QUnit.pushFailure( error, filePath + ":" + linerNr ); QUnit.pushFailure( error, filePath + ":" + linerNr );
} else { } else {
QUnit.test( "global failure", extend( function() { QUnit.test( "global failure", function() {
QUnit.pushFailure( error, filePath + ":" + linerNr ); QUnit.pushFailure( error, filePath + ":" + linerNr );
}, { validTest: validTest } ) ); });
} }
return false; return false;
} }
@@ -1141,11 +1108,6 @@ function done() {
} }
} }
// scroll back to top to show results
if ( window.scrollTo ) {
window.scrollTo(0, 0);
}
runLoggingCallbacks( "done", QUnit, { runLoggingCallbacks( "done", QUnit, {
failed: config.stats.bad, failed: config.stats.bad,
passed: passed, passed: passed,
@@ -1161,12 +1123,6 @@ function validTest( test ) {
module = config.module && config.module.toLowerCase(), module = config.module && config.module.toLowerCase(),
fullName = (test.module + ": " + test.testName).toLowerCase(); fullName = (test.module + ": " + test.testName).toLowerCase();
// Internally-generated tests are always valid
if ( test.callback && test.callback.validTest === validTest ) {
delete test.callback.validTest;
return true;
}
if ( config.testNumber ) { if ( config.testNumber ) {
return test.testNumber === config.testNumber; return test.testNumber === config.testNumber;
} }
@@ -1448,8 +1404,7 @@ QUnit.equiv = (function() {
a.global === b.global && a.global === b.global &&
// (gmi) ... // (gmi) ...
a.ignoreCase === b.ignoreCase && a.ignoreCase === b.ignoreCase &&
a.multiline === b.multiline && a.multiline === b.multiline;
a.sticky === b.sticky;
}, },
// - skip when the property is a method of an instance (OOP) // - skip when the property is a method of an instance (OOP)

View File

@@ -1,5 +1,5 @@
/** vim: et:ts=4:sw=4:sts=4 /** vim: et:ts=4:sw=4:sts=4
* @license RequireJS 2.0.6 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. * @license RequireJS 2.1.0 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license. * Available via the MIT or new BSD license.
* see: http://github.com/jrburke/requirejs for details * see: http://github.com/jrburke/requirejs for details
*/ */
@@ -12,7 +12,7 @@ var requirejs, require, define;
(function (global) { (function (global) {
var req, s, head, baseElement, dataMain, src, var req, s, head, baseElement, dataMain, src,
interactiveScript, currentlyAddingScript, mainScript, subPath, interactiveScript, currentlyAddingScript, mainScript, subPath,
version = '2.0.6', version = '2.1.0',
commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
jsSuffixRegExp = /\.js$/, jsSuffixRegExp = /\.js$/,
@@ -147,41 +147,6 @@ var requirejs, require, define;
return g; return g;
} }
function makeContextModuleFunc(func, relMap, enableBuildCallback) {
return function () {
//A version of a require function that passes a moduleName
//value for items that may need to
//look up paths relative to the moduleName
var args = aps.call(arguments, 0), lastArg;
if (enableBuildCallback &&
isFunction((lastArg = args[args.length - 1]))) {
lastArg.__requireJsBuild = true;
}
args.push(relMap);
return func.apply(null, args);
};
}
function addRequireMethods(req, context, relMap) {
each([
['toUrl'],
['undef'],
['defined', 'requireDefined'],
['specified', 'requireSpecified']
], 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);
};
});
}
/** /**
* Constructs an error with a pointer to an URL with more information. * Constructs an error with a pointer to an URL with more information.
* @param {String} id the error ID that maps to an ID on a web page. * @param {String} id the error ID that maps to an ID on a web page.
@@ -238,12 +203,7 @@ var requirejs, require, define;
defined = {}, defined = {},
urlFetched = {}, urlFetched = {},
requireCounter = 1, requireCounter = 1,
unnormalizedCounter = 1, unnormalizedCounter = 1;
//Used to track the order in which modules
//should be executed, by the order they
//load. Important for consistent cycle resolution
//behavior.
waitAry = [];
/** /**
* Trims the . and .. from an array of path segments. * Trims the . and .. from an array of path segments.
@@ -405,12 +365,25 @@ var requirejs, require, define;
//Pop off the first array value, since it failed, and //Pop off the first array value, since it failed, and
//retry //retry
pathConfig.shift(); pathConfig.shift();
context.undef(id); context.require.undef(id);
context.require([id]); context.require([id]);
return true; return true;
} }
} }
//Turns a plugin!resource to [plugin, resource]
//with the plugin being undefined if the name
//did not have a plugin prefix.
function splitPrefix(name) {
var prefix,
index = name ? name.indexOf('!') : -1;
if (index > -1) {
prefix = name.substring(0, index);
name = name.substring(index + 1, name.length);
}
return [prefix, name];
}
/** /**
* Creates a module mapping that includes plugin prefix, module * Creates a module mapping that includes plugin prefix, module
* name, and path. If parentModuleMap is provided it will * name, and path. If parentModuleMap is provided it will
@@ -427,8 +400,7 @@ var requirejs, require, define;
* @returns {Object} * @returns {Object}
*/ */
function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) { function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
var url, pluginModule, suffix, var url, pluginModule, suffix, nameParts,
index = name ? name.indexOf('!') : -1,
prefix = null, prefix = null,
parentName = parentModuleMap ? parentModuleMap.name : null, parentName = parentModuleMap ? parentModuleMap.name : null,
originalName = name, originalName = name,
@@ -442,10 +414,9 @@ var requirejs, require, define;
name = '_@r' + (requireCounter += 1); name = '_@r' + (requireCounter += 1);
} }
if (index !== -1) { nameParts = splitPrefix(name);
prefix = name.substring(0, index); prefix = nameParts[0];
name = name.substring(index + 1, name.length); name = nameParts[1];
}
if (prefix) { if (prefix) {
prefix = normalize(prefix, parentName, applyMap); prefix = normalize(prefix, parentName, applyMap);
@@ -466,6 +437,15 @@ var requirejs, require, define;
} else { } else {
//A regular module. //A regular module.
normalizedName = normalize(name, parentName, applyMap); normalizedName = normalize(name, parentName, applyMap);
//Normalized name may be a plugin ID due to map config
//application in normalize. The map config values must
//already be normalized, so do not need to redo that part.
nameParts = splitPrefix(normalizedName);
prefix = nameParts[0];
normalizedName = nameParts[1];
isNormalized = true;
url = context.nameToUrl(normalizedName); url = context.nameToUrl(normalizedName);
} }
} }
@@ -557,148 +537,71 @@ var requirejs, require, define;
} }
} }
/**
* Helper function that creates a require function object to give to
* modules that ask for it as a dependency. It needs to be specific
* per module because of the implication of path mappings that may
* need to be relative to the module name.
*/
function makeRequire(mod, enableBuildCallback, altRequire) {
var relMap = mod && mod.map,
modRequire = makeContextModuleFunc(altRequire || context.require,
relMap,
enableBuildCallback);
addRequireMethods(modRequire, context, relMap);
modRequire.isBrowser = isBrowser;
return modRequire;
}
handlers = { handlers = {
'require': function (mod) { 'require': function (mod) {
return makeRequire(mod); if (mod.require) {
return mod.require;
} else {
return (mod.require = context.makeRequire(mod.map));
}
}, },
'exports': function (mod) { 'exports': function (mod) {
mod.usingExports = true; mod.usingExports = true;
if (mod.map.isDefine) { if (mod.map.isDefine) {
return (mod.exports = defined[mod.map.id] = {}); if (mod.exports) {
return mod.exports;
} else {
return (mod.exports = defined[mod.map.id] = {});
}
} }
}, },
'module': function (mod) { 'module': function (mod) {
return (mod.module = { if (mod.module) {
id: mod.map.id, return mod.module;
uri: mod.map.url, } else {
config: function () { return (mod.module = {
return (config.config && config.config[mod.map.id]) || {}; id: mod.map.id,
}, uri: mod.map.url,
exports: defined[mod.map.id] config: function () {
}); return (config.config && config.config[mod.map.id]) || {};
},
exports: defined[mod.map.id]
});
}
} }
}; };
function removeWaiting(id) { function cleanRegistry(id) {
//Clean up machinery used for waiting modules. //Clean up machinery used for waiting modules.
delete registry[id]; delete registry[id];
each(waitAry, function (mod, i) {
if (mod.map.id === id) {
waitAry.splice(i, 1);
if (!mod.defined) {
context.waitCount -= 1;
}
return true;
}
});
} }
function findCycle(mod, traced, processed) { function breakCycle(mod, traced, processed) {
var id = mod.map.id, var id = mod.map.id;
depArray = mod.depMaps,
foundModule;
//Do not bother with unitialized modules or not yet enabled if (mod.error) {
//modules. mod.emit('error', mod.error);
if (!mod.inited) { } else {
return; traced[id] = true;
} each(mod.depMaps, function (depMap, i) {
var depId = depMap.id,
dep = registry[depId];
//Found the cycle. //Only force things that have not completed
if (traced[id]) { //being defined, so still in the registry,
return mod; //and only if it has not been matched up
} //in the module already.
if (dep && !mod.depMatched[i] && !processed[depId]) {
traced[id] = true; if (traced[depId]) {
mod.defineDep(i, defined[depId]);
//Trace through the dependencies. mod.check(); //pass false?
each(depArray, function (depMap) { } else {
var depId = depMap.id, breakCycle(dep, traced, processed);
depMod = registry[depId]; }
if (!depMod || processed[depId] ||
!depMod.inited || !depMod.enabled) {
return;
}
return (foundModule = findCycle(depMod, traced, processed));
});
processed[id] = true;
return foundModule;
}
function forceExec(mod, traced, uninited) {
var id = mod.map.id,
depArray = mod.depMaps;
if (!mod.inited || !mod.map.isDefine) {
return;
}
if (traced[id]) {
return defined[id];
}
traced[id] = mod;
each(depArray, function (depMap) {
var depId = depMap.id,
depMod = registry[depId],
value;
if (handlers[depId]) {
return;
}
if (depMod) {
if (!depMod.inited || !depMod.enabled) {
//Dependency is not inited,
//so this module cannot be
//given a forced value yet.
uninited[id] = true;
return;
} }
});
//Get the value for the current dependency processed[id] = true;
value = forceExec(depMod, traced, uninited); }
//Even with forcing it may not be done,
//in particular if the module is waiting
//on a plugin resource.
if (!uninited[depId]) {
mod.defineDepById(depId, value);
}
}
});
mod.check(true);
return defined[id];
}
function modCheck(mod) {
mod.check();
} }
function checkLoaded() { function checkLoaded() {
@@ -707,6 +610,7 @@ var requirejs, require, define;
//It is possible to disable the wait interval by using waitSeconds of 0. //It is possible to disable the wait interval by using waitSeconds of 0.
expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(), expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
noLoads = [], noLoads = [],
reqCalls = [],
stillLoading = false, stillLoading = false,
needCycleCheck = true; needCycleCheck = true;
@@ -727,6 +631,10 @@ var requirejs, require, define;
return; return;
} }
if (!map.isDefine) {
reqCalls.push(mod);
}
if (!mod.error) { if (!mod.error) {
//If the module should be executed, and it has not //If the module should be executed, and it has not
//been inited and time is up, remember it. //been inited and time is up, remember it.
@@ -761,31 +669,9 @@ var requirejs, require, define;
//Not expired, check for a cycle. //Not expired, check for a cycle.
if (needCycleCheck) { if (needCycleCheck) {
each(reqCalls, function (mod) {
each(waitAry, function (mod) { breakCycle(mod, {}, {});
if (mod.defined) {
return;
}
var cycleMod = findCycle(mod, {}, {}),
traced = {};
if (cycleMod) {
forceExec(cycleMod, traced, {});
//traced modules may have been
//removed from the registry, but
//their listeners still need to
//be called.
eachProp(traced, modCheck);
}
}); });
//Now that dependencies have
//been satisfied, trigger the
//completion check that then
//notifies listeners.
eachProp(registry, modCheck);
} }
//If still waiting on loads, and the waiting load is something //If still waiting on loads, and the waiting load is something
@@ -851,7 +737,6 @@ var requirejs, require, define;
//doing a direct modification of the depMaps array //doing a direct modification of the depMaps array
//would affect that config. //would affect that config.
this.depMaps = depMaps && depMaps.slice(0); this.depMaps = depMaps && depMaps.slice(0);
this.depMaps.rjsSkipMap = depMaps.rjsSkipMap;
this.errback = errback; this.errback = errback;
@@ -873,20 +758,6 @@ var requirejs, require, define;
} }
}, },
defineDepById: function (id, depExports) {
var i;
//Find the index for this dependency.
each(this.depMaps, function (map, index) {
if (map.id === id) {
i = index;
return true;
}
});
return this.defineDep(i, depExports);
},
defineDep: function (i, depExports) { defineDep: function (i, depExports) {
//Because of cycles, defined callback for a given //Because of cycles, defined callback for a given
//export can be called more than once. //export can be called more than once.
@@ -910,7 +781,9 @@ var requirejs, require, define;
//If the manager is for a plugin managed resource, //If the manager is for a plugin managed resource,
//ask the plugin to load it now. //ask the plugin to load it now.
if (this.shim) { if (this.shim) {
makeRequire(this, true)(this.shim.deps || [], bind(this, function () { context.makeRequire(this.map, {
enableBuildCallback: true
})(this.shim.deps || [], bind(this, function () {
return map.prefix ? this.callPlugin() : this.load(); return map.prefix ? this.callPlugin() : this.load();
})); }));
} else { } else {
@@ -931,11 +804,9 @@ var requirejs, require, define;
/** /**
* Checks is the module is ready to define itself, and if so, * Checks is the module is ready to define itself, and if so,
* define it. If the silent argument is true, then it will just * define it.
* define, but not notify listeners, and not ask for a context-wide
* check of all loaded modules. That is useful for cycle breaking.
*/ */
check: function (silent) { check: function () {
if (!this.enabled || this.enabling) { if (!this.enabled || this.enabling) {
return; return;
} }
@@ -1013,11 +884,6 @@ var requirejs, require, define;
delete registry[id]; delete registry[id];
this.defined = true; this.defined = true;
context.waitCount -= 1;
if (context.waitCount === 0) {
//Clear the wait array used for cycles.
waitAry = [];
}
} }
//Finished the define stage. Allow calling check again //Finished the define stage. Allow calling check again
@@ -1025,25 +891,33 @@ var requirejs, require, define;
//cycle. //cycle.
this.defining = false; this.defining = false;
if (!silent) { if (this.defined && !this.defineEmitted) {
if (this.defined && !this.defineEmitted) { this.defineEmitted = true;
this.defineEmitted = true; this.emit('defined', this.exports);
this.emit('defined', this.exports); this.defineEmitComplete = true;
this.defineEmitComplete = true;
}
} }
} }
}, },
callPlugin: function () { callPlugin: function () {
var map = this.map, var map = this.map,
id = map.id, id = map.id,
pluginMap = makeModuleMap(map.prefix, null, false, true); //Map already normalized the prefix.
pluginMap = makeModuleMap(map.prefix);
//Mark this as a dependency for this plugin, so it
//can be traced for cycles.
this.depMaps.push(pluginMap);
on(pluginMap, 'defined', bind(this, function (plugin) { on(pluginMap, 'defined', bind(this, function (plugin) {
var load, normalizedMap, normalizedMod, var load, normalizedMap, normalizedMod,
name = this.map.name, name = this.map.name,
parentName = this.map.parentMap ? this.map.parentMap.name : null; parentName = this.map.parentMap ? this.map.parentMap.name : null,
localRequire = context.makeRequire(map.parentMap, {
enableBuildCallback: true,
skipMap: true
});
//If current map is not normalized, wait for that //If current map is not normalized, wait for that
//normalized name to load instead of continuing. //normalized name to load instead of continuing.
@@ -1055,10 +929,10 @@ var requirejs, require, define;
}) || ''; }) || '';
} }
//prefix and name should already be normalized, no need
//for applying map config again either.
normalizedMap = makeModuleMap(map.prefix + '!' + name, normalizedMap = makeModuleMap(map.prefix + '!' + name,
this.map.parentMap, this.map.parentMap);
false,
true);
on(normalizedMap, on(normalizedMap,
'defined', bind(this, function (value) { 'defined', bind(this, function (value) {
this.init([], function () { return value; }, null, { this.init([], function () { return value; }, null, {
@@ -1066,8 +940,13 @@ var requirejs, require, define;
ignore: true ignore: true
}); });
})); }));
normalizedMod = registry[normalizedMap.id]; normalizedMod = registry[normalizedMap.id];
if (normalizedMod) { if (normalizedMod) {
//Mark this as a dependency for this plugin, so it
//can be traced for cycles.
this.depMaps.push(normalizedMap);
if (this.events.error) { if (this.events.error) {
normalizedMod.on('error', bind(this, function (err) { normalizedMod.on('error', bind(this, function (err) {
this.emit('error', err); this.emit('error', err);
@@ -1094,7 +973,7 @@ var requirejs, require, define;
//since they will never be resolved otherwise now. //since they will never be resolved otherwise now.
eachProp(registry, function (mod) { eachProp(registry, function (mod) {
if (mod.map.id.indexOf(id + '_unnormalized') === 0) { if (mod.map.id.indexOf(id + '_unnormalized') === 0) {
removeWaiting(mod.map.id); cleanRegistry(mod.map.id);
} }
}); });
@@ -1103,9 +982,19 @@ var requirejs, require, define;
//Allow plugins to load other code without having to know the //Allow plugins to load other code without having to know the
//context or how to 'complete' the load. //context or how to 'complete' the load.
load.fromText = function (moduleName, text) { load.fromText = bind(this, function (text, textAlt) {
/*jslint evil: true */ /*jslint evil: true */
var hasInteractive = useInteractive; var moduleName = map.name,
moduleMap = makeModuleMap(moduleName),
hasInteractive = useInteractive;
//As of 2.1.0, support just passing the text, to reinforce
//fromText only being called once per resource. Still
//support old style of passing moduleName but discard
//that moduleName in favor of the internal ref.
if (textAlt) {
text = textAlt;
}
//Turn off interactive script matching for IE for any define //Turn off interactive script matching for IE for any define
//calls in the text, then turn it back on at the end. //calls in the text, then turn it back on at the end.
@@ -1115,25 +1004,35 @@ var requirejs, require, define;
//Prime the system by creating a module instance for //Prime the system by creating a module instance for
//it. //it.
getModule(makeModuleMap(moduleName)); getModule(moduleMap);
req.exec(text); try {
req.exec(text);
} catch (e) {
throw new Error('fromText eval for ' + moduleName +
' failed: ' + e);
}
if (hasInteractive) { if (hasInteractive) {
useInteractive = true; useInteractive = true;
} }
//Mark this as a dependency for the plugin
//resource
this.depMaps.push(moduleMap);
//Support anonymous modules. //Support anonymous modules.
context.completeLoad(moduleName); context.completeLoad(moduleName);
};
//Bind the value of that module to the value for this
//resource ID.
localRequire([moduleName], load);
});
//Use parentName here since the plugin's name is not reliable, //Use parentName here since the plugin's name is not reliable,
//could be some weird string with no path that actually wants to //could be some weird string with no path that actually wants to
//reference the parentName's path. //reference the parentName's path.
plugin.load(map.name, makeRequire(map.parentMap, true, function (deps, cb, er) { plugin.load(map.name, localRequire, load, config);
deps.rjsSkipMap = true;
return context.require(deps, cb, er);
}), load, config);
})); }));
context.enable(pluginMap, this); context.enable(pluginMap, this);
@@ -1143,12 +1042,6 @@ var requirejs, require, define;
enable: function () { enable: function () {
this.enabled = true; this.enabled = true;
if (!this.waitPushed) {
waitAry.push(this);
context.waitCount += 1;
this.waitPushed = true;
}
//Set flag mentioning that the module is enabling, //Set flag mentioning that the module is enabling,
//so that immediate calls to the defined callbacks //so that immediate calls to the defined callbacks
//for dependencies do not trigger inadvertent load //for dependencies do not trigger inadvertent load
@@ -1165,7 +1058,7 @@ var requirejs, require, define;
depMap = makeModuleMap(depMap, depMap = makeModuleMap(depMap,
(this.map.isDefine ? this.map : this.map.parentMap), (this.map.isDefine ? this.map : this.map.parentMap),
false, false,
!this.depMaps.rjsSkipMap); !this.skipMap);
this.depMaps[i] = depMap; this.depMaps[i] = depMap;
handler = handlers[depMap.id]; handler = handlers[depMap.id];
@@ -1227,7 +1120,7 @@ var requirejs, require, define;
if (name === 'error') { if (name === 'error') {
//Now that the error handler was triggered, remove //Now that the error handler was triggered, remove
//the listeners, since this broken Module instance //the listeners, since this broken Module instance
//can stay around for a while in the registry/waitAry. //can stay around for a while in the registry.
delete this.events[name]; delete this.events[name];
} }
} }
@@ -1274,16 +1167,16 @@ var requirejs, require, define;
}; };
} }
return (context = { context = {
config: config, config: config,
contextName: contextName, contextName: contextName,
registry: registry, registry: registry,
defined: defined, defined: defined,
urlFetched: urlFetched, urlFetched: urlFetched,
waitCount: 0,
defQueue: defQueue, defQueue: defQueue,
Module: Module, Module: Module,
makeModuleMap: makeModuleMap, makeModuleMap: makeModuleMap,
nextTick: req.nextTick,
/** /**
* Set a configuration for the context. * Set a configuration for the context.
@@ -1325,8 +1218,8 @@ var requirejs, require, define;
deps: value deps: value
}; };
} }
if (value.exports && !value.exports.__buildReady) { if (value.exports && !value.exportsFn) {
value.exports = context.makeShimExports(value.exports); value.exportsFn = context.makeShimExports(value);
} }
shim[id] = value; shim[id] = value;
}); });
@@ -1381,125 +1274,152 @@ var requirejs, require, define;
} }
}, },
makeShimExports: function (exports) { makeShimExports: function (value) {
var func; function fn() {
if (typeof exports === 'string') { var ret;
func = function () { if (value.init) {
return getGlobal(exports); ret = value.init.apply(global, arguments);
}; }
//Save the exports for use in nodefine checking. return ret || getGlobal(value.exports);
func.exports = exports;
return func;
} else {
return function () {
return exports.apply(global, arguments);
};
} }
return fn;
}, },
requireDefined: function (id, relMap) { makeRequire: function (relMap, options) {
return hasProp(defined, makeModuleMap(id, relMap, false, true).id); options = options || {};
},
requireSpecified: function (id, relMap) { function require(deps, callback, errback) {
id = makeModuleMap(id, relMap, false, true).id; var id, map, requireMod, args;
return hasProp(defined, id) || hasProp(registry, id);
},
require: function (deps, callback, errback, relMap) { if (options.enableBuildCallback && callback && isFunction(callback)) {
var moduleName, id, map, requireMod, args; callback.__requireJsBuild = true;
if (typeof deps === 'string') {
if (isFunction(callback)) {
//Invalid call
return onError(makeError('requireargs', 'Invalid require call'), errback);
} }
//Synchronous access to one module. If require.get is if (typeof deps === 'string') {
//available (as in the Node adapter), prefer that. if (isFunction(callback)) {
//In this case deps is the moduleName and callback is //Invalid call
//the relMap return onError(makeError('requireargs', 'Invalid require call'), errback);
if (req.get) { }
return req.get(context, deps, callback);
//If require|exports|module are requested, get the
//value for them from the special handlers. Caveat:
//this only works while module is being defined.
if (relMap && handlers[deps]) {
return handlers[deps](registry[relMap.id]);
}
//Synchronous access to one module. If require.get is
//available (as in the Node adapter), prefer that.
if (req.get) {
return req.get(context, deps, relMap);
}
//Normalize module name, if it contains . or ..
map = makeModuleMap(deps, relMap, false, true);
id = map.id;
if (!hasProp(defined, id)) {
return onError(makeError('notloaded', 'Module name "' +
id +
'" has not been loaded yet for context: ' +
contextName +
(relMap ? '' : '. Use require([])')));
}
return defined[id];
} }
//Just return the module wanted. In this scenario, the //Any defined modules in the global queue, intake them now.
//second arg (if passed) is just the relMap. takeGlobalQueue();
moduleName = deps;
relMap = callback;
//Normalize module name, if it contains . or .. //Make sure any remaining defQueue items get properly processed.
map = makeModuleMap(moduleName, relMap, false, true); while (defQueue.length) {
id = map.id; args = defQueue.shift();
if (args[0] === null) {
if (!hasProp(defined, id)) { return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
return onError(makeError('notloaded', 'Module name "' + } else {
id + //args are id, deps, factory. Should be normalized by the
'" has not been loaded yet for context: ' + //define() function.
contextName)); callGetModule(args);
}
} }
return defined[id];
//Mark all the dependencies as needing to be loaded.
context.nextTick(function () {
requireMod = getModule(makeModuleMap(null, relMap));
//Store if map config should be applied to this require
//call for dependencies.
requireMod.skipMap = options.skipMap;
requireMod.init(deps, callback, errback, {
enabled: true
});
checkLoaded();
});
return require;
} }
//Callback require. Normalize args. if callback or errback is mixin(require, {
//not a function, it means it is a relMap. Test errback first. isBrowser: isBrowser,
if (errback && !isFunction(errback)) {
relMap = errback;
errback = undefined;
}
if (callback && !isFunction(callback)) {
relMap = callback;
callback = undefined;
}
//Any defined modules in the global queue, intake them now. /**
takeGlobalQueue(); * Converts a module name + .extension into an URL path.
* *Requires* the use of a module name. It does not support using
* plain URLs like nameToUrl.
*/
toUrl: function (moduleNamePlusExt) {
var index = moduleNamePlusExt.lastIndexOf('.'),
ext = null;
//Make sure any remaining defQueue items get properly processed. if (index !== -1) {
while (defQueue.length) { ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
args = defQueue.shift(); moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
if (args[0] === null) { }
return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
} else { return context.nameToUrl(normalize(moduleNamePlusExt,
//args are id, deps, factory. Should be normalized by the relMap && relMap.id, true), ext);
//define() function. },
callGetModule(args);
defined: function (id) {
return hasProp(defined, makeModuleMap(id, relMap, false, true).id);
},
specified: function (id) {
id = makeModuleMap(id, relMap, false, true).id;
return hasProp(defined, id) || hasProp(registry, id);
} }
}
//Mark all the dependencies as needing to be loaded.
requireMod = getModule(makeModuleMap(null, relMap));
requireMod.init(deps, callback, errback, {
enabled: true
}); });
checkLoaded(); //Only allow undef on top level require calls
if (!relMap) {
require.undef = function (id) {
//Bind any waiting define() calls to this context,
//fix for #408
takeGlobalQueue();
return context.require; var map = makeModuleMap(id, relMap, true),
}, mod = registry[id];
undef: function (id) { delete defined[id];
//Bind any waiting define() calls to this context, delete urlFetched[map.url];
//fix for #408 delete undefEvents[id];
takeGlobalQueue();
var map = makeModuleMap(id, null, true), if (mod) {
mod = registry[id]; //Hold on to listeners in case the
//module will be attempted to be reloaded
//using a different config.
if (mod.events.defined) {
undefEvents[id] = mod.events;
}
delete defined[id]; cleanRegistry(id);
delete urlFetched[map.url]; }
delete undefEvents[id]; };
if (mod) {
//Hold on to listeners in case the
//module will be attempted to be reloaded
//using a different config.
if (mod.events.defined) {
undefEvents[id] = mod.events;
}
removeWaiting(id);
} }
return require;
}, },
/** /**
@@ -1523,7 +1443,7 @@ var requirejs, require, define;
completeLoad: function (moduleName) { completeLoad: function (moduleName) {
var found, args, mod, var found, args, mod,
shim = config.shim[moduleName] || {}, shim = config.shim[moduleName] || {},
shExports = shim.exports && shim.exports.exports; shExports = shim.exports;
takeGlobalQueue(); takeGlobalQueue();
@@ -1563,31 +1483,13 @@ var requirejs, require, define;
} else { } else {
//A script that does not call define(), so just simulate //A script that does not call define(), so just simulate
//the call for it. //the call for it.
callGetModule([moduleName, (shim.deps || []), shim.exports]); callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);
} }
} }
checkLoaded(); checkLoaded();
}, },
/**
* Converts a module name + .extension into an URL path.
* *Requires* the use of a module name. It does not support using
* plain URLs like nameToUrl.
*/
toUrl: function (moduleNamePlusExt, relModuleMap) {
var index = moduleNamePlusExt.lastIndexOf('.'),
ext = null;
if (index !== -1) {
ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
}
return context.nameToUrl(normalize(moduleNamePlusExt, relModuleMap && relModuleMap.id, true),
ext);
},
/** /**
* Converts a module name to a file path. Supports cases where * Converts a module name to a file path. Supports cases where
* moduleName may actually be just an URL. * moduleName may actually be just an URL.
@@ -1701,7 +1603,10 @@ var requirejs, require, define;
return onError(makeError('scripterror', 'Script error', evt, [data.id])); return onError(makeError('scripterror', 'Script error', evt, [data.id]));
} }
} }
}); };
context.require = context.makeRequire();
return context;
} }
/** /**
@@ -1762,6 +1667,16 @@ var requirejs, require, define;
return req(config); return req(config);
}; };
/**
* Execute something after the current tick
* of the event loop. Override for other envs
* that have a better solution than setTimeout.
* @param {Function} fn function to execute later.
*/
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
setTimeout(fn, 4);
} : function (fn) { fn(); };
/** /**
* Export require as a global, but only if it does not already exist. * Export require as a global, but only if it does not already exist.
*/ */
@@ -1782,9 +1697,21 @@ var requirejs, require, define;
//Create default context. //Create default context.
req({}); req({});
//Exports some context-sensitive methods on global require, using //Exports some context-sensitive methods on global require.
//default context if no context specified. each([
addRequireMethods(req); 'toUrl',
'undef',
'defined',
'specified'
], function (prop) {
//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.
req[prop] = function () {
var ctx = contexts[defContextName];
return ctx.require[prop].apply(ctx, arguments);
};
});
if (isBrowser) { if (isBrowser) {
head = s.head = document.getElementsByTagName('head')[0]; head = s.head = document.getElementsByTagName('head')[0];
@@ -1962,7 +1889,7 @@ var requirejs, require, define;
define = function (name, deps, callback) { define = function (name, deps, callback) {
var node, context; var node, context;
//Allow for anonymous functions //Allow for anonymous modules
if (typeof name !== 'string') { if (typeof name !== 'string') {
//Adjust args appropriately //Adjust args appropriately
callback = deps; callback = deps;

File diff suppressed because one or more lines are too long

View File

@@ -622,25 +622,25 @@
// Returns a function, that, when invoked, will only be triggered at most once // Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. // during a given window of time.
_.throttle = function(func, wait) { _.throttle = function(func, wait) {
var context, args, timeout, throttling, more, result; var context, args, timeout, result;
var whenDone = _.debounce(function(){ more = throttling = false; }, wait); var previous = 0;
var later = function() {
previous = new Date;
timeout = null;
result = func.apply(context, args);
};
return function() { return function() {
context = this; args = arguments; var now = new Date;
var later = function() { var remaining = wait - (now - previous);
timeout = null; context = this;
if (more) { args = arguments;
result = func.apply(context, args); if (remaining <= 0) {
} clearTimeout(timeout);
whenDone(); previous = now;
};
if (!timeout) timeout = setTimeout(later, wait);
if (throttling) {
more = true;
} else {
throttling = true;
result = func.apply(context, args); result = func.apply(context, args);
} else if (!timeout) {
timeout = setTimeout(later, remaining);
} }
whenDone();
return result; return result;
}; };
}; };