zotero-web-library
Version:
Web library from zotero.org
1,833 lines (1,629 loc) • 4.35 MB
JavaScript
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
var assign = require('es5-ext/object/assign')
, normalizeOpts = require('es5-ext/object/normalize-options')
, isCallable = require('es5-ext/object/is-callable')
, contains = require('es5-ext/string/#/contains')
, d;
d = module.exports = function (dscr, value/*, options*/) {
var c, e, w, options, desc;
if ((arguments.length < 2) || (typeof dscr !== 'string')) {
options = value;
value = dscr;
dscr = null;
} else {
options = arguments[2];
}
if (dscr == null) {
c = w = true;
e = false;
} else {
c = contains.call(dscr, 'c');
e = contains.call(dscr, 'e');
w = contains.call(dscr, 'w');
}
desc = { value: value, configurable: c, enumerable: e, writable: w };
return !options ? desc : assign(normalizeOpts(options), desc);
};
d.gs = function (dscr, get, set/*, options*/) {
var c, e, options, desc;
if (typeof dscr !== 'string') {
options = set;
set = get;
get = dscr;
dscr = null;
} else {
options = arguments[3];
}
if (get == null) {
get = undefined;
} else if (!isCallable(get)) {
options = get;
get = set = undefined;
} else if (set == null) {
set = undefined;
} else if (!isCallable(set)) {
options = set;
set = undefined;
}
if (dscr == null) {
c = true;
e = false;
} else {
c = contains.call(dscr, 'c');
e = contains.call(dscr, 'e');
}
desc = { get: get, set: set, configurable: c, enumerable: e };
return !options ? desc : assign(normalizeOpts(options), desc);
};
},{"es5-ext/object/assign":58,"es5-ext/object/is-callable":63,"es5-ext/object/normalize-options":69,"es5-ext/string/#/contains":73}],2:[function(require,module,exports){
'use strict';
var callable = require('es5-ext/object/valid-callable')
, d = require('d')
, isCallable = require('es5-ext/object/is-callable')
, ee = require('event-emitter')
, isPromise = require('./is-promise')
, create = Object.create, defineProperty = Object.defineProperty
, deferred, resolve, reject;
module.exports = exports = function (name, unres, onres, res) {
name = String(name);
(callable(res) && ((onres == null) || callable(onres)) && callable(unres));
defineProperty(exports._unresolved, name, d(unres));
exports._onresolve[name] = onres;
defineProperty(exports._resolved, name, d(res));
exports._names.push(name);
};
exports._names = ['done', 'then', 'valueOf'];
exports._unresolved = ee(create(Function.prototype, {
then: d(function (win, fail) {
var def;
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('then', [win, fail, def.resolve, def.reject]);
return def.promise;
}),
done: d(function (win, fail) {
((win == null) || callable(win));
((fail == null) || callable(fail));
if (!this.pending) this.pending = [];
this.pending.push('done', arguments);
}),
resolved: d(false),
returnsPromise: d(true),
valueOf: d(function () { return this; })
}));
exports._onresolve = {
then: function (win, fail, resolve, reject) {
var value, cb = this.failed ? fail : win;
if (cb == null) {
if (this.failed) reject(this.value);
else resolve(this.value);
return;
}
if (isCallable(cb)) {
if (isPromise(cb)) {
if (cb.resolved) {
if (cb.failed) reject(cb.value);
else resolve(cb.value);
return;
}
cb.done(resolve, reject);
return;
}
try { value = cb(this.value); } catch (e) {
reject(e);
return;
}
resolve(value);
return;
}
resolve(cb);
},
done: function (win, fail) {
if (this.failed) {
if (fail) {
fail(this.value);
return;
}
throw this.value;
}
if (win) win(this.value);
}
};
exports._resolved = ee(create(Function.prototype, {
then: d(function (win, fail) {
var value, cb = this.failed ? fail : win;
if (cb == null) return this;
if (isCallable(cb)) {
if (isPromise(cb)) return cb;
try { value = cb(this.value); } catch (e) { return reject(e); }
return resolve(value);
}
return resolve(cb);
}),
done: d(function (win, fail) {
((win == null) || callable(win));
((fail == null) || callable(fail));
if (this.failed) {
if (fail) {
fail(this.value);
return;
}
throw this.value;
}
if (win) win(this.value);
}),
resolved: d(true),
returnsPromise: d(true),
valueOf: d(function () { return this.value; })
}));
deferred = require('./deferred');
resolve = deferred.resolve;
reject = deferred.reject;
deferred.extend = exports;
},{"./deferred":4,"./is-promise":31,"d":1,"es5-ext/object/is-callable":63,"es5-ext/object/valid-callable":70,"event-emitter":87}],3:[function(require,module,exports){
// Assimilate eventual foreign promise
'use strict';
var isObject = require('es5-ext/object/is-object')
, isPromise = require('./is-promise')
, deferred = require('./deferred')
, nextTick = require('next-tick')
, getPrototypeOf = Object.getPrototypeOf;
module.exports = function self(value) {
var then, done, def, resolve, reject;
if (!value) return value;
try {
then = value.then;
} catch (e) {
return value;
}
if (typeof then !== 'function') return value;
if (isPromise(value)) return value;
if (!isObject(value)) return value;
if (!getPrototypeOf(value)) return value;
try {
done = value.done;
} catch (ignore) {}
def = deferred();
resolve = function (value) { def.resolve(self(value)); };
reject = function (value) { def.reject(value); };
if (typeof done === 'function') {
try {
done.call(value, resolve, reject);
} catch (e) {
return def.reject(e);
}
return def.promise;
}
try {
then.call(value, function (value) { nextTick(function () {
resolve(value);
}); }, function (value) { nextTick(function () {
reject(value);
}); });
} catch (e) {
return def.reject(e);
}
return def.promise;
};
},{"./deferred":4,"./is-promise":31,"es5-ext/object/is-object":64,"next-tick":146}],4:[function(require,module,exports){
// Returns function that returns deferred or promise object.
//
// 1. If invoked without arguments then deferred object is returned
// Deferred object consist of promise (unresolved) function and resolve
// function through which we resolve promise
// 2. If invoked with one argument then promise is returned which resolved value
// is given argument. Argument may be any value (even undefined),
// if it's promise then same promise is returned
// 3. If invoked with more than one arguments then promise that resolves with
// array of all resolved arguments is returned.
'use strict';
var isError = require('es5-ext/error/is-error')
, noop = require('es5-ext/function/noop')
, isPromise = require('./is-promise')
, every = Array.prototype.every, push = Array.prototype.push
, Deferred, createDeferred, count = 0, timeout, extendShim, ext
, protoSupported = Boolean(isPromise.__proto__)
, resolve, assimilate;
extendShim = function (promise) {
ext._names.forEach(function (name) {
promise[name] = function () {
return promise.__proto__[name].apply(promise, arguments);
};
});
promise.returnsPromise = true;
promise.resolved = promise.__proto__.resolved;
};
resolve = function (value, failed) {
var promise = function (win, fail) { return promise.then(win, fail); };
promise.value = value;
promise.failed = failed;
promise.__proto__ = ext._resolved;
if (!protoSupported) { extendShim(promise); }
if (createDeferred._profile) createDeferred._profile(true);
return promise;
};
Deferred = function () {
var promise = function (win, fail) { return promise.then(win, fail); };
if (!count) timeout = setTimeout(noop, 1e9);
++count;
if (createDeferred._monitor) promise.monitor = createDeferred._monitor();
promise.__proto__ = ext._unresolved;
if (!protoSupported) extendShim(promise);
(createDeferred._profile && createDeferred._profile());
this.promise = promise;
this.resolve = this.resolve.bind(this);
this.reject = this.reject.bind(this);
};
Deferred.prototype = {
resolved: false,
_settle: function (value) {
var i, name, data, deps, dPromise, nuDeps;
this.promise.value = value;
this.promise.__proto__ = ext._resolved;
if (!protoSupported) this.promise.resolved = true;
deps = this.promise.dependencies;
delete this.promise.dependencies;
while (deps) {
for (i = 0; (dPromise = deps[i]); ++i) {
dPromise.value = value;
dPromise.failed = this.failed;
dPromise.__proto__ = ext._resolved;
if (!protoSupported) dPromise.resolved = true;
delete dPromise.pending;
if (dPromise.dependencies) {
if (!nuDeps) nuDeps = dPromise.dependencies;
else push.apply(nuDeps, dPromise.dependencies);
delete dPromise.dependencies;
}
}
deps = nuDeps;
nuDeps = null;
}
if ((data = this.promise.pending)) {
for (i = 0; (name = data[i]); ++i) {
ext._onresolve[name].apply(this.promise, data[++i]);
}
delete this.promise.pending;
}
return this.promise;
},
resolve: function (value) {
if (this.resolved) return this.promise;
this.resolved = true;
if (!--count) clearTimeout(timeout);
if (this.promise.monitor) clearTimeout(this.promise.monitor);
value = assimilate(value);
if (isPromise(value)) {
if (!value.resolved) {
if (!value.dependencies) {
value.dependencies = [];
}
value.dependencies.push(this.promise);
if (this.promise.pending) {
if (value.pending) {
push.apply(value.pending, this.promise.pending);
this.promise.pending = value.pending;
if (this.promise.dependencies) {
this.promise.dependencies.forEach(function self(dPromise) {
dPromise.pending = value.pending;
if (dPromise.dependencies) {
dPromise.dependencies.forEach(self);
}
});
}
} else {
value.pending = this.promise.pending;
}
} else if (value.pending) {
this.promise.pending = value.pending;
} else {
this.promise.pending = value.pending = [];
}
return this.promise;
}
this.promise.failed = value.failed;
value = value.value;
}
return this._settle(value);
},
reject: function (error) {
if (this.resolved) return this.promise;
this.resolved = true;
if (!--count) clearTimeout(timeout);
if (this.promise.monitor) clearTimeout(this.promise.monitor);
this.promise.failed = true;
return this._settle(error);
}
};
module.exports = createDeferred = function (value) {
var l = arguments.length, d, waiting, initialized, result;
if (!l) return new Deferred();
if (l > 1) {
d = new Deferred();
waiting = 0;
result = new Array(l);
every.call(arguments, function (value, index) {
value = assimilate(value);
if (!isPromise(value)) {
result[index] = value;
return true;
}
if (value.resolved) {
if (value.failed) {
d.reject(value.value);
return false;
}
result[index] = value.value;
return true;
}
++waiting;
value.done(function (value) {
result[index] = value;
if (!--waiting && initialized) d.resolve(result);
}, d.reject);
return true;
});
initialized = true;
if (!waiting) d.resolve(result);
return d.promise;
}
value = assimilate(value);
if (isPromise(value)) return value;
return resolve(value, isError(value));
};
createDeferred.Deferred = Deferred;
createDeferred.reject = function (value) { return resolve(value, true); };
createDeferred.resolve = function (value) {
value = assimilate(value);
if (isPromise(value)) return value;
return resolve(value, false);
};
ext = require('./_ext');
assimilate = require('./assimilate');
},{"./_ext":2,"./assimilate":3,"./is-promise":31,"es5-ext/error/is-error":43,"es5-ext/function/noop":49}],5:[function(require,module,exports){
// Dynamic queue handler
// Allows to create a promise queue, where new promises can be added to queue until last promise in
// a queue resolves. Queue promise resolves with `undefined` value, when last promises resolves.
'use strict';
var aFrom = require('es5-ext/array/from')
, ensureIterable = require('es5-ext/iterable/validate-object')
, assign = require('es5-ext/object/assign')
, deferred = require('./deferred')
, isPromise = require('./is-promise')
, assimilate = require('./assimilate')
, DynamicQueue;
module.exports = DynamicQueue = function (list) {
if (!(this instanceof DynamicQueue)) return new DynamicQueue(list);
list = aFrom(ensureIterable(list));
assign(this, deferred());
list.every(this.add, this);
if (!this.waiting) {
this.resolve();
return;
}
this.initialized = true;
};
DynamicQueue.prototype = {
waiting: 0,
initialized: false,
add: function (value) {
if (this.promise.resolved) throw new Error("Queue was already resolved");
++this.waiting;
value = assimilate(value);
if (isPromise(value)) {
if (!value.resolved) {
value.done(this._processValue.bind(this), this.reject);
return true;
}
if (value.failed) {
this.reject(value.value);
return false;
}
}
return this._processValue();
},
_processValue: function () {
if (this.promise.resolved) return;
if (!--this.waiting && this.initialized) this.resolve();
return true;
}
};
},{"./assimilate":3,"./deferred":4,"./is-promise":31,"es5-ext/array/from":36,"es5-ext/iterable/validate-object":51,"es5-ext/object/assign":58}],6:[function(require,module,exports){
'use strict';
var arrayOf = require('es5-ext/array/of')
, deferred = require('../deferred')
, isPromise = require('../is-promise')
, assimilate = require('../assimilate')
, push = Array.prototype.push, slice = Array.prototype.slice;
module.exports = function (args, length) {
var i, l, arg;
if ((length != null) && (args.length !== length)) {
args = slice.call(args, 0, length);
if (args.length < length) {
push.apply(args, new Array(length - args.length));
}
}
for (i = 0, l = args.length; i < l; ++i) {
arg = assimilate(args[i]);
if (isPromise(arg)) {
if (!arg.resolved) {
if (l > 1) return deferred.apply(null, args);
return arg(arrayOf);
}
if (arg.failed) return arg;
args[i] = arg.value;
}
}
return args;
};
},{"../assimilate":3,"../deferred":4,"../is-promise":31,"es5-ext/array/of":39}],7:[function(require,module,exports){
// Promise aware Array's every
'use strict';
module.exports = require('../../lib/some-every')(false);
},{"../../lib/some-every":32}],8:[function(require,module,exports){
// Promise aware Array's find
// Additionally differs from some that it returns *first in order* item that matches constraint
'use strict';
var assign = require('es5-ext/object/assign')
, value = require('es5-ext/object/valid-value')
, callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, assimilate = require('../../assimilate')
, call = Function.prototype.call
, resolve = deferred.resolve
, Find;
Find = function (list, cb, context) {
this.list = list;
this.cb = cb;
this.context = context;
this.length = list.length >>> 0;
while (this.current < this.length) {
if (this.current in list) {
assign(this, deferred());
this.processCb = this.processCb.bind(this);
this.process();
return this.promise;
}
++this.current;
}
return resolve(undefined);
};
Find.prototype = {
current: 0,
process: function () {
var value = assimilate(this.list[this.current]);
if (isPromise(value)) {
if (!value.resolved) {
value.done(this.processCb, this.reject);
return;
}
if (value.failed) {
this.reject(value.value);
return;
}
value = value.value;
}
this.processCb(value);
},
processCb: function (listValue) {
var value;
if (this.cb) {
try {
value = call.call(this.cb, this.context, listValue, this.current, this.list);
} catch (e) {
this.reject(e);
return;
}
value = assimilate(value);
if (isPromise(value)) {
if (!value.resolved) {
value.done(this.processValue.bind(this, listValue), this.reject);
return;
}
if (value.failed) {
this.reject(value.value);
return;
}
value = value.value;
}
} else {
value = listValue;
}
this.processValue(listValue, value);
},
processValue: function (listValue, value) {
if (value) {
this.resolve(listValue);
return;
}
while (++this.current < this.length) {
if (this.current in this.list) {
this.process();
return;
}
}
this.resolve(undefined);
}
};
module.exports = function (cb/*, thisArg*/) {
value(this);
((cb == null) || callable(cb));
return new Find(this, cb, arguments[1]);
};
},{"../../assimilate":3,"../../deferred":4,"../../is-promise":31,"es5-ext/object/assign":58,"es5-ext/object/valid-callable":70,"es5-ext/object/valid-value":72}],9:[function(require,module,exports){
// Promise aware Array's map
'use strict';
var assign = require('es5-ext/object/assign')
, value = require('es5-ext/object/valid-value')
, callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, assimilate = require('../../assimilate')
, every = Array.prototype.every
, call = Function.prototype.call
, DMap;
DMap = function (list, cb, context) {
this.list = list;
this.cb = cb;
this.context = context;
this.result = new Array(list.length >>> 0);
assign(this, deferred());
every.call(list, this.process, this);
if (!this.waiting) return this.resolve(this.result);
this.initialized = true;
return this.promise;
};
DMap.prototype = {
waiting: 0,
initialized: false,
process: function (value, index) {
++this.waiting;
value = assimilate(value);
if (isPromise(value)) {
if (!value.resolved) {
value.done(this.processCb.bind(this, index), this.reject);
return true;
}
if (value.failed) {
this.reject(value.value);
return false;
}
value = value.value;
}
return this.processCb(index, value);
},
processCb: function (index, value) {
if (this.promise.resolved) return false;
if (this.cb) {
try {
value = call.call(this.cb, this.context, value, index, this.list);
} catch (e) {
this.reject(e);
return false;
}
value = assimilate(value);
if (isPromise(value)) {
if (!value.resolved) {
value.done(this.processValue.bind(this, index), this.reject);
return true;
}
if (value.failed) {
this.reject(value.value);
return false;
}
value = value.value;
}
}
this.processValue(index, value);
return true;
},
processValue: function (index, value) {
if (this.promise.resolved) return;
this.result[index] = value;
if (!--this.waiting && this.initialized) this.resolve(this.result);
}
};
module.exports = function (cb/*, thisArg*/) {
value(this);
((cb == null) || callable(cb));
return new DMap(this, cb, arguments[1]);
};
},{"../../assimilate":3,"../../deferred":4,"../../is-promise":31,"es5-ext/object/assign":58,"es5-ext/object/valid-callable":70,"es5-ext/object/valid-value":72}],10:[function(require,module,exports){
// Promise aware Array's reduce
'use strict';
var assign = require('es5-ext/object/assign')
, value = require('es5-ext/object/valid-value')
, callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, assimilate = require('../../assimilate')
, call = Function.prototype.call
, hasOwnProperty = Object.prototype.hasOwnProperty
, resolve = deferred.resolve
, Reduce;
Reduce = function (list, cb, initial, initialized) {
this.list = list;
this.cb = cb;
this.initialized = initialized;
this.length = list.length >>> 0;
initial = assimilate(initial);
if (isPromise(initial)) {
if (!initial.resolved) {
assign(this, deferred());
initial.done(function (initial) {
this.value = initial;
this.init();
}.bind(this), this.reject);
return this.promise;
}
this.value = initial.value;
if (initial.failed) return initial;
} else {
this.value = initial;
}
return this.init();
};
Reduce.prototype = {
current: 0,
state: false,
init: function () {
while (this.current < this.length) {
if (hasOwnProperty.call(this.list, this.current)) break;
++this.current;
}
if (this.current === this.length) {
if (!this.initialized) {
throw new Error("Reduce of empty array with no initial value");
}
return this.resolve ? this.resolve(this.value) : resolve(this.value);
}
if (!this.promise) assign(this, deferred());
this.processCb = this.processCb.bind(this);
this.processValue = this.processValue.bind(this);
this.continue();
return this.promise;
},
continue: function () {
var result;
while (!this.state) {
result = this.process();
if (this.state !== 'cb') break;
result = this.processCb(result);
if (this.state !== 'value') break;
this.processValue(result);
}
},
process: function () {
var value = assimilate(this.list[this.current]);
if (isPromise(value)) {
if (!value.resolved) {
value.done(function (result) {
result = this.processCb(result);
if (this.state !== 'value') return;
this.processValue(result);
if (!this.state) this.continue();
}.bind(this), this.reject);
return;
}
if (value.failed) {
this.reject(value.value);
return;
}
value = value.value;
}
this.state = 'cb';
return value;
},
processCb: function (value) {
if (!this.initialized) {
this.initialized = true;
this.state = 'value';
return value;
}
if (this.cb) {
try {
value = call.call(this.cb, undefined, this.value, value, this.current,
this.list);
} catch (e) {
this.reject(e);
return;
}
value = assimilate(value);
if (isPromise(value)) {
if (!value.resolved) {
value.done(function (result) {
this.state = 'value';
this.processValue(result);
if (!this.state) this.continue();
}.bind(this), this.reject);
return;
}
if (value.failed) {
this.reject(value.value);
return;
}
value = value.value;
}
}
this.state = 'value';
return value;
},
processValue: function (value) {
this.value = value;
while (++this.current < this.length) {
if (hasOwnProperty.call(this.list, this.current)) {
this.state = false;
return;
}
}
this.resolve(this.value);
}
};
module.exports = function (cb/*, initial*/) {
value(this);
((cb == null) || callable(cb));
return new Reduce(this, cb, arguments[1], arguments.length > 1);
};
},{"../../assimilate":3,"../../deferred":4,"../../is-promise":31,"es5-ext/object/assign":58,"es5-ext/object/valid-callable":70,"es5-ext/object/valid-value":72}],11:[function(require,module,exports){
// Promise aware Array's some
'use strict';
module.exports = require('../../lib/some-every')(true);
},{"../../lib/some-every":32}],12:[function(require,module,exports){
// Call asynchronous function
'use strict';
var toArray = require('es5-ext/array/to-array')
, callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, processArguments = require('../_process-arguments')
, slice = Array.prototype.slice, apply = Function.prototype.apply
, applyFn, callAsync;
applyFn = function (fn, args, def) {
args = toArray(args);
apply.call(fn, this, args.concat(function (error, result) {
if (error == null) {
def.resolve((arguments.length > 2) ? slice.call(arguments, 1) : result);
} else {
def.reject(error);
}
}));
};
callAsync = function (fn, length, context, args) {
var def;
args = processArguments(args, length);
if (isPromise(args)) {
if (args.failed) return args;
def = deferred();
args.done(function (args) {
if (fn.returnsPromise) return apply.call(fn, context, args);
try {
applyFn.call(context, fn, args, def);
} catch (e) { def.reject(e); }
}, def.reject);
return def.promise;
}
if (fn.returnsPromise) return apply.call(fn, context, args);
def = deferred();
try {
applyFn.call(context, fn, args, def);
} catch (e) {
def.reject(e);
throw e;
}
return def.promise;
};
module.exports = exports = function (context/*, …args*/) {
return callAsync(callable(this), null, context, slice.call(arguments, 1));
};
Object.defineProperty(exports, '_base', { configurable: true,
enumerable: false, writable: true, value: callAsync });
},{"../../deferred":4,"../../is-promise":31,"../_process-arguments":6,"es5-ext/array/to-array":42,"es5-ext/object/valid-callable":70}],13:[function(require,module,exports){
// Delay function execution, return promise for delayed function result
'use strict';
var callable = require('es5-ext/object/valid-callable')
, nextTick = require('next-tick')
, ensureTimeout = require('timers-ext/valid-timeout')
, deferred = require('../../deferred')
, apply = Function.prototype.apply
, delayed;
delayed = function (fn, args, resolve, reject) {
var value;
try {
value = apply.call(fn, this, args);
} catch (e) {
reject(e);
return;
}
resolve(value);
};
module.exports = function (timeout) {
var fn, result, delay;
fn = callable(this);
if (timeout == null) {
delay = nextTick;
} else {
timeout = ensureTimeout(timeout);
delay = setTimeout;
}
result = function () {
var def = deferred();
delay(delayed.bind(this, fn, arguments, def.resolve, def.reject), timeout);
return def.promise;
};
result.returnsPromise = true;
return result;
};
},{"../../deferred":4,"es5-ext/object/valid-callable":70,"next-tick":146,"timers-ext/valid-timeout":291}],14:[function(require,module,exports){
// Limit number of concurrent function executions (to cLimit number).
// Limited calls are queued. Optionaly maximum queue length can also be
// controlled with qLimit value, any calls that would reach over that limit
// would be discarded (its promise would resolve with "Too many calls" error)
'use strict';
var toPosInt = require('es5-ext/number/to-pos-integer')
, callable = require('es5-ext/object/valid-callable')
, eeUnify = require('event-emitter/unify')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, assimilate = require('../../assimilate')
, resolve = deferred.resolve, reject = deferred.reject
, apply = Function.prototype.apply, max = Math.max
, gateReject;
require('../promise/finally');
gateReject = function () {
var e = new Error("Too many calls");
e.type = 'deferred-gate-rejected';
return reject(e);
};
module.exports = function (cLimit, qLimit) {
var fn, count, decrement, unload, queue, run, result;
fn = callable(this);
cLimit = max(toPosInt(cLimit), 1);
qLimit = ((qLimit == null) || isNaN(qLimit)) ? Infinity : toPosInt(qLimit);
count = 0;
queue = [];
run = function (thisArg, args, def) {
var r;
try {
r = apply.call(fn, thisArg, args);
} catch (e) {
if (!def) return reject(e);
def.reject(e);
unload();
return;
}
r = assimilate(r);
if (isPromise(r)) {
if (def) eeUnify(def.promise, r);
if (!r.resolved) {
++count;
if (def) def.resolve(r);
return r.finally(decrement);
}
r = r.value;
}
if (!def) return resolve(r);
def.resolve(r);
unload();
};
decrement = function () {
--count;
unload();
};
unload = function () {
var data;
if ((data = queue.shift())) run.apply(null, data);
};
result = function () {
var def;
if (count >= cLimit) {
if (queue.length < qLimit) {
def = deferred();
queue.push([this, arguments, def]);
return def.promise;
}
return gateReject();
}
return run(this, arguments);
};
result.returnsPromise = true;
return result;
};
},{"../../assimilate":3,"../../deferred":4,"../../is-promise":31,"../promise/finally":21,"es5-ext/number/to-pos-integer":56,"es5-ext/object/valid-callable":70,"event-emitter/unify":88}],15:[function(require,module,exports){
// Promisify synchronous function
'use strict';
var callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, processArguments = require('../_process-arguments')
, apply = Function.prototype.apply
, applyFn;
applyFn = function (fn, args, resolve, reject) {
var value;
try {
value = apply.call(fn, this, args);
} catch (e) {
reject(e);
return;
}
resolve(value);
};
module.exports = function (length) {
var fn, result;
fn = callable(this);
if (fn.returnsPromise) return fn;
if (length != null) length = length >>> 0;
result = function () {
var args, def;
args = processArguments(arguments, length);
if (isPromise(args)) {
if (args.failed) return args;
def = deferred();
args.done(function (args) {
applyFn.call(this, fn, args, def.resolve, def.reject);
}.bind(this), def.reject);
} else {
def = deferred();
applyFn.call(this, fn, args, def.resolve, def.reject);
}
return def.promise;
};
result.returnsPromise = true;
return result;
};
},{"../../deferred":4,"../../is-promise":31,"../_process-arguments":6,"es5-ext/object/valid-callable":70}],16:[function(require,module,exports){
// Promisify asynchronous function
'use strict';
var callable = require('es5-ext/object/valid-callable')
, callAsync = require('./call-async')._base;
module.exports = function (length) {
var fn, result;
fn = callable(this);
if (fn.returnsPromise) return fn;
if (length != null) length = length >>> 0;
result = function () { return callAsync(fn, length, this, arguments); };
result.returnsPromise = true;
return result;
};
},{"./call-async":12,"es5-ext/object/valid-callable":70}],17:[function(require,module,exports){
// Used by promise extensions that are based on array extensions.
'use strict';
var callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred')
, reject = deferred.reject;
module.exports = function (name, ext) {
deferred.extend(name, function (cb) {
var def;
((cb == null) || callable(cb));
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push(name, [arguments, def.resolve, def.reject]);
return def.promise;
}, function (args, resolve, reject) {
var result;
if (this.failed) {
reject(this.value);
return;
}
try {
result = ext.apply(this.value, args);
} catch (e) {
reject(e);
return;
}
resolve(result);
}, function (cb) {
((cb == null) || callable(cb));
if (this.failed) return this;
try {
return ext.apply(this.value, arguments);
} catch (e) {
return reject(e);
}
});
};
},{"../../deferred":4,"es5-ext/object/valid-callable":70}],18:[function(require,module,exports){
// 'aside' - Promise extension
//
// promise.aside(win, fail)
//
// Works in analogous way as promise function itself (or `then`)
// but instead of adding promise to promise chain it returns context promise and
// lets callback carry on with other processing logic
'use strict';
var callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred');
deferred.extend('aside', function (win, fail) {
((win == null) || callable(win));
((fail == null) || callable(fail));
if (win || fail) {
if (!this.pending) {
this.pending = [];
}
this.pending.push('aside', arguments);
}
return this;
}, function (win, fail) {
var cb = this.failed ? fail : win;
if (cb) {
cb(this.value);
}
}, function (win, fail) {
var cb;
((win == null) || callable(win));
((fail == null) || callable(fail));
cb = this.failed ? fail : win;
if (cb) {
cb(this.value);
}
return this;
});
},{"../../deferred":4,"es5-ext/object/valid-callable":70}],19:[function(require,module,exports){
// 'catch' - Promise extension
//
// promise.catch(cb)
//
// Same as `then` but accepts only onFail callback
'use strict';
var isCallable = require('es5-ext/object/is-callable')
, validValue = require('es5-ext/object/valid-value')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, resolve = deferred.resolve, reject = deferred.reject;
deferred.extend('catch', function (cb) {
var def;
validValue(cb);
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('catch', [cb, def.resolve, def.reject]);
return def.promise;
}, function (cb, resolve, reject) {
var value;
if (!this.failed) {
resolve(this.value);
return;
}
if (isCallable(cb)) {
if (isPromise(cb)) {
if (cb.resolved) {
if (cb.failed) reject(cb.value);
else resolve(cb.value);
} else {
cb.done(resolve, reject);
}
return;
}
try { value = cb(this.value); } catch (e) {
reject(e);
return;
}
resolve(value);
return;
}
resolve(cb);
}, function (cb) {
var value;
validValue(cb);
if (!this.failed) return this;
if (isCallable(cb)) {
if (isPromise(cb)) return cb;
try { value = cb(this.value); } catch (e) {
return reject(e);
}
return resolve(value);
}
return resolve(cb);
});
},{"../../deferred":4,"../../is-promise":31,"es5-ext/object/is-callable":63,"es5-ext/object/valid-value":72}],20:[function(require,module,exports){
// 'cb' - Promise extension
//
// promise.cb(cb)
//
// Handles asynchronous function style callback (which is run in next event loop
// the earliest). Returns self promise. Callback is optional.
//
// Useful when we want to configure typical asynchronous function which logic is
// internally configured with promises.
//
// Extension can be used as follows:
//
// var foo = function (arg1, arg2, cb) {
// var d = deferred();
// // ... implementation
// return d.promise.cb(cb);
// };
//
// `cb` extension returns promise and handles eventual callback (optional)
'use strict';
var callable = require('es5-ext/object/valid-callable')
, nextTick = require('next-tick')
, deferred = require('../../deferred');
deferred.extend('cb', function (cb) {
if (cb == null) return this;
callable(cb);
nextTick(function () {
if (this.resolved) {
if (this.failed) cb(this.value);
else cb(null, this.value);
} else {
if (!this.pending) this.pending = [];
this.pending.push('cb', [cb]);
}
}.bind(this));
return this;
}, function (cb) {
if (this.failed) cb(this.value);
else cb(null, this.value);
}, function (cb) {
if (cb == null) return this;
callable(cb);
nextTick(function () {
if (this.failed) cb(this.value);
else cb(null, this.value);
}.bind(this));
return this;
});
},{"../../deferred":4,"es5-ext/object/valid-callable":70,"next-tick":146}],21:[function(require,module,exports){
// 'finally' - Promise extension
//
// promise.finally(cb)
//
// Called on promise resolution returns same promise, doesn't pass any values to
// provided callback
'use strict';
var callable = require('es5-ext/object/valid-callable')
, deferred = require('../../deferred');
deferred.extend('finally', function (cb) {
callable(cb);
if (!this.pending) this.pending = [];
this.pending.push('finally', arguments);
return this;
}, function (cb) { cb(); }, function (cb) {
callable(cb)();
return this;
});
},{"../../deferred":4,"es5-ext/object/valid-callable":70}],22:[function(require,module,exports){
// 'get' - Promise extension
//
// promise.get(name)
//
// Resolves with property of resolved object
'use strict';
var value = require('es5-ext/object/valid-value')
, deferred = require('../../deferred')
, reduce = Array.prototype.reduce
, resolve = deferred.resolve, reject = deferred.reject;
deferred.extend('get', function (/*…name*/) {
var def;
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('get', [arguments, def.resolve, def.reject]);
return def.promise;
}, function (args, resolve, reject) {
var result;
if (this.failed) reject(this.value);
try {
result = reduce.call(args, function (obj, key) {
return value(obj)[String(key)];
}, this.value);
} catch (e) {
reject(e);
return;
}
resolve(result);
}, function (/*…name*/) {
var result;
if (this.failed) return this;
try {
result = reduce.call(arguments, function (obj, key) {
return value(obj)[String(key)];
}, this.value);
} catch (e) {
return reject(e);
}
return resolve(result);
});
},{"../../deferred":4,"es5-ext/object/valid-value":72}],23:[function(require,module,exports){
// 'invokeAsync' - Promise extension
//
// promise.invokeAsync(name[, arg0[, arg1[, ...]]])
//
// On resolved object calls asynchronous method that takes callback
// (Node.js style).
// Do not pass callback, it's handled by internal implementation.
// 'name' can be method name or method itself.
'use strict';
var toArray = require('es5-ext/array/to-array')
, isCallable = require('es5-ext/object/is-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, processArguments = require('../_process-arguments')
, slice = Array.prototype.slice, apply = Function.prototype.apply
, reject = deferred.reject
, applyFn;
applyFn = function (fn, args, resolve, reject) {
var result;
if (fn.returnsPromise) {
try {
result = apply.call(fn, this, args);
} catch (e) {
reject(e);
return;
}
return resolve(result);
}
args = toArray(args).concat(function (error, result) {
if (error == null) {
resolve((arguments.length > 2) ? slice.call(arguments, 1) : result);
} else {
reject(error);
}
});
try {
apply.call(fn, this, args);
} catch (e2) {
reject(e2);
}
};
deferred.extend('invokeAsync', function (method/*, …args*/) {
var def;
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('invokeAsync', [arguments, def.resolve, def.reject]);
return def.promise;
}, function (args, resolve, reject) {
var fn;
if (this.failed) {
reject(this.value);
return;
}
if (this.value == null) {
reject(new TypeError("Cannot use null or undefined"));
return;
}
fn = args[0];
if (!isCallable(fn)) {
fn = String(fn);
if (!isCallable(this.value[fn])) {
reject(new TypeError(fn + " is not a function"));
return;
}
fn = this.value[fn];
}
args = processArguments(slice.call(args, 1));
if (isPromise(args)) {
if (args.failed) {
reject(args.value);
return;
}
args.done(function (args) {
applyFn.call(this, fn, args, resolve, reject);
}.bind(this.value), reject);
} else {
applyFn.call(this.value, fn, args, resolve, reject);
}
}, function (method/*, …args*/) {
var args, def;
if (this.failed) return this;
if (this.value == null) {
return reject(new TypeError("Cannot use null or undefined"));
}
if (!isCallable(method)) {
method = String(method);
if (!isCallable(this.value[method])) {
return reject(new TypeError(method + " is not a function"));
}
method = this.value[method];
}
args = processArguments(slice.call(arguments, 1));
if (isPromise(args)) {
if (args.failed) return args;
def = deferred();
args.done(function (args) {
applyFn.call(this, method, args, def.resolve, def.reject);
}.bind(this.value), def.reject);
} else if (!method.returnsPromise) {
def = deferred();
applyFn.call(this.value, method, args, def.resolve, def.reject);
} else {
return applyFn.call(this.value, method, args, deferred, reject);
}
return def.promise;
});
},{"../../deferred":4,"../../is-promise":31,"../_process-arguments":6,"es5-ext/array/to-array":42,"es5-ext/object/is-callable":63}],24:[function(require,module,exports){
// 'invoke' - Promise extension
//
// promise.invoke(name[, arg0[, arg1[, ...]]])
//
// On resolved object calls method that returns immediately.
// 'name' can be method name or method itself.
'use strict';
var isCallable = require('es5-ext/object/is-callable')
, deferred = require('../../deferred')
, isPromise = require('../../is-promise')
, processArguments = require('../_process-arguments')
, slice = Array.prototype.slice, apply = Function.prototype.apply
, reject = deferred.reject
, applyFn;
applyFn = function (fn, args, resolve, reject) {
var value;
try {
value = apply.call(fn, this, args);
} catch (e) {
return reject(e);
}
return resolve(value);
};
deferred.extend('invoke', function (method/*, …args*/) {
var def;
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('invoke', [arguments, def.resolve, def.reject]);
return def.promise;
}, function (args, resolve, reject) {
var fn;
if (this.failed) {
reject(this.value);
return;
}
if (this.value == null) {
reject(new TypeError("Cannot use null or undefined"));
return;
}
fn = args[0];
if (!isCallable(fn)) {
fn = String(fn);
if (!isCallable(this.value[fn])) {
reject(new TypeError(fn + " is not a function"));
return;
}
fn = this.value[fn];
}
args = processArguments(slice.call(args, 1));
if (isPromise(args)) {
if (args.failed) {
reject(args.value);
return;
}
args.done(function (args) {
applyFn.call(this, fn, args, resolve, reject);
}.bind(this.value), reject);
} else {
applyFn.call(this.value, fn, args, resolve, reject);
}
}, function (method/*, …args*/) {
var args, def;
if (this.failed) return this;
if (this.value == null) {
return reject(new TypeError("Cannot use null or undefined"));
}
if (!isCallable(method)) {
method = String(method);
if (!isCallable(this.value[method])) {
return reject(new TypeError(method + " is not a function"));
}
method = this.value[method];
}
args = processArguments(slice.call(arguments, 1));
if (isPromise(args)) {
if (args.failed) return args;
def = deferred();
args.done(function (args) {
applyFn.call(this, method, args, def.resolve, def.reject);
}.bind(this.value), def.reject);
return def.promise;
}
return applyFn.call(this.value, method, args, deferred, reject);
});
},{"../../deferred":4,"../../is-promise":31,"../_process-arguments":6,"es5-ext/object/is-callable":63}],25:[function(require,module,exports){
// 'map' - Promise extension
//
// promise.map(fn[, thisArg[, concurrentLimit]])
//
// Promise aware map for array-like results
'use strict';
require('./_array')('map', require('../array/map'));
},{"../array/map":9,"./_array":17}],26:[function(require,module,exports){
// 'reduce' - Promise extension
//
// promise.reduce(fn[, initial])
//
// Promise aware reduce for array-like results
'use strict';
require('./_array')('reduce', require('../array/reduce'));
},{"../array/reduce":10,"./_array":17}],27:[function(require,module,exports){
// 'some' - Promise extension
//
// promise.some(fn[, thisArg])
//
// Promise aware some for array-like results
'use strict';
require('./_array')('some', require('../array/some'));
},{"../array/some":11,"./_array":17}],28:[function(require,module,exports){
// 'spread' - Promise extensions
//
// promise.spread(onsuccess, onerror)
//
// Matches eventual list result onto function arguments,
// otherwise works same as 'then' (promise function itself)
'use strict';
var spread = require('es5-ext/function/#/spread')
, callable = require('es5-ext/object/valid-callable')
, isCallable = require('es5-ext/object/is-callable')
, isPromise = require('../../is-promise')
, deferred = require('../../deferred')
, resolve = deferred.resolve, reject = deferred.reject;
deferred.extend('spread', function (win, fail) {
var def;
((win == null) || callable(win));
if (!win && (fail == null)) return this;
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('spread', [win, fail, def.resolve, def.reject]);
return def.promise;
}, function (win, fail, resolve, reject) {
var cb, value;
cb = this.failed ? fail : win;
if (cb == null) {
if (this.failed) reject(this.value);
else resolve(this.value);
}
if (isCallable(cb)) {
if (isPromise(cb)) {
if (cb.resolved) {
if (cb.failed) reject(cb.value);
else resolve(cb.value);
} else {
cb.done(resolve, reject);
}
return;
}
if (!this.failed) cb = spread.call(cb);
try {
value = cb(this.value);
} catch (e) {
reject(e);
return;
}
resolve(value);
} else {
resolve(cb);
}
}, function (win, fail) {
var cb, value;
cb = this.failed ? fail : win;
if (cb == null) return this;
if (isCallable(cb)) {
if (isPromise(cb)) return cb;
if (!this.failed) cb = spread.call(cb);
try {
value = cb(this.value);
} catch (e) {
return reject(e);
}
return resolve(value);
}
return resolve(cb);
});
},{"../../deferred":4,"../../is-promise":31,"es5-ext/function/#/spread":45,"es5-ext/object/is-callable":63,"es5-ext/object/valid-callable":70}],29:[function(require,module,exports){
// This construct deferred with all needed goodies that are being exported
// when we import 'deferred' by main name.
// All available promise extensions are also initialized.
'use strict';
var call = Function.prototype.call
, assign = require('es5-ext/object/assign');
module.exports = assign(require('./deferred'), {
invokeAsync: require('./invoke-async'),
isPromise: require('./is-promise'),
dynamicQueue: require('./dynamic-queue'),
validPromise: require('./valid-promise'),
callAsync: call.bind(require('./ext/function/call-async')),
delay: call.bind(require('./ext/function/delay')),
gate: call.bind(require('./ext/function/gate')),
monitor: require('./monitor'),
promisify: call.bind(require('./ext/function/promisify')),
promisifySync: call.bind(require('./ext/function/promisify-sync')),
every: call.bind(require('./ext/array/every')),
find: call.bind(require('./ext/array/find')),
map: call.bind(require('./ext/array/map')),
reduce: call.bind(require('./ext/array/reduce')),
some: call.bind(require('./ext/array/some'))
}, require('./profiler'));
require('./ext/promise/aside');
require('./ext/promise/catch');
require('./ext/promise/cb');
require('./ext/promise/finally');
require('./ext/promise/get');
require('./ext/promise/invoke');
require('./ext/promise/invoke-async');
require('./ext/promise/map');
require('./ext/promise/spread');
require('./ext/promise/some');
require('./ext/promise/reduce');
},{"./deferred":4,"./dynamic-queue":5,"./ext/array/every":7,"./ext/array/find":8,"./ext/array/map":9,"./ext/array/reduce":10,"./ext/array/some":11,"./ext/function/call-async":12,"./ext/function/delay":13,"./ext/function/gate":14,"./ext/function/promisify":16,"./ext/function/promisify-sync":15,"./ext/promise/aside":18,"./ext/promise/catch":19,"./ext/promise/cb":20,"./ext/promise/finally":21,"./ext/promise/get":22,"./ext/promise/invoke":24,"./ext/promise/invoke-async":23,"./ext/promise/map":25,"./ext/promise/reduce":26,"./ext/promise/some":27,"./ext/promise/spread":28,"./invoke-async":30,"./is-promise":31,"./monitor":33,"./profiler":34,"./valid-promise":35,"es5-ext/object/assign":58}],30:[function(require,module,exports){
// Invoke asynchronous function
'use strict';
var isCallable = require('es5-ext/object/is-callable')
, callable = require('es5-ext/object/valid-callable')
, value = require('es5-ext/object/valid-value')
, callAsync = require('./ext/function/call-async')._base
, slice = Array.prototype.slice;
module.exports = function (obj, fn/*, …args*/) {
value(obj);
if (!isCallable(fn)) fn = callable(obj[fn]);
return callAsync(fn, null, obj, slice.call(arguments, 2));
};
},{"./ext/function/call-async":12,"es5-ext/object/is-callable":63,"es5-ext/object/valid-callable":70,"es5-ext/object/valid-value":72}],31:[function(require,module,exports){
// Whether given object is a promise
'use strict';
module.exports = function (o) {
return (typeof o === 'function') && (typeof o.then === 'function') && (o.end !== o.done);
};
},{}],32:[function(require,module,exports){
// Promise aware Array's some
'use strict';
var assign = require('es5-ext/object/assign')
, value = require('es5-ext/object/valid-value')
, callable = require('es5-ext/object/valid-callable')
, deferred = require('../deferred')
, isPromise = require('../is-promise')
, assimilate = require('../assimilate')
, call = Function.prototype.call
, resolve = deferred.resolve;
module.exports = function (resolvent) {
var Iterator = function (list, cb, context) {
this.list = list;
this.cb = cb;
this.context = context;
this.length = list.length >>> 0;
while (this.current < this.length) {
if (this.current in list) {
assign(this, deferred());
this.processCb = this.processCb.bind(this);
this.processValue = this.processValue.bind(this);
this.continue();
return this.promise;
}
++this.current;
}
return resolve(!resolvent);
};
Iterator.prototype = {
current: 0,
state: false,
continue: function () {
var result;
while (!this.state) {
result = this.process();
if (this.state !== 'cb') break;
result = this.processCb(result);
if (this.state !== 'value') break;
this.processValue(result);
}
},
process: function () {
var value = assimilate(this.list[this.current]);
if (isPromise(value)) {
if (!value.resolved) {
value.done(function (result) {
result = this.processCb(result);
if (this.state !== 'value') return;
this.processValue(result);
if (!this.state) this.continue();
}.bind(this), this.reject);
return;
}
if (value.failed) {
this.reject(value.value);
return;
}
value = value.value;
}
this.state = 'cb';
return value;
},
processCb: function (value) {
if (this.cb) {
try {
value = call.call(this.cb, this.context, value, this.