(function(globals) { var define, requireModule; (function() { var registry = {}, seen = {}; define = function(name, deps, callback) { registry[name] = { deps: deps, callback: callback }; }; requireModule = function(name) { if (seen[name]) { return seen[name]; } seen[name] = {}; var mod = registry[name]; if (!mod) { throw new Error("Module '" + name + "' not found."); } var deps = mod.deps, callback = mod.callback, reified = [], exports; for (var i=0, l=deps.length; i= 0.10.x function useSetImmediate() { return function(callback, arg) { /* global setImmediate */ setImmediate(function(){ callback(arg); }); }; } function useMutationObserver() { var queue = []; var observer = new BrowserMutationObserver(function() { var toProcess = queue.slice(); queue = []; toProcess.forEach(function(tuple) { var callback = tuple[0], arg= tuple[1]; callback(arg); }); }); var element = document.createElement('div'); observer.observe(element, { attributes: true }); // Chrome Memory Leak: https://bugs.webkit.org/show_bug.cgi?id=93661 window.addEventListener('unload', function(){ observer.disconnect(); observer = null; }, false); return function(callback, arg) { queue.push([callback, arg]); element.setAttribute('drainQueue', 'drainQueue'); }; } function useSetTimeout() { return function(callback, arg) { local.setTimeout(function() { callback(arg); }, 1); }; } if (typeof setImmediate === 'function') { async = useSetImmediate(); } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { async = useNextTick(); } else if (BrowserMutationObserver) { async = useMutationObserver(); } else { async = useSetTimeout(); } __exports__.async = async; }); define("rsvp/cancellation_error", ["exports"], function(__exports__) { "use strict"; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error function CancellationError(message) { this.name = "cancel"; if ((message !== undefined) && (typeof message !== "string")) { throw new TypeError('You must pass a string.'); } this.message = message || "Default Message"; } CancellationError.prototype = new Error(); CancellationError.prototype.constructor = CancellationError; __exports__.CancellationError = CancellationError; }); define("rsvp/config", ["rsvp/async","exports"], function(__dependency1__, __exports__) { "use strict"; var async = __dependency1__.async; var config = {}; config.async = async; __exports__.config = config; }); define("rsvp/defer", ["rsvp/promise","exports"], function(__dependency1__, __exports__) { "use strict"; var Promise = __dependency1__.Promise; function defer() { var deferred = { // pre-allocate shape resolve: undefined, reject: undefined, promise: undefined }; deferred.promise = new Promise(function(resolve, reject) { deferred.resolve = resolve; deferred.reject = reject; }); return deferred; } __exports__.defer = defer; }); define("rsvp/events", ["exports"], function(__exports__) { "use strict"; var Event = function(type, options) { this.type = type; for (var option in options) { if (!options.hasOwnProperty(option)) { continue; } this[option] = options[option]; } }; var indexOf = function(callbacks, callback) { for (var i=0, l=callbacks.length; i 2) { resolve(Array.prototype.slice.call(arguments, 1)); } else { resolve(value); } }; } function denodeify(nodeFunc) { return function() { var nodeArgs = Array.prototype.slice.call(arguments), resolve, reject; var thisArg = this; var promise = new Promise(function(nodeResolve, nodeReject) { resolve = nodeResolve; reject = nodeReject; }); all(nodeArgs).then(function(nodeArgs) { nodeArgs.push(makeNodeCallbackFor(resolve, reject)); try { nodeFunc.apply(thisArg, nodeArgs); } catch(e) { reject(e); } }); return promise; }; } __exports__.denodeify = denodeify; }); define("rsvp/promise", ["rsvp/config","rsvp/events","rsvp/cancellation_error","exports"], function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; var config = __dependency1__.config; var EventTarget = __dependency2__.EventTarget; var CancellationError = __dependency3__.CancellationError; function objectOrFunction(x) { return isFunction(x) || (typeof x === "object" && x !== null); } function isFunction(x){ return typeof x === "function"; } var Promise = function(resolver, canceller) { var promise = this, resolved = false; if (typeof resolver !== 'function') { throw new TypeError('You must pass a resolver function as the sole argument to the promise constructor'); } if ((canceller !== undefined) && (typeof canceller !== 'function')) { throw new TypeError('You can only pass a canceller function' + ' as the second argument to the promise constructor'); } if (!(promise instanceof Promise)) { return new Promise(resolver, canceller); } var resolvePromise = function(value) { if (resolved) { return; } resolved = true; resolve(promise, value); }; var rejectPromise = function(value) { if (resolved) { return; } resolved = true; reject(promise, value); }; var notifyPromise = function(value) { if (resolved) { return; } notify(promise, value); }; this.on('promise:failed', function(event) { this.trigger('error', { detail: event.detail }); }, this); this.on('error', onerror); this.cancel = function () { // For now, simply reject the promise and does not propagate the cancel // to parent or children if (resolved) { return; } if (canceller !== undefined) { try { canceller(); } catch (e) { rejectPromise(e); return; } } // Trigger cancel? rejectPromise(new CancellationError()); }; try { resolver(resolvePromise, rejectPromise, notifyPromise); } catch(e) { rejectPromise(e); } }; function onerror(event) { if (config.onerror) { config.onerror(event.detail); } } var invokeCallback = function(type, promise, callback, event) { var hasCallback = isFunction(callback), value, error, succeeded, failed; if (hasCallback) { try { value = callback(event.detail); succeeded = true; } catch(e) { failed = true; error = e; } } else { value = event.detail; succeeded = true; } if (handleThenable(promise, value)) { return; } else if (hasCallback && succeeded) { resolve(promise, value); } else if (failed) { reject(promise, error); } else if (type === 'resolve') { resolve(promise, value); } else if (type === 'reject') { reject(promise, value); } }; var invokeNotifyCallback = function(promise, callback, event) { var value; if (typeof callback === 'function') { try { value = callback(event.detail); } catch (e) { // stop propagating return; } notify(promise, value); } else { notify(promise, event.detail); } }; Promise.prototype = { constructor: Promise, isRejected: undefined, isFulfilled: undefined, rejectedReason: undefined, fulfillmentValue: undefined, then: function(done, fail, progress) { this.off('error', onerror); var thenPromise = new this.constructor(function() {}, function () { thenPromise.trigger('promise:cancelled', {}); }); if (this.isFulfilled) { config.async(function(promise) { invokeCallback('resolve', thenPromise, done, { detail: promise.fulfillmentValue }); }, this); } if (this.isRejected) { config.async(function(promise) { invokeCallback('reject', thenPromise, fail, { detail: promise.rejectedReason }); }, this); } this.on('promise:resolved', function(event) { invokeCallback('resolve', thenPromise, done, event); }); this.on('promise:failed', function(event) { invokeCallback('reject', thenPromise, fail, event); }); this.on('promise:notified', function (event) { invokeNotifyCallback(thenPromise, progress, event); }); return thenPromise; }, fail: function(fail) { return this.then(null, fail); }, always: function(fail) { return this.then(fail, fail); } }; EventTarget.mixin(Promise.prototype); function resolve(promise, value) { if (promise === value) { fulfill(promise, value); } else if (!handleThenable(promise, value)) { fulfill(promise, value); } } function handleThenable(promise, value) { var then = null, resolved; try { if (promise === value) { throw new TypeError("A promises callback cannot return that same promise."); } if (objectOrFunction(value)) { then = value.then; if (isFunction(then)) { promise.on('promise:cancelled', function(event) { if (isFunction(value.cancel)) { value.cancel(); } }); then.call(value, function(val) { if (resolved) { return true; } resolved = true; if (value !== val) { resolve(promise, val); } else { fulfill(promise, val); } }, function(val) { if (resolved) { return true; } resolved = true; reject(promise, val); }); return true; } } } catch (error) { reject(promise, error); return true; } return false; } function fulfill(promise, value) { config.async(function() { promise.trigger('promise:resolved', { detail: value }); promise.isFulfilled = true; promise.fulfillmentValue = value; }); } function reject(promise, value) { config.async(function() { promise.trigger('promise:failed', { detail: value }); promise.isRejected = true; promise.rejectedReason = value; }); } function notify(promise, value) { config.async(function() { promise.trigger('promise:notified', { detail: value }); }); } __exports__.Promise = Promise; }); define("rsvp/queue", ["rsvp/promise","rsvp/timeout","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; var Promise = __dependency1__.Promise; var delay = __dependency2__.delay; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error function ResolvedQueueError(message) { this.name = "resolved"; if ((message !== undefined) && (typeof message !== "string")) { throw new TypeError('You must pass a string.'); } this.message = message || "Default Message"; } ResolvedQueueError.prototype = new Error(); ResolvedQueueError.prototype.constructor = ResolvedQueueError; var Queue = function() { var promise = this, promise_list = [], fulfill, reject; if (!(this instanceof Queue)) { return new Queue(); } function canceller() { for (var i = 0; i < promise_list.length; i++) { promise_list[i].cancel(); } } Promise.apply(promise, [function (done, fail) { fulfill = done; reject = fail; }, canceller]); promise_list.push(delay()); promise_list.push(promise_list[0].then(function () { promise_list.splice(0, 2); if (promise_list.length === 0) { fulfill(); } })); promise.push = function(done, fail) { var last_promise = promise_list[promise_list.length - 1], next_promise; if (this.isRejected || this.isFulfilled) { throw new ResolvedQueueError(); } next_promise = last_promise.then(done, fail); promise_list.push(next_promise); // Handle pop promise_list.push(next_promise.then(function (fulfillmentValue) { promise_list.splice(0, 2); if (promise_list.length === 0) { fulfill(fulfillmentValue); } else { return fulfillmentValue; } }, function (rejectedReason) { if (!(promise.isRejected || promise.isFulfilled)) { reject(rejectedReason); } throw rejectedReason; })); return this; }; }; Queue.prototype = Object.create(Promise.prototype); Queue.prototype.constructor = Queue; __exports__.Queue = Queue; __exports__.ResolvedQueueError = ResolvedQueueError; }); define("rsvp/reject", ["rsvp/promise","exports"], function(__dependency1__, __exports__) { "use strict"; var Promise = __dependency1__.Promise; function reject(reason) { return new Promise(function (resolve, reject) { reject(reason); }); } __exports__.reject = reject; }); define("rsvp/resolve", ["rsvp/promise","exports"], function(__dependency1__, __exports__) { "use strict"; var Promise = __dependency1__.Promise; function resolve(thenable) { return new Promise(function(resolve, reject) { resolve(thenable); }); } __exports__.resolve = resolve; }); define("rsvp/rethrow", ["exports"], function(__exports__) { "use strict"; var local = (typeof global === "undefined") ? this : global; function rethrow(reason) { local.setTimeout(function() { throw reason; }); throw reason; } __exports__.rethrow = rethrow; }); define("rsvp/timeout", ["rsvp/promise","exports"], function(__dependency1__, __exports__) { "use strict"; var Promise = __dependency1__.Promise; function promiseSetTimeout(millisecond, should_reject, message) { var timeout_id; function resolver(resolve, reject) { timeout_id = setTimeout(function () { if (should_reject) { reject(message); } else { resolve(message); } }, millisecond); } function canceller() { clearTimeout(timeout_id); } return new Promise(resolver, canceller); } function delay(millisecond, message) { return promiseSetTimeout(millisecond, false, message); } function timeout(millisecond) { return promiseSetTimeout(millisecond, true, "Timed out after " + millisecond + " ms"); } Promise.prototype.delay = function(millisecond) { return this.then(function (fulfillmentValue) { return delay(millisecond, fulfillmentValue); }); }; __exports__.delay = delay; __exports__.timeout = timeout; }); define("rsvp", ["rsvp/events","rsvp/cancellation_error","rsvp/promise","rsvp/node","rsvp/all","rsvp/queue","rsvp/timeout","rsvp/hash","rsvp/rethrow","rsvp/defer","rsvp/config","rsvp/resolve","rsvp/reject","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) { "use strict"; var EventTarget = __dependency1__.EventTarget; var CancellationError = __dependency2__.CancellationError; var Promise = __dependency3__.Promise; var denodeify = __dependency4__.denodeify; var all = __dependency5__.all; var any = __dependency5__.any; var Queue = __dependency6__.Queue; var ResolvedQueueError = __dependency6__.ResolvedQueueError; var delay = __dependency7__.delay; var timeout = __dependency7__.timeout; var hash = __dependency8__.hash; var rethrow = __dependency9__.rethrow; var defer = __dependency10__.defer; var config = __dependency11__.config; var resolve = __dependency12__.resolve; var reject = __dependency13__.reject; function configure(name, value) { config[name] = value; } __exports__.CancellationError = CancellationError; __exports__.Promise = Promise; __exports__.EventTarget = EventTarget; __exports__.all = all; __exports__.any = any; __exports__.Queue = Queue; __exports__.ResolvedQueueError = ResolvedQueueError; __exports__.delay = delay; __exports__.timeout = timeout; __exports__.hash = hash; __exports__.rethrow = rethrow; __exports__.defer = defer; __exports__.denodeify = denodeify; __exports__.configure = configure; __exports__.resolve = resolve; __exports__.reject = reject; }); window.RSVP = requireModule("rsvp"); })(window);