knex/browser/websql.js

20118 lines
615 KiB
JavaScript
Raw Normal View History

2014-10-01 16:29:39 -04:00
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Knex=e()}}(function(){var define,module,exports;return (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){
2015-03-09 23:44:51 -04:00
// Knex.js 0.7.5
2014-05-05 22:22:51 -04:00
// --------------
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// (c) 2014 Tim Griesser
// Knex may be freely distributed under the MIT license.
// For details and documentation:
// http://knexjs.org
// The "Knex" object we're exporting is just a passthrough to `Knex.initialize`.
function Knex() {
return Knex.initialize.apply(null, arguments);
}
2014-10-01 16:29:39 -04:00
// Require the main constructors necessary for a `Knex` instance,
// each of which are injected with the current instance, so they maintain
// the correct client reference & grammar.
var Raw = require('./lib/raw');
2014-05-05 22:22:51 -04:00
// Run a "raw" query, though we can't do anything with it other than put
// it in a query statement.
Knex.raw = function(sql, bindings) {
return new Raw(sql, bindings);
};
// Doing it this way makes it easier to build for browserify.
2014-10-01 16:29:39 -04:00
var mysql = function() { return require('./lib/dialects/mysql'); };
var mysql2 = function() { return require('./lib/dialects/mysql2'); };
var maria = function() { return require('./lib/dialects/maria'); };
var oracle = function() { return require('./lib/dialects/oracle'); };
var pg = function() { return require('./lib/dialects/postgres'); };
var sqlite3 = function() { return require('./lib/dialects/sqlite3'); };
var websql = function() { return require('./lib/dialects/websql'); };
2014-05-05 22:22:51 -04:00
// The client names we'll allow in the `{name: lib}` pairing.
var Clients = Knex.Clients = {
'mysql' : mysql,
2014-06-09 19:58:01 -04:00
'mysql2' : mysql2,
'maria' : maria,
'mariadb' : maria,
'mariasql' : maria,
2014-10-01 16:29:39 -04:00
'oracle' : oracle,
2014-05-05 22:22:51 -04:00
'pg' : pg,
'postgres' : pg,
'postgresql' : pg,
'sqlite' : sqlite3,
'sqlite3' : sqlite3,
'websql' : websql
};
// Each of the methods which may be statically chained from knex.
2014-10-01 16:29:39 -04:00
var QueryInterface = require('./lib/query/methods');
2014-05-05 22:22:51 -04:00
// Create a new "knex" instance with the appropriate configured client.
Knex.initialize = function(config) {
var Dialect, client;
2014-10-01 16:29:39 -04:00
var EventEmitter = require('events').EventEmitter;
2014-05-05 22:22:51 -04:00
// The object we're potentially using to kick off an
// initial chain. It is assumed that `knex` isn't a
// constructor, so we have no reference to 'this' just
// in case it's called with `new`.
function knex(tableName) {
2014-10-01 16:29:39 -04:00
var qb = new client.QueryBuilder();
if (config.__transactor__) qb.transacting(config.__transactor__);
2014-05-05 22:22:51 -04:00
return tableName ? qb.table(tableName) : qb;
}
// Hook up the "knex" object as an EventEmitter.
var ee = new EventEmitter();
for (var key in ee) {
knex[key] = ee[key];
}
// The `__knex__` is used if you need to duck-type check whether this
// is a knex builder, without a full on `instanceof` check.
2015-03-09 23:44:51 -04:00
knex.VERSION = knex.__knex__ = '0.7.5';
2014-05-05 22:22:51 -04:00
knex.raw = function(sql, bindings) {
2014-07-09 10:40:01 -04:00
var raw = new client.Raw(sql, bindings);
if (config.__transactor__) raw.transacting(config.__transactor__);
return raw;
2014-05-05 22:22:51 -04:00
};
// Runs a new transaction, taking a container and returning a promise
// for when the transaction is resolved.
knex.transaction = function(container) {
2014-06-23 19:02:01 -04:00
return new client.Transaction(container);
2014-05-05 22:22:51 -04:00
};
// Convenience method for tearing down the pool.
knex.destroy = function (callback) {
2014-10-01 16:29:39 -04:00
return this.client.destroy(callback);
};
if (config.__client__) {
client = config.__client__;
} else {
2014-10-01 16:29:39 -04:00
// Build the "client"
2014-07-09 10:40:01 -04:00
var clientName = config.client || config.dialect;
if (!Clients[clientName]) {
throw new Error(clientName + ' is not a valid Knex client, did you misspell it?');
}
knex.toString = function() {
return '[object Knex:' + clientName + ']';
};
Dialect = Clients[clientName]();
client = new Dialect(config);
2014-06-23 19:02:01 -04:00
// Passthrough all "start" and "query" events to the knex object.
client.on('start', function(obj) {
knex.emit('start', obj);
});
client.on('query', function(obj) {
knex.emit('query', obj);
});
2014-05-05 22:22:51 -04:00
}
// Allow chaining methods from the root object, before
// any other information is specified.
2014-10-01 16:29:39 -04:00
QueryInterface.forEach(function(method) {
2014-05-05 22:22:51 -04:00
knex[method] = function() {
var builder = knex();
return builder[method].apply(builder, arguments);
};
});
knex.client = client;
2014-10-01 16:29:39 -04:00
Object.defineProperties(knex, {
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
// Lazy-load / return a "schema" builder object, ensuring it's context-aware.
schema: {
get: function() {
if (!client.SchemaBuilder) client.initSchema();
var builder = new client.SchemaBuilder();
if (config.__transactor__) builder.transacting(config.__transactor__);
return builder;
}
},
// Lazy-load / return a `Migrator` object.
migrate: {
get: function() {
if (!client.Migrator) client.initMigrator();
return new client.Migrator(knex);
}
},
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
// Lazy-load / return a `Seeder` object.
seed: {
get: function() {
if (!client.Seeder) client.initSeeder();
return new client.Seeder(knex);
}
},
// Lazy-load / return a `FunctionHelper` object.
fn: {
get: function() {
if (!client.FunctionHelper) client.initFunctionHelper();
return client.FunctionHelper;
}
}
});
2014-05-05 22:22:51 -04:00
return knex;
};
module.exports = Knex;
2014-06-04 11:43:18 -04:00
2015-02-25 13:53:04 -05:00
},{"./lib/dialects/maria":undefined,"./lib/dialects/mysql":undefined,"./lib/dialects/mysql2":undefined,"./lib/dialects/oracle":undefined,"./lib/dialects/postgres":undefined,"./lib/dialects/sqlite3":undefined,"./lib/dialects/websql":19,"./lib/query/methods":30,"./lib/raw":31,"events":83}],2:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// "Base Client"
// ------
2014-10-01 16:29:39 -04:00
var Promise = require('./promise');
var _ = require('lodash');
var inherits = require('inherits');
var EventEmitter = require('events').EventEmitter;
2014-05-05 22:22:51 -04:00
// The base client provides the general structure
// for a dialect specific client object. The client
// object attaches fresh constructors for each component
// of the library.
function Client(config) {
2014-05-05 22:22:51 -04:00
this.initFormatter();
this.initRaw();
this.initTransaction();
this.initQuery();
this.migrationConfig = _.clone(config && config.migrations);
2014-10-01 16:29:39 -04:00
this.seedConfig = _.clone(config && config.seeds);
2014-05-05 22:22:51 -04:00
}
2014-06-23 19:02:01 -04:00
inherits(Client, EventEmitter);
2014-05-05 22:22:51 -04:00
// Set the "isDebugging" flag on the client to "true" to log
// all queries run by the client.
Client.prototype.isDebugging = false;
// Acquire a connection from the pool.
Client.prototype.acquireConnection = function() {
var pool = this.pool;
return new Promise(function(resolver, rejecter) {
if (!pool) return rejecter(new Error('There is no pool defined on the current client'));
pool.acquire(function(err, connection) {
if (err) return rejecter(err);
resolver(connection);
});
});
};
// Releases a connection from the connection pool,
// returning a promise resolved when the connection is released.
Client.prototype.releaseConnection = function(connection) {
var pool = this.pool;
return new Promise(function(resolver, rejecter) {
pool.release(connection, function(err) {
if (err) return rejecter(err);
resolver(connection);
});
});
};
2014-10-01 16:29:39 -04:00
// Destroy the current connection pool for the client.
Client.prototype.destroy = function(callback) {
var pool = this.pool;
var promise = new Promise(function(resolver, rejecter) {
if (!pool) resolver();
pool.destroy(function(err) {
if (err) return rejecter(err);
resolver();
});
});
// Allow either a callback or promise interface for destruction.
if (typeof callback === 'function') {
promise.exec(callback);
} else {
return promise;
}
};
2014-05-05 22:22:51 -04:00
// Return the database being used by this client.
Client.prototype.database = function() {
2014-10-03 12:26:29 -04:00
return this.databaseName || this.connectionSettings.database;
2014-05-05 22:22:51 -04:00
};
module.exports = Client;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"./promise":26,"events":83,"inherits":87,"lodash":88}],3:[function(require,module,exports){
(function (Buffer){
2014-10-01 16:29:39 -04:00
'use strict';
function zeroPad(number, length) {
number = number.toString();
while (number.length < length) {
number = '0' + number;
}
return number;
}
function convertTimezone(tz) {
if (tz === "Z") return 0;
var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/);
if (m) {
return (m[1] === '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60;
}
return false;
}
var SqlString = exports;
SqlString.escapeId = function (val, forbidQualified) {
if (Array.isArray(val)) {
return val.map(function(v) {
return SqlString.escapeId(v, forbidQualified);
}).join(', ');
}
if (forbidQualified) {
return '`' + val.replace(/`/g, '``') + '`';
}
return '`' + val.replace(/`/g, '``').replace(/\./g, '`.`') + '`';
};
SqlString.escape = function(val, stringifyObjects, timeZone) {
if (val === undefined || val === null) {
return 'NULL';
}
switch (typeof val) {
case 'boolean': return (val) ? 'true' : 'false';
case 'number': return val+'';
}
if (val instanceof Date) {
val = SqlString.dateToString(val, timeZone || 'local');
}
if (Buffer.isBuffer(val)) {
return SqlString.bufferToString(val);
}
if (Array.isArray(val)) {
return SqlString.arrayToList(val, timeZone);
}
if (typeof val === 'object') {
if (stringifyObjects) {
val = val.toString();
} else {
return SqlString.objectToValues(val, timeZone);
}
}
val = val.replace(/[\0\n\r\b\t\\\'\"\x1a]/g, function(s) {
switch(s) {
case "\0": return "\\0";
case "\n": return "\\n";
case "\r": return "\\r";
case "\b": return "\\b";
case "\t": return "\\t";
case "\x1a": return "\\Z";
default: return "\\"+s;
}
});
return "'"+val+"'";
};
SqlString.arrayToList = function(array, timeZone) {
return array.map(function(v) {
if (Array.isArray(v)) return '(' + SqlString.arrayToList(v, timeZone) + ')';
return SqlString.escape(v, true, timeZone);
}).join(', ');
};
SqlString.format = function(sql, values, stringifyObjects, timeZone) {
2014-10-01 16:29:39 -04:00
values = !values ? [] : [].concat(values);
return sql.replace(/\?\??/g, function(match) {
if (!values.length) {
return match;
}
2014-10-01 16:29:39 -04:00
if (match === "??") {
return SqlString.escapeId(values.shift());
}
return SqlString.escape(values.shift(), stringifyObjects, timeZone);
});
};
SqlString.dateToString = function(date, timeZone) {
var dt = new Date(date);
2014-10-01 16:29:39 -04:00
if (timeZone !== 'local') {
var tz = convertTimezone(timeZone);
dt.setTime(dt.getTime() + (dt.getTimezoneOffset() * 60000));
if (tz !== false) {
dt.setTime(dt.getTime() + (tz * 60000));
}
}
var year = dt.getFullYear();
var month = zeroPad(dt.getMonth() + 1, 2);
var day = zeroPad(dt.getDate(), 2);
var hour = zeroPad(dt.getHours(), 2);
var minute = zeroPad(dt.getMinutes(), 2);
var second = zeroPad(dt.getSeconds(), 2);
var millisecond = zeroPad(dt.getMilliseconds(), 3);
return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second + '.' + millisecond;
};
SqlString.bufferToString = function(buffer) {
var hex = '';
try {
hex = buffer.toString('hex');
} catch (err) {
// node v0.4.x does not support hex / throws unknown encoding error
for (var i = 0; i < buffer.length; i++) {
var byte = buffer[i];
hex += zeroPad(byte.toString(16));
}
}
return "X'" + hex+ "'";
};
SqlString.objectToValues = function(object, timeZone) {
var values = [];
for (var key in object) {
var value = object[key];
if(typeof value === 'function') {
continue;
}
values.push(this.escapeId(key) + ' = ' + SqlString.escape(value, true, timeZone));
}
return values.join(', ');
};
2014-10-01 16:29:39 -04:00
}).call(this,require("buffer").Buffer)
2015-02-25 13:53:04 -05:00
},{"buffer":79}],4:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3 Formatter
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var Formatter = require('../../formatter');
var inherits = require('inherits');
2014-05-05 22:22:51 -04:00
// The "formatter" is used to ensure all output is properly
// escaped & parameterized.
function Formatter_SQLite3() {
this.client = client;
Formatter.apply(this, arguments);
}
inherits(Formatter_SQLite3, Formatter);
Formatter_SQLite3.prototype.operators = [
'=', '<', '>', '<=', '>=', '<>', '!=',
'like', 'not like', 'between', 'ilike',
'&', '|', '<<', '>>'
];
2014-05-05 22:22:51 -04:00
// Wraps a value (column, tableName) with the correct ticks.
Formatter_SQLite3.prototype.wrapValue = function(value) {
return (value !== '*' ? '"' + value + '"' : '*');
};
// Memoize the calls to "wrap" for a little extra perf.
var wrapperMemo = (function(){
var memo = Object.create(null);
return function(key) {
2014-06-10 11:52:42 -04:00
if (memo[key] === void 0) {
2014-05-05 22:22:51 -04:00
memo[key] = this._wrapString(key);
}
return memo[key];
};
}());
Formatter_SQLite3.prototype._wrap = wrapperMemo;
// Assign the formatter to the the client.
client.Formatter = Formatter_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../formatter":21,"inherits":87}],5:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
module.exports = function(client) {
var FunctionHelper = require('../../functionhelper');
var FunctionHelper_SQLite3 = Object.create(FunctionHelper);
FunctionHelper_SQLite3.client = client;
// Assign the newly extended `FunctionHelper` constructor to the client object.
client.FunctionHelper = FunctionHelper_SQLite3;
};
},{"../../functionhelper":22}],6:[function(require,module,exports){
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3
// -------
2014-10-01 16:29:39 -04:00
var inherits = require('inherits');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var Client = require('../../client');
var Promise = require('../../promise');
2014-05-05 22:22:51 -04:00
function Client_SQLite3(config) {
Client.apply(this, arguments);
if (config.debug) this.isDebugging = true;
if (config.connection) {
this.initDriver();
this.initRunner();
this.connectionSettings = config.connection;
this.initPool();
this.pool = new this.Pool(config.pool);
}
// Todo: Plugins here possibly??
}
inherits(Client_SQLite3, Client);
// Lazy load the sqlite3 module, since we might just be using
// the client to generate SQL strings.
var sqlite3;
2014-10-01 16:29:39 -04:00
Client_SQLite3.prototype.dialect = 'sqlite3';
2014-05-05 22:22:51 -04:00
Client_SQLite3.prototype.initTransaction = function() {
2014-10-01 16:29:39 -04:00
require('./transaction')(this);
2014-05-05 22:22:51 -04:00
};
Client_SQLite3.prototype.initFormatter = function() {
2014-10-01 16:29:39 -04:00
require('./formatter')(this);
2014-05-05 22:22:51 -04:00
};
// Lazy-load the sqlite3 dependency.
Client_SQLite3.prototype.initDriver = function() {
2014-10-01 16:29:39 -04:00
sqlite3 = sqlite3 || require('sqlite3');
2014-05-05 22:22:51 -04:00
};
// Initialize the raw connection on the client.
Client_SQLite3.prototype.initRaw = function() {
2014-10-01 16:29:39 -04:00
require('./raw')(this);
};
// Attaches the `FunctionHelper` constructor to the client object.
Client_SQLite3.prototype.initFunctionHelper = function() {
require('./functionhelper')(this);
2014-05-05 22:22:51 -04:00
};
// Always initialize with the "Query" and "QueryCompiler"
// objects, each of which is unique to this client (and thus)
// can be altered without messing up anything for anyone else.
Client_SQLite3.prototype.initQuery = function() {
2014-10-01 16:29:39 -04:00
require('./query')(this);
2014-05-05 22:22:51 -04:00
};
// Initializes a new pool instance for the current client.
Client_SQLite3.prototype.initPool = function() {
2014-10-01 16:29:39 -04:00
require('./pool')(this);
2014-05-05 22:22:51 -04:00
};
// Initialize the query "runner"
Client_SQLite3.prototype.initRunner = function() {
2014-10-01 16:29:39 -04:00
require('./runner')(this);
2014-05-05 22:22:51 -04:00
};
// Lazy-load the schema dependencies.
Client_SQLite3.prototype.initSchema = function() {
2014-10-01 16:29:39 -04:00
require('./schema')(this);
2014-05-05 22:22:51 -04:00
};
// Lazy-load the migration dependency
Client_SQLite3.prototype.initMigrator = function() {
2014-10-01 16:29:39 -04:00
require('./migrator')(this);
};
// Lazy-load the seeding dependency
Client_SQLite3.prototype.initSeeder = function() {
require('./seeder')(this);
2014-05-05 22:22:51 -04:00
};
// Get a raw connection from the database, returning a promise with the connection object.
Client_SQLite3.prototype.acquireRawConnection = function() {
var driver = this;
return new Promise(function(resolve, reject) {
var db = new sqlite3.Database(driver.connectionSettings.filename, function(err) {
if (err) return reject(err);
resolve(db);
});
});
};
// Used to explicitly close a connection, called internally by the pool
// when a connection times out or the pool is shutdown.
Client_SQLite3.prototype.destroyRawConnection = Promise.method(function(connection) {
connection.close();
});
module.exports = Client_SQLite3;
2015-02-25 13:53:04 -05:00
},{"../../client":2,"../../promise":26,"./formatter":4,"./functionhelper":5,"./migrator":7,"./pool":8,"./query":9,"./raw":10,"./runner":11,"./schema":14,"./seeder":17,"./transaction":18,"inherits":87,"sqlite3":undefined}],7:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var Migrator = require('../../migrate');
var inherits = require('inherits');
2014-05-05 22:22:51 -04:00
// Inherit from the `Migrator` constructor's prototype,
// so we can add the correct `then` method.
function Migrator_SQLite3() {
this.client = client;
2014-05-05 22:22:51 -04:00
Migrator.apply(this, arguments);
}
inherits(Migrator_SQLite3, Migrator);
// Assign the newly extended `Migrator` constructor to the client object.
client.Migrator = Migrator_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../migrate":undefined,"inherits":87}],8:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var Pool = require('../../pool');
var inherits = require('inherits');
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
// Inherit from the `Pool` constructor's prototype.
function Pool_SQLite3() {
this.client = client;
Pool.apply(this, arguments);
}
inherits(Pool_SQLite3, Pool);
Pool_SQLite3.prototype.defaults = function() {
return _.extend(Pool.prototype.defaults.call(this), {
max: 1,
min: 1,
destroy: function(client) { client.close(); }
});
};
// Assign the newly extended `Pool` constructor to the client object.
client.Pool = Pool_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../pool":25,"inherits":87,"lodash":88}],9:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3 Query Builder & Compiler
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var inherits = require('inherits');
2014-05-05 22:22:51 -04:00
2015-02-25 13:53:04 -05:00
var Raw = require('../../raw');
2014-10-01 16:29:39 -04:00
var QueryBuilder = require('../../query/builder');
var QueryCompiler = require('../../query/compiler');
2014-05-05 22:22:51 -04:00
// Query Builder
// -------
function QueryBuilder_SQLite3() {
this.client = client;
QueryBuilder.apply(this, arguments);
}
inherits(QueryBuilder_SQLite3, QueryBuilder);
2015-02-25 13:53:04 -05:00
// Adds a raw `where` clause to the query.
QueryBuilder_SQLite3.prototype.whereRaw =
QueryBuilder_SQLite3.prototype.andWhereRaw = function(sql, bindings) {
// sqlite uses ints for bools, so cast true/false to 1/0
if (typeof sql === 'boolean') { sql = Number(sql); }
var raw = (sql instanceof Raw ? sql : new Raw(sql, bindings));
this._statements.push({
grouping: 'where',
type: 'whereRaw',
value: raw,
bool: this._bool()
});
return this;
};
2014-05-05 22:22:51 -04:00
// Query Compiler
// -------
function QueryCompiler_SQLite3() {
this.formatter = new client.Formatter();
QueryCompiler.apply(this, arguments);
}
inherits(QueryCompiler_SQLite3, QueryCompiler);
// The locks are not applicable in SQLite3
QueryCompiler_SQLite3.prototype.forShare =
QueryCompiler_SQLite3.prototype.forUpdate = function() {
return '';
};
// SQLite requires us to build the multi-row insert as a listing of select with
// unions joining them together. So we'll build out this list of columns and
// then join them all together with select unions to complete the queries.
QueryCompiler_SQLite3.prototype.insert = function() {
var insert = this.single.insert;
var sql = 'insert into ' + this.tableName + ' ';
2014-10-01 16:29:39 -04:00
if (_.isArray(insert) && (insert.length === 1) && _.isEmpty(insert[0])) {
insert = [];
}
if (_.isEmpty(insert) && !_.isFunction(insert)) {
return sql + 'default values';
}
2014-05-05 22:22:51 -04:00
var insertData = this._prepInsert(insert);
2014-10-01 16:29:39 -04:00
if (_.isString(insertData)) return sql + insertData;
2014-05-05 22:22:51 -04:00
sql += '(' + this.formatter.columnize(insertData.columns) + ')';
if (insertData.values.length === 1) {
return sql + ' values (' + this.formatter.parameterize(insertData.values[0]) + ')';
}
var blocks = [];
for (var i = 0, l = insertData.values.length; i < l; i++) {
var block = blocks[i] = [];
var current = insertData.values[i];
for (var i2 = 0, l2 = insertData.columns.length; i2 < l2; i2++) {
block.push(this.formatter.parameter(current[i2]) + ' as ' + this.formatter.wrap(insertData.columns[i2]));
}
blocks[i] = block.join(', ');
}
return sql + ' select ' + blocks.join(' union all select ');
};
// Compile a truncate table statement into SQL.
QueryCompiler_SQLite3.prototype.truncate = function() {
var table = this.tableName;
return {
sql: 'delete from sqlite_sequence where name = ' + this.tableName,
output: function() {
return this.query({sql: 'delete from ' + table});
}
};
};
// Compiles a `columnInfo` query
QueryCompiler_SQLite3.prototype.columnInfo = function() {
var column = this.single.columnInfo;
2014-05-05 22:22:51 -04:00
return {
sql: 'PRAGMA table_info(' + this.single.table +')',
output: function(resp) {
var maxLengthRegex = /.*\((\d+)\)/;
var out = _.reduce(resp, function (columns, val) {
2014-05-05 22:22:51 -04:00
var type = val.type;
var maxLength = (maxLength = type.match(maxLengthRegex)) && maxLength[1];
type = maxLength ? type.split('(')[0] : type;
columns[val.name] = {
type: type.toLowerCase(),
maxLength: maxLength,
nullable: !val.notnull,
defaultValue: val.dflt_value
};
return columns;
}, {});
return column && out[column] || out;
2014-05-05 22:22:51 -04:00
}
};
};
2014-10-01 16:29:39 -04:00
QueryCompiler_SQLite3.prototype.limit = function() {
2015-02-25 13:53:04 -05:00
var noLimit = !this.single.limit && this.single.limit !== 0;
if (noLimit && !this.single.offset) return '';
2014-10-01 16:29:39 -04:00
// Workaround for offset only, see http://stackoverflow.com/questions/10491492/sqllite-with-skip-offset-only-not-limit
2015-02-25 13:53:04 -05:00
return 'limit ' + this.formatter.parameter((this.single.offset && noLimit) ? -1 : this.single.limit);
2014-10-01 16:29:39 -04:00
};
2014-05-05 22:22:51 -04:00
client.QueryBuilder = QueryBuilder_SQLite3;
client.QueryCompiler = QueryCompiler_SQLite3;
};
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"../../query/builder":27,"../../query/compiler":28,"../../raw":31,"inherits":87,"lodash":88}],10:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Raw
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var Raw = require('../../raw');
var inherits = require('inherits');
2014-05-05 22:22:51 -04:00
// Inherit from the `Raw` constructor's prototype,
// so we can add the correct `then` method.
function Raw_SQLite3() {
this.client = client;
Raw.apply(this, arguments);
}
inherits(Raw_SQLite3, Raw);
// Assign the newly extended `Raw` constructor to the client object.
client.Raw = Raw_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../raw":31,"inherits":87}],11:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Runner
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var Promise = require('../../promise');
var Runner = require('../../runner');
var helpers = require('../../helpers');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var inherits = require('inherits');
2014-05-05 22:22:51 -04:00
// Inherit from the `Runner` constructor's prototype,
// so we can add the correct `then` method.
function Runner_SQLite3() {
this.client = client;
Runner.apply(this, arguments);
}
inherits(Runner_SQLite3, Runner);
Runner_SQLite3.prototype._beginTransaction = 'begin transaction;';
// Runs the query on the specified connection, providing the bindings and any other necessary prep work.
Runner_SQLite3.prototype._query = Promise.method(function(obj) {
var method = obj.method;
if (this.isDebugging()) this.debug(obj);
2014-06-18 12:59:25 -04:00
var callMethod;
switch (method) {
case 'insert':
case 'update':
case 'counter':
case 'del':
callMethod = 'run';
break;
default:
callMethod = 'all';
}
2014-05-05 22:22:51 -04:00
var connection = this.connection;
return new Promise(function(resolver, rejecter) {
if (!connection || !connection[callMethod]) {
return rejecter(new Error('Error calling ' + callMethod + ' on connection.'));
}
connection[callMethod](obj.sql, obj.bindings, function(err, response) {
if (err) return rejecter(err);
obj.response = response;
// We need the context here, as it contains
// the "this.lastID" or "this.changes"
obj.context = this;
return resolver(obj);
});
});
});
// Sounds like .each doesn't work great for
2014-05-05 22:22:51 -04:00
Runner_SQLite3.prototype._stream = Promise.method(function(sql, stream, options) {
2014-10-01 16:29:39 -04:00
/*jshint unused: false*/
2014-05-05 22:22:51 -04:00
var runner = this;
return new Promise(function(resolver, rejecter) {
stream.on('error', rejecter);
stream.on('end', resolver);
2014-06-25 05:18:32 -04:00
return runner.query(sql).map(function(row) {
2014-05-05 22:22:51 -04:00
stream.write(row);
2014-07-09 10:40:01 -04:00
}).catch(function(err) {
stream.emit('error', err);
}).then(function() {
2014-05-05 22:22:51 -04:00
stream.end();
});
});
});
// Ensures the response is returned in the same format as other clients.
Runner_SQLite3.prototype.processResponse = function(obj) {
var ctx = obj.context;
var response = obj.response;
if (obj.output) return obj.output.call(this, response);
2014-06-04 16:24:29 -04:00
switch (obj.method) {
case 'select':
case 'pluck':
case 'first':
response = helpers.skim(response);
if (obj.method === 'pluck') response = _.pluck(response, obj.pluck);
return obj.method === 'first' ? response[0] : response;
case 'insert':
return [ctx.lastID];
case 'del':
case 'update':
2014-06-18 12:59:25 -04:00
case 'counter':
2014-06-04 16:24:29 -04:00
return ctx.changes;
default:
return response;
2014-05-05 22:22:51 -04:00
}
};
// Assign the newly extended `Runner` constructor to the client object.
client.Runner = Runner_SQLite3;
};
2014-07-09 10:40:01 -04:00
2015-02-25 13:53:04 -05:00
},{"../../helpers":23,"../../promise":26,"../../runner":32,"inherits":87,"lodash":88}],12:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3: Column Builder & Compiler
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var inherits = require('inherits');
var Schema = require('../../../schema');
2014-05-05 22:22:51 -04:00
// Column Builder
// -------
function ColumnBuilder_SQLite3() {
this.client = client;
Schema.ColumnBuilder.apply(this, arguments);
}
inherits(ColumnBuilder_SQLite3, Schema.ColumnBuilder);
// Column Compiler
// -------
function ColumnCompiler_SQLite3() {
this.modifiers = ['nullable', 'defaultTo'];
this.Formatter = client.Formatter;
Schema.ColumnCompiler.apply(this, arguments);
}
inherits(ColumnCompiler_SQLite3, Schema.ColumnCompiler);
// Types
// -------
ColumnCompiler_SQLite3.prototype.double =
ColumnCompiler_SQLite3.prototype.decimal =
ColumnCompiler_SQLite3.prototype.floating = 'float';
ColumnCompiler_SQLite3.prototype.timestamp = 'datetime';
client.ColumnBuilder = ColumnBuilder_SQLite3;
client.ColumnCompiler = ColumnCompiler_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../../schema":37,"inherits":87}],13:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3_DDL
//
// All of the SQLite3 specific DDL helpers for renaming/dropping
// columns and changing datatypes.
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var Promise = require('../../../promise');
2014-05-05 22:22:51 -04:00
// So altering the schema in SQLite3 is a major pain.
// We have our own object to deal with the renaming and altering the types
// for sqlite3 things.
function SQLite3_DDL(runner, tableCompiler, pragma) {
this.tableCompiler = tableCompiler;
this.pragma = pragma;
this.runner = runner;
2014-10-01 16:29:39 -04:00
this.formatter = new client.Formatter();
2014-05-05 22:22:51 -04:00
this.tableName = this.tableCompiler.tableNameRaw;
this.alteredName = '_knex_temp_alter' + _.uniqueId();
}
SQLite3_DDL.prototype.getColumn = Promise.method(function(column) {
var currentCol = _.findWhere(this.pragma, {name: column});
if (!currentCol) throw new Error('The column ' + column + ' is not in the ' + this.tableName + ' table');
return currentCol;
});
SQLite3_DDL.prototype.ensureTransaction = Promise.method(function() {
if (!this.runner.transaction) {
2014-10-01 16:29:39 -04:00
return this.runner.beginTransaction();
2014-05-05 22:22:51 -04:00
}
});
SQLite3_DDL.prototype.commitTransaction = Promise.method(function() {
2014-10-01 16:29:39 -04:00
if (!this.runner.transaction) {
return this.runner.commitTransaction();
}
2014-05-05 22:22:51 -04:00
});
SQLite3_DDL.prototype.rollbackTransaction = function(e) {
2014-10-01 16:29:39 -04:00
if (this.runner.transaction) throw e;
return this.runner.rollbackTransaction().throw(e);
2014-05-05 22:22:51 -04:00
};
SQLite3_DDL.prototype.getTableSql = function() {
return this.runner.query({sql: 'SELECT name, sql FROM sqlite_master WHERE type="table" AND name="' + this.tableName + '"'});
};
SQLite3_DDL.prototype.renameTable = Promise.method(function() {
return this.runner.query({sql: 'ALTER TABLE "' + this.tableName + '" RENAME TO "' + this.alteredName + '"'});
});
SQLite3_DDL.prototype.dropOriginal = function() {
return this.runner.query({sql: 'DROP TABLE "' + this.tableName + '"'});
};
SQLite3_DDL.prototype.dropTempTable = function() {
return this.runner.query({sql: 'DROP TABLE "' + this.alteredName + '"'});
};
SQLite3_DDL.prototype.copyData = function() {
return this.runner.query({sql: 'SELECT * FROM "' + this.tableName + '"'})
.bind(this)
.then(this.insertChunked(20, this.alteredName));
};
SQLite3_DDL.prototype.reinsertData = function(iterator) {
return function() {
return this.runner.query({sql: 'SELECT * FROM "' + this.alteredName + '"'})
.bind(this)
.then(this.insertChunked(20, this.tableName, iterator));
};
};
SQLite3_DDL.prototype.insertChunked = function(amount, target, iterator) {
iterator = iterator || function(noop) { return noop; };
return function(result) {
var batch = [];
var ddl = this;
return Promise.reduce(result, function(memo, row) {
memo++;
2014-10-01 16:29:39 -04:00
batch.push(row);
2014-05-05 22:22:51 -04:00
if (memo % 20 === 0 || memo === result.length) {
return new client.QueryBuilder()
.connection(ddl.runner.connection)
.table(target)
.insert(_.map(batch, iterator))
.then(function() { batch = []; })
.thenReturn(memo);
}
return memo;
}, 0);
};
};
SQLite3_DDL.prototype.createTempTable = function(createTable) {
return function() {
return this.runner.query({sql: createTable.sql.replace(this.tableName, this.alteredName)});
};
};
// Boy, this is quite a method.
SQLite3_DDL.prototype.renameColumn = Promise.method(function(from, to) {
var currentCol;
2014-10-01 16:29:39 -04:00
return this.ensureTransaction()
2014-05-05 22:22:51 -04:00
.bind(this)
2014-10-01 16:29:39 -04:00
.then(function() {
return this.getColumn(from);
})
2014-05-05 22:22:51 -04:00
.tap(function(col) { currentCol = col; })
.then(this.getTableSql)
.then(function(sql) {
var createTable = sql[0];
var a = this.formatter.wrap(from) + ' ' + currentCol.type;
var b = this.formatter.wrap(to) + ' ' + currentCol.type;
if (createTable.sql.indexOf(a) === -1) {
throw new Error('Unable to find the column to change');
}
return Promise.bind(this)
.then(this.createTempTable(createTable))
.then(this.copyData)
.then(this.dropOriginal)
.then(function() {
return this.runner.query({sql: createTable.sql.replace(a, b)});
2014-06-09 15:33:09 -04:00
})
.then(this.reinsertData(function(row) {
2014-05-05 22:22:51 -04:00
row[to] = row[from];
return _.omit(row, from);
2014-06-09 15:33:09 -04:00
}))
.then(this.dropTempTable);
2014-05-05 22:22:51 -04:00
})
.tap(this.commitTransaction)
.catch(this.rollbackTransaction);
});
SQLite3_DDL.prototype.dropColumn = Promise.method(function(column) {
2014-06-09 15:33:09 -04:00
var currentCol;
2014-10-01 16:29:39 -04:00
return this.ensureTransaction()
2014-06-09 15:33:09 -04:00
.bind(this)
2014-10-01 16:29:39 -04:00
.then(function() {
return this.getColumn(column);
})
2014-06-09 15:33:09 -04:00
.tap(function(col) { currentCol = col; })
.then(this.getTableSql)
.then(function(sql) {
var createTable = sql[0];
2015-02-25 13:53:04 -05:00
var a;
var a0 = this.formatter.wrap(column) + ' ' + currentCol.type;
var al = a0 + ', ';
if (createTable.sql.indexOf(al) !== -1) {
a = al;
} else {
var af = ', ' + a0;
if (createTable.sql.indexOf(af) !== -1) {
a = af;
}
}
if (!a) {
2014-06-09 15:33:09 -04:00
throw new Error('Unable to find the column to change');
}
return Promise.bind(this)
.then(this.createTempTable(createTable))
.then(this.copyData)
.then(this.dropOriginal)
.then(function() {
return this.runner.query({sql: createTable.sql.replace(a, '')});
})
.then(this.reinsertData(function(row) {
return _.omit(row, column);
}))
.then(this.dropTempTable);
})
.tap(this.commitTransaction)
.catch(this.rollbackTransaction);
2014-05-05 22:22:51 -04:00
});
client.SQLite3_DDL = SQLite3_DDL;
};
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"../../../promise":26,"lodash":88}],14:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
require('./ddl')(client);
require('./schema')(client);
require('./table')(client);
require('./column')(client);
2014-05-05 22:22:51 -04:00
};
2014-10-01 16:29:39 -04:00
},{"./column":12,"./ddl":13,"./schema":15,"./table":16}],15:[function(require,module,exports){
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3: Column Builder & Compiler
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var inherits = require('inherits');
var Schema = require('../../../schema');
2014-05-05 22:22:51 -04:00
// Schema Builder
// -------
function SchemaBuilder_SQLite3() {
this.client = client;
Schema.Builder.apply(this, arguments);
}
inherits(SchemaBuilder_SQLite3, Schema.Builder);
// Schema Compiler
// -------
function SchemaCompiler_SQLite3() {
this.client = client;
this.Formatter = client.Formatter;
Schema.Compiler.apply(this, arguments);
}
inherits(SchemaCompiler_SQLite3, Schema.Compiler);
// Compile the query to determine if a table exists.
SchemaCompiler_SQLite3.prototype.hasTable = function(tableName) {
this.pushQuery({
sql: "select * from sqlite_master where type = 'table' and name = " + this.formatter.parameter(tableName),
output: function(resp) {
return resp.length > 0;
}
});
};
// Compile the query to determine if a column exists.
SchemaCompiler_SQLite3.prototype.hasColumn = function(tableName, column) {
this.pushQuery({
sql: 'PRAGMA table_info(' + this.formatter.wrap(tableName) + ')',
output: function(resp) {
2014-10-01 16:29:39 -04:00
return _.some(resp, {name: column});
2014-05-05 22:22:51 -04:00
}
});
};
// Compile a rename table command.
SchemaCompiler_SQLite3.prototype.renameTable = function(from, to) {
this.pushQuery('alter table ' + this.formatter.wrap(from) + ' rename to ' + this.formatter.wrap(to));
};
client.SchemaBuilder = SchemaBuilder_SQLite3;
client.SchemaCompiler = SchemaCompiler_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../../schema":37,"inherits":87,"lodash":88}],16:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3: Column Builder & Compiler
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var inherits = require('inherits');
var Schema = require('../../../schema');
2014-05-05 22:22:51 -04:00
// Table Builder
// -------
function TableBuilder_SQLite3() {
this.client = client;
Schema.TableBuilder.apply(this, arguments);
}
inherits(TableBuilder_SQLite3, Schema.TableBuilder);
// Table Compiler
// -------
function TableCompiler_SQLite3() {
this.client = client;
this.Formatter = client.Formatter;
this.SQLite3_DDL = client.SQLite3_DDL;
this.primaryKey = void 0;
Schema.TableCompiler.apply(this, arguments);
}
inherits(TableCompiler_SQLite3, Schema.TableCompiler);
// Create a new table.
2014-10-01 16:29:39 -04:00
TableCompiler_SQLite3.prototype.createQuery = function(columns, ifNot) {
var createStatement = ifNot ? 'create table if not exists ' : 'create table ';
var sql = createStatement + this.tableName() + ' (' + columns.sql.join(', ');
2014-05-05 22:22:51 -04:00
// SQLite forces primary keys to be added when the table is initially created
// so we will need to check for a primary key commands and add the columns
// to the table's declaration here so they can be created on the tables.
sql += this.foreignKeys() || '';
sql += this.primaryKeys() || '';
sql += ')';
this.pushQuery(sql);
};
TableCompiler_SQLite3.prototype.addColumns = function(columns) {
for (var i = 0, l = columns.sql.length; i < l; i++) {
this.pushQuery({
sql: 'alter table ' + this.tableName() + ' add column ' + columns.sql[i],
bindings: columns.bindings[i]
});
}
};
// Compile a drop unique key command.
2014-06-04 11:43:18 -04:00
TableCompiler_SQLite3.prototype.dropUnique = function(columns, indexName) {
indexName = indexName || this._indexCommand('unique', this.tableNameRaw, columns);
this.pushQuery('drop index ' + indexName);
2014-05-05 22:22:51 -04:00
};
2014-06-04 11:43:18 -04:00
TableCompiler_SQLite3.prototype.dropIndex = function(columns, indexName) {
indexName = indexName || this._indexCommand('index', this.tableNameRaw, columns);
this.pushQuery('drop index ' + indexName);
2014-05-05 22:22:51 -04:00
};
// Compile a unique key command.
TableCompiler_SQLite3.prototype.unique = function(columns, indexName) {
indexName = indexName || this._indexCommand('unique', this.tableNameRaw, columns);
columns = this.formatter.columnize(columns);
this.pushQuery('create unique index ' + indexName + ' on ' + this.tableName() + ' (' + columns + ')');
};
// Compile a plain index key command.
TableCompiler_SQLite3.prototype.index = function(columns, indexName) {
indexName = indexName || this._indexCommand('index', this.tableNameRaw, columns);
columns = this.formatter.columnize(columns);
this.pushQuery('create index ' + indexName + ' on ' + this.tableName() + ' (' + columns + ')');
};
TableCompiler_SQLite3.prototype.primary =
TableCompiler_SQLite3.prototype.foreign = function() {
if (this.method !== 'create') {
2014-06-09 15:33:09 -04:00
console.warn('SQLite3 Foreign & Primary keys may only be added on create');
2014-05-05 22:22:51 -04:00
}
};
TableCompiler_SQLite3.prototype.primaryKeys = function() {
var pks = _.where(this.grouped.alterTable || [], {method: 'primary'});
if (pks.length > 0 && pks[0].args.length > 0) {
2014-10-01 16:29:39 -04:00
var args = _.isArray(pks[0].args[0]) ? pks[0].args[0] : pks[0].args;
return ', primary key (' + this.formatter.columnize(args) + ')';
2014-05-05 22:22:51 -04:00
}
};
TableCompiler_SQLite3.prototype.foreignKeys = function() {
var sql = '';
var foreignKeys = _.where(this.grouped.alterTable || [], {method: 'foreign'});
for (var i = 0, l = foreignKeys.length; i < l; i++) {
var foreign = foreignKeys[i].args[0];
var column = this.formatter.columnize(foreign.column);
var references = this.formatter.columnize(foreign.references);
var foreignTable = this.formatter.wrap(foreign.inTable);
sql += ', foreign key(' + column + ') references ' + foreignTable + '(' + references + ')';
if (foreign.onDelete) sql += ' on delete ' + foreign.onDelete;
if (foreign.onUpdate) sql += ' on update ' + foreign.onUpdate;
}
return sql;
};
TableCompiler_SQLite3.prototype.createTableBlock = function() {
return this.getColumns().concat().join(',');
};
// Compile a rename column command... very complex in sqlite
TableCompiler_SQLite3.prototype.renameColumn = function(from, to) {
var compiler = this;
this.pushQuery({
sql: 'PRAGMA table_info(' + this.tableName() + ')',
output: function(pragma) {
return new compiler.SQLite3_DDL(this, compiler, pragma).renameColumn(from, to);
}
});
};
TableCompiler_SQLite3.prototype.dropColumn = function(column) {
var compiler = this;
this.pushQuery({
sql: 'PRAGMA table_info(' + this.tableName() + ')',
output: function(pragma) {
return new compiler.SQLite3_DDL(this, compiler, pragma).dropColumn(column);
}
});
};
client.TableBuilder = TableBuilder_SQLite3;
client.TableCompiler = TableCompiler_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../../schema":37,"inherits":87,"lodash":88}],17:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
module.exports = function(client) {
var Seeder = require('../../seed');
var inherits = require('inherits');
// Inherit from the `Seeder` constructor's prototype,
// so we can add the correct `then` method.
function Seeder_SQLite3() {
this.client = client;
Seeder.apply(this, arguments);
}
inherits(Seeder_SQLite3, Seeder);
// Assign the newly extended `Seeder` constructor to the client object.
client.Seeder = Seeder_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../seed":undefined,"inherits":87}],18:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// SQLite3 Transaction
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var inherits = require('inherits');
var Transaction = require('../../transaction');
2014-05-05 22:22:51 -04:00
function Transaction_SQLite3() {
this.client = client;
Transaction.apply(this, arguments);
}
inherits(Transaction_SQLite3, Transaction);
client.Transaction = Transaction_SQLite3;
};
2015-02-25 13:53:04 -05:00
},{"../../transaction":40,"inherits":87}],19:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// WebSQL
// -------
2014-10-01 16:29:39 -04:00
var inherits = require('inherits');
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var Client_SQLite3 = require('../sqlite3/index');
var Promise = require('../../promise');
2014-05-05 22:22:51 -04:00
function Client_WebSQL(config) {
config = config || {};
Client_SQLite3.super_.apply(this, arguments);
if (config.debug) this.isDebugging = true;
this.name = config.name || 'knex_database';
2014-10-01 16:29:39 -04:00
this.version = config.version || '1.0';
this.displayName = config.displayName || this.name;
this.estimatedSize = config.estimatedSize || 5 * 1024 * 1024;
2014-05-05 22:22:51 -04:00
this.initDriver();
this.initRunner();
2014-10-01 16:29:39 -04:00
this.transaction = function () {
return this;
};
2014-05-05 22:22:51 -04:00
}
inherits(Client_WebSQL, Client_SQLite3);
2014-10-01 16:29:39 -04:00
Client_WebSQL.prototype.dialect = 'websql';
2014-05-05 22:22:51 -04:00
Client_WebSQL.prototype.initDriver = function() {};
Client_WebSQL.prototype.initPool = function() {};
Client_WebSQL.prototype.initMigrator = function() {};
// Initialize the query "runner"
Client_WebSQL.prototype.initRunner = function() {
2014-10-01 16:29:39 -04:00
require('./runner')(this);
2014-05-05 22:22:51 -04:00
};
// Get a raw connection from the database, returning a promise with the connection object.
Client_WebSQL.prototype.acquireConnection = function() {
var client = this;
return new Promise(function(resolve, reject) {
try {
2014-10-01 16:29:39 -04:00
/*jslint browser: true*/
var db = openDatabase(client.name, client.version, client.displayName, client.estimatedSize);
2014-05-05 22:22:51 -04:00
db.transaction(function(t) {
t.__cid = _.uniqueId('__cid');
resolve(t);
});
} catch (e) {
reject(e);
}
});
};
// Used to explicitly close a connection, called internally by the pool
// when a connection times out or the pool is shutdown.
2014-10-01 16:29:39 -04:00
Client_WebSQL.prototype.releaseConnection = Promise.method(function() {});
2014-05-05 22:22:51 -04:00
module.exports = Client_WebSQL;
2015-02-25 13:53:04 -05:00
},{"../../promise":26,"../sqlite3/index":6,"./runner":20,"inherits":87,"lodash":88}],20:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Runner
// -------
module.exports = function(client) {
2014-10-01 16:29:39 -04:00
var Promise = require('../../promise');
2014-05-05 22:22:51 -04:00
// Require the SQLite3 Runner.
2014-10-01 16:29:39 -04:00
require('../sqlite3/runner')(client);
2014-05-05 22:22:51 -04:00
var Runner_SQLite3 = client.Runner;
2014-10-01 16:29:39 -04:00
var inherits = require('inherits');
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
// Inherit from the `Runner` constructor's prototype,
// so we can add the correct `then` method.
function Runner_WebSQL() {
Runner_SQLite3.apply(this, arguments);
}
inherits(Runner_WebSQL, Runner_SQLite3);
// Runs the query on the specified connection, providing the bindings and any other necessary prep work.
Runner_WebSQL.prototype._query = Promise.method(function(obj) {
if (this.isDebugging()) this.debug(obj);
var connection = this.connection;
return new Promise(function(resolver, rejecter) {
if (!connection) {
return rejecter(new Error('No connection provided.'));
}
connection.executeSql(obj.sql, obj.bindings, function(trx, response) {
obj.response = response;
return resolver(obj);
}, function(trx, err) {
rejecter(err);
});
});
});
2014-10-01 16:29:39 -04:00
// Null out the transaction statements so they aren't run.
Runner_WebSQL.prototype._beginTransaction = null;
Runner_WebSQL.prototype._commitTransaction = null;
Runner_WebSQL.prototype._rollbackTransaction = null;
2014-05-05 22:22:51 -04:00
// Ensures the response is returned in the same format as other clients.
Runner_WebSQL.prototype.processResponse = function(obj) {
var resp = obj.response;
2014-10-01 16:29:39 -04:00
if (obj.output) return obj.output.call(this, resp);
2014-06-04 16:24:29 -04:00
switch (obj.method) {
case 'pluck':
case 'first':
case 'select':
var results = [];
for (var i = 0, l = resp.rows.length; i < l; i++) {
results[i] = _.clone(resp.rows.item(i));
}
if (obj.method === 'pluck') results = _.pluck(results, obj.pluck);
return obj.method === 'first' ? results[0] : results;
case 'insert':
return [resp.insertId];
case 'delete':
case 'update':
2014-06-18 12:59:25 -04:00
case 'counter':
2014-06-04 16:24:29 -04:00
return resp.rowsAffected;
default:
return resp;
2014-05-05 22:22:51 -04:00
}
};
// Assign the newly extended `Runner` constructor to the client object.
client.Runner = Runner_WebSQL;
};
2015-02-25 13:53:04 -05:00
},{"../../promise":26,"../sqlite3/runner":11,"inherits":87,"lodash":88}],21:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Mixed into the query compiler & schema pieces. Assumes a `grammar`
// property exists on the current object.
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var QueryBuilder = require('./query/builder');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var Raw = require('./raw');
2014-05-05 22:22:51 -04:00
var push = Array.prototype.push;
// Valid values for the `order by` clause generation.
var orderBys = ['asc', 'desc'];
// A "formatter" instance is used to both determine how wrap, bind, and
// parameterize values within a query, keeping track of all bindings
// added to the query. This allows us to easily keep track of raw statements
// arbitrarily added to queries.
function Formatter() {
this.bindings = [];
}
// Turns a list of values into a list of ?'s, joining them with commas unless
// a "joining" value is specified (e.g. ' and ')
Formatter.prototype.parameterize = function(values) {
if (_.isFunction(values)) return this.parameter(values);
values = _.isArray(values) ? values : [values];
return _.map(values, this.parameter, this).join(', ');
};
// Checks whether a value is a function... if it is, we compile it
// otherwise we check whether it's a raw
Formatter.prototype.parameter = function(value) {
if (_.isFunction(value)) {
2014-06-14 17:46:20 -04:00
return this.outputQuery(this.compileCallback(value), true);
2014-05-05 22:22:51 -04:00
}
return this.checkRaw(value, true) || '?';
};
Formatter.prototype.checkRaw = function(value, parameter) {
if (value instanceof QueryBuilder) {
var query = value.toSQL();
if (query.bindings) push.apply(this.bindings, query.bindings);
2015-02-25 13:53:04 -05:00
return this.outputQuery(query, parameter);
2014-05-05 22:22:51 -04:00
}
if (value instanceof Raw) {
if (value.bindings) push.apply(this.bindings, value.bindings);
return value.sql;
}
if (parameter) this.bindings.push(value);
};
2014-06-14 10:04:27 -04:00
Formatter.prototype.rawOrFn = function(value, method) {
2014-05-05 22:22:51 -04:00
if (_.isFunction(value)) {
2014-06-14 17:46:20 -04:00
return this.outputQuery(this.compileCallback(value, method));
2014-05-05 22:22:51 -04:00
}
2014-06-14 10:04:27 -04:00
return this.checkRaw(value) || '';
2014-05-05 22:22:51 -04:00
};
// Puts the appropriate wrapper around a value depending on the database
// engine, unless it's a knex.raw value, in which case it's left alone.
2014-06-14 17:46:20 -04:00
Formatter.prototype.wrap = function(value) {
2014-05-05 22:22:51 -04:00
var raw;
2014-06-14 17:46:20 -04:00
if (_.isFunction(value)) {
return this.outputQuery(this.compileCallback(value), true);
}
2014-10-01 16:29:39 -04:00
raw = this.checkRaw(value);
if (raw) return raw;
2014-06-14 17:46:20 -04:00
if (_.isNumber(value)) return value;
return this._wrap(value + '');
2014-05-05 22:22:51 -04:00
};
// Coerce to string to prevent strange errors when it's not a string.
Formatter.prototype._wrapString = function(value) {
var segments, asIndex = value.toLowerCase().indexOf(' as ');
if (asIndex !== -1) {
var first = value.slice(0, asIndex);
var second = value.slice(asIndex + 4);
return this.wrap(first) + ' as ' + this.wrap(second);
}
var wrapped = [];
segments = value.split('.');
for (var i = 0, l = segments.length; i < l; i = ++i) {
value = segments[i];
if (i === 0 && segments.length > 1) {
2014-10-01 16:29:39 -04:00
wrapped.push(this.wrap((value || '').trim()));
2014-05-05 22:22:51 -04:00
} else {
2014-10-01 16:29:39 -04:00
wrapped.push(this.wrapValue((value || '').trim()));
2014-05-05 22:22:51 -04:00
}
}
return wrapped.join('.');
};
// Accepts a string or array of columns to wrap as appropriate.
Formatter.prototype.columnize = function(target) {
var columns = (_.isString(target) ? [target] : target);
return _.map(columns, this.wrap, this).join(', ');
};
// The operator method takes a value and returns something or other.
Formatter.prototype.operator = function(value) {
2014-10-01 16:29:39 -04:00
var raw = this.checkRaw(value);
if (raw) return raw;
2014-06-30 12:45:32 -04:00
if (!_.contains(this.operators, (value || '').toLowerCase())) {
throw new TypeError('The operator "' + value + '" is not permitted');
2014-05-05 22:22:51 -04:00
}
return value;
};
// Specify the direction of the ordering.
Formatter.prototype.direction = function(value) {
2014-10-01 16:29:39 -04:00
var raw = this.checkRaw(value);
if (raw) return raw;
2014-05-05 22:22:51 -04:00
return _.contains(orderBys, (value || '').toLowerCase()) ? value : 'asc';
};
2014-06-14 17:46:20 -04:00
// Compiles a callback using the query builder.
2014-05-05 22:22:51 -04:00
Formatter.prototype.compileCallback = function(callback, method) {
var client = this.client;
// Build the callback
var builder = new client.QueryBuilder();
callback.call(builder, builder);
// Compile the callback, using the current formatter (to track all bindings).
var compiler = new client.QueryCompiler(builder);
compiler.formatter = this;
// Return the compiled & parameterized sql.
2014-06-14 17:46:20 -04:00
return compiler.toSQL(method || 'select');
};
// Ensures the query is aliased if necessary.
Formatter.prototype.outputQuery = function(compiled, alwaysWrapped) {
var sql = compiled.sql || '';
if (sql) {
if (compiled.method === 'select' && alwaysWrapped || compiled.as) {
sql = '(' + sql + ')';
if (compiled.as) sql += ' as ' + this.wrap(compiled.as);
}
}
return sql;
2014-05-05 22:22:51 -04:00
};
module.exports = Formatter;
2015-02-25 13:53:04 -05:00
},{"./query/builder":27,"./raw":31,"lodash":88}],22:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
// FunctionHelper
// -------
module.exports = {
now: function() {
return new this.client.Raw('CURRENT_TIMESTAMP');
}
};
},{}],23:[function(require,module,exports){
'use strict';
2014-05-05 22:22:51 -04:00
// helpers.js
// -------
// Just some common functions needed in multiple places within the library.
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
var helpers = {
// Pick off the attributes from only the current layer of the object.
skim: function(data) {
return _.map(data, function(obj) {
return _.pick(obj, _.keys(obj));
});
},
// Check if the first argument is an array, otherwise
// uses all arguments as an array.
normalizeArr: function() {
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
if (_.isArray(args[0])) {
return args[0];
}
return args;
},
// Used to signify deprecated functionality.
deprecate: function(msg) {
this.warn(msg);
},
// Used to warn about incorrect use, without error'ing
warn: function(msg) {
if (typeof console !== "undefined" && console !== null &&
typeof console.warn === "function") {
console.warn("Knex: " + msg);
}
},
// Sort the keys for the insert
sortObject: function(obj) {
return _.sortBy(_.pairs(obj), function(a) {
return a[0];
});
}
};
module.exports = helpers;
2015-02-25 13:53:04 -05:00
},{"lodash":88}],24:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
module.exports = function(Target) {
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var SqlString = require('./dialects/mysql/string');
2014-05-05 22:22:51 -04:00
Target.prototype.toQuery = function(tz) {
2014-05-05 22:22:51 -04:00
var data = this.toSQL(this._method);
if (this._errors && this._errors.length > 0) throw this._errors[0];
2014-05-05 22:22:51 -04:00
if (!_.isArray(data)) data = [data];
return _.map(data, function(statement) {
return this._formatQuery(statement.sql, statement.bindings, tz);
}, this).join(';\n');
};
// Format the query as sql, prepping bindings as necessary.
Target.prototype._formatQuery = function(sql, bindings, tz) {
if (this.client && this.client.prepBindings) {
bindings = this.client.prepBindings(bindings, tz);
}
return SqlString.format(sql, bindings, true, tz);
2014-05-05 22:22:51 -04:00
};
// Create a new instance of the `Runner`, passing in the current object.
2015-02-25 13:53:04 -05:00
Target.prototype.then = function(/* onFulfilled, onRejected */) {
2014-05-05 22:22:51 -04:00
var Runner = this.client.Runner;
2015-02-25 13:53:04 -05:00
var result = new Runner(this).run();
return result.then.apply(result, arguments);
2014-05-05 22:22:51 -04:00
};
// Add additional "options" to the builder. Typically used for client specific
// items, like the `mysql` and `sqlite3` drivers.
Target.prototype.options = function(opts) {
this._options = this._options || [];
2014-06-14 17:46:20 -04:00
this._options.push(_.clone(opts) || {});
2014-05-05 22:22:51 -04:00
return this;
};
// Sets an explicit "connnection" we wish to use for this query.
Target.prototype.connection = function(connection) {
this._connection = connection;
return this;
};
// Set a debug flag for the current schema query stack.
Target.prototype.debug = function(val) {
2014-10-01 16:29:39 -04:00
this._debug = (val === undefined || val === null) ? true : val;
2014-05-05 22:22:51 -04:00
return this;
};
// Set the transaction object for this query.
Target.prototype.transacting = function(t) {
this._transacting = t;
return this;
};
// Initializes a stream.
Target.prototype.stream = function(options) {
var Runner = this.client.Runner;
return new Runner(this).stream(options);
};
// Initialize a stream & pipe automatically.
Target.prototype.pipe = function(writable) {
var Runner = this.client.Runner;
return new Runner(this).pipe(writable);
};
2014-05-05 22:22:51 -04:00
// Creates a method which "coerces" to a promise, by calling a
// "then" method on the current `Target`
2014-06-23 19:02:01 -04:00
_.each(['bind', 'catch', 'spread', 'otherwise', 'map', 'reduce', 'tap', 'thenReturn',
2014-05-05 22:22:51 -04:00
'return', 'yield', 'ensure', 'nodeify', 'exec'], function(method) {
Target.prototype[method] = function() {
var then = this.then();
return then[method].apply(then, arguments);
};
});
};
2015-02-25 13:53:04 -05:00
},{"./dialects/mysql/string":3,"lodash":88}],25:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Pool
// -------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var GenericPool = require('generic-pool-redux').Pool;
var Promise = require('./promise');
2014-05-05 22:22:51 -04:00
// The "Pool" object is a thin wrapper around the
// "generic-pool-redux" library, exposing a `destroy`
// method for explicitly draining the pool. The
// `init` method is called internally and initializes
// the pool if it doesn't already exist.
2014-10-01 16:29:39 -04:00
function Pool(config) {
2014-05-05 22:22:51 -04:00
this.config = _.clone(config) || {};
2014-06-12 14:05:49 -04:00
this.genericPool = this.initialize();
2014-10-01 16:29:39 -04:00
}
2014-05-05 22:22:51 -04:00
// Typically only called internally, this initializes
// a new `GenericPool` instance, based on the `config`
// options passed into the constructor.
Pool.prototype.initialize = function() {
2014-06-12 14:05:49 -04:00
return new GenericPool(_.defaults(this.config, _.result(this, 'defaults')));
2014-05-05 22:22:51 -04:00
};
// Some basic defaults for the pool...
Pool.prototype.defaults = function() {
var pool = this;
return {
min: 2,
max: 10,
create: function(callback) {
pool.client.acquireRawConnection()
.tap(function(connection) {
connection.__cid = _.uniqueId('__cid');
if (pool.config.afterCreate) {
return Promise.promisify(pool.config.afterCreate)(connection);
}
}).exec(callback);
},
destroy: function(connection) {
if (pool.config.beforeDestroy) {
return pool.config.beforeDestroy(connection, function() {
2014-10-01 17:34:42 -04:00
if (connection !== void 0) connection.end();
2014-05-05 22:22:51 -04:00
});
}
2014-10-01 17:34:42 -04:00
if (connection !== void 0) connection.end();
2014-05-05 22:22:51 -04:00
}
};
};
// Acquires a connection from the pool.
Pool.prototype.acquire = function(callback, priority) {
2014-06-12 14:05:49 -04:00
if (this.genericPool) {
this.genericPool.acquire(callback, priority);
} else {
callback(new Error('The genericPool is not initialized.'));
}
2014-05-05 22:22:51 -04:00
};
// Release a connection back to the connection pool.
Pool.prototype.release = function(connection, callback) {
2014-06-12 14:05:49 -04:00
if (this.genericPool) {
this.genericPool.release(connection, callback);
} else {
callback(new Error('The genericPool is not initialized.'));
}
2014-05-05 22:22:51 -04:00
};
// Tear down the pool, only necessary if you need it.
Pool.prototype.destroy = function(callback) {
var genericPool = this.genericPool;
if (genericPool) {
genericPool.drain(function() {
genericPool.destroyAllNow(callback);
});
this.genericPool = void 0;
} else {
callback();
}
return this;
};
module.exports = Pool;
2015-02-25 13:53:04 -05:00
},{"./promise":26,"generic-pool-redux":86,"lodash":88}],26:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
var Promise = require('bluebird/js/main/promise')();
2014-05-05 22:22:51 -04:00
Promise.prototype.yield = Promise.prototype.thenReturn;
Promise.prototype.ensure = Promise.prototype.lastly;
Promise.prototype.otherwise = Promise.prototype.caught;
Promise.prototype.exec = Promise.prototype.nodeify;
module.exports = Promise;
2015-02-25 13:53:04 -05:00
},{"bluebird/js/main/promise":62}],27:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Builder
// -------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var inherits = require('inherits');
var EventEmitter = require('events').EventEmitter;
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var Raw = require('../raw');
var helpers = require('../helpers');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var JoinClause = require('./joinclause');
2014-05-05 22:22:51 -04:00
// Typically called from `knex.builder`,
// start a new query building chain.
function QueryBuilder() {
this._single = {};
this._statements = [];
this._errors = [];
// Internal flags used in the builder.
this._joinFlag = 'inner';
this._boolFlag = 'and';
2014-10-01 16:29:39 -04:00
this._notFlag = false;
2014-07-09 10:40:01 -04:00
this.and = this;
2014-05-05 22:22:51 -04:00
}
inherits(QueryBuilder, EventEmitter);
QueryBuilder.prototype.toString = function() {
return this.toQuery();
};
// Convert the current query "toSQL"
QueryBuilder.prototype.toSQL = function() {
var QueryCompiler = this.client.QueryCompiler;
return new QueryCompiler(this).toSQL(this._method || 'select');
};
// Create a shallow clone of the current query builder.
// TODO: Test this!!
QueryBuilder.prototype.clone = function() {
var cloned = new this.constructor();
cloned._method = this._method;
cloned._single = _.clone(this._single);
cloned._options = _.clone(this._options);
cloned._statements = this._statements.slice();
cloned._errors = this._errors.slice();
cloned._debug = this._debug;
cloned._transacting = this._transacting;
cloned._connection = this._connection;
return cloned;
};
// Select
// ------
// Sets the values for a `select` query,
// which is the same as specifying the columns.
QueryBuilder.prototype.select =
// Adds a column or columns to the list of "columns"
// being selected on the query.
QueryBuilder.prototype.columns =
2014-06-06 17:41:31 -04:00
QueryBuilder.prototype.column = function(column) {
2014-10-01 16:29:39 -04:00
if (!column) return this;
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'columns',
value: helpers.normalizeArr.apply(null, arguments)
});
return this;
};
2014-06-14 17:46:20 -04:00
// Allow for a sub-select to be explicitly aliased as a column,
// without needing to compile the query in a where.
QueryBuilder.prototype.as = function(column) {
this._single.as = column;
return this;
};
2014-05-05 22:22:51 -04:00
// Sets the `tableName` on the query.
// Alias to "from" for select and "into" for insert statements
// e.g. builder.insert({a: value}).into('tableName')
QueryBuilder.prototype.table = function(tableName) {
this._single.table = tableName;
return this;
};
QueryBuilder.prototype.from = QueryBuilder.prototype.table;
QueryBuilder.prototype.into = QueryBuilder.prototype.table;
// Adds a `distinct` clause to the query.
QueryBuilder.prototype.distinct = function() {
this._statements.push({
grouping: 'columns',
value: helpers.normalizeArr.apply(null, arguments),
distinct: true
});
return this;
};
// Adds a join clause to the query, allowing for advanced joins
// with an anonymous function as the second argument.
2014-10-01 16:29:39 -04:00
// function(table, first, operator, second)
QueryBuilder.prototype.join = function(table, first) {
2014-05-05 22:22:51 -04:00
var join;
2014-10-01 16:29:39 -04:00
var joinType = this._joinType();
2014-05-05 22:22:51 -04:00
if (_.isFunction(first)) {
2014-10-01 16:29:39 -04:00
join = new JoinClause(table, joinType);
2014-05-05 22:22:51 -04:00
first.call(join, join);
2014-10-01 16:29:39 -04:00
} else if (joinType === 'raw') {
join = new JoinClause(new Raw(table, first), 'raw');
2014-05-05 22:22:51 -04:00
} else {
2014-10-01 16:29:39 -04:00
join = new JoinClause(table, joinType);
if (arguments.length > 1) {
join.on.apply(join, _.toArray(arguments).slice(1));
}
2014-05-05 22:22:51 -04:00
}
this._statements.push(join);
return this;
};
// JOIN blocks:
QueryBuilder.prototype.innerJoin = function() {
return this._joinType('inner').join.apply(this, arguments);
};
QueryBuilder.prototype.leftJoin = function() {
return this._joinType('left').join.apply(this, arguments);
};
QueryBuilder.prototype.leftOuterJoin = function() {
return this._joinType('left outer').join.apply(this, arguments);
};
QueryBuilder.prototype.rightJoin = function() {
return this._joinType('right').join.apply(this, arguments);
};
QueryBuilder.prototype.rightOuterJoin = function() {
return this._joinType('right outer').join.apply(this, arguments);
};
QueryBuilder.prototype.outerJoin = function() {
return this._joinType('outer').join.apply(this, arguments);
};
QueryBuilder.prototype.fullOuterJoin = function() {
return this._joinType('full outer').join.apply(this, arguments);
};
QueryBuilder.prototype.crossJoin = function() {
return this._joinType('cross').join.apply(this, arguments);
};
2014-10-01 16:29:39 -04:00
QueryBuilder.prototype.joinRaw = function() {
return this._joinType('raw').join.apply(this, arguments);
};
2014-05-05 22:22:51 -04:00
// The where function can be used in several ways:
// The most basic is `where(key, value)`, which expands to
// where key = value.
QueryBuilder.prototype.where =
QueryBuilder.prototype.andWhere = function(column, operator, value) {
2014-10-01 16:29:39 -04:00
// Support "where true || where false"
if (column === false || column === true) {
return this.whereRaw(column);
}
2014-05-05 22:22:51 -04:00
// Check if the column is a function, in which case it's
// a where statement wrapped in parens.
if (_.isFunction(column)) {
return this.whereWrapped(column);
}
// Allow a raw statement to be passed along to the query.
if (column instanceof Raw) return this.whereRaw(column);
2014-05-05 22:22:51 -04:00
// Allows `where({id: 2})` syntax.
if (_.isObject(column)) return this._objectWhere(column);
// Enable the where('key', value) syntax, only when there
// are explicitly two arguments passed, so it's not possible to
// do where('key', '!=') and have that turn into where key != null
if (arguments.length === 2) {
value = operator;
operator = '=';
// If the value is null, and it's a two argument query,
// we assume we're going for a `whereNull`.
if (value === null) {
return this.whereNull(column);
}
2014-05-05 22:22:51 -04:00
}
// lower case the operator for comparison purposes
var checkOperator = ('' + operator).toLowerCase().trim();
2014-05-05 22:22:51 -04:00
// If there are 3 arguments, check whether 'in' is one of them.
if (arguments.length === 3) {
if (checkOperator === 'in' || checkOperator === 'not in') {
2014-10-01 16:29:39 -04:00
return this._not(checkOperator === 'not in').whereIn(arguments[0], arguments[2]);
}
if (checkOperator === 'between' || checkOperator === 'not between') {
2014-10-01 16:29:39 -04:00
return this._not(checkOperator === 'not between').whereBetween(arguments[0], arguments[2]);
2014-05-05 22:22:51 -04:00
}
}
// If the value is still null, check whether they're meaning
// where value is null
if (value === null) {
// Check for .where(key, 'is', null) or .where(key, 'is not', 'null');
if (checkOperator === 'is' || checkOperator === 'is not') {
2014-10-01 16:29:39 -04:00
return this._not(checkOperator === 'is not').whereNull(column);
}
2014-05-05 22:22:51 -04:00
}
// Push onto the where statement stack.
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'where',
type: 'whereBasic',
column: column,
operator: operator,
value: value,
bool: this._bool()
});
return this;
};
// Adds an `or where` clause to the query.
QueryBuilder.prototype.orWhere = function() {
return this._bool('or').where.apply(this, arguments);
};
2014-05-05 22:22:51 -04:00
// Processes an object literal provided in a "where" clause.
QueryBuilder.prototype._objectWhere = function(obj) {
var boolVal = this._bool();
for (var key in obj) {
this[boolVal + 'Where'](key, obj[key]);
2014-05-05 22:22:51 -04:00
}
return this;
};
// Adds a raw `where` clause to the query.
QueryBuilder.prototype.whereRaw =
QueryBuilder.prototype.andWhereRaw = function(sql, bindings) {
2014-05-05 22:22:51 -04:00
var raw = (sql instanceof Raw ? sql : new Raw(sql, bindings));
this._statements.push({
grouping: 'where',
type: 'whereRaw',
value: raw,
bool: this._bool()
});
return this;
};
QueryBuilder.prototype.orWhereRaw = function(sql, bindings) {
return this._bool('or').whereRaw(sql, bindings);
};
2014-05-05 22:22:51 -04:00
// Helper for compiling any advanced `where` queries.
QueryBuilder.prototype.whereWrapped = function(callback) {
this._statements.push({
grouping: 'where',
type: 'whereWrapped',
value: callback,
bool: this._bool()
});
return this;
};
2015-02-25 13:53:04 -05:00
// Helper for compiling any advanced `having` queries.
QueryBuilder.prototype.havingWrapped = function(callback) {
this._statements.push({
grouping: 'having',
type: 'whereWrapped',
value: callback,
bool: this._bool()
});
return this;
};
2014-05-05 22:22:51 -04:00
// Adds a `where exists` clause to the query.
2014-10-01 16:29:39 -04:00
QueryBuilder.prototype.whereExists = function(callback) {
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'where',
type: 'whereExists',
value: callback,
2014-10-01 16:29:39 -04:00
not: this._not(),
2014-05-05 22:22:51 -04:00
bool: this._bool(),
});
return this;
};
// Adds an `or where exists` clause to the query.
QueryBuilder.prototype.orWhereExists = function(callback) {
return this._bool('or').whereExists(callback);
};
// Adds a `where not exists` clause to the query.
QueryBuilder.prototype.whereNotExists = function(callback) {
2014-10-01 16:29:39 -04:00
return this._not(true).whereExists(callback);
2014-05-05 22:22:51 -04:00
};
// Adds a `or where not exists` clause to the query.
QueryBuilder.prototype.orWhereNotExists = function(callback) {
2014-10-01 16:29:39 -04:00
return this._bool('or').whereNotExists(callback);
2014-05-05 22:22:51 -04:00
};
// Adds a `where in` clause to the query.
2014-10-01 16:29:39 -04:00
QueryBuilder.prototype.whereIn = function(column, values) {
if (_.isArray(values) && _.isEmpty(values)) return this.where(this._not());
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'where',
type: 'whereIn',
column: column,
value: values,
2014-10-01 16:29:39 -04:00
not: this._not(),
2014-05-05 22:22:51 -04:00
bool: this._bool()
});
return this;
};
// Adds a `or where in` clause to the query.
QueryBuilder.prototype.orWhereIn = function(column, values) {
return this._bool('or').whereIn(column, values);
};
// Adds a `where not in` clause to the query.
QueryBuilder.prototype.whereNotIn = function(column, values) {
2014-10-01 16:29:39 -04:00
return this._not(true).whereIn(column, values);
2014-05-05 22:22:51 -04:00
};
// Adds a `or where not in` clause to the query.
QueryBuilder.prototype.orWhereNotIn = function(column, values) {
2014-10-01 16:29:39 -04:00
return this._bool('or')._not(true).whereIn(column, values);
2014-05-05 22:22:51 -04:00
};
// Adds a `where null` clause to the query.
2014-10-01 16:29:39 -04:00
QueryBuilder.prototype.whereNull = function(column) {
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'where',
type: 'whereNull',
column: column,
2014-10-01 16:29:39 -04:00
not: this._not(),
2014-05-05 22:22:51 -04:00
bool: this._bool()
});
return this;
};
// Adds a `or where null` clause to the query.
QueryBuilder.prototype.orWhereNull = function(column) {
return this._bool('or').whereNull(column);
};
// Adds a `where not null` clause to the query.
QueryBuilder.prototype.whereNotNull = function(column) {
2014-10-01 16:29:39 -04:00
return this._not(true).whereNull(column);
2014-05-05 22:22:51 -04:00
};
// Adds a `or where not null` clause to the query.
QueryBuilder.prototype.orWhereNotNull = function(column) {
2014-10-01 16:29:39 -04:00
return this._bool('or').whereNotNull(column);
2014-05-05 22:22:51 -04:00
};
// Adds a `where between` clause to the query.
2014-10-01 16:29:39 -04:00
QueryBuilder.prototype.whereBetween = function(column, values) {
2014-05-05 22:22:51 -04:00
if (!_.isArray(values)) {
return this._errors.push(new Error('The second argument to whereBetween must be an array.'));
}
if (values.length !== 2) {
return this._errors.push(new Error('You must specify 2 values for the whereBetween clause'));
}
this._statements.push({
grouping: 'where',
type: 'whereBetween',
column: column,
value: values,
2014-10-01 16:29:39 -04:00
not: this._not(),
2014-05-05 22:22:51 -04:00
bool: this._bool()
});
return this;
};
// Adds a `where not between` clause to the query.
QueryBuilder.prototype.whereNotBetween = function(column, values) {
2014-10-01 16:29:39 -04:00
return this._not(true).whereBetween(column, values);
2014-05-05 22:22:51 -04:00
};
// Adds a `or where between` clause to the query.
QueryBuilder.prototype.orWhereBetween = function(column, values) {
return this._bool('or').whereBetween(column, values);
};
// Adds a `or where not between` clause to the query.
QueryBuilder.prototype.orWhereNotBetween = function(column, values) {
2014-10-01 16:29:39 -04:00
return this._bool('or').whereNotBetween(column, values);
2014-05-05 22:22:51 -04:00
};
// Adds a `group by` clause to the query.
2014-06-27 11:59:54 -04:00
QueryBuilder.prototype.groupBy = function(item) {
if (item instanceof Raw) {
return this.groupByRaw.apply(this, arguments);
}
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'group',
2014-06-27 11:59:54 -04:00
type: 'groupByBasic',
2014-05-05 22:22:51 -04:00
value: helpers.normalizeArr.apply(null, arguments)
});
return this;
};
2014-06-27 11:59:54 -04:00
// Adds a raw `group by` clause to the query.
QueryBuilder.prototype.groupByRaw = function(sql, bindings) {
var raw = (sql instanceof Raw ? sql : new Raw(sql, bindings));
this._statements.push({
grouping: 'group',
type: 'groupByRaw',
value: raw
});
return this;
};
2014-05-05 22:22:51 -04:00
// Adds a `order by` clause to the query.
QueryBuilder.prototype.orderBy = function(column, direction) {
this._statements.push({
grouping: 'order',
2014-06-27 11:59:54 -04:00
type: 'orderByBasic',
2014-05-05 22:22:51 -04:00
value: column,
direction: direction
});
return this;
};
2014-06-27 11:59:54 -04:00
// Add a raw `order by` clause to the query.
QueryBuilder.prototype.orderByRaw = function(sql, bindings) {
var raw = (sql instanceof Raw ? sql : new Raw(sql, bindings));
this._statements.push({
grouping: 'order',
type: 'orderByRaw',
value: raw
});
return this;
};
2014-05-05 22:22:51 -04:00
// Add a union statement to the query.
2015-02-25 13:53:04 -05:00
QueryBuilder.prototype.union = function(callbacks, wrap) {
if (arguments.length === 1 ||
(arguments.length === 2 && _.isBoolean(wrap))) {
if (!_.isArray(callbacks)) {
callbacks = [callbacks];
}
for (var i = 0, l = callbacks.length; i < l; i++) {
this._statements.push({
grouping: 'union',
clause: 'union',
value: callbacks[i],
wrap: wrap || false
});
2014-05-05 22:22:51 -04:00
}
2015-02-25 13:53:04 -05:00
} else {
callbacks = _.toArray(arguments).slice(0, arguments.length - 1);
wrap = arguments[arguments.length - 1];
if (!_.isBoolean(wrap)) {
callbacks.push(wrap);
wrap = false;
}
this.union(callbacks, wrap);
2014-05-05 22:22:51 -04:00
}
return this;
};
// Adds a union all statement to the query.
QueryBuilder.prototype.unionAll = function(callback, wrap) {
this._statements.push({
grouping: 'union',
clause: 'union all',
value: callback,
wrap: wrap || false
});
return this;
};
// Adds a `having` clause to the query.
QueryBuilder.prototype.having =
QueryBuilder.prototype.andHaving = function(column, operator, value) {
2014-05-05 22:22:51 -04:00
if (column instanceof Raw && arguments.length === 1) {
return this._havingRaw(column);
}
2015-02-25 13:53:04 -05:00
// Check if the column is a function, in which case it's
// a having statement wrapped in parens.
if (_.isFunction(column)) {
return this.havingWrapped(column);
}
2014-05-05 22:22:51 -04:00
this._statements.push({
grouping: 'having',
type: 'havingBasic',
column: column,
operator: operator,
value: value,
bool: this._bool()
});
return this;
};
// Adds an `or having` clause to the query.
QueryBuilder.prototype.orHaving = function() {
return this._bool('or').having.apply(this, arguments);
};
QueryBuilder.prototype.havingRaw = function(sql, bindings) {
return this._havingRaw(sql, bindings);
};
QueryBuilder.prototype.orHavingRaw = function(sql, bindings) {
return this._bool('or').havingRaw(sql, bindings);
};
// Adds a raw `having` clause to the query.
QueryBuilder.prototype._havingRaw = function(sql, bindings) {
var raw = (sql instanceof Raw ? sql : new Raw(sql, bindings));
this._statements.push({
grouping: 'having',
type: 'havingRaw',
value: raw,
bool: this._bool()
});
return this;
};
// Only allow a single "offset" to be set for the current query.
QueryBuilder.prototype.offset = function(value) {
this._single.offset = value;
return this;
};
// Only allow a single "limit" to be set for the current query.
QueryBuilder.prototype.limit = function(value) {
this._single.limit = value;
return this;
};
// Retrieve the "count" result of the query.
QueryBuilder.prototype.count = function(column) {
return this._aggregate('count', (column || '*'));
};
// Retrieve the minimum value of a given column.
QueryBuilder.prototype.min = function(column) {
return this._aggregate('min', column);
};
// Retrieve the maximum value of a given column.
QueryBuilder.prototype.max = function(column) {
return this._aggregate('max', column);
};
// Retrieve the sum of the values of a given column.
QueryBuilder.prototype.sum = function(column) {
return this._aggregate('sum', column);
};
// Retrieve the average of the values of a given column.
QueryBuilder.prototype.avg = function(column) {
return this._aggregate('avg', column);
};
// Increments a column's value by the specified amount.
QueryBuilder.prototype.increment = function(column, amount) {
return this._counter(column, amount);
};
// Decrements a column's value by the specified amount.
QueryBuilder.prototype.decrement = function(column, amount) {
return this._counter(column, amount, '-');
};
// Sets the values for a `select` query, informing that only the first
// row should be returned (limit 1).
QueryBuilder.prototype.first = function() {
var i, args = new Array(arguments.length);
for (i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
this.select.apply(this, args);
this._method = 'first';
this.limit(1);
return this;
};
// Pluck a column from a query.
QueryBuilder.prototype.pluck = function(column) {
this._method = 'pluck';
2014-06-04 16:24:29 -04:00
this._single.pluck = column;
2014-05-05 22:22:51 -04:00
this._statements.push({
2014-06-04 16:24:29 -04:00
grouping: 'columns',
2014-05-05 22:22:51 -04:00
type: 'pluck',
value: column
});
return this;
};
// Insert & Update
// ------
// Sets the values for an `insert` query.
QueryBuilder.prototype.insert = function(values, returning) {
this._method = 'insert';
if (!_.isEmpty(returning)) this.returning(returning);
this._single.insert = values;
return this;
};
// Sets the values for an `update`, allowing for both
// `.update(key, value, [returning])` and `.update(obj, [returning])` syntaxes.
QueryBuilder.prototype.update = function(values, returning) {
var ret, obj = {};
this._method = 'update';
var i, args = new Array(arguments.length);
for (i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
if (_.isString(values)) {
obj[values] = returning;
if (args.length > 2) {
ret = args[2];
}
} else {
obj = values;
ret = args[1];
}
if (!_.isEmpty(ret)) this.returning(ret);
this._single.update = obj;
return this;
};
// Sets the returning value for the query.
QueryBuilder.prototype.returning = function(returning) {
this._single.returning = returning;
return this;
};
// Delete
// ------
// Executes a delete statement on the query;
QueryBuilder.prototype.del =
QueryBuilder.prototype.delete = function(ret) {
this._method = 'del';
if (!_.isEmpty(ret)) this.returning(ret);
return this;
};
// Truncates a table, ends the query chain.
QueryBuilder.prototype.truncate = function() {
this._method = 'truncate';
return this;
};
// Retrieves columns for the table specified by `knex(tableName)`
QueryBuilder.prototype.columnInfo = function(column) {
2014-05-05 22:22:51 -04:00
this._method = 'columnInfo';
this._single.columnInfo = column;
2014-05-05 22:22:51 -04:00
return this;
};
// Set a lock for update constraint.
QueryBuilder.prototype.forUpdate = function() {
this._single.lock = 'forUpdate';
return this;
};
// Set a lock for share constraint.
QueryBuilder.prototype.forShare = function() {
this._single.lock = 'forShare';
return this;
};
// ----------------------------------------------------------------------
// Helper for the incrementing/decrementing queries.
QueryBuilder.prototype._counter = function(column, amount, symbol) {
var amt = parseInt(amount, 10);
if (isNaN(amt)) amt = 1;
this._method = 'counter';
this._single.counter = {
column: column,
amount: amt,
symbol: (symbol || '+')
};
return this;
};
// Helper to get or set the "boolFlag" value.
QueryBuilder.prototype._bool = function(val) {
if (arguments.length === 1) {
this._boolFlag = val;
return this;
}
var ret = this._boolFlag;
this._boolFlag = 'and';
return ret;
};
2014-07-09 10:40:01 -04:00
// Helper to get or set the "notFlag" value.
QueryBuilder.prototype._not = function(val) {
if (arguments.length === 1) {
this._notFlag = val;
return this;
}
var ret = this._notFlag;
this._notFlag = false;
return ret;
};
2014-05-05 22:22:51 -04:00
// Helper to get or set the "joinFlag" value.
QueryBuilder.prototype._joinType = function (val) {
if (arguments.length === 1) {
this._joinFlag = val;
return this;
}
var ret = this._joinFlag || 'inner';
this._joinFlag = 'inner';
return ret;
};
// Helper for compiling any aggregate queries.
QueryBuilder.prototype._aggregate = function(method, column) {
this._statements.push({
grouping: 'columns',
type: 'aggregate',
method: method,
value: column
});
return this;
};
2014-07-09 10:40:01 -04:00
Object.defineProperty(QueryBuilder.prototype, 'or', {
get: function () {
return this._bool('or');
}
});
Object.defineProperty(QueryBuilder.prototype, 'not', {
get: function () {
return this._not(true);
}
});
2014-05-05 22:22:51 -04:00
// Attach all of the top level promise methods that should be chainable.
2014-10-01 16:29:39 -04:00
require('../interface')(QueryBuilder);
2014-05-05 22:22:51 -04:00
module.exports = QueryBuilder;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"../helpers":23,"../interface":24,"../raw":31,"./joinclause":29,"events":83,"inherits":87,"lodash":88}],28:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Query Compiler
// -------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var helpers = require('../helpers');
var Raw = require('../raw');
2014-05-05 22:22:51 -04:00
// The "QueryCompiler" takes all of the query statements which have been
// gathered in the "QueryBuilder" and turns them into a properly formatted / bound
// query string.
function QueryCompiler(queryBuilder) {
this.method = queryBuilder._method || 'select';
this.options = queryBuilder._options;
this.single = queryBuilder._single;
this.transacting = queryBuilder._transacting;
this.grouped = _.groupBy(queryBuilder._statements, 'grouping');
}
// Collapse the builder into a single object
QueryCompiler.prototype.toSQL = function(method) {
var val = this[method]();
var defaults = {
method: method,
options: this.options && this.options.length > 0 ?
_.extend.apply(_, this.options) : void 0,
bindings: this.formatter.bindings
};
if (_.isString(val)) {
val = {sql: val};
}
2014-06-14 17:46:20 -04:00
if (method === 'select' && this.single.as) {
defaults.as = this.single.as;
}
2014-05-05 22:22:51 -04:00
return _.extend(defaults, val);
};
2015-02-25 13:53:04 -05:00
// Get the table name, wrapping it if necessary.
// Implemented as a property to prevent ordering issues as described in #704.
Object.defineProperty(QueryCompiler.prototype, 'tableName', {
get: function() {
if(!this._tableName) {
// Only call this.formatter.wrap() the first time this property is accessed.
this._tableName = this.single.table ? this.formatter.wrap(this.single.table) : '';
}
return this._tableName;
}
});
2014-05-05 22:22:51 -04:00
var components = [
'columns', 'join', 'where', 'union', 'group',
'having', 'order', 'limit', 'offset', 'lock'
];
// Compiles the `select` statement, or nested sub-selects
// by calling each of the component compilers, trimming out
// the empties, and returning a generated query string.
QueryCompiler.prototype.select = function() {
var statements = [];
for (var i = 0, l = components.length; i < l; i++) {
var component = components[i];
statements.push(this[component](this));
}
return _.compact(statements).join(' ');
};
QueryCompiler.prototype.first = QueryCompiler.prototype.select;
2014-06-04 16:24:29 -04:00
QueryCompiler.prototype.pluck = function() {
return {
sql: this.select(),
pluck: this.single.pluck
};
};
2014-05-05 22:22:51 -04:00
// Compiles an "insert" query, allowing for multiple
// inserts using a single query statement.
QueryCompiler.prototype.insert = function() {
2014-10-01 16:29:39 -04:00
var self = this;
var insertValues = this.single.insert;
2014-05-05 22:22:51 -04:00
var sql = 'insert into ' + this.tableName + ' ';
2014-10-01 16:29:39 -04:00
if (_.isArray(insertValues) && (insertValues.length === 1) && _.isEmpty(insertValues[0])) {
insertValues = [];
}
if (_.isEmpty(insertValues) && !_.isFunction(insertValues)) {
2014-05-05 22:22:51 -04:00
sql += this._emptyInsertValue;
} else {
2014-10-01 16:29:39 -04:00
var insertData = this._prepInsert(insertValues);
2014-05-05 22:22:51 -04:00
if (_.isString(insertData)) {
sql += insertData;
} else {
2014-10-01 16:29:39 -04:00
if (insertData.columns.length) {
sql += '(' + this.formatter.columnize(insertData.columns) + ') values (' +
_.map(insertData.values, this.formatter.parameterize, this.formatter).join('), (') + ')';
} else {
// if there is no target column only insert default values
sql += '() values ' + _.map(insertData.values, function () { return '(' + (self._defaultInsertValue || '') + ')'; }).join(', ');
}
2014-05-05 22:22:51 -04:00
}
}
return sql;
};
// Compiles the "update" query.
QueryCompiler.prototype.update = function() {
2015-02-25 13:53:04 -05:00
// Make sure tableName is processed by the formatter first.
var tableName = this.tableName;
2014-10-01 16:29:39 -04:00
var updateData = this._prepUpdate(this.single.update);
var wheres = this.where();
2015-02-25 13:53:04 -05:00
return 'update ' + tableName +
2014-10-01 16:29:39 -04:00
' set ' + updateData.join(', ') +
(wheres ? ' ' + wheres : '');
2014-05-05 22:22:51 -04:00
};
// Compiles the columns in the query, specifying if an item was distinct.
QueryCompiler.prototype.columns = function() {
var distinct = false;
if (this.onlyUnions()) return '';
var columns = this.grouped.columns || [];
var sql = [];
if (columns) {
for (var i = 0, l = columns.length; i < l; i++) {
var stmt = columns[i];
if (stmt.distinct) distinct = true;
if (stmt.type === 'aggregate') {
sql.push(this.aggregate(stmt));
} else if (stmt.value && stmt.value.length > 0) {
sql.push(this.formatter.columnize(stmt.value));
}
}
}
if (sql.length === 0) sql.push('*');
return 'select ' + (distinct ? 'distinct ' : '') +
(sql.join(', ') || '*') + (this.tableName ? ' from ' + this.tableName : '');
};
QueryCompiler.prototype.aggregate = function(stmt) {
var val = stmt.value;
var splitOn = val.toLowerCase().indexOf(' as ');
// Allows us to speciy an alias for the aggregate types.
if (splitOn !== -1) {
var col = val.slice(0, splitOn);
var alias = val.slice(splitOn + 4);
return stmt.method + '(' + this.formatter.wrap(col) + ') as ' + this.formatter.wrap(alias);
}
return stmt.method + '(' + this.formatter.wrap(val) + ')';
};
// Compiles all each of the `join` clauses on the query,
// including any nested join queries.
QueryCompiler.prototype.join = function() {
var joins = this.grouped.join;
if (!joins) return '';
2014-10-03 12:26:29 -04:00
var sql = _.reduce(joins, function(acc, join) {
if (join.joinType === 'raw') {
acc.push(this.formatter.checkRaw(join.table));
2014-10-01 16:29:39 -04:00
} else {
2014-10-03 12:26:29 -04:00
acc.push(join.joinType + ' join ' + this.formatter.wrap(join.table));
_.each(join.clauses, function(clause, i) {
acc.push(i > 0 ? clause[1] : clause[0]);
acc.push(this.formatter.wrap(clause[2]));
if (clause[3]) acc.push(this.formatter.operator(clause[3]));
if (clause[4]) acc.push(this.formatter.wrap(clause[4]));
}, this);
2014-05-05 22:22:51 -04:00
}
2014-10-03 12:26:29 -04:00
return acc;
}, [], this);
2014-05-05 22:22:51 -04:00
return sql.length > 0 ? sql.join(' ') : '';
};
// Compiles all `where` statements on the query.
QueryCompiler.prototype.where = function() {
var wheres = this.grouped.where;
if (!wheres) return;
var sql = [];
sql[0] = 'where';
for (var i = 0, l = wheres.length; i < l; i++) {
var stmt = wheres[i];
if (i !== 0) sql.push(stmt.bool);
sql.push(this[stmt.type](stmt));
}
return sql.length > 1 ? sql.join(' ') : '';
};
QueryCompiler.prototype.group = function() {
return this._groupsOrders('group');
};
QueryCompiler.prototype.order = function() {
return this._groupsOrders('order');
};
// Compiles the `having` statements.
QueryCompiler.prototype.having = function() {
var havings = this.grouped.having;
if (!havings) return '';
var sql = ['having'];
for (var i = 0, l = havings.length; i < l; i++) {
var str = '', s = havings[i];
if (i !== 0) str = s.bool + ' ';
if (s.type === 'havingBasic') {
sql.push(str + this.formatter.columnize(s.column) + ' ' +
this.formatter.operator(s.operator) + ' ' + this.formatter.parameter(s.value));
2015-02-25 13:53:04 -05:00
}else{
if(s.type === 'whereWrapped'){
sql.push(this.whereWrapped(s));
} else {
sql.push(str + this.formatter.checkRaw(s.value));
}
2014-05-05 22:22:51 -04:00
}
}
return sql.length > 1 ? sql.join(' ') : '';
};
// Compile the "union" queries attached to the main query.
QueryCompiler.prototype.union = function() {
var onlyUnions = this.onlyUnions();
var unions = this.grouped.union;
if (!unions) return '';
var sql = '';
for (var i = 0, l = unions.length; i < l; i++) {
var union = unions[i];
if (i > 0) sql += ' ';
if (i > 0 || !onlyUnions) sql += union.clause + ' ';
2014-06-14 10:04:27 -04:00
var statement = this.formatter.rawOrFn(union.value);
if (statement) {
if (union.wrap) sql += '(';
sql += statement;
if (union.wrap) sql += ')';
}
2014-05-05 22:22:51 -04:00
}
return sql;
};
// If we haven't specified any columns or a `tableName`, we're assuming this
// is only being used for unions.
QueryCompiler.prototype.onlyUnions = function() {
return (!this.grouped.columns && this.grouped.union && !this.tableName);
};
QueryCompiler.prototype.limit = function() {
2015-02-25 13:53:04 -05:00
var noLimit = !this.single.limit && this.single.limit !== 0;
if (noLimit) return '';
2014-05-05 22:22:51 -04:00
return 'limit ' + this.formatter.parameter(this.single.limit);
};
QueryCompiler.prototype.offset = function() {
2014-10-01 16:29:39 -04:00
if (!this.single.offset) return '';
2014-05-05 22:22:51 -04:00
return 'offset ' + this.formatter.parameter(this.single.offset);
};
// Compiles a `delete` query.
QueryCompiler.prototype.del = function() {
2015-02-25 13:53:04 -05:00
// Make sure tableName is processed by the formatter first.
var tableName = this.tableName;
2014-05-05 22:22:51 -04:00
var wheres = this.where();
2015-02-25 13:53:04 -05:00
return 'delete from ' + tableName +
2014-05-05 22:22:51 -04:00
(wheres ? ' ' + wheres : '');
};
// Compiles a `truncate` query.
QueryCompiler.prototype.truncate = function() {
return 'truncate ' + this.tableName;
};
// Compiles the "locks".
QueryCompiler.prototype.lock = function() {
if (this.single.lock) {
if (!this.transacting) {
helpers.warn('You are attempting to perform a "lock" command outside of a transaction.');
} else {
return this[this.single.lock]();
}
}
};
// Compile the "counter".
QueryCompiler.prototype.counter = function() {
var counter = this.single.counter;
var toUpdate = {};
toUpdate[counter.column] = new Raw(this.formatter.wrap(counter.column) +
' ' + (counter.symbol || '+') +
' ' + counter.amount);
this.single.update = toUpdate;
return this.update();
};
// Compiles the `order by` statements.
QueryCompiler.prototype._groupsOrders = function(type) {
var items = this.grouped[type];
if (!items) return '';
2014-10-01 16:29:39 -04:00
var formatter = this.formatter;
var sql = items.map(function (item) {
return (item.value instanceof Raw ? formatter.checkRaw(item.value) : formatter.columnize(item.value)) +
((type === 'order' && item.type !== 'orderByRaw') ? ' ' + formatter.direction(item.direction) : '');
});
return sql.length ? type + ' by ' + sql.join(', ') : '';
2014-05-05 22:22:51 -04:00
};
// Where Clause
// ------
QueryCompiler.prototype.whereIn = function(statement) {
if (_.isArray(statement.column)) return this.multiWhereIn(statement);
return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'in ') +
this.wrap(this.formatter.parameterize(statement.value));
};
QueryCompiler.prototype.multiWhereIn = function(statement) {
return '(' + _.map(statement.column, this.formatter.wrap, this.formatter) + ') ' +
this._not(statement, 'in ') + '((' +
_.map(statement.value, this.formatter.parameterize, this.formatter).join('),(') + '))';
};
QueryCompiler.prototype.whereNull = function(statement) {
return this.formatter.wrap(statement.column) + ' is ' + this._not(statement, 'null');
};
// Compiles a basic "where" clause.
QueryCompiler.prototype.whereBasic = function(statement) {
return this.formatter.wrap(statement.column) + ' ' +
this.formatter.operator(statement.operator) + ' ' +
this.formatter.parameter(statement.value);
};
QueryCompiler.prototype.whereExists = function(statement) {
2014-06-14 10:04:27 -04:00
return this._not(statement, 'exists') + ' (' + this.formatter.rawOrFn(statement.value) + ')';
2014-05-05 22:22:51 -04:00
};
QueryCompiler.prototype.whereWrapped = function(statement) {
2014-06-14 10:04:27 -04:00
return '(' + this.formatter.rawOrFn(statement.value, 'where').slice(6) + ')';
2014-05-05 22:22:51 -04:00
};
QueryCompiler.prototype.whereBetween = function(statement) {
return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'between') + ' ' +
_.map(statement.value, this.formatter.parameter, this.formatter).join(' and ');
};
// Compiles a "whereRaw" query.
QueryCompiler.prototype.whereRaw = function(statement) {
return this.formatter.checkRaw(statement.value);
};
QueryCompiler.prototype.wrap = function(str) {
if (str.charAt(0) !== '(') return '(' + str + ')';
return str;
};
// Determines whether to add a "not" prefix to the where clause.
QueryCompiler.prototype._not = function(statement, str) {
if (statement.not) return 'not ' + str;
return str;
};
// "Preps" the insert.
QueryCompiler.prototype._prepInsert = function(data) {
var isRaw = this.formatter.rawOrFn(data);
if (isRaw) return isRaw;
var values = [];
var columns, colList;
2014-05-05 22:22:51 -04:00
if (!_.isArray(data)) data = data ? [data] : [];
for (var i = 0, l = data.length; i<l; i++) {
var sorted = helpers.sortObject(data[i]);
columns = _.pluck(sorted, 0);
colList = colList || columns;
if (!_.isEqual(columns, colList)) {
return this._prepInsert(this._normalizeInsert(data));
}
2014-05-05 22:22:51 -04:00
values.push(_.pluck(sorted, 1));
}
return {
columns: columns,
values: values
};
};
// If we are running an insert with variable object keys, we need to normalize
// for the missing keys, presumably setting the values to undefined.
QueryCompiler.prototype._normalizeInsert = function(data) {
if (!_.isArray(data)) return _.clone(data);
var defaultObj = _.reduce(_.union.apply(_, _.map(data, function(val) {
return _.keys(val);
})), function(memo, key) {
memo[key] = void 0;
return memo;
}, {});
return _.map(data, function(row) { return _.defaults(row, defaultObj); });
};
2014-05-05 22:22:51 -04:00
// "Preps" the update.
QueryCompiler.prototype._prepUpdate = function(data) {
var vals = [];
var sorted = helpers.sortObject(data);
for (var i = 0, l = sorted.length; i < l; i++) {
vals.push(this.formatter.wrap(sorted[i][0]) + ' = ' + this.formatter.parameter(sorted[i][1]));
}
return vals;
};
module.exports = QueryCompiler;
2015-02-25 13:53:04 -05:00
},{"../helpers":23,"../raw":31,"lodash":88}],29:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// JoinClause
// -------
// The "JoinClause" is an object holding any necessary info about a join,
// including the type, and any associated tables & columns being joined.
function JoinClause(table, type) {
this.table = table;
this.joinType = type;
this.clauses = [];
2014-10-01 16:29:39 -04:00
this.and = this;
2014-05-05 22:22:51 -04:00
}
JoinClause.prototype.grouping = 'join';
// Adds an "on" clause to the current join object.
JoinClause.prototype.on = function(first, operator, second) {
2014-10-01 16:29:39 -04:00
var data;
2014-10-03 12:26:29 -04:00
switch (arguments.length) {
case 1: data = ['on', this._bool(), first]; break;
case 2: data = ['on', this._bool(), first, '=', operator]; break;
default: data = ['on', this._bool(), first, operator, second];
2014-05-05 22:22:51 -04:00
}
this.clauses.push(data);
return this;
};
2014-10-03 12:26:29 -04:00
// Adds a "using" clause to the current join.
JoinClause.prototype.using = function(table) {
return this.clauses.push(['using', this._bool(), table]);
};
2014-05-05 22:22:51 -04:00
// Adds an "and on" clause to the current join object.
JoinClause.prototype.andOn = function() {
return this.on.apply(this, arguments);
};
// Adds an "or on" clause to the current join object.
JoinClause.prototype.orOn = function(first, operator, second) {
2014-10-01 16:29:39 -04:00
/*jshint unused: false*/
2014-05-05 22:22:51 -04:00
return this._bool('or').on.apply(this, arguments);
};
// Explicitly set the type of join, useful within a function when creating a grouped join.
JoinClause.prototype.type = function(type) {
this.joinType = type;
return this;
};
JoinClause.prototype._bool = function(bool) {
if (arguments.length === 1) {
this._boolFlag = bool;
return this;
}
var ret = this._boolFlag || 'and';
this._boolFlag = 'and';
return ret;
};
2014-07-09 10:40:01 -04:00
Object.defineProperty(JoinClause.prototype, 'or', {
get: function () {
return this._bool('or');
}
});
2014-05-05 22:22:51 -04:00
module.exports = JoinClause;
2014-10-01 16:29:39 -04:00
},{}],30:[function(require,module,exports){
'use strict';
2014-05-05 22:22:51 -04:00
// All properties we can use to start a query chain
// from the `knex` object, e.g. `knex.select('*').from(...`
module.exports = [
'select',
2014-06-14 17:46:20 -04:00
'as',
2014-05-05 22:22:51 -04:00
'columns',
'column',
'from',
'into',
'table',
'distinct',
'join',
2014-10-01 16:29:39 -04:00
'joinRaw',
2014-05-05 22:22:51 -04:00
'innerJoin',
'leftJoin',
'leftOuterJoin',
'rightJoin',
'rightOuterJoin',
'outerJoin',
'fullOuterJoin',
'crossJoin',
'where',
'andWhere',
'orWhere',
'whereRaw',
'whereWrapped',
2015-02-25 13:53:04 -05:00
'havingWrapped',
2014-05-05 22:22:51 -04:00
'orWhereRaw',
'whereExists',
'orWhereExists',
'whereNotExists',
'orWhereNotExists',
'whereIn',
'orWhereIn',
'whereNotIn',
'orWhereNotIn',
'whereNull',
'orWhereNull',
'whereNotNull',
'orWhereNotNull',
'whereBetween',
'whereNotBetween',
'orWhereBetween',
'orWhereNotBetween',
'groupBy',
2014-06-27 11:59:54 -04:00
'groupByRaw',
2014-05-05 22:22:51 -04:00
'orderBy',
2014-06-27 11:59:54 -04:00
'orderByRaw',
2014-05-05 22:22:51 -04:00
'union',
'unionAll',
'having',
'havingRaw',
'orHaving',
'orHavingRaw',
'offset',
'limit',
'count',
'min',
'max',
'sum',
'avg',
'increment',
'decrement',
'first',
2014-06-04 16:24:29 -04:00
'debug',
2014-05-05 22:22:51 -04:00
'pluck',
'insert',
'update',
'returning',
'del',
'delete',
'truncate',
'transacting',
'connection'
];
2014-10-01 16:29:39 -04:00
},{}],31:[function(require,module,exports){
'use strict';
2014-05-05 22:22:51 -04:00
// Raw
// -------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var inherits = require('inherits');
var EventEmitter = require('events').EventEmitter;
2014-05-05 22:22:51 -04:00
function Raw(sql, bindings) {
2014-06-09 19:58:01 -04:00
if (sql && sql.toSQL) {
2014-06-09 15:33:09 -04:00
var output = sql.toSQL();
sql = output.sql;
bindings = output.bindings;
2014-05-05 22:22:51 -04:00
}
2014-10-01 16:29:39 -04:00
this.sql = sql + '';
2014-05-05 22:22:51 -04:00
this.bindings = _.isArray(bindings) ? bindings :
bindings ? [bindings] : [];
2014-10-01 16:29:39 -04:00
this.interpolateBindings();
this._debug = void 0;
2014-05-05 22:22:51 -04:00
this._transacting = void 0;
}
inherits(Raw, EventEmitter);
// Wraps the current sql with `before` and `after`.
Raw.prototype.wrap = function(before, after) {
this.sql = before + this.sql + after;
return this;
};
// Calls `toString` on the Knex object.
Raw.prototype.toString = function() {
return this.toQuery();
};
2014-10-01 16:29:39 -04:00
// Ensure all Raw / builder bindings are mixed-in to the ? placeholders
// as appropriate.
Raw.prototype.interpolateBindings = function() {
var replacements = [];
this.bindings = _.reduce(this.bindings, function(accum, param, index) {
var innerBindings = [param];
if (param && param.toSQL) {
var result = this.splicer(param, index);
innerBindings = result.bindings;
replacements.push(result.replacer);
}
return accum.concat(innerBindings);
}, [], this);
// we run this in reverse order, because ? concats earlier in the
// query string will disrupt indices for later ones
this.sql = _.reduce(replacements.reverse(), function(accum, fn) {
return fn(accum);
}, this.sql.split('?')).join('?');
};
// Returns a replacer function that splices into the i'th
// ? in the sql string the inner raw's sql,
// and the bindings associated with it
Raw.prototype.splicer = function(raw, i) {
var obj = raw.toSQL();
// the replacer function assumes that the sql has been
// already sql.split('?') and will be arr.join('?')
var replacer = function(arr) {
arr[i] = arr[i] + obj.sql + arr[i + 1];
arr.splice(i + 1, 1);
return arr;
};
return {
replacer: replacer,
bindings: obj.bindings
};
};
2014-05-05 22:22:51 -04:00
// Returns the raw sql for the query.
Raw.prototype.toSQL = function() {
return {
sql: this.sql,
method: 'raw',
bindings: this.bindings
};
};
// Allow the `Raw` object to be utilized with full access to the relevant
// promise API.
2014-10-01 16:29:39 -04:00
require('./interface')(Raw);
2014-05-05 22:22:51 -04:00
module.exports = Raw;
2015-02-25 13:53:04 -05:00
},{"./interface":24,"events":83,"inherits":87,"lodash":88}],32:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
var _ = require('lodash');
var Promise = require('./promise');
2014-05-05 22:22:51 -04:00
// The "Runner" constructor takes a "builder" (query, schema, or raw)
// and runs through each of the query statements, calling any additional
// "output" method provided alongside the query and bindings.
function Runner(builder) {
this.builder = builder;
this.queries = [];
// The "connection" object is set on the runner when
// "run" is called.
this.connection = void 0;
}
Runner.prototype._beginTransaction = 'begin;';
Runner.prototype._commitTransaction = 'commit;';
Runner.prototype._rollbackTransaction = 'rollback;';
// "Run" the target, calling "toSQL" on the builder, returning
// an object or array of queries to run, each of which are run on
// a single connection.
Runner.prototype.run = Promise.method(function() {
if (this.builder._transacting) {
return this.transactionQuery();
}
return Promise.bind(this)
.then(this.ensureConnection)
.then(function(connection) {
this.connection = connection;
2014-06-23 19:02:01 -04:00
// Emit a "start" event on both the builder and the client,
// allowing us to listen in on any events. We fire on the "client"
// before building the SQL, and on the builder after building the SQL
// in case we want to determine at how long it actually
// took to build the query.
this.client.emit('start', this.builder);
2014-05-05 22:22:51 -04:00
var sql = this.builder.toSQL();
2014-06-23 19:02:01 -04:00
this.builder.emit('start', this.builder);
2014-05-05 22:22:51 -04:00
if (_.isArray(sql)) {
return this.queryArray(sql);
}
return this.query(sql);
})
2014-06-23 19:02:01 -04:00
// If there are any "error" listeners, we fire an error event
// and then re-throw the error to be eventually handled by
// the promise chain. Useful if you're wrapping in a custom `Promise`.
.catch(function(err) {
if (this.builder._events && this.builder._events.error) {
this.builder.emit('error', err);
}
throw err;
})
// Fire a single "end" event on the builder when
// all queries have successfully completed.
.tap(function() {
this.builder.emit('end');
})
2014-05-05 22:22:51 -04:00
.finally(this.cleanupConnection);
});
// Stream the result set, by passing through to the dialect's streaming
// capabilities. If the options are
var PassThrough;
2014-06-25 05:18:32 -04:00
Runner.prototype.stream = function(options, handler) {
2014-05-05 22:22:51 -04:00
// If we specify stream(handler).then(...
if (arguments.length === 1) {
if (_.isFunction(options)) {
handler = options;
options = {};
}
}
2014-06-25 05:18:32 -04:00
// Determines whether we emit an error or throw here.
var hasHandler = _.isFunction(handler);
// Lazy-load the "PassThrough" dependency.
2014-10-01 16:29:39 -04:00
PassThrough = PassThrough || require('readable-stream').PassThrough;
var stream = new PassThrough({objectMode: true});
var promise = Promise.bind(this)
2014-05-05 22:22:51 -04:00
.then(this.ensureConnection)
.then(function(connection) {
this.connection = connection;
var sql = this.builder.toSQL();
var err = new Error('The stream may only be used with a single query statement.');
if (_.isArray(sql)) {
2014-06-25 05:18:32 -04:00
if (hasHandler) throw err;
2014-05-05 22:22:51 -04:00
stream.emit('error', err);
}
return sql;
}).then(function(sql) {
return this._stream(sql, stream, options);
2014-05-05 22:22:51 -04:00
}).finally(this.cleanupConnection);
// If a function is passed to handle the stream, send the stream
// there and return the promise, otherwise just return the stream
// and the promise will take care of itsself.
2014-06-25 05:18:32 -04:00
if (hasHandler) {
handler(stream);
return promise;
}
return stream;
2014-06-25 05:18:32 -04:00
};
2014-05-05 22:22:51 -04:00
// Allow you to pipe the stream to a writable stream.
Runner.prototype.pipe = function(writable) {
return this.stream().pipe(writable);
};
2014-05-05 22:22:51 -04:00
// "Runs" a query, returning a promise. All queries specified by the builder are guaranteed
// to run in sequence, and on the same connection, especially helpful when schema building
// and dealing with foreign key constraints, etc.
Runner.prototype.query = Promise.method(function(obj) {
2014-10-01 16:29:39 -04:00
if (!this.connection) {
throw new Error('There is an error with the database connection. Please check your config.');
}
obj.__cid = this.connection.__cid;
2014-05-05 22:22:51 -04:00
this.builder.emit('query', obj);
2014-06-23 19:02:01 -04:00
this.client.emit('query', obj);
2014-05-05 22:22:51 -04:00
return this._query(obj).bind(this).then(this.processResponse);
});
// In the case of the "schema builder" we call `queryArray`, which runs each
// of the queries in sequence.
Runner.prototype.queryArray = Promise.method(function(queries) {
return queries.length === 1 ? this.query(queries[0]) : Promise.bind(this)
.thenReturn(queries)
.reduce(function(memo, query) {
return this.query(query).then(function(resp) {
memo.push(resp);
return memo;
});
}, []);
});
// Check whether there's a transaction flag, and that it has a connection.
Runner.prototype.ensureConnection = Promise.method(function() {
if (this.builder._connection) {
return this.builder._connection;
}
return this.client.acquireConnection();
});
// "Debug" the query being run.
Runner.prototype.debug = function(obj) {
console.dir(_.extend({__cid: this.connection.__cid}, obj));
};
// Check whether we're "debugging", based on either calling `debug` on the query.
Runner.prototype.isDebugging = function() {
return (this.client.isDebugging === true || this.builder._debug === true);
};
// Transaction Methods:
// -------
// Run the transaction on the correct "runner" instance.
Runner.prototype.transactionQuery = Promise.method(function() {
var runner = this.builder._transacting._runner;
if (!(runner instanceof Runner)) {
throw new Error('Invalid transaction object provided.');
}
var sql = this.builder.toSQL();
if (_.isArray(sql)) {
return runner.queryArray(sql);
}
return runner.query(sql);
});
// Begins a transaction statement on the instance,
2014-10-01 16:29:39 -04:00
// resolving with the current runner.
Runner.prototype.startTransaction = Promise.method(function() {
2014-05-05 22:22:51 -04:00
return Promise.bind(this)
.then(this.ensureConnection)
.then(function(connection) {
this.connection = connection;
this.transaction = true;
2014-10-01 16:29:39 -04:00
return this.beginTransaction();
2014-05-05 22:22:51 -04:00
}).thenReturn(this);
});
2014-05-05 22:22:51 -04:00
// Finishes the transaction statement and handles disposing of the connection,
// resolving / rejecting the transaction's promise, and ensuring the transaction object's
// `_runner` property is `null`'ed out so it cannot continue to be used.
Runner.prototype.finishTransaction = Promise.method(function(action, containerObject, msg) {
var query, dfd = containerObject.__dfd__;
2014-05-05 22:22:51 -04:00
// Run the query to commit / rollback the transaction.
switch (action) {
case 0:
query = this.commitTransaction();
break;
case 1:
query = this.rollbackTransaction();
break;
}
return query.then(function(resp) {
2014-06-06 17:41:31 -04:00
msg = (msg === void 0) ? resp : msg;
2014-05-05 22:22:51 -04:00
switch (action) {
case 0:
2014-06-06 17:41:31 -04:00
dfd.fulfill(msg);
2014-05-05 22:22:51 -04:00
break;
case 1:
2014-06-06 17:41:31 -04:00
dfd.reject(msg);
2014-05-05 22:22:51 -04:00
break;
}
// If there was a problem committing the transaction,
// reject the transaction block (to reject the entire transaction block),
// then re-throw the error for any promises chained off the commit.
}).catch(function(e) {
dfd.reject(e);
throw e;
}).bind(this).finally(function() {
// Kill the "_runner" object on the containerObject,
// so it's not possible to continue using the transaction object.
containerObject._runner = void 0;
return this.cleanupConnection();
});
});
2014-10-01 16:29:39 -04:00
Runner.prototype.beginTransaction = function() {
return this._beginTransaction && this.query({sql: this._beginTransaction});
};
2014-05-05 22:22:51 -04:00
Runner.prototype.commitTransaction = function() {
2014-10-01 16:29:39 -04:00
return this._commitTransaction && this.query({sql: this._commitTransaction});
2014-05-05 22:22:51 -04:00
};
Runner.prototype.rollbackTransaction = function() {
2014-10-01 16:29:39 -04:00
return this._rollbackTransaction && this.query({sql: this._rollbackTransaction});
2014-05-05 22:22:51 -04:00
};
// Cleanup the connection as necessary, if the `_connection` was
// explicitly set on the query we don't need to do anything here,
// otherwise we
Runner.prototype.cleanupConnection = Promise.method(function() {
2014-10-01 16:29:39 -04:00
if (!this.builder._connection && typeof this.connection !== "undefined") {
2014-05-05 22:22:51 -04:00
return this.client.releaseConnection(this.connection);
}
});
module.exports = Runner;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"./promise":26,"lodash":88,"readable-stream":99}],33:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
var _ = require('lodash');
var inherits = require('inherits');
var EventEmitter = require('events').EventEmitter;
2014-05-05 22:22:51 -04:00
// Constructor for the builder instance, typically called from
// `knex.builder`, accepting the current `knex` instance,
// and pulling out the `client` and `grammar` from the current
// knex instance.
function SchemaBuilder() {
this._sequence = [];
this._errors = [];
}
inherits(SchemaBuilder, EventEmitter);
// Each of the schema builder methods just add to the
// "_sequence" array for consistency.
_.each([
2014-10-01 16:29:39 -04:00
'createTable', 'createTableIfNotExists', 'createSchema',
'createSchemaIfNotExists', 'dropSchema', 'dropSchemaIfExists',
'table', 'alterTable', 'hasTable', 'hasColumn',
2014-06-09 19:58:01 -04:00
'dropTable', 'renameTable', 'dropTableIfExists', 'raw', 'debug'
2014-05-05 22:22:51 -04:00
], function(method) {
SchemaBuilder.prototype[method] = function() {
if (method === 'table') method = 'alterTable';
this._sequence.push({
method: method,
args: _.toArray(arguments)
});
return this;
};
});
SchemaBuilder.prototype.toString = function() {
return this.toQuery();
};
SchemaBuilder.prototype.toSQL = function() {
var SchemaCompiler = this.client.SchemaCompiler;
return new SchemaCompiler(this).toSQL();
};
2014-10-01 16:29:39 -04:00
require('../interface')(SchemaBuilder);
2014-05-05 22:22:51 -04:00
module.exports = SchemaBuilder;
2015-02-25 13:53:04 -05:00
},{"../interface":24,"events":83,"inherits":87,"lodash":88}],34:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
var AlterMethods = {};
// Specify that the column is to be dropped. This takes precedence
// over all other rules for the column.
AlterMethods.drop = function() {
this._single.drop = true;
return this;
};
// Specify the "type" that we're looking to set the
// Knex takes no responsibility for any data-loss that may
// occur when changing data types.
AlterMethods.alterType = function(type) {
this._statements.push({
grouping: 'alterType',
value: type
});
return this;
};
// All of the modifier methods that can be used to modify the current query.
var modifiers = [
2014-10-01 16:29:39 -04:00
'default', 'defaultsTo', 'defaultTo', 'unsigned',
2014-05-05 22:22:51 -04:00
'nullable', 'notNull', 'notNullable',
2014-10-01 16:29:39 -04:00
'first', 'after', 'comment'
2014-05-05 22:22:51 -04:00
];
// Aliases for convenience.
var aliasMethod = {
2014-10-01 16:29:39 -04:00
default: 'defaultTo',
2014-05-05 22:22:51 -04:00
defaultsTo: 'defaultTo',
notNull: 'notNullable'
};
2014-10-01 16:29:39 -04:00
// Alias a few methods for clarity when processing.
var columnAlias = {
'float' : 'floating',
'enum' : 'enu',
'boolean': 'bool',
'string' : 'varchar',
'bigint' : 'bigInteger'
};
// The chainable interface off the original "column" method.
function ColumnBuilder(tableBuilder, type, args) {
this._single = {};
this._modifiers = {};
this._statements = [];
this._type = columnAlias[type] || type;
this._args = args;
this._tableBuilder = tableBuilder;
// If we're altering the table, extend the object
// with the available "alter" methods.
if (tableBuilder._method === 'alter') {
_.extend(this, AlterMethods);
}
}
// If we call any of the modifiers (index or otherwise) on the chainable, we pretend
// as though we're calling `table.method(column)` directly.
_.each(modifiers, function(method) {
ColumnBuilder.prototype[method] = function() {
if (aliasMethod[method]) {
method = aliasMethod[method];
}
if (method === 'notNullable') return this.nullable(false);
this._modifiers[method] = _.toArray(arguments);
return this;
};
});
_.each(['index', 'primary', 'unique'], function(method) {
ColumnBuilder.prototype[method] = function() {
if (this._type.toLowerCase().indexOf('increments') === -1) {
this._tableBuilder[method].apply(this._tableBuilder,
[this._args[0]].concat(_.toArray(arguments)));
}
2014-05-05 22:22:51 -04:00
return this;
};
});
// Specify that the current column "references" a column,
// which may be tableName.column or just "column"
ColumnBuilder.prototype.references = function(value) {
return this._tableBuilder.foreign.call(this._tableBuilder, this._args[0], this)
._columnBuilder(this)
.references(value);
};
module.exports = ColumnBuilder;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"lodash":88}],35:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Column Compiler
// Used for designating column definitions
// during the table "create" / "alter" statements.
// -------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var Raw = require('../raw');
2014-05-05 22:22:51 -04:00
function ColumnCompiler(tableCompiler, columnBuilder) {
this.tableCompiler = tableCompiler;
this.columnBuilder = columnBuilder;
2014-05-05 22:22:51 -04:00
this.args = columnBuilder._args;
this.type = columnBuilder._type.toLowerCase();
2014-05-05 22:22:51 -04:00
this.grouped = _.groupBy(columnBuilder._statements, 'grouping');
this.modified = columnBuilder._modifiers;
this.isIncrements = (this.type.indexOf('increments') !== -1);
2014-05-05 22:22:51 -04:00
this.initCompiler();
}
// To convert to sql, we first go through and build the
// column as it would be in the insert statement
ColumnCompiler.prototype.toSQL = function() {
this.pushQuery(this.compileColumn());
if (this.sequence.additional) {
this.sequence = this.sequence.concat(this.sequence.additional);
}
2014-05-05 22:22:51 -04:00
return this.sequence;
};
// Compiles a column.
ColumnCompiler.prototype.compileColumn = function() {
return this.formatter.wrap(this.getColumnName()) + ' ' +
this.getColumnType() + this.getModifiers();
};
// Assumes the autoincrementing key is named `id` if not otherwise specified.
ColumnCompiler.prototype.getColumnName = function() {
var value = _.first(this.args);
if (value) return value;
if (this.isIncrements) {
return 'id';
} else {
throw new Error('You did not specify a column name for the ' + this.type + 'column.');
}
};
ColumnCompiler.prototype.getColumnType = function() {
var type = this[this.type];
2014-05-05 22:22:51 -04:00
return _.isFunction(type) ? type.apply(this, _.rest(this.args)) : type;
};
ColumnCompiler.prototype.getModifiers = function() {
var modifiers = [];
if (this.type.indexOf('increments') === -1) {
for (var i = 0, l = this.modifiers.length; i < l; i++) {
var modifier = this.modifiers[i];
if (_.has(this.modified, modifier)) {
var val = this[modifier].apply(this, this.modified[modifier]);
if (val) modifiers.push(val);
}
}
}
return modifiers.length > 0 ? ' ' + modifiers.join(' ') : '';
};
// Types
// ------
ColumnCompiler.prototype.increments = 'integer not null primary key autoincrement';
ColumnCompiler.prototype.bigincrements = 'integer not null primary key autoincrement';
ColumnCompiler.prototype.integer =
ColumnCompiler.prototype.smallint =
ColumnCompiler.prototype.mediumint = 'integer';
ColumnCompiler.prototype.biginteger = 'bigint';
ColumnCompiler.prototype.varchar = function(length) {
return 'varchar(' + this._num(length, 255) + ')';
};
ColumnCompiler.prototype.text = 'text';
ColumnCompiler.prototype.tinyint = 'tinyint';
ColumnCompiler.prototype.floating = function(precision, scale) {
return 'float(' + this._num(precision, 8) + ', ' + this._num(scale, 2) + ')';
};
ColumnCompiler.prototype.decimal = function(precision, scale) {
return 'decimal(' + this._num(precision, 8) + ', ' + this._num(scale, 2) + ')';
};
ColumnCompiler.prototype.binary = 'blob';
ColumnCompiler.prototype.bool = 'boolean';
ColumnCompiler.prototype.date = 'date';
ColumnCompiler.prototype.datetime = 'datetime';
ColumnCompiler.prototype.time = 'time';
ColumnCompiler.prototype.timestamp = 'timestamp';
ColumnCompiler.prototype.enu = 'varchar';
2014-05-05 22:22:51 -04:00
ColumnCompiler.prototype.bit =
ColumnCompiler.prototype.json = 'text';
2014-05-05 22:22:51 -04:00
ColumnCompiler.prototype.uuid = 'char(36)';
2014-06-09 21:28:49 -04:00
ColumnCompiler.prototype.specifictype = function(type) {
2014-05-05 22:22:51 -04:00
return type;
};
// Modifiers
// -------
ColumnCompiler.prototype.nullable = function(nullable) {
return nullable === false ? 'not null' : 'null';
};
ColumnCompiler.prototype.notNullable = function() {
return this.nullable(false);
};
ColumnCompiler.prototype.defaultTo = function(value) {
if (value === void 0) {
return '';
2014-10-01 16:29:39 -04:00
} else if (value === null) {
value = "null";
2014-05-05 22:22:51 -04:00
} else if (value instanceof Raw) {
value = value.toQuery();
} else if (this.type === 'bool') {
2014-05-05 22:22:51 -04:00
if (value === 'false') value = 0;
2014-06-10 16:42:33 -04:00
value = "'" + (value ? 1 : 0) + "'";
} else if (this.type === 'json' && _.isObject(value)) {
return JSON.stringify(value);
2014-05-05 22:22:51 -04:00
} else {
value = "'" + value + "'";
}
return 'default ' + value;
};
ColumnCompiler.prototype._num = function(val, fallback) {
2014-10-01 16:29:39 -04:00
if (val === undefined || val === null) return fallback;
2014-05-05 22:22:51 -04:00
var number = parseInt(val, 10);
return isNaN(number) ? fallback : number;
};
module.exports = ColumnCompiler;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"../raw":31,"lodash":88}],36:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// The "SchemaCompiler" takes all of the query statements which have been
// gathered in the "SchemaBuilder" and turns them into an array of
// properly formatted / bound query strings.
function SchemaCompiler(builder) {
this.builder = builder;
this.initCompiler();
}
function buildTable(type) {
return function(tableName, fn) {
var TableBuilder = this.client.TableBuilder;
var sql = new TableBuilder(type, tableName, fn).toSQL();
for (var i = 0, l = sql.length; i < l; i++) {
this.sequence.push(sql[i]);
}
};
}
SchemaCompiler.prototype.createTable = buildTable('create');
2014-10-01 16:29:39 -04:00
SchemaCompiler.prototype.createTableIfNotExists = buildTable('createIfNot');
2014-05-05 22:22:51 -04:00
SchemaCompiler.prototype.alterTable = buildTable('alter');
2014-10-01 16:29:39 -04:00
2014-05-05 22:22:51 -04:00
SchemaCompiler.prototype.dropTable = function(tableName) {
this.pushQuery('drop table ' + this.formatter.wrap(tableName));
};
SchemaCompiler.prototype.dropTableIfExists = function(tableName) {
this.pushQuery('drop table if exists ' + this.formatter.wrap(tableName));
};
SchemaCompiler.prototype.toSQL = function() {
var sequence = this.builder._sequence;
for (var i = 0, l = sequence.length; i < l; i++) {
var query = sequence[i];
this[query.method].apply(this, query.args);
}
return this.sequence;
};
2014-06-09 10:32:11 -04:00
SchemaCompiler.prototype.raw = function(sql, bindings) {
this.sequence.push(new this.client.Raw(sql, bindings).toSQL());
};
2014-05-05 22:22:51 -04:00
module.exports = SchemaCompiler;
2014-10-01 16:29:39 -04:00
},{}],37:[function(require,module,exports){
'use strict';
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var Builder = require('./builder');
var Compiler = require('./compiler');
var TableBuilder = require('./tablebuilder');
var TableCompiler = require('./tablecompiler');
var ColumnBuilder = require('./columnbuilder');
var ColumnCompiler = require('./columncompiler');
2014-05-05 22:22:51 -04:00
// Initialize the compiler.
Compiler.prototype.initCompiler =
TableCompiler.prototype.initCompiler =
ColumnCompiler.prototype.initCompiler = function() {
this.formatter = new this.Formatter();
this.sequence = [];
};
// Push a new query onto the compiled "sequence" stack,
// creating a new formatter, returning the compiler.
Compiler.prototype.pushQuery =
TableCompiler.prototype.pushQuery =
ColumnCompiler.prototype.pushQuery = function(query) {
if (!query) return;
if (_.isString(query)) {
query = {sql: query};
} else {
query = query;
}
if (!query.bindings) {
query.bindings = this.formatter.bindings;
}
this.sequence.push(query);
this.formatter = new this.Formatter();
};
// Used in cases where we need to push some additional column specific statements.
ColumnCompiler.prototype.pushAdditional = function(fn) {
var child = new this.constructor(this.tableCompiler, this.columnBuilder);
fn.call(child, _.rest(arguments));
this.sequence.additional = (this.sequence.additional || []).concat(child.sequence);
};
2014-05-05 22:22:51 -04:00
module.exports = {
Builder: Builder,
Compiler: Compiler,
TableBuilder: TableBuilder,
TableCompiler: TableCompiler,
ColumnBuilder: ColumnBuilder,
ColumnCompiler: ColumnCompiler
};
2015-02-25 13:53:04 -05:00
},{"./builder":33,"./columnbuilder":34,"./columncompiler":35,"./compiler":36,"./tablebuilder":38,"./tablecompiler":39,"lodash":88}],38:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// TableBuilder
// Takes the function passed to the "createTable" or "table/editTable"
// functions and calls it with the "TableBuilder" as both the context and
// the first argument. Inside this function we can specify what happens to the
// method, pushing everything we want to do onto the "allStatements" array,
// which is then compiled into sql.
// ------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
var helpers = require('../helpers');
2014-05-05 22:22:51 -04:00
var AlterMethods = {
// Renames the current column `from` the current
// TODO: this.column(from).rename(to)
renameColumn: function(from, to) {
this._statements.push({
grouping: 'alterTable',
method: 'renameColumn',
args: [from, to]
});
return this;
},
dropTimestamps: function() {
return this.dropColumns(['created_at', 'updated_at']);
}
// TODO: changeType
};
// Drop a column from the current table.
// TODO: Enable this.column(columnName).drop();
AlterMethods.dropColumn =
AlterMethods.dropColumns = function() {
this._statements.push({
grouping: 'alterTable',
method: 'dropColumn',
args: _.toArray(arguments)
});
return this;
};
2014-10-01 16:29:39 -04:00
function TableBuilder(method, tableName, fn) {
this._fn = fn;
this._method = method;
this._tableName = tableName;
this._statements = [];
this._single = {};
}
// Convert the current tableBuilder object "toSQL"
// giving us additional methods if we're altering
// rather than creating the table.
TableBuilder.prototype.toSQL = function() {
if (this._method === 'alter') {
_.extend(this, AlterMethods);
}
this._fn.call(this, this);
var TableCompiler = this.client.TableCompiler;
return new TableCompiler(this).toSQL();
};
2014-05-05 22:22:51 -04:00
_.each([
// Each of the index methods can be called individually, with the
// column name to be used, e.g. table.unique('column').
'index', 'primary', 'unique',
// Key specific
'dropPrimary', 'dropUnique', 'dropIndex', 'dropForeign'
], function(method) {
TableBuilder.prototype[method] = function() {
this._statements.push({
grouping: 'alterTable',
method: method,
args: _.toArray(arguments)
});
return this;
};
});
// Warn if we're not in MySQL, since that's the only time these
// three are supported.
var specialMethods = ['engine', 'charset', 'collate'];
_.each(specialMethods, function(method) {
TableBuilder.prototype[method] = function(value) {
if (false) {
2014-10-01 16:29:39 -04:00
helpers.warn('Knex only supports ' + method + ' statement with mysql.');
2014-05-05 22:22:51 -04:00
} if (this.__method === 'alter') {
2014-10-01 16:29:39 -04:00
helpers.warn('Knex does not support altering the ' + method + ' outside of the create table, please use knex.raw statement.');
2014-05-05 22:22:51 -04:00
}
this._single[method] = value;
};
});
// Each of the column types that we can add, we create a new ColumnBuilder
// instance and push it onto the statements array.
var columnTypes = [
// Numeric
'tinyint',
'smallint',
'mediumint',
'int',
'bigint',
'decimal',
'float',
'double',
'real',
'bit',
'boolean',
'serial',
// Date / Time
'date',
'datetime',
'timestamp',
'time',
'year',
// String
'char',
'varchar',
'tinytext',
'tinyText',
'text',
'mediumtext',
'mediumText',
'longtext',
'longText',
'binary',
'varbinary',
'tinyblob',
'tinyBlob',
'mediumblob',
'mediumBlob',
'blob',
'longblob',
'longBlob',
'enum',
'set',
// Increments, Aliases, and Additional
'bool',
'dateTime',
'increments',
'bigincrements',
'bigIncrements',
'integer',
'biginteger',
'bigInteger',
'string',
'timestamps',
'json',
'uuid',
'enu',
'specificType'
];
// For each of the column methods, create a new "ColumnBuilder" interface,
// push it onto the "allStatements" stack, and then return the interface,
// with which we can add indexes, etc.
_.each(columnTypes, function(type) {
TableBuilder.prototype[type] = function() {
var args = _.toArray(arguments);
// The "timestamps" call is really a compound call to set the
// `created_at` and `updated_at` columns.
if (type === 'timestamps') {
if (args[0] === true) {
this.timestamp('created_at');
this.timestamp('updated_at');
} else {
this.datetime('created_at');
this.datetime('updated_at');
}
return;
}
var ColumnBuilder = this.client.ColumnBuilder;
var builder = new ColumnBuilder(this, type, args);
this._statements.push({
grouping: 'columns',
builder: builder
});
return builder;
};
});
// Set the comment value for a table, they're only allowed to be called
// once per table.
TableBuilder.prototype.comment = function(value) {
this._single.comment = value;
};
// Set a foreign key on the table, calling
// `table.foreign('column_name').references('column').on('table').onDelete()...
// Also called from the ColumnBuilder context when chaining.
TableBuilder.prototype.foreign = function(column) {
var foreignData = {column: column};
this._statements.push({
grouping: 'alterTable',
method: 'foreign',
args: [foreignData]
});
var returnObj = {
references: function(tableColumn) {
var pieces;
if (_.isString(tableColumn)) {
pieces = tableColumn.split('.');
}
if (!pieces || pieces.length === 1) {
foreignData.references = pieces ? pieces[0] : tableColumn;
return {
on: function(tableName) {
foreignData.inTable = tableName;
return returnObj;
},
inTable: function() {
return this.on.apply(this, arguments);
}
};
}
foreignData.inTable = pieces[0];
foreignData.references = pieces[1];
return returnObj;
},
onUpdate: function(statement) {
foreignData.onUpdate = statement;
return returnObj;
},
onDelete: function(statement) {
foreignData.onDelete = statement;
return returnObj;
},
_columnBuilder: function(builder) {
_.extend(builder, returnObj);
returnObj = builder;
return builder;
}
};
return returnObj;
};
module.exports = TableBuilder;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
},{"../helpers":23,"lodash":88}],39:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Table Compiler
// -------
2014-10-01 16:29:39 -04:00
var _ = require('lodash');
2014-05-05 22:22:51 -04:00
2014-10-01 16:29:39 -04:00
var helpers = require('../helpers');
2014-05-05 22:22:51 -04:00
function TableCompiler(tableBuilder) {
this.method = tableBuilder._method;
this.tableNameRaw = tableBuilder._tableName;
this.single = tableBuilder._single;
this.grouped = _.groupBy(tableBuilder._statements, 'grouping');
this.initCompiler();
}
// Convert the tableCompiler toSQL
TableCompiler.prototype.toSQL = function() {
this[this.method]();
return this.sequence;
};
// Column Compilation
// -------
// If this is a table "creation", we need to first run through all
// of the columns to build them into a single string,
// and then run through anything else and push it to the query sequence.
2014-10-01 16:29:39 -04:00
TableCompiler.prototype.create = function(ifNot) {
2014-05-05 22:22:51 -04:00
var columns = this.getColumns();
var columnTypes = this.getColumnTypes(columns);
2014-10-01 16:29:39 -04:00
this.createQuery(columnTypes, ifNot);
2014-05-05 22:22:51 -04:00
this.columnQueries(columns);
delete this.single.comment;
2014-05-05 22:22:51 -04:00
this.alterTable();
};
2014-10-01 16:29:39 -04:00
// Only create the table if it doesn't exist.
TableCompiler.prototype.createIfNot = function() {
this.create(true);
};
2014-05-05 22:22:51 -04:00
// If we're altering the table, we need to one-by-one
// go through and handle each of the queries associated
// with altering the table's schema.
TableCompiler.prototype.alter = function() {
var columns = this.getColumns();
var columnTypes = this.getColumnTypes(columns);
this.addColumns(columnTypes);
this.columnQueries(columns);
this.alterTable();
};
TableCompiler.prototype.foreign = function(foreignData) {
if (foreignData.inTable && foreignData.references) {
var keyName = this._indexCommand('foreign', this.tableNameRaw, foreignData.column);
var column = this.formatter.columnize(foreignData.column);
var references = this.formatter.columnize(foreignData.references);
var inTable = this.formatter.wrap(foreignData.inTable);
2014-06-12 14:05:49 -04:00
var onUpdate = foreignData.onUpdate ? ' on update ' + foreignData.onUpdate : '';
var onDelete = foreignData.onDelete ? ' on delete ' + foreignData.onDelete : '';
this.pushQuery('alter table ' + this.tableName() + ' add constraint ' + keyName + ' ' +
'foreign key (' + column + ') references ' + inTable + ' (' + references + ')' + onUpdate + onDelete);
2014-05-05 22:22:51 -04:00
}
};
// Get all of the column sql & bindings individually for building the table queries.
TableCompiler.prototype.getColumnTypes = function(columns) {
return _.reduce(_.map(columns, _.first), function(memo, column) {
memo.sql.push(column.sql);
memo.bindings.concat(column.bindings);
return memo;
}, {sql: [], bindings: []});
};
// Adds all of the additional queries from the "column"
TableCompiler.prototype.columnQueries = function(columns) {
var queries = _.reduce(_.map(columns, _.rest), function(memo, column) {
if (!_.isEmpty(column)) return memo.concat(column);
2014-05-05 22:22:51 -04:00
return memo;
}, []);
for (var i = 0, l = queries.length; i < l; i++) {
this.pushQuery(queries[i]);
}
};
// Add a new column.
TableCompiler.prototype.addColumnsPrefix = 'add column ';
// All of the columns to "add" for the query
TableCompiler.prototype.addColumns = function(columns) {
if (columns.sql.length > 0) {
var columnSql = _.map(columns.sql, function(column) {
return this.addColumnsPrefix + column;
}, this);
this.pushQuery({
sql: 'alter table ' + this.tableName() + ' ' + columnSql.join(', '),
bindings: columns.bindings
});
}
};
// Compile the columns as needed for the current create or alter table
TableCompiler.prototype.getColumns = function() {
var compiledColumns = [], columns = this.grouped.columns || [];
var ColumnCompiler = this.client.ColumnCompiler;
for (var i = 0, l = columns.length; i < l; i++) {
compiledColumns.push(new ColumnCompiler(this, columns[i].builder).toSQL());
}
return compiledColumns;
};
TableCompiler.prototype.tableName = function() {
return this.formatter.wrap(this.tableNameRaw);
};
// Generate all of the alter column statements necessary for the query.
TableCompiler.prototype.alterTable = function() {
var alterTable = this.grouped.alterTable || [];
for (var i = 0, l = alterTable.length; i < l; i++) {
var statement = alterTable[i];
if (this[statement.method]) {
this[statement.method].apply(this, statement.args);
} else {
console.error('Debug: ' + statement.method + ' does not exist');
}
}
for (var item in this.single) {
if (_.isFunction(this[item])) this[item](this.single[item]);
}
2014-05-05 22:22:51 -04:00
};
// Drop the index on the current table.
TableCompiler.prototype.dropIndex = function(value) {
this.pushQuery('drop index' + value);
};
// Drop the unique
TableCompiler.prototype.dropUnique =
TableCompiler.prototype.dropForeign = function() {
throw new Error('Method implemented in the dialect driver');
};
TableCompiler.prototype.dropColumnPrefix = 'drop column ';
TableCompiler.prototype.dropColumn = function() {
var columns = helpers.normalizeArr.apply(null, arguments);
var drops = _.map(_.isArray(columns) ? columns : [columns], function(column) {
return this.dropColumnPrefix + this.formatter.wrap(column);
}, this);
this.pushQuery('alter table ' + this.tableName() + ' ' + drops.join(', '));
};
// If no name was specified for this index, we will create one using a basic
// convention of the table name, followed by the columns, followed by an
// index type, such as primary or index, which makes the index unique.
TableCompiler.prototype._indexCommand = function(type, tableName, columns) {
if (!_.isArray(columns)) columns = columns ? [columns] : [];
var table = tableName.replace(/\.|-/g, '_');
return (table + '_' + columns.join('_') + '_' + type).toLowerCase();
};
module.exports = TableCompiler;
2015-02-25 13:53:04 -05:00
},{"../helpers":23,"lodash":88}],40:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
'use strict';
2014-05-05 22:22:51 -04:00
// Transaction
// -------
2014-10-01 16:29:39 -04:00
var Promise = require('./promise');
var inherits = require('inherits');
var EventEmitter = require('events').EventEmitter;
2014-05-05 22:22:51 -04:00
// Creates a new wrapper object for constructing a transaction.
// Called by the `knex.transaction`, which sets the correct client
// and handles the `container` object, passing along the correct
// `connection` to keep all of the transactions on the correct connection.
function Transaction(container) {
this.container = container;
}
inherits(Transaction, EventEmitter);
// Build the knex instance passed around inside the transaction container.
// It can be used both as a fully functional knex instance, or assimilated
// into existing knex chains via the ".transacting" method call.
2014-05-05 22:22:51 -04:00
Transaction.prototype.containerObject = function(runner) {
2014-10-01 16:29:39 -04:00
var Knex = require('../knex');
// Create an entirely new knex instance just for this transaction
var transactor = Knex.initialize({
__client__ : this.client,
__transactor__ : {_runner: runner}
});
// Remove the ability to start a transaction or destroy
// the entire pool within a transaction.
transactor.destroy = transactor.transaction = void 0;
// Commits the transaction:
transactor.commit = function(message) {
runner.finishTransaction(0, transactor, message);
2014-05-05 22:22:51 -04:00
};
// Rolls back the transaction.
transactor.rollback = function(error) {
runner.finishTransaction(1, transactor, error);
};
transactor._runner = runner;
return transactor;
2014-05-05 22:22:51 -04:00
};
Transaction.prototype.initiateDeferred = function(transactor) {
2014-05-05 22:22:51 -04:00
// Initiate a deferred object, bound to the container object,
// so we know when the transaction completes or fails
// and can continue from there.
var dfd = transactor.__dfd__ = Promise.pending();
2014-05-05 22:22:51 -04:00
// Call the container with the transaction
// commit & rollback objects.
var result = this.container(transactor);
// If we've returned a "thenable" from the transaction container,
// and it's got the transaction object we're running for this, assume
// the rollback and commit are chained to this object's success / failure.
if (result && result.then && typeof result.then === 'function') {
2014-06-06 17:41:31 -04:00
result.then(function(val) { transactor.commit(val); }).catch(function(err) { transactor.rollback(err); });
}
2014-05-05 22:22:51 -04:00
// Return the promise for the entire transaction.
return dfd.promise;
};
// Allow the `Transaction` object to be utilized with full access to the relevant
// promise API.
2014-10-01 16:29:39 -04:00
require('./interface')(Transaction);
2014-05-05 22:22:51 -04:00
// Passed a `container` function, this method runs the current
// transaction, returning a promise.
2015-02-25 13:53:04 -05:00
Transaction.prototype.then = function(/* onFulfilled, onRejected */) {
2014-10-01 16:29:39 -04:00
var Runner = this.client.Runner;
2015-02-25 13:53:04 -05:00
var self = this;
2014-05-05 22:22:51 -04:00
// Create a new "runner" object, passing the "runner"
// object along, so we can easily keep track of every
// query run on the current connection.
2015-02-25 13:53:04 -05:00
var result = new Runner(this)
2014-05-05 22:22:51 -04:00
.startTransaction()
2015-02-25 13:53:04 -05:00
.then(function(runner) {
return self.containerObject(runner);
2014-10-01 16:29:39 -04:00
})
2015-02-25 13:53:04 -05:00
.then(function(container) {
return self.initiateDeferred(container);
});
return result.then.apply(result, arguments);
2014-05-05 22:22:51 -04:00
};
module.exports = Transaction;
2015-02-25 13:53:04 -05:00
},{"../knex":undefined,"./interface":24,"./promise":26,"events":83,"inherits":87}],41:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
2015-02-25 13:53:04 -05:00
function any(promises) {
2014-10-01 16:29:39 -04:00
var ret = new SomePromiseArray(promises);
2014-07-10 22:41:24 -04:00
var promise = ret.promise();
ret.setHowMany(1);
ret.setUnwrap();
ret.init();
return promise;
}
2015-02-25 13:53:04 -05:00
Promise.any = function (promises) {
return any(promises);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.any = function () {
return any(this);
2014-07-10 22:41:24 -04:00
};
};
2014-10-01 16:29:39 -04:00
},{}],42:[function(require,module,exports){
(function (process){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
2014-10-01 16:29:39 -04:00
var schedule = require("./schedule.js");
var Queue = require("./queue.js");
2015-02-25 13:53:04 -05:00
var _process = typeof process !== "undefined" ? process : undefined;
2014-07-10 22:41:24 -04:00
function Async() {
this._isTickUsed = false;
2015-02-25 13:53:04 -05:00
this._lateQueue = new Queue(16);
this._normalQueue = new Queue(16);
2014-07-10 22:41:24 -04:00
var self = this;
2015-02-25 13:53:04 -05:00
this.drainQueues = function () {
self._drainQueues();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
this._schedule =
schedule.isStatic ? schedule(this.drainQueues) : schedule;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
Async.prototype.haveItemsQueued = function () {
return this._normalQueue.length() > 0;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Async.prototype._withDomain = function(fn) {
if (_process !== undefined &&
2014-10-01 16:29:39 -04:00
_process.domain != null &&
2014-07-10 22:41:24 -04:00
!fn.domain) {
2014-10-01 16:29:39 -04:00
fn = _process.domain.bind(fn);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
return fn;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Async.prototype.throwLater = function(fn, arg) {
if (arguments.length === 1) {
arg = fn;
fn = function () { throw arg; };
}
fn = this._withDomain(fn);
if (typeof setTimeout !== "undefined") {
setTimeout(function() {
fn(arg);
}, 0);
} else try {
this._schedule(function() {
fn(arg);
});
} catch (e) {
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/m3OTXk\u000a");
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
};
Async.prototype.invokeLater = function (fn, receiver, arg) {
fn = this._withDomain(fn);
this._lateQueue.push(fn, receiver, arg);
this._queueTick();
};
Async.prototype.invokeFirst = function (fn, receiver, arg) {
fn = this._withDomain(fn);
this._normalQueue.unshift(fn, receiver, arg);
this._queueTick();
};
Async.prototype.invoke = function (fn, receiver, arg) {
fn = this._withDomain(fn);
this._normalQueue.push(fn, receiver, arg);
this._queueTick();
};
Async.prototype.settlePromises = function(promise) {
this._normalQueue._pushOne(promise);
2014-07-10 22:41:24 -04:00
this._queueTick();
};
2015-02-25 13:53:04 -05:00
Async.prototype._drainQueue = function(queue) {
while (queue.length() > 0) {
var fn = queue.shift();
if (typeof fn !== "function") {
fn._settlePromises();
continue;
}
var receiver = queue.shift();
var arg = queue.shift();
2014-07-10 22:41:24 -04:00
fn.call(receiver, arg);
}
2015-02-25 13:53:04 -05:00
};
Async.prototype._drainQueues = function () {
this._drainQueue(this._normalQueue);
2014-07-10 22:41:24 -04:00
this._reset();
2015-02-25 13:53:04 -05:00
this._drainQueue(this._lateQueue);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Async.prototype._queueTick = function () {
2014-07-10 22:41:24 -04:00
if (!this._isTickUsed) {
this._isTickUsed = true;
2015-02-25 13:53:04 -05:00
this._schedule(this.drainQueues);
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
Async.prototype._reset = function () {
2014-07-10 22:41:24 -04:00
this._isTickUsed = false;
};
module.exports = new Async();
2015-02-25 13:53:04 -05:00
module.exports.firstLineError = firstLineError;
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
}).call(this,require('_process'))
2015-02-25 13:53:04 -05:00
},{"./queue.js":67,"./schedule.js":70,"_process":84}],43:[function(require,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise) {
var rejectThis = function(_, e) {
this._reject(e);
};
var targetRejected = function(e, context) {
context.promiseRejectionQueued = true;
context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};
var bindingResolved = function(thisArg, context) {
this._setBoundTo(thisArg);
if (this._isPending()) {
this._resolveCallback(context.target);
}
};
var bindingRejected = function(e, context) {
if (!context.promiseRejectionQueued) this._reject(e);
};
Promise.prototype.bind = function (thisArg) {
var maybePromise = tryConvertToPromise(thisArg);
var ret = new Promise(INTERNAL);
ret._propagateFrom(this, 1);
var target = this._target();
if (maybePromise instanceof Promise) {
var context = {
promiseRejectionQueued: false,
promise: ret,
target: target,
bindingPromise: maybePromise
};
target._then(INTERNAL, targetRejected, ret._progress, ret, context);
maybePromise._then(
bindingResolved, bindingRejected, ret._progress, ret, context);
} else {
ret._setBoundTo(thisArg);
ret._resolveCallback(target);
}
return ret;
};
Promise.prototype._setBoundTo = function (obj) {
if (obj !== undefined) {
this._bitField = this._bitField | 131072;
this._boundTo = obj;
} else {
this._bitField = this._bitField & (~131072);
}
};
Promise.prototype._isBound = function () {
return (this._bitField & 131072) === 131072;
};
Promise.bind = function (thisArg, value) {
var maybePromise = tryConvertToPromise(thisArg);
var ret = new Promise(INTERNAL);
if (maybePromise instanceof Promise) {
maybePromise._then(function(thisArg) {
ret._setBoundTo(thisArg);
ret._resolveCallback(value);
}, ret._reject, ret._progress, ret, null);
} else {
ret._setBoundTo(thisArg);
ret._resolveCallback(value);
}
return ret;
};
};
},{}],44:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
var cr = Object.create;
if (cr) {
var callerCache = cr(null);
var getterCache = cr(null);
callerCache[" size"] = getterCache[" size"] = 0;
}
2014-07-10 22:41:24 -04:00
module.exports = function(Promise) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;
2015-02-25 13:53:04 -05:00
var getMethodCaller;
var getGetter;
if (!false) {
var makeMethodCaller = function (methodName) {
return new Function("ensureMethod", " \n\
return function(obj) { \n\
'use strict' \n\
var len = this.length; \n\
ensureMethod(obj, 'methodName'); \n\
switch(len) { \n\
case 1: return obj.methodName(this[0]); \n\
case 2: return obj.methodName(this[0], this[1]); \n\
case 3: return obj.methodName(this[0], this[1], this[2]); \n\
case 0: return obj.methodName(); \n\
default: \n\
return obj.methodName.apply(obj, this); \n\
} \n\
}; \n\
".replace(/methodName/g, methodName))(ensureMethod);
};
var makeGetter = function (propertyName) {
2014-10-01 16:29:39 -04:00
return new Function("obj", " \n\
'use strict'; \n\
return obj.propertyName; \n\
".replace("propertyName", propertyName));
2015-02-25 13:53:04 -05:00
};
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
var getCompiled = function(name, compiler, cache) {
2014-10-01 16:29:39 -04:00
var ret = cache[name];
if (typeof ret !== "function") {
if (!isIdentifier(name)) {
return null;
}
ret = compiler(name);
cache[name] = ret;
cache[" size"]++;
if (cache[" size"] > 512) {
var keys = Object.keys(cache);
for (var i = 0; i < 256; ++i) delete cache[keys[i]];
cache[" size"] = keys.length - 256;
}
}
return ret;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
getMethodCaller = function(name) {
2014-10-01 16:29:39 -04:00
return getCompiled(name, makeMethodCaller, callerCache);
2015-02-25 13:53:04 -05:00
};
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
getGetter = function(name) {
2014-10-01 16:29:39 -04:00
return getCompiled(name, makeGetter, getterCache);
2015-02-25 13:53:04 -05:00
};
}
function ensureMethod(obj, methodName) {
var fn;
if (obj != null) fn = obj[methodName];
if (typeof fn !== "function") {
var message = "Object " + util.classString(obj) + " has no method '" +
util.toString(methodName) + "'";
throw new Promise.TypeError(message);
}
return fn;
2014-10-01 16:29:39 -04:00
}
function caller(obj) {
2015-02-25 13:53:04 -05:00
var methodName = this.pop();
var fn = ensureMethod(obj, methodName);
return fn.apply(obj, this);
2014-10-01 16:29:39 -04:00
}
2015-02-25 13:53:04 -05:00
Promise.prototype.call = function (methodName) {
2014-10-01 16:29:39 -04:00
var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}
2015-02-25 13:53:04 -05:00
if (!false) {
if (canEvaluate) {
var maybeCaller = getMethodCaller(methodName);
if (maybeCaller !== null) {
return this._then(
maybeCaller, undefined, undefined, args, undefined);
}
2014-10-01 16:29:39 -04:00
}
}
args.push(methodName);
2015-02-25 13:53:04 -05:00
return this._then(caller, undefined, undefined, args, undefined);
2014-07-10 22:41:24 -04:00
};
2014-10-01 16:29:39 -04:00
function namedGetter(obj) {
return obj[this];
}
function indexedGetter(obj) {
2015-02-25 13:53:04 -05:00
var index = +this;
if (index < 0) index = Math.max(0, index + obj.length);
return obj[index];
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
Promise.prototype.get = function (propertyName) {
2014-10-01 16:29:39 -04:00
var isIndex = (typeof propertyName === "number");
var getter;
if (!isIndex) {
if (canEvaluate) {
var maybeGetter = getGetter(propertyName);
getter = maybeGetter !== null ? maybeGetter : namedGetter;
} else {
getter = namedGetter;
}
} else {
getter = indexedGetter;
}
2015-02-25 13:53:04 -05:00
return this._then(getter, undefined, undefined, propertyName, undefined);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],45:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise) {
2014-10-01 16:29:39 -04:00
var errors = require("./errors.js");
var async = require("./async.js");
2014-07-10 22:41:24 -04:00
var CancellationError = errors.CancellationError;
2015-02-25 13:53:04 -05:00
Promise.prototype._cancel = function (reason) {
2014-07-10 22:41:24 -04:00
if (!this.isCancellable()) return this;
var parent;
var promiseToReject = this;
2015-02-25 13:53:04 -05:00
while ((parent = promiseToReject._cancellationParent) !== undefined &&
2014-07-10 22:41:24 -04:00
parent.isCancellable()) {
promiseToReject = parent;
}
2015-02-25 13:53:04 -05:00
this._unsetCancellable();
promiseToReject._target()._rejectCallback(reason, false, true);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.cancel = function (reason) {
2014-07-10 22:41:24 -04:00
if (!this.isCancellable()) return this;
2015-02-25 13:53:04 -05:00
if (reason === undefined) reason = new CancellationError();
2014-10-01 16:29:39 -04:00
async.invokeLater(this._cancel, this, reason);
2014-07-10 22:41:24 -04:00
return this;
};
2015-02-25 13:53:04 -05:00
Promise.prototype.cancellable = function () {
2014-07-10 22:41:24 -04:00
if (this._cancellable()) return this;
this._setCancellable();
2015-02-25 13:53:04 -05:00
this._cancellationParent = undefined;
2014-07-10 22:41:24 -04:00
return this;
};
2015-02-25 13:53:04 -05:00
Promise.prototype.uncancellable = function () {
var ret = this.then();
2014-07-10 22:41:24 -04:00
ret._unsetCancellable();
return ret;
};
2015-02-25 13:53:04 -05:00
Promise.prototype.fork = function (didFulfill, didReject, didProgress) {
2014-07-10 22:41:24 -04:00
var ret = this._then(didFulfill, didReject, didProgress,
2015-02-25 13:53:04 -05:00
undefined, undefined);
2014-07-10 22:41:24 -04:00
ret._setCancellable();
2015-02-25 13:53:04 -05:00
ret._cancellationParent = undefined;
2014-07-10 22:41:24 -04:00
return ret;
};
};
2015-02-25 13:53:04 -05:00
},{"./async.js":42,"./errors.js":52}],46:[function(require,module,exports){
(function (process){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function() {
2015-02-25 13:53:04 -05:00
var async = require("./async.js");
var util = require("./util.js");
var bluebirdFramePattern =
/[\\\/]bluebird[\\\/]js[\\\/](main|debug|zalgo|instrumented)/;
var stackFramePattern = null;
2014-07-10 22:41:24 -04:00
var formatStack = null;
2015-02-25 13:53:04 -05:00
var indentStackFrames = false;
var warn;
function CapturedTrace(parent) {
this._parent = parent;
var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
captureStackTrace(this, CapturedTrace);
if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
CapturedTrace.prototype.uncycle = function() {
var length = this._length;
if (length < 2) return;
var nodes = [];
var stackToIndex = {};
for (var i = 0, node = this; node !== undefined; ++i) {
nodes.push(node);
node = node._parent;
}
length = this._length = i;
for (var i = length - 1; i >= 0; --i) {
var stack = nodes[i].stack;
if (stackToIndex[stack] === undefined) {
stackToIndex[stack] = i;
}
}
for (var i = 0; i < length; ++i) {
var currentStack = nodes[i].stack;
var index = stackToIndex[currentStack];
if (index !== undefined && index !== i) {
if (index > 0) {
nodes[index - 1]._parent = undefined;
nodes[index - 1]._length = 1;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
nodes[i]._parent = undefined;
nodes[i]._length = 1;
var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;
if (index < length - 1) {
cycleEdgeNode._parent = nodes[index + 1];
cycleEdgeNode._parent.uncycle();
cycleEdgeNode._length =
cycleEdgeNode._parent._length + 1;
} else {
cycleEdgeNode._parent = undefined;
cycleEdgeNode._length = 1;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
var currentChildLength = cycleEdgeNode._length + 1;
for (var j = i - 2; j >= 0; --j) {
nodes[j]._length = currentChildLength;
currentChildLength++;
}
return;
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
CapturedTrace.prototype.parent = function() {
return this._parent;
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
CapturedTrace.prototype.hasParent = function() {
return this._parent !== undefined;
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
CapturedTrace.prototype.attachExtraTrace = function(error) {
if (error.__stackCleaned__) return;
this.uncycle();
var parsed = CapturedTrace.parseStackAndMessage(error);
var message = parsed.message;
var stacks = [parsed.stack];
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var trace = this;
while (trace !== undefined) {
stacks.push(cleanStack(trace.stack.split("\n")));
trace = trace._parent;
}
removeCommonRoots(stacks);
removeDuplicateOrEmptyJumps(stacks);
error.stack = reconstructStack(message, stacks);
util.notEnumerableProp(error, "__stackCleaned__", true);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
function reconstructStack(message, stacks) {
for (var i = 0; i < stacks.length - 1; ++i) {
stacks[i].push("From previous event:");
stacks[i] = stacks[i].join("\n");
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
if (i < stacks.length) {
stacks[i] = stacks[i].join("\n");
}
return message + "\n" + stacks.join("\n");
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function removeDuplicateOrEmptyJumps(stacks) {
for (var i = 0; i < stacks.length; ++i) {
if (stacks[i].length === 0 ||
((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
stacks.splice(i, 1);
i--;
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function removeCommonRoots(stacks) {
var current = stacks[0];
for (var i = 1; i < stacks.length; ++i) {
var prev = stacks[i];
var currentLastIndex = current.length - 1;
var currentLastLine = current[currentLastIndex];
var commonRootMeetPoint = -1;
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
for (var j = prev.length - 1; j >= 0; --j) {
if (prev[j] === currentLastLine) {
commonRootMeetPoint = j;
break;
}
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
for (var j = commonRootMeetPoint; j >= 0; --j) {
var line = prev[j];
if (current[currentLastIndex] === line) {
current.pop();
currentLastIndex--;
} else {
break;
}
}
current = prev;
}
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function cleanStack(stack) {
var ret = [];
for (var i = 0; i < stack.length; ++i) {
var line = stack[i];
var isTraceLine = stackFramePattern.test(line) ||
" (No stack trace)" === line;
var isInternalFrame = isTraceLine && shouldIgnore(line);
if (isTraceLine && !isInternalFrame) {
if (indentStackFrames && line.charAt(0) !== " ") {
line = " " + line;
}
ret.push(line);
2014-07-10 22:41:24 -04:00
}
}
return ret;
2015-02-25 13:53:04 -05:00
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function stackFramesAsArray(error) {
var stack = error.stack.replace(/\s+$/g, "").split("\n");
2014-10-01 16:29:39 -04:00
for (var i = 0; i < stack.length; ++i) {
2015-02-25 13:53:04 -05:00
var line = stack[i];
if (" (No stack trace)" === line || stackFramePattern.test(line)) {
2014-10-01 16:29:39 -04:00
break;
}
}
2015-02-25 13:53:04 -05:00
if (i > 0) {
stack = stack.slice(i);
}
return stack;
}
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
CapturedTrace.parseStackAndMessage = function(error) {
var stack = error.stack;
var message = error.toString();
stack = typeof stack === "string" && stack.length > 0
? stackFramesAsArray(error) : [" (No stack trace)"];
return {
message: message,
stack: cleanStack(stack)
};
};
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
CapturedTrace.formatAndLogError = function(error, title) {
if (typeof console !== "undefined") {
var message;
if (typeof error === "object" || typeof error === "function") {
var stack = error.stack;
message = title + formatStack(stack, error);
} else {
message = title + String(error);
}
if (typeof warn === "function") {
warn(message);
} else if (typeof console.log === "function" ||
typeof console.log === "object") {
console.log(message);
}
2014-10-01 16:29:39 -04:00
}
};
2015-02-25 13:53:04 -05:00
CapturedTrace.unhandledRejection = function (reason) {
CapturedTrace.formatAndLogError(reason, "^--- With additional stack trace: ");
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
CapturedTrace.isSupported = function () {
return typeof captureStackTrace === "function";
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
CapturedTrace.fireRejectionEvent =
function(name, localHandler, reason, promise) {
var localEventFired = false;
try {
if (typeof localHandler === "function") {
localEventFired = true;
if (name === "rejectionHandled") {
localHandler(promise);
} else {
localHandler(reason, promise);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
}
} catch (e) {
async.throwLater(e);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
var globalEventFired = false;
try {
globalEventFired = fireGlobalEvent(name, reason, promise);
} catch (e) {
globalEventFired = true;
async.throwLater(e);
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var domEventFired = false;
if (fireDomEvent) {
try {
domEventFired = fireDomEvent(name.toLowerCase(), {
reason: reason,
promise: promise
});
} catch (e) {
domEventFired = true;
async.throwLater(e);
}
}
if (!globalEventFired && !localEventFired && !domEventFired &&
name === "unhandledRejection") {
CapturedTrace.formatAndLogError(reason, "Unhandled rejection ");
}
};
function formatNonError(obj) {
var str;
if (typeof obj === "function") {
str = "[function " +
(obj.name || "anonymous") +
"]";
} else {
str = obj.toString();
var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
if (ruselessToString.test(str)) {
try {
var newStr = JSON.stringify(obj);
str = newStr;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
catch(e) {
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
}
if (str.length === 0) {
str = "(empty array)";
}
}
return ("(<" + snip(str) + ">, no stack trace)");
}
function snip(str) {
var maxChars = 41;
if (str.length < maxChars) {
return str;
}
return str.substr(0, maxChars - 3) + "...";
}
var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
var matches = line.match(parseLineInfoRegex);
if (matches) {
return {
fileName: matches[1],
line: parseInt(matches[2], 10)
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
}
}
CapturedTrace.setBounds = function(firstLineError, lastLineError) {
if (!CapturedTrace.isSupported()) return;
var firstStackLines = firstLineError.stack.split("\n");
var lastStackLines = lastLineError.stack.split("\n");
var firstIndex = -1;
var lastIndex = -1;
var firstFileName;
var lastFileName;
for (var i = 0; i < firstStackLines.length; ++i) {
var result = parseLineInfo(firstStackLines[i]);
if (result) {
firstFileName = result.fileName;
firstIndex = result.line;
break;
}
}
for (var i = 0; i < lastStackLines.length; ++i) {
var result = parseLineInfo(lastStackLines[i]);
if (result) {
lastFileName = result.fileName;
lastIndex = result.line;
break;
}
}
if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
firstFileName !== lastFileName || firstIndex >= lastIndex) {
return;
}
shouldIgnore = function(line) {
if (bluebirdFramePattern.test(line)) return true;
var info = parseLineInfo(line);
if (info) {
if (info.fileName === firstFileName &&
(firstIndex <= info.line && info.line <= lastIndex)) {
return true;
}
}
return false;
};
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var captureStackTrace = (function stackDetection() {
var v8stackFramePattern = /^\s*at\s*/;
var v8stackFormatter = function(stack, error) {
if (typeof stack === "string") return stack;
if (error.name !== undefined &&
error.message !== undefined) {
return error.toString();
}
return formatNonError(error);
};
if (typeof Error.stackTraceLimit === "number" &&
typeof Error.captureStackTrace === "function") {
Error.stackTraceLimit = Error.stackTraceLimit + 6;
stackFramePattern = v8stackFramePattern;
formatStack = v8stackFormatter;
var captureStackTrace = Error.captureStackTrace;
shouldIgnore = function(line) {
return bluebirdFramePattern.test(line);
};
return function(receiver, ignoreUntil) {
Error.stackTraceLimit = Error.stackTraceLimit + 6;
captureStackTrace(receiver, ignoreUntil);
Error.stackTraceLimit = Error.stackTraceLimit - 6;
};
}
var err = new Error();
if (typeof err.stack === "string" &&
err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
stackFramePattern = /@/;
formatStack = v8stackFormatter;
indentStackFrames = true;
return function captureStackTrace(o) {
o.stack = new Error().stack;
};
}
var hasStackAfterThrow;
try { throw new Error(); }
catch(e) {
hasStackAfterThrow = ("stack" in e);
}
if (!("stack" in err) && hasStackAfterThrow) {
stackFramePattern = v8stackFramePattern;
formatStack = v8stackFormatter;
2014-07-10 22:41:24 -04:00
return function captureStackTrace(o) {
2015-02-25 13:53:04 -05:00
Error.stackTraceLimit = Error.stackTraceLimit + 6;
try { throw new Error(); }
catch(e) { o.stack = e.stack; }
Error.stackTraceLimit = Error.stackTraceLimit - 6;
};
}
formatStack = function(stack, error) {
if (typeof stack === "string") return stack;
if ((typeof error === "object" ||
typeof error === "function") &&
error.name !== undefined &&
error.message !== undefined) {
return error.toString();
}
return formatNonError(error);
};
return null;
})([]);
var fireDomEvent;
var fireGlobalEvent = (function() {
if (util.isNode) {
return function(name, reason, promise) {
if (name === "rejectionHandled") {
return process.emit(name, promise);
} else {
return process.emit(name, reason, promise);
2014-07-10 22:41:24 -04:00
}
};
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
var customEventWorks = false;
var anyEventWorks = true;
try {
var ev = new self.CustomEvent("test");
customEventWorks = ev instanceof CustomEvent;
} catch (e) {}
if (!customEventWorks) {
try {
var event = document.createEvent("CustomEvent");
event.initCustomEvent("testingtheevent", false, true, {});
self.dispatchEvent(event);
} catch (e) {
anyEventWorks = false;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
}
if (anyEventWorks) {
fireDomEvent = function(type, detail) {
var event;
if (customEventWorks) {
event = new self.CustomEvent(type, {
detail: detail,
bubbles: false,
cancelable: true
});
} else if (self.dispatchEvent) {
event = document.createEvent("CustomEvent");
event.initCustomEvent(type, false, true, detail);
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
return event ? !self.dispatchEvent(event) : false;
};
}
var toWindowMethodNameMap = {};
toWindowMethodNameMap["unhandledRejection"] = ("on" +
"unhandledRejection").toLowerCase();
toWindowMethodNameMap["rejectionHandled"] = ("on" +
"rejectionHandled").toLowerCase();
return function(name, reason, promise) {
var methodName = toWindowMethodNameMap[name];
var method = self[methodName];
if (!method) return false;
if (name === "rejectionHandled") {
method.call(self, promise);
} else {
method.call(self, reason, promise);
}
return true;
};
2014-07-10 22:41:24 -04:00
}
})();
2015-02-25 13:53:04 -05:00
if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
warn = function (message) {
console.warn(message);
};
if (util.isNode && process.stderr.isTTY) {
warn = function(message) {
process.stderr.write("\u001b[31m" + message + "\u001b[39m\n");
};
} else if (!util.isNode && typeof (new Error().stack) === "string") {
warn = function(message) {
console.warn("%c" + message, "color: red");
};
}
}
2014-07-10 22:41:24 -04:00
return CapturedTrace;
};
2015-02-25 13:53:04 -05:00
}).call(this,require('_process'))
},{"./async.js":42,"./util.js":77,"_process":84}],47:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function(NEXT_FILTER) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var errors = require("./errors.js");
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-07-10 22:41:24 -04:00
var errorObj = util.errorObj;
2014-10-01 16:29:39 -04:00
var keys = require("./es5.js").keys;
2014-07-10 22:41:24 -04:00
var TypeError = errors.TypeError;
function CatchFilter(instances, callback, promise) {
this._instances = instances;
this._callback = callback;
this._promise = promise;
}
2015-02-25 13:53:04 -05:00
function safePredicate(predicate, e) {
2014-07-10 22:41:24 -04:00
var safeObject = {};
2015-02-25 13:53:04 -05:00
var retfilter = tryCatch(predicate).call(safeObject, e);
2014-07-10 22:41:24 -04:00
if (retfilter === errorObj) return retfilter;
var safeKeys = keys(safeObject);
if (safeKeys.length) {
2015-02-25 13:53:04 -05:00
errorObj.e = new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a See http://goo.gl/o84o68\u000a");
2014-07-10 22:41:24 -04:00
return errorObj;
}
return retfilter;
}
2015-02-25 13:53:04 -05:00
CatchFilter.prototype.doFilter = function (e) {
2014-07-10 22:41:24 -04:00
var cb = this._callback;
var promise = this._promise;
2014-10-01 16:29:39 -04:00
var boundTo = promise._boundTo;
2014-07-10 22:41:24 -04:00
for (var i = 0, len = this._instances.length; i < len; ++i) {
var item = this._instances[i];
var itemIsErrorType = item === Error ||
(item != null && item.prototype instanceof Error);
if (itemIsErrorType && e instanceof item) {
2015-02-25 13:53:04 -05:00
var ret = tryCatch(cb).call(boundTo, e);
2014-07-10 22:41:24 -04:00
if (ret === errorObj) {
NEXT_FILTER.e = ret.e;
return NEXT_FILTER;
}
return ret;
} else if (typeof item === "function" && !itemIsErrorType) {
2015-02-25 13:53:04 -05:00
var shouldHandle = safePredicate(item, e);
2014-07-10 22:41:24 -04:00
if (shouldHandle === errorObj) {
e = errorObj.e;
break;
} else if (shouldHandle) {
2015-02-25 13:53:04 -05:00
var ret = tryCatch(cb).call(boundTo, e);
2014-07-10 22:41:24 -04:00
if (ret === errorObj) {
NEXT_FILTER.e = ret.e;
return NEXT_FILTER;
}
return ret;
}
}
}
NEXT_FILTER.e = e;
return NEXT_FILTER;
};
return CatchFilter;
};
2015-02-25 13:53:04 -05:00
},{"./errors.js":52,"./es5.js":53,"./util.js":77}],48:[function(require,module,exports){
"use strict";
module.exports = function(Promise, CapturedTrace, isDebugging) {
var contextStack = [];
function Context() {
this._trace = new CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
if (!isDebugging()) return;
if (this._trace !== undefined) {
contextStack.push(this._trace);
}
};
Context.prototype._popContext = function () {
if (!isDebugging()) return;
if (this._trace !== undefined) {
contextStack.pop();
}
};
function createContext() {
if (isDebugging()) return new Context();
}
function peekContext() {
var lastIndex = contextStack.length - 1;
if (lastIndex >= 0) {
return contextStack[lastIndex];
}
return undefined;
}
Promise.prototype._peekContext = peekContext;
Promise.prototype._pushContext = Context.prototype._pushContext;
Promise.prototype._popContext = Context.prototype._popContext;
return createContext;
};
},{}],49:[function(require,module,exports){
(function (process){
"use strict";
module.exports = function(Promise, CapturedTrace) {
var async = require("./async.js");
var Warning = require("./errors.js").Warning;
var util = require("./util.js");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var debugging = false || (util.isNode &&
(!!process.env["BLUEBIRD_DEBUG"] ||
process.env["NODE_ENV"] === "development"));
Promise.prototype._ensurePossibleRejectionHandled = function () {
this._setRejectionIsUnhandled();
async.invokeLater(this._notifyUnhandledRejection, this, undefined);
};
Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
CapturedTrace.fireRejectionEvent("rejectionHandled",
unhandledRejectionHandled, undefined, this);
};
Promise.prototype._notifyUnhandledRejection = function () {
if (this._isRejectionUnhandled()) {
var reason = this._getCarriedStackTrace() || this._settledValue;
this._setUnhandledRejectionIsNotified();
CapturedTrace.fireRejectionEvent("unhandledRejection",
possiblyUnhandledRejection, reason, this);
}
};
Promise.prototype._setUnhandledRejectionIsNotified = function () {
this._bitField = this._bitField | 524288;
};
Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
this._bitField = this._bitField & (~524288);
};
Promise.prototype._isUnhandledRejectionNotified = function () {
return (this._bitField & 524288) > 0;
};
Promise.prototype._setRejectionIsUnhandled = function () {
this._bitField = this._bitField | 2097152;
};
Promise.prototype._unsetRejectionIsUnhandled = function () {
this._bitField = this._bitField & (~2097152);
if (this._isUnhandledRejectionNotified()) {
this._unsetUnhandledRejectionIsNotified();
this._notifyUnhandledRejectionIsHandled();
}
};
Promise.prototype._isRejectionUnhandled = function () {
return (this._bitField & 2097152) > 0;
};
Promise.prototype._setCarriedStackTrace = function (capturedTrace) {
this._bitField = this._bitField | 1048576;
this._fulfillmentHandler0 = capturedTrace;
};
Promise.prototype._isCarryingStackTrace = function () {
return (this._bitField & 1048576) > 0;
};
Promise.prototype._getCarriedStackTrace = function () {
return this._isCarryingStackTrace()
? this._fulfillmentHandler0
: undefined;
};
Promise.prototype._captureStackTrace = function () {
if (debugging) {
this._trace = new CapturedTrace(this._peekContext());
}
return this;
};
Promise.prototype._attachExtraTrace = function (error, ignoreSelf) {
if (debugging && canAttachTrace(error)) {
var trace = this._trace;
if (trace !== undefined) {
if (ignoreSelf) trace = trace._parent;
}
if (trace !== undefined) {
trace.attachExtraTrace(error);
} else if (!error.__stackCleaned__) {
var parsed = CapturedTrace.parseStackAndMessage(error);
error.stack = parsed.message + "\n" + parsed.stack.join("\n");
util.notEnumerableProp(error, "__stackCleaned__", true);
}
}
};
Promise.prototype._warn = function(message) {
var warning = new Warning(message);
var ctx = this._peekContext();
if (ctx) {
ctx.attachExtraTrace(warning);
} else {
var parsed = CapturedTrace.parseStackAndMessage(warning);
warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
}
CapturedTrace.formatAndLogError(warning, "");
};
Promise.onPossiblyUnhandledRejection = function (fn) {
possiblyUnhandledRejection = typeof fn === "function" ? fn : undefined;
};
Promise.onUnhandledRejectionHandled = function (fn) {
unhandledRejectionHandled = typeof fn === "function" ? fn : undefined;
};
Promise.longStackTraces = function () {
if (async.haveItemsQueued() &&
debugging === false
) {
throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/DT1qyG\u000a");
}
debugging = CapturedTrace.isSupported();
};
Promise.hasLongStackTraces = function () {
return debugging && CapturedTrace.isSupported();
};
if (!CapturedTrace.isSupported()) {
Promise.longStackTraces = function(){};
debugging = false;
}
return function() {
return debugging;
};
};
}).call(this,require('_process'))
},{"./async.js":42,"./errors.js":52,"./util.js":77,"_process":84}],50:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var isPrimitive = util.isPrimitive;
var wrapsPrimitiveReceiver = util.wrapsPrimitiveReceiver;
module.exports = function(Promise) {
2015-02-25 13:53:04 -05:00
var returner = function () {
2014-07-10 22:41:24 -04:00
return this;
};
2015-02-25 13:53:04 -05:00
var thrower = function () {
2014-07-10 22:41:24 -04:00
throw this;
};
2015-02-25 13:53:04 -05:00
var wrapper = function (value, action) {
2014-07-10 22:41:24 -04:00
if (action === 1) {
2015-02-25 13:53:04 -05:00
return function () {
2014-07-10 22:41:24 -04:00
throw value;
};
2014-10-01 16:29:39 -04:00
} else if (action === 2) {
2015-02-25 13:53:04 -05:00
return function () {
2014-07-10 22:41:24 -04:00
return value;
};
}
};
Promise.prototype["return"] =
2015-02-25 13:53:04 -05:00
Promise.prototype.thenReturn = function (value) {
2014-07-10 22:41:24 -04:00
if (wrapsPrimitiveReceiver && isPrimitive(value)) {
return this._then(
wrapper(value, 2),
2015-02-25 13:53:04 -05:00
undefined,
undefined,
undefined,
undefined
2014-07-10 22:41:24 -04:00
);
}
2015-02-25 13:53:04 -05:00
return this._then(returner, undefined, undefined, value, undefined);
2014-07-10 22:41:24 -04:00
};
Promise.prototype["throw"] =
2015-02-25 13:53:04 -05:00
Promise.prototype.thenThrow = function (reason) {
2014-07-10 22:41:24 -04:00
if (wrapsPrimitiveReceiver && isPrimitive(reason)) {
return this._then(
wrapper(reason, 1),
2015-02-25 13:53:04 -05:00
undefined,
undefined,
undefined,
undefined
2014-07-10 22:41:24 -04:00
);
}
2015-02-25 13:53:04 -05:00
return this._then(thrower, undefined, undefined, reason, undefined);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],51:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
2015-02-25 13:53:04 -05:00
Promise.prototype.each = function (fn) {
2014-10-01 16:29:39 -04:00
return PromiseReduce(this, fn, null, INTERNAL);
};
2015-02-25 13:53:04 -05:00
Promise.each = function (promises, fn) {
2014-10-01 16:29:39 -04:00
return PromiseReduce(promises, fn, null, INTERNAL);
};
};
2015-02-25 13:53:04 -05:00
},{}],52:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
var es5 = require("./es5.js");
var Objectfreeze = es5.freeze;
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;
function subError(nameProperty, defaultMessage) {
function SubError(message) {
if (!(this instanceof SubError)) return new SubError(message);
2015-02-25 13:53:04 -05:00
notEnumerableProp(this, "message",
typeof message === "string" ? message : defaultMessage);
notEnumerableProp(this, "name", nameProperty);
2014-07-10 22:41:24 -04:00
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
2015-02-25 13:53:04 -05:00
} else {
Error.call(this);
2014-07-10 22:41:24 -04:00
}
}
inherits(SubError, Error);
return SubError;
}
2014-10-01 16:29:39 -04:00
var _TypeError, _RangeError;
2015-02-25 13:53:04 -05:00
var Warning = subError("Warning", "warning");
2014-07-10 22:41:24 -04:00
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
2014-10-01 16:29:39 -04:00
var AggregateError = subError("AggregateError", "aggregate error");
try {
_TypeError = TypeError;
_RangeError = RangeError;
} catch(e) {
_TypeError = subError("TypeError", "type error");
_RangeError = subError("RangeError", "range error");
}
var methods = ("join pop push shift unshift slice filter forEach some " +
"every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");
for (var i = 0; i < methods.length; ++i) {
if (typeof Array.prototype[methods[i]] === "function") {
AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
}
}
2015-02-25 13:53:04 -05:00
es5.defineProperty(AggregateError.prototype, "length", {
value: 0,
configurable: false,
writable: true,
enumerable: true
});
2014-10-01 16:29:39 -04:00
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
var indent = Array(level * 4 + 1).join(" ");
var ret = "\n" + indent + "AggregateError of:" + "\n";
level++;
indent = Array(level * 4 + 1).join(" ");
for (var i = 0; i < this.length; ++i) {
var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
var lines = str.split("\n");
for (var j = 0; j < lines.length; ++j) {
lines[j] = indent + lines[j];
}
str = lines.join("\n");
ret += str + "\n";
}
level--;
return ret;
};
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
function OperationalError(message) {
2015-02-25 13:53:04 -05:00
if (!(this instanceof OperationalError))
return new OperationalError(message);
notEnumerableProp(this, "name", "OperationalError");
notEnumerableProp(this, "message", message);
2014-07-10 22:41:24 -04:00
this.cause = message;
2014-10-01 16:29:39 -04:00
this["isOperational"] = true;
2014-07-10 22:41:24 -04:00
if (message instanceof Error) {
2015-02-25 13:53:04 -05:00
notEnumerableProp(this, "message", message.message);
notEnumerableProp(this, "stack", message.stack);
2014-10-01 16:29:39 -04:00
} else if (Error.captureStackTrace) {
2014-07-10 22:41:24 -04:00
Error.captureStackTrace(this, this.constructor);
}
}
2014-10-01 16:29:39 -04:00
inherits(OperationalError, Error);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var errorTypes = Error["__BluebirdErrorTypes__"];
2014-07-10 22:41:24 -04:00
if (!errorTypes) {
errorTypes = Objectfreeze({
CancellationError: CancellationError,
TimeoutError: TimeoutError,
2014-10-01 16:29:39 -04:00
OperationalError: OperationalError,
RejectionError: OperationalError,
AggregateError: AggregateError
2014-07-10 22:41:24 -04:00
});
2015-02-25 13:53:04 -05:00
notEnumerableProp(Error, "__BluebirdErrorTypes__", errorTypes);
2014-07-10 22:41:24 -04:00
}
module.exports = {
Error: Error,
2014-10-01 16:29:39 -04:00
TypeError: _TypeError,
RangeError: _RangeError,
2014-07-10 22:41:24 -04:00
CancellationError: errorTypes.CancellationError,
2014-10-01 16:29:39 -04:00
OperationalError: errorTypes.OperationalError,
2014-07-10 22:41:24 -04:00
TimeoutError: errorTypes.TimeoutError,
2014-10-01 16:29:39 -04:00
AggregateError: errorTypes.AggregateError,
2015-02-25 13:53:04 -05:00
Warning: Warning
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
},{"./es5.js":53,"./util.js":77}],53:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
var isES5 = (function(){
"use strict";
2015-02-25 13:53:04 -05:00
return this === undefined;
2014-07-10 22:41:24 -04:00
})();
if (isES5) {
module.exports = {
freeze: Object.freeze,
defineProperty: Object.defineProperty,
2015-02-25 13:53:04 -05:00
getDescriptor: Object.getOwnPropertyDescriptor,
2014-07-10 22:41:24 -04:00
keys: Object.keys,
2015-02-25 13:53:04 -05:00
names: Object.getOwnPropertyNames,
2014-07-10 22:41:24 -04:00
getPrototypeOf: Object.getPrototypeOf,
isArray: Array.isArray,
2015-02-25 13:53:04 -05:00
isES5: isES5,
propertyIsWritable: function(obj, prop) {
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
return !!(!descriptor || descriptor.writable || descriptor.set);
}
2014-07-10 22:41:24 -04:00
};
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
var has = {}.hasOwnProperty;
var str = {}.toString;
var proto = {}.constructor.prototype;
2015-02-25 13:53:04 -05:00
var ObjectKeys = function (o) {
2014-07-10 22:41:24 -04:00
var ret = [];
for (var key in o) {
if (has.call(o, key)) {
ret.push(key);
}
}
return ret;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var ObjectGetDescriptor = function(o, key) {
return {value: o[key]};
};
var ObjectDefineProperty = function (o, key, desc) {
2014-07-10 22:41:24 -04:00
o[key] = desc.value;
return o;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var ObjectFreeze = function (obj) {
2014-07-10 22:41:24 -04:00
return obj;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var ObjectGetPrototypeOf = function (obj) {
2014-07-10 22:41:24 -04:00
try {
return Object(obj).constructor.prototype;
}
catch (e) {
return proto;
}
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var ArrayIsArray = function (obj) {
2014-07-10 22:41:24 -04:00
try {
return str.call(obj) === "[object Array]";
}
catch(e) {
return false;
}
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
module.exports = {
isArray: ArrayIsArray,
keys: ObjectKeys,
2015-02-25 13:53:04 -05:00
names: ObjectKeys,
2014-07-10 22:41:24 -04:00
defineProperty: ObjectDefineProperty,
2015-02-25 13:53:04 -05:00
getDescriptor: ObjectGetDescriptor,
2014-07-10 22:41:24 -04:00
freeze: ObjectFreeze,
getPrototypeOf: ObjectGetPrototypeOf,
2015-02-25 13:53:04 -05:00
isES5: isES5,
propertyIsWritable: function() {
return true;
}
2014-07-10 22:41:24 -04:00
};
}
2015-02-25 13:53:04 -05:00
},{}],54:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
Promise.prototype.filter = function (fn, options) {
2014-10-01 16:29:39 -04:00
return PromiseMap(this, fn, options, INTERNAL);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.filter = function (promises, fn, options) {
2014-10-01 16:29:39 -04:00
return PromiseMap(promises, fn, options, INTERNAL);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{}],55:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise, NEXT_FILTER, tryConvertToPromise) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var wrapsPrimitiveReceiver = util.wrapsPrimitiveReceiver;
var isPrimitive = util.isPrimitive;
var thrower = util.thrower;
function returnThis() {
return this;
}
function throwThis() {
throw this;
}
function return$(r) {
2015-02-25 13:53:04 -05:00
return function() {
2014-07-10 22:41:24 -04:00
return r;
};
}
function throw$(r) {
2015-02-25 13:53:04 -05:00
return function() {
2014-07-10 22:41:24 -04:00
throw r;
};
}
function promisedFinally(ret, reasonOrValue, isFulfilled) {
var then;
if (wrapsPrimitiveReceiver && isPrimitive(reasonOrValue)) {
then = isFulfilled ? return$(reasonOrValue) : throw$(reasonOrValue);
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
then = isFulfilled ? returnThis : throwThis;
}
2015-02-25 13:53:04 -05:00
return ret._then(then, thrower, undefined, reasonOrValue, undefined);
2014-07-10 22:41:24 -04:00
}
function finallyHandler(reasonOrValue) {
var promise = this.promise;
var handler = this.handler;
var ret = promise._isBound()
? handler.call(promise._boundTo)
: handler();
2015-02-25 13:53:04 -05:00
if (ret !== undefined) {
var maybePromise = tryConvertToPromise(ret, promise);
2014-07-10 22:41:24 -04:00
if (maybePromise instanceof Promise) {
2015-02-25 13:53:04 -05:00
maybePromise = maybePromise._target();
2014-07-10 22:41:24 -04:00
return promisedFinally(maybePromise, reasonOrValue,
promise.isFulfilled());
}
}
if (promise.isRejected()) {
NEXT_FILTER.e = reasonOrValue;
return NEXT_FILTER;
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
return reasonOrValue;
}
}
function tapHandler(value) {
var promise = this.promise;
var handler = this.handler;
var ret = promise._isBound()
? handler.call(promise._boundTo, value)
: handler(value);
2015-02-25 13:53:04 -05:00
if (ret !== undefined) {
var maybePromise = tryConvertToPromise(ret, promise);
2014-07-10 22:41:24 -04:00
if (maybePromise instanceof Promise) {
2015-02-25 13:53:04 -05:00
maybePromise = maybePromise._target();
2014-07-10 22:41:24 -04:00
return promisedFinally(maybePromise, value, true);
}
}
return value;
}
2015-02-25 13:53:04 -05:00
Promise.prototype._passThroughHandler = function (handler, isFinally) {
2014-07-10 22:41:24 -04:00
if (typeof handler !== "function") return this.then();
var promiseAndHandler = {
promise: this,
handler: handler
};
return this._then(
isFinally ? finallyHandler : tapHandler,
2015-02-25 13:53:04 -05:00
isFinally ? finallyHandler : undefined, undefined,
promiseAndHandler, undefined);
2014-07-10 22:41:24 -04:00
};
Promise.prototype.lastly =
2015-02-25 13:53:04 -05:00
Promise.prototype["finally"] = function (handler) {
2014-07-10 22:41:24 -04:00
return this._passThroughHandler(handler, true);
};
2015-02-25 13:53:04 -05:00
Promise.prototype.tap = function (handler) {
2014-07-10 22:41:24 -04:00
return this._passThroughHandler(handler, false);
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],56:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise,
apiRejection,
INTERNAL,
tryConvertToPromise) {
2014-10-01 16:29:39 -04:00
var errors = require("./errors.js");
2014-07-10 22:41:24 -04:00
var TypeError = errors.TypeError;
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var errorObj = util.errorObj;
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-10-01 16:29:39 -04:00
var yieldHandlers = [];
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
for (var i = 0; i < yieldHandlers.length; ++i) {
traceParent._pushContext();
var result = tryCatch(yieldHandlers[i])(value);
traceParent._popContext();
if (result === errorObj) {
traceParent._pushContext();
var ret = Promise.reject(errorObj.e);
traceParent._popContext();
return ret;
2014-10-01 16:29:39 -04:00
}
2015-02-25 13:53:04 -05:00
var maybePromise = tryConvertToPromise(result, traceParent);
if (maybePromise instanceof Promise) return maybePromise;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
return null;
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
2014-10-01 16:29:39 -04:00
var promise = this._promise = new Promise(INTERNAL);
2015-02-25 13:53:04 -05:00
promise._captureStackTrace();
this._stack = stack;
2014-10-01 16:29:39 -04:00
this._generatorFunction = generatorFunction;
this._receiver = receiver;
2015-02-25 13:53:04 -05:00
this._generator = undefined;
2014-10-01 16:29:39 -04:00
this._yieldHandlers = typeof yieldHandler === "function"
? [yieldHandler].concat(yieldHandlers)
: yieldHandlers;
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
PromiseSpawn.prototype.promise = function () {
2014-10-01 16:29:39 -04:00
return this._promise;
};
2015-02-25 13:53:04 -05:00
PromiseSpawn.prototype._run = function () {
2014-10-01 16:29:39 -04:00
this._generator = this._generatorFunction.call(this._receiver);
this._receiver =
2015-02-25 13:53:04 -05:00
this._generatorFunction = undefined;
this._next(undefined);
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseSpawn.prototype._continue = function (result) {
2014-10-01 16:29:39 -04:00
if (result === errorObj) {
2015-02-25 13:53:04 -05:00
return this._promise._rejectCallback(result.e, false, true);
2014-10-01 16:29:39 -04:00
}
var value = result.value;
if (result.done === true) {
2015-02-25 13:53:04 -05:00
this._promise._resolveCallback(value);
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
var maybePromise = tryConvertToPromise(value, this._promise);
2014-10-01 16:29:39 -04:00
if (!(maybePromise instanceof Promise)) {
maybePromise =
2015-02-25 13:53:04 -05:00
promiseFromYieldHandler(maybePromise,
this._yieldHandlers,
this._promise);
2014-10-01 16:29:39 -04:00
if (maybePromise === null) {
2015-02-25 13:53:04 -05:00
this._throw(
new TypeError(
"A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/4Y4pDk\u000a\u000a".replace("%s", value) +
"From coroutine:\u000a" +
this._stack.split("\n").slice(1, -7).join("\n")
)
);
2014-10-01 16:29:39 -04:00
return;
}
}
maybePromise._then(
this._next,
this._throw,
2015-02-25 13:53:04 -05:00
undefined,
2014-10-01 16:29:39 -04:00
this,
null
);
}
};
2015-02-25 13:53:04 -05:00
PromiseSpawn.prototype._throw = function (reason) {
this._promise._attachExtraTrace(reason);
this._promise._pushContext();
var result = tryCatch(this._generator["throw"])
.call(this._generator, reason);
this._promise._popContext();
this._continue(result);
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseSpawn.prototype._next = function (value) {
this._promise._pushContext();
var result = tryCatch(this._generator.next).call(this._generator, value);
this._promise._popContext();
this._continue(result);
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.coroutine = function (generatorFunction, options) {
2014-10-01 16:29:39 -04:00
if (typeof generatorFunction !== "function") {
2015-02-25 13:53:04 -05:00
throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/6Vqhm0\u000a");
2014-10-01 16:29:39 -04:00
}
var yieldHandler = Object(options).yieldHandler;
var PromiseSpawn$ = PromiseSpawn;
2015-02-25 13:53:04 -05:00
var stack = new Error().stack;
2014-10-01 16:29:39 -04:00
return function () {
var generator = generatorFunction.apply(this, arguments);
2015-02-25 13:53:04 -05:00
var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
stack);
2014-10-01 16:29:39 -04:00
spawn._generator = generator;
2015-02-25 13:53:04 -05:00
spawn._next(undefined);
2014-10-01 16:29:39 -04:00
return spawn.promise();
};
};
Promise.coroutine.addYieldHandler = function(fn) {
2015-02-25 13:53:04 -05:00
if (typeof fn !== "function") throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
2014-10-01 16:29:39 -04:00
yieldHandlers.push(fn);
};
2015-02-25 13:53:04 -05:00
Promise.spawn = function (generatorFunction) {
2014-10-01 16:29:39 -04:00
if (typeof generatorFunction !== "function") {
2015-02-25 13:53:04 -05:00
return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/6Vqhm0\u000a");
2014-10-01 16:29:39 -04:00
}
var spawn = new PromiseSpawn(generatorFunction, this);
var ret = spawn.promise();
2014-07-10 22:41:24 -04:00
spawn._run(Promise.spawn);
return ret;
};
};
2015-02-25 13:53:04 -05:00
},{"./errors.js":52,"./util.js":77}],57:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
"use strict";
module.exports =
2015-02-25 13:53:04 -05:00
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var canEvaluate = util.canEvaluate;
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-10-01 16:29:39 -04:00
var errorObj = util.errorObj;
2015-02-25 13:53:04 -05:00
var reject;
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
if (!false) {
2014-10-01 16:29:39 -04:00
if (canEvaluate) {
var thenCallback = function(i) {
return new Function("value", "holder", " \n\
'use strict'; \n\
holder.pIndex = value; \n\
holder.checkFulfillment(this); \n\
".replace(/Index/g, i));
};
var caller = function(count) {
var values = [];
for (var i = 1; i <= count; ++i) values.push("holder.p" + i);
return new Function("holder", " \n\
'use strict'; \n\
var callback = holder.fn; \n\
return callback(values); \n\
".replace(/values/g, values.join(", ")));
};
var thenCallbacks = [];
2015-02-25 13:53:04 -05:00
var callers = [undefined];
2014-10-01 16:29:39 -04:00
for (var i = 1; i <= 5; ++i) {
thenCallbacks.push(thenCallback(i));
callers.push(caller(i));
}
var Holder = function(total, fn) {
this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;
this.fn = fn;
this.total = total;
this.now = 0;
};
Holder.prototype.callers = callers;
Holder.prototype.checkFulfillment = function(promise) {
var now = this.now;
now++;
var total = this.total;
if (now >= total) {
var handler = this.callers[total];
2015-02-25 13:53:04 -05:00
promise._pushContext();
var ret = tryCatch(handler)(this);
promise._popContext();
2014-10-01 16:29:39 -04:00
if (ret === errorObj) {
2015-02-25 13:53:04 -05:00
promise._rejectCallback(ret.e, false, true);
} else {
promise._resolveCallback(ret);
2014-10-01 16:29:39 -04:00
}
} else {
this.now = now;
}
};
2015-02-25 13:53:04 -05:00
var reject = function (reason) {
this._reject(reason);
};
}
}
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
Promise.join = function () {
2014-10-01 16:29:39 -04:00
var last = arguments.length - 1;
var fn;
if (last > 0 && typeof arguments[last] === "function") {
fn = arguments[last];
2015-02-25 13:53:04 -05:00
if (!false) {
if (last < 6 && canEvaluate) {
var ret = new Promise(INTERNAL);
ret._captureStackTrace();
var holder = new Holder(last, fn);
var callbacks = thenCallbacks;
for (var i = 0; i < last; ++i) {
var maybePromise = tryConvertToPromise(arguments[i], ret);
if (maybePromise instanceof Promise) {
maybePromise = maybePromise._target();
if (maybePromise._isPending()) {
maybePromise._then(callbacks[i], reject,
undefined, ret, holder);
} else if (maybePromise._isFulfilled()) {
callbacks[i].call(ret,
maybePromise._value(), holder);
} else {
ret._reject(maybePromise._reason());
}
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
callbacks[i].call(ret, maybePromise, holder);
2014-10-01 16:29:39 -04:00
}
}
2015-02-25 13:53:04 -05:00
return ret;
2014-10-01 16:29:39 -04:00
}
}
}
var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];}
2015-02-25 13:53:04 -05:00
if (fn) args.pop();
2014-10-01 16:29:39 -04:00
var ret = new PromiseArray(args).promise();
2015-02-25 13:53:04 -05:00
return fn !== undefined ? ret.spread(fn) : ret;
2014-10-01 16:29:39 -04:00
};
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],58:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise,
PromiseArray,
apiRejection,
tryConvertToPromise,
INTERNAL) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-10-01 16:29:39 -04:00
var errorObj = util.errorObj;
var PENDING = {};
var EMPTY_ARRAY = [];
function MappingPromiseArray(promises, fn, limit, _filter) {
this.constructor$(promises);
2015-02-25 13:53:04 -05:00
this._promise._captureStackTrace();
2014-10-01 16:29:39 -04:00
this._callback = fn;
this._preservedValues = _filter === INTERNAL
? new Array(this.length())
: null;
this._limit = limit;
this._inFlight = 0;
this._queue = limit >= 1 ? [] : EMPTY_ARRAY;
2015-02-25 13:53:04 -05:00
this._init$(undefined, -2);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
util.inherits(MappingPromiseArray, PromiseArray);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
MappingPromiseArray.prototype._init = function () {};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
2014-10-01 16:29:39 -04:00
var values = this._values;
var length = this.length();
var preservedValues = this._preservedValues;
var limit = this._limit;
if (values[index] === PENDING) {
values[index] = value;
if (limit >= 1) {
this._inFlight--;
this._drainQueue();
if (this._isResolved()) return;
}
} else {
if (limit >= 1 && this._inFlight >= limit) {
values[index] = value;
this._queue.push(index);
return;
}
if (preservedValues !== null) preservedValues[index] = value;
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
var callback = this._callback;
var receiver = this._promise._boundTo;
2015-02-25 13:53:04 -05:00
this._promise._pushContext();
var ret = tryCatch(callback).call(receiver, value, index, length);
this._promise._popContext();
2014-10-01 16:29:39 -04:00
if (ret === errorObj) return this._reject(ret.e);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var maybePromise = tryConvertToPromise(ret, this._promise);
2014-07-10 22:41:24 -04:00
if (maybePromise instanceof Promise) {
2015-02-25 13:53:04 -05:00
maybePromise = maybePromise._target();
if (maybePromise._isPending()) {
2014-10-01 16:29:39 -04:00
if (limit >= 1) this._inFlight++;
values[index] = PENDING;
return maybePromise._proxyPromiseArray(this, index);
2015-02-25 13:53:04 -05:00
} else if (maybePromise._isFulfilled()) {
ret = maybePromise._value();
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
return this._reject(maybePromise._reason());
2014-07-10 22:41:24 -04:00
}
}
2014-10-01 16:29:39 -04:00
values[index] = ret;
}
var totalResolved = ++this._totalResolved;
if (totalResolved >= length) {
if (preservedValues !== null) {
this._filter(values, preservedValues);
} else {
this._resolve(values);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
MappingPromiseArray.prototype._drainQueue = function () {
2014-10-01 16:29:39 -04:00
var queue = this._queue;
var limit = this._limit;
var values = this._values;
while (queue.length > 0 && this._inFlight < limit) {
2015-02-25 13:53:04 -05:00
if (this._isResolved()) return;
2014-10-01 16:29:39 -04:00
var index = queue.pop();
this._promiseFulfilled(values[index], index);
}
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
MappingPromiseArray.prototype._filter = function (booleans, values) {
2014-10-01 16:29:39 -04:00
var len = values.length;
var ret = new Array(len);
var j = 0;
for (var i = 0; i < len; ++i) {
if (booleans[i]) ret[j++] = values[i];
}
ret.length = j;
this._resolve(ret);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
MappingPromiseArray.prototype.preservedValues = function () {
2014-10-01 16:29:39 -04:00
return this._preservedValues;
2014-07-10 22:41:24 -04:00
};
2014-10-01 16:29:39 -04:00
function map(promises, fn, options, _filter) {
var limit = typeof options === "object" && options !== null
? options.concurrency
: 0;
limit = typeof limit === "number" &&
isFinite(limit) && limit >= 1 ? limit : 0;
return new MappingPromiseArray(promises, fn, limit, _filter);
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
Promise.prototype.map = function (fn, options) {
if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
return map(this, fn, options, null).promise();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.map = function (promises, fn, options, _filter) {
if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
2014-10-01 16:29:39 -04:00
return map(promises, fn, options, _filter).promise();
2014-07-10 22:41:24 -04:00
};
2014-10-01 16:29:39 -04:00
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],59:[function(require,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = require("./util.js");
var tryCatch = util.tryCatch;
Promise.method = function (fn) {
if (typeof fn !== "function") {
throw new Promise.TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
}
return function () {
var ret = new Promise(INTERNAL);
ret._captureStackTrace();
ret._pushContext();
var value = tryCatch(fn).apply(this, arguments);
ret._popContext();
ret._resolveFromSyncValue(value);
return ret;
};
};
Promise.attempt = Promise["try"] = function (fn, args, ctx) {
if (typeof fn !== "function") {
return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
}
var ret = new Promise(INTERNAL);
ret._captureStackTrace();
ret._pushContext();
var value = util.isArray(args)
? tryCatch(fn).apply(ctx, args)
: tryCatch(fn).call(ctx, args);
ret._popContext();
ret._resolveFromSyncValue(value);
return ret;
};
Promise.prototype._resolveFromSyncValue = function (value) {
if (value === util.errorObj) {
this._rejectCallback(value.e, false, true);
} else {
this._resolveCallback(value, true);
}
};
};
},{"./util.js":77}],60:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function(Promise) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var async = require("./async.js");
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-07-10 22:41:24 -04:00
var errorObj = util.errorObj;
2015-02-25 13:53:04 -05:00
function spreadAdapter(val, nodeback) {
var promise = this;
if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
var ret = tryCatch(nodeback).apply(promise._boundTo, [null].concat(val));
2014-10-01 16:29:39 -04:00
if (ret === errorObj) {
2015-02-25 13:53:04 -05:00
async.throwLater(ret.e);
2014-10-01 16:29:39 -04:00
}
}
2015-02-25 13:53:04 -05:00
function successAdapter(val, nodeback) {
var promise = this;
var receiver = promise._boundTo;
var ret = val === undefined
? tryCatch(nodeback).call(receiver, null)
: tryCatch(nodeback).call(receiver, null, val);
2014-07-10 22:41:24 -04:00
if (ret === errorObj) {
2015-02-25 13:53:04 -05:00
async.throwLater(ret.e);
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
function errorAdapter(reason, nodeback) {
var promise = this;
if (!reason) {
var target = promise._target();
var newReason = target._getCarriedStackTrace();
newReason.cause = reason;
reason = newReason;
}
var ret = tryCatch(nodeback).call(promise._boundTo, reason);
2014-07-10 22:41:24 -04:00
if (ret === errorObj) {
2015-02-25 13:53:04 -05:00
async.throwLater(ret.e);
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
Promise.prototype.nodeify = function (nodeback, options) {
2014-07-10 22:41:24 -04:00
if (typeof nodeback == "function") {
2015-02-25 13:53:04 -05:00
var adapter = successAdapter;
if (options !== undefined && Object(options).spread) {
adapter = spreadAdapter;
2014-10-01 16:29:39 -04:00
}
2014-07-10 22:41:24 -04:00
this._then(
2014-10-01 16:29:39 -04:00
adapter,
2015-02-25 13:53:04 -05:00
errorAdapter,
undefined,
this,
nodeback
2014-07-10 22:41:24 -04:00
);
}
return this;
};
};
2015-02-25 13:53:04 -05:00
},{"./async.js":42,"./util.js":77}],61:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
module.exports = function(Promise, PromiseArray) {
var util = require("./util.js");
var async = require("./async.js");
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-07-10 22:41:24 -04:00
var errorObj = util.errorObj;
2015-02-25 13:53:04 -05:00
Promise.prototype.progressed = function (handler) {
return this._then(undefined, undefined, handler, undefined, undefined);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._progress = function (progressValue) {
2014-07-10 22:41:24 -04:00
if (this._isFollowingOrFulfilledOrRejected()) return;
2015-02-25 13:53:04 -05:00
this._target()._progressUnchecked(progressValue);
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._progressHandlerAt = function (index) {
2014-10-01 16:29:39 -04:00
return index === 0
? this._progressHandler0
: this[(index << 2) + index - 5 + 2];
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._doProgressWith = function (progression) {
2014-07-10 22:41:24 -04:00
var progressValue = progression.value;
var handler = progression.handler;
var promise = progression.promise;
var receiver = progression.receiver;
2015-02-25 13:53:04 -05:00
var ret = tryCatch(handler).call(receiver, progressValue);
2014-07-10 22:41:24 -04:00
if (ret === errorObj) {
if (ret.e != null &&
ret.e.name !== "StopProgressPropagation") {
2015-02-25 13:53:04 -05:00
var trace = util.canAttachTrace(ret.e)
? ret.e : new Error(util.toString(ret.e));
2014-07-10 22:41:24 -04:00
promise._attachExtraTrace(trace);
promise._progress(ret.e);
}
2014-10-01 16:29:39 -04:00
} else if (ret instanceof Promise) {
2015-02-25 13:53:04 -05:00
ret._then(promise._progress, null, null, promise, undefined);
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
promise._progress(ret);
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._progressUnchecked = function (progressValue) {
2014-07-10 22:41:24 -04:00
var len = this._length();
var progress = this._progress;
2014-10-01 16:29:39 -04:00
for (var i = 0; i < len; i++) {
2014-07-10 22:41:24 -04:00
var handler = this._progressHandlerAt(i);
var promise = this._promiseAt(i);
if (!(promise instanceof Promise)) {
var receiver = this._receiverAt(i);
if (typeof handler === "function") {
handler.call(receiver, progressValue, promise);
2015-02-25 13:53:04 -05:00
} else if (receiver instanceof PromiseArray &&
!receiver._isResolved()) {
2014-07-10 22:41:24 -04:00
receiver._promiseProgressed(progressValue, promise);
}
continue;
}
if (typeof handler === "function") {
async.invoke(this._doProgressWith, this, {
handler: handler,
promise: promise,
receiver: this._receiverAt(i),
value: progressValue
});
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
async.invoke(progress, promise, progressValue);
}
}
};
};
2015-02-25 13:53:04 -05:00
},{"./async.js":42,"./util.js":77}],62:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function() {
2015-02-25 13:53:04 -05:00
var makeSelfResolutionError = function () {
return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/LhFpo0\u000a");
};
var reflect = function() {
return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
return Promise.reject(new TypeError(msg));
};
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var async = require("./async.js");
var errors = require("./errors.js");
2015-02-25 13:53:04 -05:00
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
2014-07-10 22:41:24 -04:00
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {e: null};
2015-02-25 13:53:04 -05:00
var tryConvertToPromise = require("./thenables.js")(Promise, INTERNAL);
var PromiseArray =
require("./promise_array.js")(Promise, INTERNAL,
tryConvertToPromise, apiRejection);
2014-10-01 16:29:39 -04:00
var CapturedTrace = require("./captured_trace.js")();
2015-02-25 13:53:04 -05:00
var isDebugging = require("./debuggability.js")(Promise, CapturedTrace);
/*jshint unused:false*/
var createContext =
require("./context.js")(Promise, CapturedTrace, isDebugging);
2014-10-01 16:29:39 -04:00
var CatchFilter = require("./catch_filter.js")(NEXT_FILTER);
var PromiseResolver = require("./promise_resolver.js");
2015-02-25 13:53:04 -05:00
var nodebackForPromise = PromiseResolver._nodebackForPromise;
2014-07-10 22:41:24 -04:00
var errorObj = util.errorObj;
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-07-10 22:41:24 -04:00
function Promise(resolver) {
if (typeof resolver !== "function") {
2015-02-25 13:53:04 -05:00
throw new TypeError("the promise constructor requires a resolver function\u000a\u000a See http://goo.gl/EC22Yn\u000a");
2014-07-10 22:41:24 -04:00
}
if (this.constructor !== Promise) {
2015-02-25 13:53:04 -05:00
throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/KsIlge\u000a");
2014-07-10 22:41:24 -04:00
}
this._bitField = 0;
2015-02-25 13:53:04 -05:00
this._fulfillmentHandler0 = undefined;
this._rejectionHandler0 = undefined;
this._progressHandler0 = undefined;
this._promise0 = undefined;
this._receiver0 = undefined;
this._settledValue = undefined;
2014-07-10 22:41:24 -04:00
if (resolver !== INTERNAL) this._resolveFromResolver(resolver);
}
2015-02-25 13:53:04 -05:00
Promise.prototype.toString = function () {
2014-07-10 22:41:24 -04:00
return "[object Promise]";
};
2015-02-25 13:53:04 -05:00
Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
2014-07-10 22:41:24 -04:00
var len = arguments.length;
if (len > 1) {
var catchInstances = new Array(len - 1),
j = 0, i;
for (i = 0; i < len - 1; ++i) {
var item = arguments[i];
if (typeof item === "function") {
catchInstances[j++] = item;
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
return Promise.reject(
new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a See http://goo.gl/o84o68\u000a"));
2014-07-10 22:41:24 -04:00
}
}
catchInstances.length = j;
fn = arguments[i];
var catchFilter = new CatchFilter(catchInstances, fn, this);
2015-02-25 13:53:04 -05:00
return this._then(undefined, catchFilter.doFilter, undefined,
catchFilter, undefined);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
return this._then(undefined, fn, undefined, undefined, undefined);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.reflect = function () {
return this._then(reflect, reflect, undefined, this, undefined);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.then = function (didFulfill, didReject, didProgress) {
if (isDebugging() && arguments.length > 0 &&
typeof didFulfill !== "function" &&
typeof didReject !== "function") {
var msg = ".then() only accepts functions but was passed: " +
util.classString(didFulfill);
if (arguments.length > 1) {
msg += ", " + util.classString(didReject);
}
this._warn(msg);
}
return this._then(didFulfill, didReject, didProgress,
undefined, undefined);
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
Promise.prototype.done = function (didFulfill, didReject, didProgress) {
2014-07-10 22:41:24 -04:00
var promise = this._then(didFulfill, didReject, didProgress,
2015-02-25 13:53:04 -05:00
undefined, undefined);
2014-07-10 22:41:24 -04:00
promise._setIsFinal();
};
2015-02-25 13:53:04 -05:00
Promise.prototype.spread = function (didFulfill, didReject) {
return this.all()._then(didFulfill, didReject, undefined, APPLY, undefined);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.isCancellable = function () {
2014-07-10 22:41:24 -04:00
return !this.isResolved() &&
this._cancellable();
};
2015-02-25 13:53:04 -05:00
Promise.prototype.toJSON = function () {
2014-07-10 22:41:24 -04:00
var ret = {
isFulfilled: false,
isRejected: false,
2015-02-25 13:53:04 -05:00
fulfillmentValue: undefined,
rejectionReason: undefined
2014-07-10 22:41:24 -04:00
};
if (this.isFulfilled()) {
2015-02-25 13:53:04 -05:00
ret.fulfillmentValue = this.value();
2014-07-10 22:41:24 -04:00
ret.isFulfilled = true;
2014-10-01 16:29:39 -04:00
} else if (this.isRejected()) {
2015-02-25 13:53:04 -05:00
ret.rejectionReason = this.reason();
2014-07-10 22:41:24 -04:00
ret.isRejected = true;
}
return ret;
};
2015-02-25 13:53:04 -05:00
Promise.prototype.all = function () {
2014-10-01 16:29:39 -04:00
return new PromiseArray(this).promise();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.error = function (fn) {
return this.caught(util.originatesFromRejection, fn);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.is = function (val) {
return val instanceof Promise;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.fromNode = function(fn) {
var ret = new Promise(INTERNAL);
var result = tryCatch(fn)(nodebackForPromise(ret));
if (result === errorObj) {
ret._rejectCallback(result.e, true, true);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
return ret;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.all = function (promises) {
return new PromiseArray(promises).promise();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.defer = Promise.pending = function () {
2014-07-10 22:41:24 -04:00
var promise = new Promise(INTERNAL);
return new PromiseResolver(promise);
};
2015-02-25 13:53:04 -05:00
Promise.cast = function (obj) {
var ret = tryConvertToPromise(obj);
2014-07-10 22:41:24 -04:00
if (!(ret instanceof Promise)) {
2014-10-01 16:29:39 -04:00
var val = ret;
ret = new Promise(INTERNAL);
2015-02-25 13:53:04 -05:00
ret._fulfillUnchecked(val);
2014-07-10 22:41:24 -04:00
}
return ret;
};
2014-10-01 16:29:39 -04:00
Promise.resolve = Promise.fulfilled = Promise.cast;
2015-02-25 13:53:04 -05:00
Promise.reject = Promise.rejected = function (reason) {
2014-10-01 16:29:39 -04:00
var ret = new Promise(INTERNAL);
2015-02-25 13:53:04 -05:00
ret._captureStackTrace();
ret._rejectCallback(reason, true);
2014-10-01 16:29:39 -04:00
return ret;
};
2015-02-25 13:53:04 -05:00
Promise.setScheduler = function(fn) {
if (typeof fn !== "function") throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
var prev = async._schedule;
async._schedule = fn;
return prev;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._then = function (
2014-07-10 22:41:24 -04:00
didFulfill,
didReject,
didProgress,
receiver,
internalData
) {
2015-02-25 13:53:04 -05:00
var haveInternalData = internalData !== undefined;
2014-07-10 22:41:24 -04:00
var ret = haveInternalData ? internalData : new Promise(INTERNAL);
2014-10-01 16:29:39 -04:00
if (!haveInternalData) {
2015-02-25 13:53:04 -05:00
ret._propagateFrom(this, 4 | 1);
ret._captureStackTrace();
}
var target = this._target();
if (target !== this) {
if (receiver === undefined) receiver = this._boundTo;
if (!haveInternalData) ret._setIsMigrated();
2014-07-10 22:41:24 -04:00
}
var callbackIndex =
2015-02-25 13:53:04 -05:00
target._addCallbacks(didFulfill, didReject, didProgress, ret, receiver);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
if (target._isResolved() && !target._isSettlePromisesQueued()) {
async.invoke(
target._settlePromiseAtPostResolution, target, callbackIndex);
2014-07-10 22:41:24 -04:00
}
return ret;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._settlePromiseAtPostResolution = function (index) {
if (this._isRejectionUnhandled()) this._unsetRejectionIsUnhandled();
this._settlePromiseAt(index);
};
Promise.prototype._length = function () {
return this._bitField & 131071;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._isFollowingOrFulfilledOrRejected = function () {
2014-07-10 22:41:24 -04:00
return (this._bitField & 939524096) > 0;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._isFollowing = function () {
2014-07-10 22:41:24 -04:00
return (this._bitField & 536870912) === 536870912;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setLength = function (len) {
this._bitField = (this._bitField & -131072) |
(len & 131071);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setFulfilled = function () {
2014-07-10 22:41:24 -04:00
this._bitField = this._bitField | 268435456;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setRejected = function () {
this._bitField = this._bitField | 134217728;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setFollowing = function () {
this._bitField = this._bitField | 536870912;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setIsFinal = function () {
this._bitField = this._bitField | 33554432;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._isFinal = function () {
return (this._bitField & 33554432) > 0;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._cancellable = function () {
return (this._bitField & 67108864) > 0;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setCancellable = function () {
this._bitField = this._bitField | 67108864;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._unsetCancellable = function () {
this._bitField = this._bitField & (~67108864);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setIsMigrated = function () {
this._bitField = this._bitField | 4194304;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._unsetIsMigrated = function () {
this._bitField = this._bitField & (~4194304);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._isMigrated = function () {
return (this._bitField & 4194304) > 0;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._receiverAt = function (index) {
2014-10-01 16:29:39 -04:00
var ret = index === 0
? this._receiver0
2015-02-25 13:53:04 -05:00
: this[
index * 5 - 5 + 4];
if (ret === undefined && this._isBound()) {
2014-07-10 22:41:24 -04:00
return this._boundTo;
}
return ret;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._promiseAt = function (index) {
2014-10-01 16:29:39 -04:00
return index === 0
? this._promise0
2015-02-25 13:53:04 -05:00
: this[index * 5 - 5 + 3];
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._fulfillmentHandlerAt = function (index) {
2014-10-01 16:29:39 -04:00
return index === 0
? this._fulfillmentHandler0
2015-02-25 13:53:04 -05:00
: this[index * 5 - 5 + 0];
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._rejectionHandlerAt = function (index) {
2014-10-01 16:29:39 -04:00
return index === 0
? this._rejectionHandler0
2015-02-25 13:53:04 -05:00
: this[index * 5 - 5 + 1];
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._migrateCallbacks = function (follower, index) {
var fulfill = follower._fulfillmentHandlerAt(index);
var reject = follower._rejectionHandlerAt(index);
var progress = follower._progressHandlerAt(index);
var promise = follower._promiseAt(index);
var receiver = follower._receiverAt(index);
if (promise instanceof Promise) promise._setIsMigrated();
this._addCallbacks(fulfill, reject, progress, promise, receiver);
};
Promise.prototype._addCallbacks = function (
2014-07-10 22:41:24 -04:00
fulfill,
reject,
progress,
promise,
receiver
) {
var index = this._length();
2015-02-25 13:53:04 -05:00
if (index >= 131071 - 5) {
2014-07-10 22:41:24 -04:00
index = 0;
this._setLength(0);
}
if (index === 0) {
this._promise0 = promise;
2015-02-25 13:53:04 -05:00
if (receiver !== undefined) this._receiver0 = receiver;
2014-07-10 22:41:24 -04:00
if (typeof fulfill === "function" && !this._isCarryingStackTrace())
this._fulfillmentHandler0 = fulfill;
if (typeof reject === "function") this._rejectionHandler0 = reject;
if (typeof progress === "function") this._progressHandler0 = progress;
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
var base = index * 5 - 5;
2014-10-01 16:29:39 -04:00
this[base + 3] = promise;
this[base + 4] = receiver;
2015-02-25 13:53:04 -05:00
if (typeof fulfill === "function")
this[base + 0] = fulfill;
if (typeof reject === "function")
this[base + 1] = reject;
if (typeof progress === "function")
this[base + 2] = progress;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
this._setLength(index + 1);
2014-07-10 22:41:24 -04:00
return index;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setProxyHandlers = function (receiver, promiseSlotValue) {
2014-10-01 16:29:39 -04:00
var index = this._length();
2015-02-25 13:53:04 -05:00
if (index >= 131071 - 5) {
2014-10-01 16:29:39 -04:00
index = 0;
this._setLength(0);
}
if (index === 0) {
this._promise0 = promiseSlotValue;
this._receiver0 = receiver;
} else {
2015-02-25 13:53:04 -05:00
var base = index * 5 - 5;
2014-10-01 16:29:39 -04:00
this[base + 3] = promiseSlotValue;
this[base + 4] = receiver;
}
this._setLength(index + 1);
};
2015-02-25 13:53:04 -05:00
Promise.prototype._proxyPromiseArray = function (promiseArray, index) {
2014-10-01 16:29:39 -04:00
this._setProxyHandlers(promiseArray, index);
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
Promise.prototype._resolveCallback = function(value, shouldBind) {
if (this._isFollowingOrFulfilledOrRejected()) return;
if (value === this)
return this._rejectCallback(makeSelfResolutionError(), false, true);
var maybePromise = tryConvertToPromise(value, this);
if (!(maybePromise instanceof Promise)) return this._fulfill(value);
var propagationFlags = 1 | (shouldBind ? 4 : 0);
this._propagateFrom(maybePromise, propagationFlags);
var promise = maybePromise._target();
if (promise._isPending()) {
var len = this._length();
for (var i = 0; i < len; ++i) {
promise._migrateCallbacks(this, i);
}
this._setFollowing();
this._setLength(0);
this._setFollowee(promise);
} else if (promise._isFulfilled()) {
this._fulfillUnchecked(promise._value());
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
this._rejectUnchecked(promise._reason(),
promise._getCarriedStackTrace());
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._rejectCallback =
function(reason, synchronous, shouldNotMarkOriginatingFromRejection) {
if (!shouldNotMarkOriginatingFromRejection) {
util.markAsOriginatingFromRejection(reason);
}
var trace = util.ensureErrorObject(reason);
var hasStack = trace === reason;
this._attachExtraTrace(trace, synchronous ? hasStack : false);
this._reject(reason, hasStack ? undefined : trace);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._resolveFromResolver = function (resolver) {
2014-10-01 16:29:39 -04:00
var promise = this;
2015-02-25 13:53:04 -05:00
this._captureStackTrace();
2014-10-01 16:29:39 -04:00
this._pushContext();
2015-02-25 13:53:04 -05:00
var synchronous = true;
var r = tryCatch(resolver)(function(value) {
if (promise === null) return;
promise._resolveCallback(value);
promise = null;
}, function (reason) {
if (promise === null) return;
promise._rejectCallback(reason, synchronous);
promise = null;
});
synchronous = false;
2014-10-01 16:29:39 -04:00
this._popContext();
2015-02-25 13:53:04 -05:00
if (r !== undefined && r === errorObj && promise !== null) {
promise._rejectCallback(r.e, true, true);
promise = null;
2014-10-01 16:29:39 -04:00
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._settlePromiseFromHandler = function (
handler, receiver, value, promise
) {
if (promise._isRejected()) return;
2014-10-01 16:29:39 -04:00
promise._pushContext();
2014-07-10 22:41:24 -04:00
var x;
2015-02-25 13:53:04 -05:00
if (receiver === APPLY && !this._isRejected()) {
x = tryCatch(handler).apply(this._boundTo, value);
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
x = tryCatch(handler).call(receiver, value);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
promise._popContext();
2014-07-10 22:41:24 -04:00
if (x === errorObj || x === promise || x === NEXT_FILTER) {
2015-02-25 13:53:04 -05:00
var err = x === promise ? makeSelfResolutionError() : x.e;
promise._rejectCallback(err, false, true);
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
promise._resolveCallback(x);
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._target = function() {
var ret = this;
while (ret._isFollowing()) ret = ret._followee();
return ret;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._followee = function() {
return this._rejectionHandler0;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setFollowee = function(promise) {
this._rejectionHandler0 = promise;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._cleanValues = function () {
2014-07-10 22:41:24 -04:00
if (this._cancellable()) {
2015-02-25 13:53:04 -05:00
this._cancellationParent = undefined;
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._propagateFrom = function (parent, flags) {
2014-10-01 16:29:39 -04:00
if ((flags & 1) > 0 && parent._cancellable()) {
this._setCancellable();
this._cancellationParent = parent;
}
2015-02-25 13:53:04 -05:00
if ((flags & 4) > 0 && parent._isBound()) {
2014-10-01 16:29:39 -04:00
this._setBoundTo(parent._boundTo);
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._fulfill = function (value) {
2014-07-10 22:41:24 -04:00
if (this._isFollowingOrFulfilledOrRejected()) return;
this._fulfillUnchecked(value);
};
2015-02-25 13:53:04 -05:00
Promise.prototype._reject = function (reason, carriedStackTrace) {
2014-07-10 22:41:24 -04:00
if (this._isFollowingOrFulfilledOrRejected()) return;
this._rejectUnchecked(reason, carriedStackTrace);
};
2015-02-25 13:53:04 -05:00
Promise.prototype._settlePromiseAt = function (index) {
var promise = this._promiseAt(index);
var isPromise = promise instanceof Promise;
if (isPromise && promise._isMigrated()) {
promise._unsetIsMigrated();
return async.invoke(this._settlePromiseAt, this, index);
}
var handler = this._isFulfilled()
2014-07-10 22:41:24 -04:00
? this._fulfillmentHandlerAt(index)
: this._rejectionHandlerAt(index);
2015-02-25 13:53:04 -05:00
var carriedStackTrace =
this._isCarryingStackTrace() ? this._getCarriedStackTrace() : undefined;
2014-07-10 22:41:24 -04:00
var value = this._settledValue;
var receiver = this._receiverAt(index);
2015-02-25 13:53:04 -05:00
this._clearCallbackDataAtIndex(index);
2014-07-10 22:41:24 -04:00
if (typeof handler === "function") {
2015-02-25 13:53:04 -05:00
if (!isPromise) {
handler.call(receiver, value, promise);
} else {
this._settlePromiseFromHandler(handler, receiver, value, promise);
}
} else if (receiver instanceof PromiseArray) {
if (!receiver._isResolved()) {
if (this._isFulfilled()) {
receiver._promiseFulfilled(value, promise);
}
else {
receiver._promiseRejected(value, promise);
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
} else if (isPromise) {
if (this._isFulfilled()) {
promise._fulfill(value);
} else {
promise._reject(value, carriedStackTrace);
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
if (index >= 4 && (index & 31) === 4)
async.invokeLater(this._setLength, this, 0);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._clearCallbackDataAtIndex = function(index) {
if (index === 0) {
if (!this._isCarryingStackTrace()) {
this._fulfillmentHandler0 = undefined;
}
this._rejectionHandler0 =
this._progressHandler0 =
this._receiver0 =
this._promise0 = undefined;
} else {
var base = index * 5 - 5;
this[base + 3] =
this[base + 4] =
this[base + 0] =
this[base + 1] =
this[base + 2] = undefined;
}
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._isSettlePromisesQueued = function () {
return (this._bitField &
-1073741824) === -1073741824;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setSettlePromisesQueued = function () {
2014-07-10 22:41:24 -04:00
this._bitField = this._bitField | -1073741824;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._unsetSettlePromisesQueued = function () {
2014-07-10 22:41:24 -04:00
this._bitField = this._bitField & (~-1073741824);
};
2015-02-25 13:53:04 -05:00
Promise.prototype._queueSettlePromises = function() {
async.settlePromises(this);
this._setSettlePromisesQueued();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._fulfillUnchecked = function (value) {
2014-07-10 22:41:24 -04:00
if (value === this) {
var err = makeSelfResolutionError();
this._attachExtraTrace(err);
2015-02-25 13:53:04 -05:00
return this._rejectUnchecked(err, undefined);
2014-07-10 22:41:24 -04:00
}
this._setFulfilled();
this._settledValue = value;
2015-02-25 13:53:04 -05:00
this._cleanValues();
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
if (this._length() > 0) {
this._queueSettlePromises();
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._rejectUncheckedCheckError = function (reason) {
var trace = util.ensureErrorObject(reason);
this._rejectUnchecked(reason, trace === reason ? undefined : trace);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._rejectUnchecked = function (reason, trace) {
2014-07-10 22:41:24 -04:00
if (reason === this) {
var err = makeSelfResolutionError();
this._attachExtraTrace(err);
return this._rejectUnchecked(err);
}
this._setRejected();
this._settledValue = reason;
2015-02-25 13:53:04 -05:00
this._cleanValues();
2014-07-10 22:41:24 -04:00
if (this._isFinal()) {
2015-02-25 13:53:04 -05:00
async.throwLater(function(e) {
if ("stack" in e) {
async.invokeFirst(
CapturedTrace.unhandledRejection, undefined, e);
}
throw e;
}, trace === undefined ? reason : trace);
2014-07-10 22:41:24 -04:00
return;
}
2015-02-25 13:53:04 -05:00
if (trace !== undefined && trace !== reason) {
this._setCarriedStackTrace(trace);
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
if (this._length() > 0) {
this._queueSettlePromises();
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
this._ensurePossibleRejectionHandled();
}
};
2015-02-25 13:53:04 -05:00
Promise.prototype._settlePromises = function () {
this._unsetSettlePromisesQueued();
2014-07-10 22:41:24 -04:00
var len = this._length();
2014-10-01 16:29:39 -04:00
for (var i = 0; i < len; i++) {
2014-07-10 22:41:24 -04:00
this._settlePromiseAt(i);
}
};
Promise._makeSelfResolutionError = makeSelfResolutionError;
2015-02-25 13:53:04 -05:00
require("./method.js")(Promise, INTERNAL, tryConvertToPromise, apiRejection);
require("./bind.js")(Promise, INTERNAL, tryConvertToPromise);
require("./finally.js")(Promise, NEXT_FILTER, tryConvertToPromise);
2014-10-01 16:29:39 -04:00
require("./direct_resolve.js")(Promise);
require("./synchronous_inspection.js")(Promise);
2015-02-25 13:53:04 -05:00
require("./join.js")(Promise, PromiseArray, tryConvertToPromise, INTERNAL);
2014-10-01 16:29:39 -04:00
Promise.Promise = Promise;
2015-02-25 13:53:04 -05:00
require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);
require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext);
require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise);
2014-10-01 16:29:39 -04:00
require('./nodeify.js')(Promise);
2015-02-25 13:53:04 -05:00
require('./cancel.js')(Promise);
require('./promisify.js')(Promise, INTERNAL);
require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);
require('./settle.js')(Promise, PromiseArray);
require('./call_get.js')(Promise);
require('./some.js')(Promise, PromiseArray, apiRejection);
require('./progress.js')(Promise, PromiseArray);
require('./any.js')(Promise);
require('./each.js')(Promise, INTERNAL);
require('./timers.js')(Promise, INTERNAL);
require('./filter.js')(Promise, INTERNAL);
util.toFastProperties(Promise);
util.toFastProperties(Promise.prototype);
function fillTypes(value) {
var p = new Promise(INTERNAL);
p._fulfillmentHandler0 = value;
p._rejectionHandler0 = value;
p._progressHandler0 = value;
p._promise0 = value;
p._receiver0 = value;
p._settledValue = value;
}
// Complete slack tracking, opt out of field-type tracking and
// stabilize map
fillTypes({a: 1});
fillTypes({b: 2});
fillTypes({c: 3});
fillTypes(1);
fillTypes(function(){});
fillTypes(undefined);
fillTypes(false);
fillTypes(new Promise(INTERNAL));
CapturedTrace.setBounds(async.firstLineError, util.lastLineError);
return Promise;
};
},{"./any.js":41,"./async.js":42,"./bind.js":43,"./call_get.js":44,"./cancel.js":45,"./captured_trace.js":46,"./catch_filter.js":47,"./context.js":48,"./debuggability.js":49,"./direct_resolve.js":50,"./each.js":51,"./errors.js":52,"./filter.js":54,"./finally.js":55,"./generators.js":56,"./join.js":57,"./map.js":58,"./method.js":59,"./nodeify.js":60,"./progress.js":61,"./promise_array.js":63,"./promise_resolver.js":64,"./promisify.js":65,"./props.js":66,"./race.js":68,"./reduce.js":69,"./settle.js":71,"./some.js":72,"./synchronous_inspection.js":73,"./thenables.js":74,"./timers.js":75,"./using.js":76,"./util.js":77}],63:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
apiRejection) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var isArray = util.isArray;
function toResolutionValue(val) {
switch(val) {
case -2: return [];
case -3: return {};
}
}
2014-10-01 16:29:39 -04:00
function PromiseArray(values) {
2014-07-10 22:41:24 -04:00
var promise = this._promise = new Promise(INTERNAL);
2015-02-25 13:53:04 -05:00
var parent;
2014-07-10 22:41:24 -04:00
if (values instanceof Promise) {
parent = values;
2014-10-01 16:29:39 -04:00
promise._propagateFrom(parent, 1 | 4);
2014-07-10 22:41:24 -04:00
}
this._values = values;
this._length = 0;
this._totalResolved = 0;
2015-02-25 13:53:04 -05:00
this._init(undefined, -2);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
PromiseArray.prototype.length = function () {
2014-07-10 22:41:24 -04:00
return this._length;
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype.promise = function () {
2014-07-10 22:41:24 -04:00
return this._promise;
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
var values = tryConvertToPromise(this._values, this._promise);
2014-07-10 22:41:24 -04:00
if (values instanceof Promise) {
2015-02-25 13:53:04 -05:00
values = values._target();
2014-10-01 16:29:39 -04:00
this._values = values;
2015-02-25 13:53:04 -05:00
if (values._isFulfilled()) {
values = values._value();
2014-07-10 22:41:24 -04:00
if (!isArray(values)) {
2015-02-25 13:53:04 -05:00
var err = new Promise.TypeError("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a");
2014-07-10 22:41:24 -04:00
this.__hardReject__(err);
return;
}
2015-02-25 13:53:04 -05:00
} else if (values._isPending()) {
2014-07-10 22:41:24 -04:00
values._then(
2015-02-25 13:53:04 -05:00
init,
2014-07-10 22:41:24 -04:00
this._reject,
2015-02-25 13:53:04 -05:00
undefined,
2014-07-10 22:41:24 -04:00
this,
resolveValueIfEmpty
);
return;
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
this._reject(values._reason());
2014-07-10 22:41:24 -04:00
return;
}
2014-10-01 16:29:39 -04:00
} else if (!isArray(values)) {
2015-02-25 13:53:04 -05:00
this._promise._reject(apiRejection("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a")._reason());
2014-10-01 16:29:39 -04:00
return;
2014-07-10 22:41:24 -04:00
}
if (values.length === 0) {
2014-10-01 16:29:39 -04:00
if (resolveValueIfEmpty === -5) {
this._resolveEmptyArray();
}
else {
this._resolve(toResolutionValue(resolveValueIfEmpty));
}
2014-07-10 22:41:24 -04:00
return;
}
2014-10-01 16:29:39 -04:00
var len = this.getActualLength(values.length);
2015-02-25 13:53:04 -05:00
this._length = len;
this._values = this.shouldCopyValues() ? new Array(len) : this._values;
var promise = this._promise;
2014-07-10 22:41:24 -04:00
for (var i = 0; i < len; ++i) {
2015-02-25 13:53:04 -05:00
var isResolved = this._isResolved();
var maybePromise = tryConvertToPromise(values[i], promise);
2014-07-10 22:41:24 -04:00
if (maybePromise instanceof Promise) {
2015-02-25 13:53:04 -05:00
maybePromise = maybePromise._target();
if (isResolved) {
maybePromise._unsetRejectionIsUnhandled();
} else if (maybePromise._isPending()) {
2014-07-10 22:41:24 -04:00
maybePromise._proxyPromiseArray(this, i);
2015-02-25 13:53:04 -05:00
} else if (maybePromise._isFulfilled()) {
this._promiseFulfilled(maybePromise._value(), i);
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
this._promiseRejected(maybePromise._reason(), i);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
} else if (!isResolved) {
this._promiseFulfilled(maybePromise, i);
2014-07-10 22:41:24 -04:00
}
}
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._isResolved = function () {
2014-07-10 22:41:24 -04:00
return this._values === null;
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._resolve = function (value) {
2014-07-10 22:41:24 -04:00
this._values = null;
this._promise._fulfill(value);
};
PromiseArray.prototype.__hardReject__ =
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._reject = function (reason) {
2014-07-10 22:41:24 -04:00
this._values = null;
2015-02-25 13:53:04 -05:00
this._promise._rejectCallback(reason, false, true);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._promiseProgressed = function (progressValue, index) {
2014-07-10 22:41:24 -04:00
this._promise._progress({
index: index,
value: progressValue
});
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._promiseFulfilled = function (value, index) {
2014-07-10 22:41:24 -04:00
this._values[index] = value;
var totalResolved = ++this._totalResolved;
if (totalResolved >= this._length) {
this._resolve(this._values);
}
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype._promiseRejected = function (reason, index) {
2014-07-10 22:41:24 -04:00
this._totalResolved++;
this._reject(reason);
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype.shouldCopyValues = function () {
2014-10-01 16:29:39 -04:00
return true;
};
2015-02-25 13:53:04 -05:00
PromiseArray.prototype.getActualLength = function (len) {
2014-10-01 16:29:39 -04:00
return len;
};
2014-07-10 22:41:24 -04:00
return PromiseArray;
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],64:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var maybeWrapAsError = util.maybeWrapAsError;
2014-10-01 16:29:39 -04:00
var errors = require("./errors.js");
2014-07-10 22:41:24 -04:00
var TimeoutError = errors.TimeoutError;
2014-10-01 16:29:39 -04:00
var OperationalError = errors.OperationalError;
2014-07-10 22:41:24 -04:00
var haveGetters = util.haveGetters;
2014-10-01 16:29:39 -04:00
var es5 = require("./es5.js");
2014-07-10 22:41:24 -04:00
function isUntypedError(obj) {
return obj instanceof Error &&
es5.getPrototypeOf(obj) === Error.prototype;
}
2015-02-25 13:53:04 -05:00
var rErrorKey = /^(?:name|message|stack|cause)$/;
2014-10-01 16:29:39 -04:00
function wrapAsOperationalError(obj) {
2014-07-10 22:41:24 -04:00
var ret;
if (isUntypedError(obj)) {
2014-10-01 16:29:39 -04:00
ret = new OperationalError(obj);
2015-02-25 13:53:04 -05:00
ret.name = obj.name;
ret.message = obj.message;
ret.stack = obj.stack;
var keys = es5.keys(obj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
if (!rErrorKey.test(key)) {
ret[key] = obj[key];
}
}
return ret;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
util.markAsOriginatingFromRejection(obj);
return obj;
2014-07-10 22:41:24 -04:00
}
function nodebackForPromise(promise) {
2015-02-25 13:53:04 -05:00
return function(err, value) {
2014-07-10 22:41:24 -04:00
if (promise === null) return;
if (err) {
2014-10-01 16:29:39 -04:00
var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
2014-07-10 22:41:24 -04:00
promise._attachExtraTrace(wrapped);
promise._reject(wrapped);
2014-10-01 16:29:39 -04:00
} else if (arguments.length > 2) {
var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}
promise._fulfill(args);
} else {
promise._fulfill(value);
2014-07-10 22:41:24 -04:00
}
promise = null;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
}
var PromiseResolver;
if (!haveGetters) {
2015-02-25 13:53:04 -05:00
PromiseResolver = function (promise) {
2014-07-10 22:41:24 -04:00
this.promise = promise;
this.asCallback = nodebackForPromise(promise);
this.callback = this.asCallback;
};
}
else {
2015-02-25 13:53:04 -05:00
PromiseResolver = function (promise) {
2014-07-10 22:41:24 -04:00
this.promise = promise;
};
}
if (haveGetters) {
var prop = {
get: function() {
return nodebackForPromise(this.promise);
}
};
es5.defineProperty(PromiseResolver.prototype, "asCallback", prop);
es5.defineProperty(PromiseResolver.prototype, "callback", prop);
}
PromiseResolver._nodebackForPromise = nodebackForPromise;
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.toString = function () {
2014-07-10 22:41:24 -04:00
return "[object PromiseResolver]";
};
PromiseResolver.prototype.resolve =
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.fulfill = function (value) {
2014-10-01 16:29:39 -04:00
if (!(this instanceof PromiseResolver)) {
2015-02-25 13:53:04 -05:00
throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a");
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
this.promise._resolveCallback(value);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.reject = function (reason) {
2014-10-01 16:29:39 -04:00
if (!(this instanceof PromiseResolver)) {
2015-02-25 13:53:04 -05:00
throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a");
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
this.promise._rejectCallback(reason);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.progress = function (value) {
2014-10-01 16:29:39 -04:00
if (!(this instanceof PromiseResolver)) {
2015-02-25 13:53:04 -05:00
throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a");
2014-10-01 16:29:39 -04:00
}
2015-02-25 13:53:04 -05:00
this.promise._progress(value);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.cancel = function (err) {
this.promise.cancel(err);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.timeout = function () {
2014-07-10 22:41:24 -04:00
this.reject(new TimeoutError("timeout"));
};
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.isResolved = function () {
2014-07-10 22:41:24 -04:00
return this.promise.isResolved();
};
2015-02-25 13:53:04 -05:00
PromiseResolver.prototype.toJSON = function () {
2014-07-10 22:41:24 -04:00
return this.promise.toJSON();
};
module.exports = PromiseResolver;
2015-02-25 13:53:04 -05:00
},{"./errors.js":52,"./es5.js":53,"./util.js":77}],65:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var nodebackForPromise = require("./promise_resolver.js")
2014-07-10 22:41:24 -04:00
._nodebackForPromise;
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
2014-10-01 16:29:39 -04:00
var TypeError = require("./errors").TypeError;
var defaultSuffix = "Async";
2015-02-25 13:53:04 -05:00
var defaultPromisified = {__isPromisified__: true};
var noCopyPropsPattern =
/^(?:length|name|arguments|caller|prototype|__isPromisified__)$/;
2014-10-01 16:29:39 -04:00
var defaultFilter = function(name, func) {
return util.isIdentifier(name) &&
name.charAt(0) !== "_" &&
!util.isClass(func);
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function propsFilter(key) {
return !noCopyPropsPattern.test(key);
2014-10-01 16:29:39 -04:00
}
2014-07-10 22:41:24 -04:00
function isPromisified(fn) {
2014-10-01 16:29:39 -04:00
try {
return fn.__isPromisified__ === true;
}
catch (e) {
return false;
}
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function hasPromisified(obj, key, suffix) {
var val = util.getDataPropertyOrDefault(obj, key + suffix,
defaultPromisified);
return val ? isPromisified(val) : false;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function checkValid(ret, suffix, suffixRegexp) {
2014-07-10 22:41:24 -04:00
for (var i = 0; i < ret.length; i += 2) {
var key = ret[i];
2014-10-01 16:29:39 -04:00
if (suffixRegexp.test(key)) {
var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
2014-07-10 22:41:24 -04:00
for (var j = 0; j < ret.length; j += 2) {
if (ret[j] === keyWithoutAsyncSuffix) {
2015-02-25 13:53:04 -05:00
throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/iWrZbw\u000a"
.replace("%s", suffix));
2014-07-10 22:41:24 -04:00
}
}
}
}
}
2014-10-01 16:29:39 -04:00
function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
var keys = util.inheritedDataKeys(obj);
var ret = [];
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var value = obj[key];
2015-02-25 13:53:04 -05:00
var passesDefaultFilter = filter === defaultFilter
? true : defaultFilter(key, value, obj);
2014-10-01 16:29:39 -04:00
if (typeof value === "function" &&
!isPromisified(value) &&
!hasPromisified(obj, key, suffix) &&
2015-02-25 13:53:04 -05:00
filter(key, value, obj, passesDefaultFilter)) {
2014-10-01 16:29:39 -04:00
ret.push(key, value);
}
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
checkValid(ret, suffix, suffixRegexp);
return ret;
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var escapeIdentRegex = function(str) {
return str.replace(/([$])/, "\\$");
};
var makeNodePromisifiedEval;
if (!false) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
2014-07-10 22:41:24 -04:00
var ret = [likelyArgumentCount];
2015-02-25 13:53:04 -05:00
var min = Math.max(0, likelyArgumentCount - 1 - 3);
2014-07-10 22:41:24 -04:00
for(var i = likelyArgumentCount - 1; i >= min; --i) {
ret.push(i);
}
2015-02-25 13:53:04 -05:00
for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
2014-07-10 22:41:24 -04:00
ret.push(i);
}
return ret;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var argumentSequence = function(argumentCount) {
return util.filledRange(argumentCount, "_arg", "");
};
2014-10-01 16:29:39 -04:00
2015-02-25 13:53:04 -05:00
var parameterDeclaration = function(parameterCount) {
return util.filledRange(
Math.max(parameterCount, 3), "_arg", "");
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var parameterCount = function(fn) {
2014-07-10 22:41:24 -04:00
if (typeof fn.length === "number") {
return Math.max(Math.min(fn.length, 1023 + 1), 0);
}
return 0;
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
makeNodePromisifiedEval =
function(callback, receiver, originalName, fn) {
2014-07-10 22:41:24 -04:00
var newParameterCount = Math.max(0, parameterCount(fn) - 1);
var argumentOrder = switchCaseArgumentOrder(newParameterCount);
2015-02-25 13:53:04 -05:00
var shouldProxyThis = typeof callback === "string" || receiver === THIS;
2014-07-10 22:41:24 -04:00
function generateCallForArgumentCount(count) {
2014-10-01 16:29:39 -04:00
var args = argumentSequence(count).join(", ");
var comma = count > 0 ? ", " : "";
var ret;
2015-02-25 13:53:04 -05:00
if (shouldProxyThis) {
ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
ret = receiver === undefined
? "ret = callback({{args}}, nodeback); break;\n"
: "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
return ret.replace("{{args}}", args).replace(", ", comma);
2014-07-10 22:41:24 -04:00
}
function generateArgumentSwitchCase() {
var ret = "";
2015-02-25 13:53:04 -05:00
for (var i = 0; i < argumentOrder.length; ++i) {
2014-07-10 22:41:24 -04:00
ret += "case " + argumentOrder[i] +":" +
generateCallForArgumentCount(argumentOrder[i]);
}
2014-10-01 16:29:39 -04:00
ret += " \n\
default: \n\
var args = new Array(len + 1); \n\
var i = 0; \n\
for (var i = 0; i < len; ++i) { \n\
args[i] = arguments[i]; \n\
} \n\
2015-02-25 13:53:04 -05:00
args[i] = nodeback; \n\
2014-10-01 16:29:39 -04:00
[CodeForCall] \n\
break; \n\
2015-02-25 13:53:04 -05:00
".replace("[CodeForCall]", (shouldProxyThis
? "ret = callback.apply(this, args);\n"
: "ret = callback.apply(receiver, args);\n"));
2014-07-10 22:41:24 -04:00
return ret;
}
2015-02-25 13:53:04 -05:00
var getFunctionCode = typeof callback === "string"
? ("this != null ? this['"+callback+"'] : fn")
: "fn";
2014-10-01 16:29:39 -04:00
return new Function("Promise",
2015-02-25 13:53:04 -05:00
"fn",
2014-10-01 16:29:39 -04:00
"receiver",
"withAppended",
"maybeWrapAsError",
"nodebackForPromise",
2015-02-25 13:53:04 -05:00
"tryCatch",
"errorObj",
"INTERNAL","'use strict'; \n\
var ret = function (Parameters) { \n\
2014-10-01 16:29:39 -04:00
'use strict'; \n\
var len = arguments.length; \n\
var promise = new Promise(INTERNAL); \n\
2015-02-25 13:53:04 -05:00
promise._captureStackTrace(); \n\
var nodeback = nodebackForPromise(promise); \n\
var ret; \n\
var callback = tryCatch([GetFunctionCode]); \n\
switch(len) { \n\
[CodeForSwitchCase] \n\
} \n\
if (ret === errorObj) { \n\
promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
2014-10-01 16:29:39 -04:00
} \n\
return promise; \n\
}; \n\
ret.__isPromisified__ = true; \n\
return ret; \n\
"
.replace("Parameters", parameterDeclaration(newParameterCount))
2015-02-25 13:53:04 -05:00
.replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
.replace("[GetFunctionCode]", getFunctionCode))(
2014-10-01 16:29:39 -04:00
Promise,
2015-02-25 13:53:04 -05:00
fn,
2014-10-01 16:29:39 -04:00
receiver,
withAppended,
maybeWrapAsError,
nodebackForPromise,
2015-02-25 13:53:04 -05:00
util.tryCatch,
util.errorObj,
2014-10-01 16:29:39 -04:00
INTERNAL
);
2015-02-25 13:53:04 -05:00
};
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
function makeNodePromisifiedClosure(callback, receiver, _, fn) {
var defaultThis = (function() {return this;})();
var method = callback;
if (typeof method === "string") {
callback = fn;
}
2014-07-10 22:41:24 -04:00
function promisified() {
var _receiver = receiver;
if (receiver === THIS) _receiver = this;
var promise = new Promise(INTERNAL);
2015-02-25 13:53:04 -05:00
promise._captureStackTrace();
var cb = typeof method === "string" && this !== defaultThis
? this[method] : callback;
2014-07-10 22:41:24 -04:00
var fn = nodebackForPromise(promise);
try {
2015-02-25 13:53:04 -05:00
cb.apply(_receiver, withAppended(arguments, fn));
2014-10-01 16:29:39 -04:00
} catch(e) {
2015-02-25 13:53:04 -05:00
promise._rejectCallback(maybeWrapAsError(e), true, true);
2014-07-10 22:41:24 -04:00
}
return promise;
}
promisified.__isPromisified__ = true;
return promisified;
}
var makeNodePromisified = canEvaluate
? makeNodePromisifiedEval
: makeNodePromisifiedClosure;
2014-10-01 16:29:39 -04:00
function promisifyAll(obj, suffix, filter, promisifier) {
var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
var methods =
promisifiableMethods(obj, suffix, suffixRegexp, filter);
for (var i = 0, len = methods.length; i < len; i+= 2) {
var key = methods[i];
var fn = methods[i+1];
var promisifiedKey = key + suffix;
obj[promisifiedKey] = promisifier === makeNodePromisified
? makeNodePromisified(key, THIS, key, fn, suffix)
2015-02-25 13:53:04 -05:00
: promisifier(fn, function() {
return makeNodePromisified(key, THIS, key, fn, suffix);
});
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
util.toFastProperties(obj);
return obj;
}
function promisify(callback, receiver) {
2015-02-25 13:53:04 -05:00
return makeNodePromisified(callback, receiver, undefined, callback);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
Promise.promisify = function (fn, receiver) {
2014-07-10 22:41:24 -04:00
if (typeof fn !== "function") {
2015-02-25 13:53:04 -05:00
throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
2014-07-10 22:41:24 -04:00
}
if (isPromisified(fn)) {
return fn;
}
2015-02-25 13:53:04 -05:00
var ret = promisify(fn, arguments.length < 2 ? THIS : receiver);
util.copyDescriptors(fn, ret, propsFilter);
return ret;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.promisifyAll = function (target, options) {
2014-07-10 22:41:24 -04:00
if (typeof target !== "function" && typeof target !== "object") {
2015-02-25 13:53:04 -05:00
throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/9ITlV0\u000a");
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
options = Object(options);
var suffix = options.suffix;
if (typeof suffix !== "string") suffix = defaultSuffix;
var filter = options.filter;
if (typeof filter !== "function") filter = defaultFilter;
var promisifier = options.promisifier;
if (typeof promisifier !== "function") promisifier = makeNodePromisified;
if (!util.isIdentifier(suffix)) {
2015-02-25 13:53:04 -05:00
throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/8FZo5V\u000a");
2014-10-01 16:29:39 -04:00
}
2015-02-25 13:53:04 -05:00
var keys = util.inheritedDataKeys(target);
2014-10-01 16:29:39 -04:00
for (var i = 0; i < keys.length; ++i) {
var value = target[keys[i]];
if (keys[i] !== "constructor" &&
util.isClass(value)) {
promisifyAll(value.prototype, suffix, filter, promisifier);
promisifyAll(value, suffix, filter, promisifier);
}
}
return promisifyAll(target, suffix, filter, promisifier);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./errors":52,"./promise_resolver.js":64,"./util.js":77}],66:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(
Promise, PromiseArray, tryConvertToPromise, apiRejection) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
var isObject = util.isObject;
var es5 = require("./es5.js");
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
function PropertiesPromiseArray(obj) {
2014-07-10 22:41:24 -04:00
var keys = es5.keys(obj);
2014-10-01 16:29:39 -04:00
var len = keys.length;
var values = new Array(len * 2);
for (var i = 0; i < len; ++i) {
var key = keys[i];
values[i] = obj[key];
values[i + len] = key;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
this.constructor$(values);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
util.inherits(PropertiesPromiseArray, PromiseArray);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
PropertiesPromiseArray.prototype._init = function () {
this._init$(undefined, -3) ;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
2014-07-10 22:41:24 -04:00
this._values[index] = value;
var totalResolved = ++this._totalResolved;
if (totalResolved >= this._length) {
var val = {};
var keyOffset = this.length();
for (var i = 0, len = this.length(); i < len; ++i) {
val[this._values[i + keyOffset]] = this._values[i];
}
this._resolve(val);
}
};
2015-02-25 13:53:04 -05:00
PropertiesPromiseArray.prototype._promiseProgressed = function (value, index) {
2014-07-10 22:41:24 -04:00
this._promise._progress({
key: this._values[index + this.length()],
value: value
});
};
2015-02-25 13:53:04 -05:00
PropertiesPromiseArray.prototype.shouldCopyValues = function () {
2014-10-01 16:29:39 -04:00
return false;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
PropertiesPromiseArray.prototype.getActualLength = function (len) {
2014-10-01 16:29:39 -04:00
return len >> 1;
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function props(promises) {
2014-07-10 22:41:24 -04:00
var ret;
2015-02-25 13:53:04 -05:00
var castValue = tryConvertToPromise(promises);
2014-07-10 22:41:24 -04:00
if (!isObject(castValue)) {
2015-02-25 13:53:04 -05:00
return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/OsFKC8\u000a");
2014-10-01 16:29:39 -04:00
} else if (castValue instanceof Promise) {
2015-02-25 13:53:04 -05:00
ret = castValue._then(
Promise.props, undefined, undefined, undefined, undefined);
2014-10-01 16:29:39 -04:00
} else {
ret = new PropertiesPromiseArray(castValue).promise();
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
if (castValue instanceof Promise) {
ret._propagateFrom(castValue, 4);
2014-07-10 22:41:24 -04:00
}
return ret;
}
2015-02-25 13:53:04 -05:00
Promise.prototype.props = function () {
return props(this);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.props = function (promises) {
return props(promises);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./es5.js":53,"./util.js":77}],67:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
function arrayMove(src, srcIndex, dst, dstIndex, len) {
2014-07-10 22:41:24 -04:00
for (var j = 0; j < len; ++j) {
dst[j + dstIndex] = src[j + srcIndex];
2015-02-25 13:53:04 -05:00
src[j + srcIndex] = void 0;
2014-07-10 22:41:24 -04:00
}
}
function Queue(capacity) {
2014-10-01 16:29:39 -04:00
this._capacity = capacity;
2014-07-10 22:41:24 -04:00
this._length = 0;
this._front = 0;
}
2015-02-25 13:53:04 -05:00
Queue.prototype._willBeOverCapacity = function (size) {
2014-07-10 22:41:24 -04:00
return this._capacity < size;
};
2015-02-25 13:53:04 -05:00
Queue.prototype._pushOne = function (arg) {
2014-07-10 22:41:24 -04:00
var length = this.length();
this._checkCapacity(length + 1);
var i = (this._front + length) & (this._capacity - 1);
this[i] = arg;
this._length = length + 1;
};
2015-02-25 13:53:04 -05:00
Queue.prototype._unshiftOne = function(value) {
var capacity = this._capacity;
this._checkCapacity(this.length() + 1);
var front = this._front;
var i = (((( front - 1 ) &
( capacity - 1) ) ^ capacity ) - capacity );
this[i] = value;
this._front = i;
this._length = this.length() + 1;
};
Queue.prototype.unshift = function(fn, receiver, arg) {
this._unshiftOne(arg);
this._unshiftOne(receiver);
this._unshiftOne(fn);
};
Queue.prototype.push = function (fn, receiver, arg) {
2014-07-10 22:41:24 -04:00
var length = this.length() + 3;
if (this._willBeOverCapacity(length)) {
this._pushOne(fn);
this._pushOne(receiver);
this._pushOne(arg);
return;
}
var j = this._front + length - 3;
this._checkCapacity(length);
var wrapMask = this._capacity - 1;
this[(j + 0) & wrapMask] = fn;
this[(j + 1) & wrapMask] = receiver;
this[(j + 2) & wrapMask] = arg;
this._length = length;
};
2015-02-25 13:53:04 -05:00
Queue.prototype.shift = function () {
2014-07-10 22:41:24 -04:00
var front = this._front,
ret = this[front];
2015-02-25 13:53:04 -05:00
this[front] = undefined;
2014-07-10 22:41:24 -04:00
this._front = (front + 1) & (this._capacity - 1);
this._length--;
return ret;
};
2015-02-25 13:53:04 -05:00
Queue.prototype.length = function () {
2014-07-10 22:41:24 -04:00
return this._length;
};
2015-02-25 13:53:04 -05:00
Queue.prototype._checkCapacity = function (size) {
2014-07-10 22:41:24 -04:00
if (this._capacity < size) {
2015-02-25 13:53:04 -05:00
this._resizeTo(this._capacity << 1);
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
Queue.prototype._resizeTo = function (capacity) {
2014-07-10 22:41:24 -04:00
var oldCapacity = this._capacity;
this._capacity = capacity;
2015-02-25 13:53:04 -05:00
var front = this._front;
var length = this._length;
var moveItemsCount = (front + length) & (oldCapacity - 1);
arrayMove(this, 0, this, oldCapacity, moveItemsCount);
2014-07-10 22:41:24 -04:00
};
module.exports = Queue;
2015-02-25 13:53:04 -05:00
},{}],68:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(
Promise, INTERNAL, tryConvertToPromise, apiRejection) {
2014-10-01 16:29:39 -04:00
var isArray = require("./util.js").isArray;
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var raceLater = function (promise) {
2014-07-10 22:41:24 -04:00
return promise.then(function(array) {
2015-02-25 13:53:04 -05:00
return race(array, promise);
2014-07-10 22:41:24 -04:00
});
};
2015-02-25 13:53:04 -05:00
function race(promises, parent) {
var maybePromise = tryConvertToPromise(promises);
2014-07-10 22:41:24 -04:00
if (maybePromise instanceof Promise) {
return raceLater(maybePromise);
2014-10-01 16:29:39 -04:00
} else if (!isArray(promises)) {
2015-02-25 13:53:04 -05:00
return apiRejection("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a");
2014-07-10 22:41:24 -04:00
}
var ret = new Promise(INTERNAL);
2015-02-25 13:53:04 -05:00
if (parent !== undefined) {
ret._propagateFrom(parent, 4 | 1);
2014-07-10 22:41:24 -04:00
}
var fulfill = ret._fulfill;
var reject = ret._reject;
for (var i = 0, len = promises.length; i < len; ++i) {
var val = promises[i];
2015-02-25 13:53:04 -05:00
if (val === undefined && !(i in promises)) {
2014-07-10 22:41:24 -04:00
continue;
}
2015-02-25 13:53:04 -05:00
Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
2014-07-10 22:41:24 -04:00
}
return ret;
}
2015-02-25 13:53:04 -05:00
Promise.race = function (promises) {
return race(promises, undefined);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.race = function () {
return race(this, undefined);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],69:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise,
PromiseArray,
apiRejection,
tryConvertToPromise,
INTERNAL) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2015-02-25 13:53:04 -05:00
var tryCatch = util.tryCatch;
2014-10-01 16:29:39 -04:00
var errorObj = util.errorObj;
function ReductionPromiseArray(promises, fn, accum, _each) {
this.constructor$(promises);
2015-02-25 13:53:04 -05:00
this._promise._captureStackTrace();
2014-10-01 16:29:39 -04:00
this._preservedValues = _each === INTERNAL ? [] : null;
2015-02-25 13:53:04 -05:00
this._zerothIsAccum = (accum === undefined);
2014-10-01 16:29:39 -04:00
this._gotAccum = false;
this._reducingIndex = (this._zerothIsAccum ? 1 : 0);
this._valuesPhase = undefined;
2015-02-25 13:53:04 -05:00
var maybePromise = tryConvertToPromise(accum, this._promise);
2014-10-01 16:29:39 -04:00
var rejected = false;
var isPromise = maybePromise instanceof Promise;
if (isPromise) {
2015-02-25 13:53:04 -05:00
maybePromise = maybePromise._target();
if (maybePromise._isPending()) {
2014-10-01 16:29:39 -04:00
maybePromise._proxyPromiseArray(this, -1);
2015-02-25 13:53:04 -05:00
} else if (maybePromise._isFulfilled()) {
accum = maybePromise._value();
2014-10-01 16:29:39 -04:00
this._gotAccum = true;
} else {
2015-02-25 13:53:04 -05:00
this._reject(maybePromise._reason());
2014-10-01 16:29:39 -04:00
rejected = true;
}
}
if (!(isPromise || this._zerothIsAccum)) this._gotAccum = true;
this._callback = fn;
this._accum = accum;
2015-02-25 13:53:04 -05:00
if (!rejected) this._init$(undefined, -5);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
util.inherits(ReductionPromiseArray, PromiseArray);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
ReductionPromiseArray.prototype._init = function () {};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
ReductionPromiseArray.prototype._resolveEmptyArray = function () {
2014-10-01 16:29:39 -04:00
if (this._gotAccum || this._zerothIsAccum) {
this._resolve(this._preservedValues !== null
? [] : this._accum);
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
ReductionPromiseArray.prototype._promiseFulfilled = function (value, index) {
2014-10-01 16:29:39 -04:00
var values = this._values;
2015-02-25 13:53:04 -05:00
values[index] = value;
2014-10-01 16:29:39 -04:00
var length = this.length();
var preservedValues = this._preservedValues;
var isEach = preservedValues !== null;
var gotAccum = this._gotAccum;
var valuesPhase = this._valuesPhase;
var valuesPhaseIndex;
if (!valuesPhase) {
2015-02-25 13:53:04 -05:00
valuesPhase = this._valuesPhase = new Array(length);
2014-10-01 16:29:39 -04:00
for (valuesPhaseIndex=0; valuesPhaseIndex<length; ++valuesPhaseIndex) {
valuesPhase[valuesPhaseIndex] = 0;
}
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
valuesPhaseIndex = valuesPhase[index];
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
if (index === 0 && this._zerothIsAccum) {
2015-02-25 13:53:04 -05:00
this._accum = value;
this._gotAccum = gotAccum = true;
2014-10-01 16:29:39 -04:00
valuesPhase[index] = ((valuesPhaseIndex === 0)
? 1 : 2);
} else if (index === -1) {
2015-02-25 13:53:04 -05:00
this._accum = value;
this._gotAccum = gotAccum = true;
2014-10-01 16:29:39 -04:00
} else {
if (valuesPhaseIndex === 0) {
valuesPhase[index] = 1;
2015-02-25 13:53:04 -05:00
} else {
2014-10-01 16:29:39 -04:00
valuesPhase[index] = 2;
2015-02-25 13:53:04 -05:00
this._accum = value;
2014-10-01 16:29:39 -04:00
}
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
if (!gotAccum) return;
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
var callback = this._callback;
var receiver = this._promise._boundTo;
var ret;
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
for (var i = this._reducingIndex; i < length; ++i) {
valuesPhaseIndex = valuesPhase[i];
if (valuesPhaseIndex === 2) {
this._reducingIndex = i + 1;
continue;
}
if (valuesPhaseIndex !== 1) return;
value = values[i];
2015-02-25 13:53:04 -05:00
this._promise._pushContext();
2014-10-01 16:29:39 -04:00
if (isEach) {
preservedValues.push(value);
2015-02-25 13:53:04 -05:00
ret = tryCatch(callback).call(receiver, value, i, length);
2014-10-01 16:29:39 -04:00
}
else {
2015-02-25 13:53:04 -05:00
ret = tryCatch(callback)
.call(receiver, this._accum, value, i, length);
2014-10-01 16:29:39 -04:00
}
2015-02-25 13:53:04 -05:00
this._promise._popContext();
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
if (ret === errorObj) return this._reject(ret.e);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
var maybePromise = tryConvertToPromise(ret, this._promise);
2014-10-01 16:29:39 -04:00
if (maybePromise instanceof Promise) {
2015-02-25 13:53:04 -05:00
maybePromise = maybePromise._target();
if (maybePromise._isPending()) {
2014-10-01 16:29:39 -04:00
valuesPhase[i] = 4;
return maybePromise._proxyPromiseArray(this, i);
2015-02-25 13:53:04 -05:00
} else if (maybePromise._isFulfilled()) {
ret = maybePromise._value();
2014-10-01 16:29:39 -04:00
} else {
2015-02-25 13:53:04 -05:00
return this._reject(maybePromise._reason());
2014-07-10 22:41:24 -04:00
}
}
2014-10-01 16:29:39 -04:00
this._reducingIndex = i + 1;
this._accum = ret;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
this._resolve(isEach ? preservedValues : this._accum);
2014-07-10 22:41:24 -04:00
};
2014-10-01 16:29:39 -04:00
function reduce(promises, fn, initialValue, _each) {
2015-02-25 13:53:04 -05:00
if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
2014-10-01 16:29:39 -04:00
var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
return array.promise();
}
2015-02-25 13:53:04 -05:00
Promise.prototype.reduce = function (fn, initialValue) {
2014-10-01 16:29:39 -04:00
return reduce(this, fn, initialValue, null);
};
2015-02-25 13:53:04 -05:00
Promise.reduce = function (promises, fn, initialValue, _each) {
2014-10-01 16:29:39 -04:00
return reduce(promises, fn, initialValue, _each);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],70:[function(require,module,exports){
(function (process,global){
2014-07-10 22:41:24 -04:00
"use strict";
var schedule;
2015-02-25 13:53:04 -05:00
if (require("./util.js").isNode) {
var version = process.versions.node.split(".").map(Number);
schedule = (version[0] === 0 && version[1] > 10) || (version[0] > 0)
? global.setImmediate : process.nextTick;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
else if (typeof MutationObserver !== "undefined") {
schedule = function(fn) {
2014-07-10 22:41:24 -04:00
var div = document.createElement("div");
2015-02-25 13:53:04 -05:00
var observer = new MutationObserver(fn);
observer.observe(div, {attributes: true});
return function() { div.classList.toggle("foo"); };
};
schedule.isStatic = true;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
else if (typeof setTimeout !== "undefined") {
2015-02-25 13:53:04 -05:00
schedule = function (fn) {
2014-10-01 16:29:39 -04:00
setTimeout(fn, 0);
2014-07-10 22:41:24 -04:00
};
}
2015-02-25 13:53:04 -05:00
else {
schedule = function() {
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/m3OTXk\u000a");
};
}
2014-07-10 22:41:24 -04:00
module.exports = schedule;
2015-02-25 13:53:04 -05:00
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./util.js":77,"_process":84}],71:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports =
2014-10-01 16:29:39 -04:00
function(Promise, PromiseArray) {
2014-07-10 22:41:24 -04:00
var PromiseInspection = Promise.PromiseInspection;
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
function SettledPromiseArray(values) {
this.constructor$(values);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
util.inherits(SettledPromiseArray, PromiseArray);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
2014-07-10 22:41:24 -04:00
this._values[index] = inspection;
var totalResolved = ++this._totalResolved;
if (totalResolved >= this._length) {
this._resolve(this._values);
}
};
2015-02-25 13:53:04 -05:00
SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
2014-07-10 22:41:24 -04:00
var ret = new PromiseInspection();
ret._bitField = 268435456;
ret._settledValue = value;
this._promiseResolved(index, ret);
};
2015-02-25 13:53:04 -05:00
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
2014-07-10 22:41:24 -04:00
var ret = new PromiseInspection();
ret._bitField = 134217728;
ret._settledValue = reason;
this._promiseResolved(index, ret);
};
2015-02-25 13:53:04 -05:00
Promise.settle = function (promises) {
2014-10-01 16:29:39 -04:00
return new SettledPromiseArray(promises).promise();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.settle = function () {
2014-10-01 16:29:39 -04:00
return new SettledPromiseArray(this).promise();
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],72:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2014-10-01 16:29:39 -04:00
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = require("./util.js");
var RangeError = require("./errors.js").RangeError;
var AggregateError = require("./errors.js").AggregateError;
2014-07-10 22:41:24 -04:00
var isArray = util.isArray;
2014-10-01 16:29:39 -04:00
function SomePromiseArray(values) {
this.constructor$(values);
2014-07-10 22:41:24 -04:00
this._howMany = 0;
this._unwrap = false;
this._initialized = false;
}
2014-10-01 16:29:39 -04:00
util.inherits(SomePromiseArray, PromiseArray);
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._init = function () {
2014-07-10 22:41:24 -04:00
if (!this._initialized) {
return;
}
if (this._howMany === 0) {
this._resolve([]);
return;
}
2015-02-25 13:53:04 -05:00
this._init$(undefined, -5);
2014-07-10 22:41:24 -04:00
var isArrayResolved = isArray(this._values);
if (!this._isResolved() &&
isArrayResolved &&
this._howMany > this._canPossiblyFulfill()) {
2014-10-01 16:29:39 -04:00
this._reject(this._getRangeError(this.length()));
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype.init = function () {
2014-07-10 22:41:24 -04:00
this._initialized = true;
this._init();
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype.setUnwrap = function () {
2014-07-10 22:41:24 -04:00
this._unwrap = true;
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype.howMany = function () {
2014-07-10 22:41:24 -04:00
return this._howMany;
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype.setHowMany = function (count) {
2014-07-10 22:41:24 -04:00
this._howMany = count;
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._promiseFulfilled = function (value) {
2014-07-10 22:41:24 -04:00
this._addFulfilled(value);
if (this._fulfilled() === this.howMany()) {
this._values.length = this.howMany();
if (this.howMany() === 1 && this._unwrap) {
this._resolve(this._values[0]);
2014-10-01 16:29:39 -04:00
} else {
2014-07-10 22:41:24 -04:00
this._resolve(this._values);
}
}
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._promiseRejected = function (reason) {
2014-07-10 22:41:24 -04:00
this._addRejected(reason);
if (this.howMany() > this._canPossiblyFulfill()) {
2014-10-01 16:29:39 -04:00
var e = new AggregateError();
for (var i = this.length(); i < this._values.length; ++i) {
e.push(this._values[i]);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
this._reject(e);
2014-07-10 22:41:24 -04:00
}
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._fulfilled = function () {
2014-07-10 22:41:24 -04:00
return this._totalResolved;
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._rejected = function () {
2014-10-01 16:29:39 -04:00
return this._values.length - this.length();
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._addRejected = function (reason) {
2014-07-10 22:41:24 -04:00
this._values.push(reason);
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._addFulfilled = function (value) {
2014-07-10 22:41:24 -04:00
this._values[this._totalResolved++] = value;
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._canPossiblyFulfill = function () {
2014-07-10 22:41:24 -04:00
return this.length() - this._rejected();
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._getRangeError = function (count) {
2014-10-01 16:29:39 -04:00
var message = "Input array must contain at least " +
this._howMany + " items but contains only " + count + " items";
return new RangeError(message);
};
2015-02-25 13:53:04 -05:00
SomePromiseArray.prototype._resolveEmptyArray = function () {
2014-10-01 16:29:39 -04:00
this._reject(this._getRangeError(0));
};
2015-02-25 13:53:04 -05:00
function some(promises, howMany) {
2014-10-01 16:29:39 -04:00
if ((howMany | 0) !== howMany || howMany < 0) {
2015-02-25 13:53:04 -05:00
return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/1wAmHx\u000a");
2014-10-01 16:29:39 -04:00
}
var ret = new SomePromiseArray(promises);
var promise = ret.promise();
ret.setHowMany(howMany);
ret.init();
return promise;
}
2015-02-25 13:53:04 -05:00
Promise.some = function (promises, howMany) {
return some(promises, howMany);
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.some = function (howMany) {
return some(this, howMany);
2014-07-10 22:41:24 -04:00
};
2014-10-01 16:29:39 -04:00
Promise._SomePromiseArray = SomePromiseArray;
};
2015-02-25 13:53:04 -05:00
},{"./errors.js":52,"./util.js":77}],73:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
2015-02-25 13:53:04 -05:00
if (promise !== undefined) {
promise = promise._target();
2014-07-10 22:41:24 -04:00
this._bitField = promise._bitField;
2015-02-25 13:53:04 -05:00
this._settledValue = promise._settledValue;
2014-07-10 22:41:24 -04:00
}
else {
this._bitField = 0;
2015-02-25 13:53:04 -05:00
this._settledValue = undefined;
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
PromiseInspection.prototype.value = function () {
if (!this.isFulfilled()) {
throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/hc1DLj\u000a");
}
return this._settledValue;
};
PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
if (!this.isRejected()) {
throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/hPuiwB\u000a");
}
return this._settledValue;
};
2014-07-10 22:41:24 -04:00
PromiseInspection.prototype.isFulfilled =
2015-02-25 13:53:04 -05:00
Promise.prototype._isFulfilled = function () {
2014-07-10 22:41:24 -04:00
return (this._bitField & 268435456) > 0;
};
PromiseInspection.prototype.isRejected =
2015-02-25 13:53:04 -05:00
Promise.prototype._isRejected = function () {
2014-07-10 22:41:24 -04:00
return (this._bitField & 134217728) > 0;
};
PromiseInspection.prototype.isPending =
2015-02-25 13:53:04 -05:00
Promise.prototype._isPending = function () {
2014-07-10 22:41:24 -04:00
return (this._bitField & 402653184) === 0;
};
2015-02-25 13:53:04 -05:00
PromiseInspection.prototype.isResolved =
Promise.prototype._isResolved = function () {
return (this._bitField & 402653184) > 0;
};
Promise.prototype.isPending = function() {
return this._target()._isPending();
};
Promise.prototype.isRejected = function() {
return this._target()._isRejected();
};
Promise.prototype.isFulfilled = function() {
return this._target()._isFulfilled();
};
Promise.prototype.isResolved = function() {
return this._target()._isResolved();
};
Promise.prototype._value = function() {
2014-07-10 22:41:24 -04:00
return this._settledValue;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._reason = function() {
this._unsetRejectionIsUnhandled();
2014-07-10 22:41:24 -04:00
return this._settledValue;
};
2015-02-25 13:53:04 -05:00
Promise.prototype.value = function() {
var target = this._target();
if (!target.isFulfilled()) {
throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/hc1DLj\u000a");
}
return target._settledValue;
};
Promise.prototype.reason = function() {
var target = this._target();
if (!target.isRejected()) {
throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/hPuiwB\u000a");
}
target._unsetRejectionIsUnhandled();
return target._settledValue;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
2014-07-10 22:41:24 -04:00
Promise.PromiseInspection = PromiseInspection;
};
2015-02-25 13:53:04 -05:00
},{}],74:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
module.exports = function(Promise, INTERNAL) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var errorObj = util.errorObj;
var isObject = util.isObject;
2015-02-25 13:53:04 -05:00
function tryConvertToPromise(obj, context) {
2014-07-10 22:41:24 -04:00
if (isObject(obj)) {
if (obj instanceof Promise) {
return obj;
}
else if (isAnyBluebirdPromise(obj)) {
var ret = new Promise(INTERNAL);
obj._then(
ret._fulfillUnchecked,
ret._rejectUncheckedCheckError,
ret._progressUnchecked,
ret,
null
);
return ret;
}
2015-02-25 13:53:04 -05:00
var then = util.tryCatch(getThen)(obj);
2014-07-10 22:41:24 -04:00
if (then === errorObj) {
2015-02-25 13:53:04 -05:00
if (context) context._pushContext();
var ret = Promise.reject(then.e);
if (context) context._popContext();
return ret;
2014-10-01 16:29:39 -04:00
} else if (typeof then === "function") {
2015-02-25 13:53:04 -05:00
return doThenable(obj, then, context);
2014-07-10 22:41:24 -04:00
}
}
return obj;
}
2015-02-25 13:53:04 -05:00
function getThen(obj) {
return obj.then;
}
2014-07-10 22:41:24 -04:00
var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
return hasProp.call(obj, "_promise0");
}
2015-02-25 13:53:04 -05:00
function doThenable(x, then, context) {
var promise = new Promise(INTERNAL);
var ret = promise;
if (context) context._pushContext();
promise._captureStackTrace();
if (context) context._popContext();
var synchronous = true;
var result = util.tryCatch(then).call(x,
resolveFromThenable,
rejectFromThenable,
progressFromThenable);
synchronous = false;
if (promise && result === errorObj) {
promise._rejectCallback(result.e, true, true);
promise = null;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
function resolveFromThenable(value) {
if (!promise) return;
if (x === value) {
promise._rejectCallback(
Promise._makeSelfResolutionError(), false, true);
} else {
promise._resolveCallback(value);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
promise = null;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
function rejectFromThenable(reason) {
if (!promise) return;
promise._rejectCallback(reason, synchronous, true);
promise = null;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
function progressFromThenable(value) {
if (!promise) return;
2014-07-10 22:41:24 -04:00
if (typeof promise._progress === "function") {
2015-02-25 13:53:04 -05:00
promise._progress(value);
2014-07-10 22:41:24 -04:00
}
}
2015-02-25 13:53:04 -05:00
return ret;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
return tryConvertToPromise;
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],75:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function(Promise, INTERNAL) {
2014-10-01 16:29:39 -04:00
var util = require("./util.js");
2014-07-10 22:41:24 -04:00
var TimeoutError = Promise.TimeoutError;
2015-02-25 13:53:04 -05:00
var afterTimeout = function (promise, message) {
2014-07-10 22:41:24 -04:00
if (!promise.isPending()) return;
if (typeof message !== "string") {
2015-02-25 13:53:04 -05:00
message = "operation timed out";
2014-07-10 22:41:24 -04:00
}
var err = new TimeoutError(message);
2015-02-25 13:53:04 -05:00
util.markAsOriginatingFromRejection(err);
2014-07-10 22:41:24 -04:00
promise._attachExtraTrace(err);
2014-10-01 16:29:39 -04:00
promise._cancel(err);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (value, ms) {
if (ms === undefined) {
2014-07-10 22:41:24 -04:00
ms = value;
2015-02-25 13:53:04 -05:00
value = undefined;
var ret = new Promise(INTERNAL);
setTimeout(function() { ret._fulfill(); }, ms);
return ret;
2014-07-10 22:41:24 -04:00
}
ms = +ms;
2015-02-25 13:53:04 -05:00
return Promise.resolve(value)._then(afterValue, null, null, ms, undefined);
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.delay = function (ms) {
2014-07-10 22:41:24 -04:00
return delay(this, ms);
};
2015-02-25 13:53:04 -05:00
function successClear(value) {
var handle = this;
if (handle instanceof Number) handle = +handle;
clearTimeout(handle);
return value;
}
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
function failureClear(reason) {
var handle = this;
if (handle instanceof Number) handle = +handle;
clearTimeout(handle);
throw reason;
}
Promise.prototype.timeout = function (ms, message) {
ms = +ms;
var ret = this.then().cancellable();
ret._cancellationParent = this;
var handle = setTimeout(function timeoutTimeout() {
afterTimeout(ret, message);
}, ms);
return ret._then(successClear, failureClear, undefined, handle, undefined);
2014-07-10 22:41:24 -04:00
};
};
2015-02-25 13:53:04 -05:00
},{"./util.js":77}],76:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
"use strict";
2015-02-25 13:53:04 -05:00
module.exports = function (Promise, apiRejection, tryConvertToPromise,
createContext) {
2014-10-01 16:29:39 -04:00
var TypeError = require("./errors.js").TypeError;
var inherits = require("./util.js").inherits;
var PromiseInspection = Promise.PromiseInspection;
function inspectionMapper(inspections) {
var len = inspections.length;
for (var i = 0; i < len; ++i) {
var inspection = inspections[i];
if (inspection.isRejected()) {
return Promise.reject(inspection.error());
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
inspections[i] = inspection._settledValue;
2014-10-01 16:29:39 -04:00
}
return inspections;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function thrower(e) {
setTimeout(function(){throw e;}, 0);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function castPreservingDisposable(thenable) {
2015-02-25 13:53:04 -05:00
var maybePromise = tryConvertToPromise(thenable);
2014-10-01 16:29:39 -04:00
if (maybePromise !== thenable &&
typeof thenable._isDisposable === "function" &&
typeof thenable._getDisposer === "function" &&
thenable._isDisposable()) {
maybePromise._setDisposable(thenable._getDisposer());
}
return maybePromise;
}
function dispose(resources, inspection) {
var i = 0;
var len = resources.length;
var ret = Promise.defer();
function iterator() {
if (i >= len) return ret.resolve();
var maybePromise = castPreservingDisposable(resources[i++]);
if (maybePromise instanceof Promise &&
maybePromise._isDisposable()) {
try {
2015-02-25 13:53:04 -05:00
maybePromise = tryConvertToPromise(
maybePromise._getDisposer().tryDispose(inspection),
resources.promise);
2014-10-01 16:29:39 -04:00
} catch (e) {
return thrower(e);
}
if (maybePromise instanceof Promise) {
return maybePromise._then(iterator, thrower,
null, null, null);
}
}
iterator();
}
iterator();
return ret.promise;
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function disposerSuccess(value) {
var inspection = new PromiseInspection();
inspection._settledValue = value;
inspection._bitField = 268435456;
return dispose(this, inspection).thenReturn(value);
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function disposerFail(reason) {
var inspection = new PromiseInspection();
inspection._settledValue = reason;
inspection._bitField = 134217728;
return dispose(this, inspection).thenThrow(reason);
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
function Disposer(data, promise, context) {
2014-10-01 16:29:39 -04:00
this._data = data;
this._promise = promise;
2015-02-25 13:53:04 -05:00
this._context = context;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
Disposer.prototype.data = function () {
2014-10-01 16:29:39 -04:00
return this._data;
};
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
Disposer.prototype.promise = function () {
2014-10-01 16:29:39 -04:00
return this._promise;
};
2015-02-25 13:53:04 -05:00
Disposer.prototype.resource = function () {
2014-10-01 16:29:39 -04:00
if (this.promise().isFulfilled()) {
return this.promise().value();
}
return null;
};
Disposer.prototype.tryDispose = function(inspection) {
var resource = this.resource();
2015-02-25 13:53:04 -05:00
var context = this._context;
if (context !== undefined) context._pushContext();
2014-10-01 16:29:39 -04:00
var ret = resource !== null
? this.doDispose(resource, inspection) : null;
2015-02-25 13:53:04 -05:00
if (context !== undefined) context._popContext();
2014-10-01 16:29:39 -04:00
this._promise._unsetDisposable();
2015-02-25 13:53:04 -05:00
this._data = null;
2014-10-01 16:29:39 -04:00
return ret;
};
2015-02-25 13:53:04 -05:00
Disposer.isDisposer = function (d) {
2014-10-01 16:29:39 -04:00
return (d != null &&
typeof d.resource === "function" &&
typeof d.tryDispose === "function");
};
2015-02-25 13:53:04 -05:00
function FunctionDisposer(fn, promise, context) {
this.constructor$(fn, promise, context);
2014-10-01 16:29:39 -04:00
}
inherits(FunctionDisposer, Disposer);
FunctionDisposer.prototype.doDispose = function (resource, inspection) {
var fn = this.data();
return fn.call(resource, resource, inspection);
};
2015-02-25 13:53:04 -05:00
function maybeUnwrapDisposer(value) {
if (Disposer.isDisposer(value)) {
this.resources[this.index]._setDisposable(value);
return value.promise();
}
return value;
}
Promise.using = function () {
2014-10-01 16:29:39 -04:00
var len = arguments.length;
if (len < 2) return apiRejection(
"you must pass at least 2 arguments to Promise.using");
var fn = arguments[len - 1];
2015-02-25 13:53:04 -05:00
if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
2014-10-01 16:29:39 -04:00
len--;
var resources = new Array(len);
for (var i = 0; i < len; ++i) {
var resource = arguments[i];
if (Disposer.isDisposer(resource)) {
var disposer = resource;
resource = resource.promise();
resource._setDisposable(disposer);
2015-02-25 13:53:04 -05:00
} else {
var maybePromise = tryConvertToPromise(resource);
if (maybePromise instanceof Promise) {
resource =
maybePromise._then(maybeUnwrapDisposer, null, null, {
resources: resources,
index: i
}, undefined);
}
2014-10-01 16:29:39 -04:00
}
resources[i] = resource;
}
2015-02-25 13:53:04 -05:00
var promise = Promise.settle(resources)
2014-10-01 16:29:39 -04:00
.then(inspectionMapper)
2015-02-25 13:53:04 -05:00
.then(function(vals) {
promise._pushContext();
var ret;
try {
ret = fn.apply(undefined, vals);
} finally {
promise._popContext();
}
return ret;
})
._then(
disposerSuccess, disposerFail, undefined, resources, undefined);
resources.promise = promise;
return promise;
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype._setDisposable = function (disposer) {
2014-10-01 16:29:39 -04:00
this._bitField = this._bitField | 262144;
this._disposer = disposer;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._isDisposable = function () {
2014-10-01 16:29:39 -04:00
return (this._bitField & 262144) > 0;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._getDisposer = function () {
2014-10-01 16:29:39 -04:00
return this._disposer;
};
2015-02-25 13:53:04 -05:00
Promise.prototype._unsetDisposable = function () {
2014-10-01 16:29:39 -04:00
this._bitField = this._bitField & (~262144);
2015-02-25 13:53:04 -05:00
this._disposer = undefined;
2014-10-01 16:29:39 -04:00
};
2015-02-25 13:53:04 -05:00
Promise.prototype.disposer = function (fn) {
2014-10-01 16:29:39 -04:00
if (typeof fn === "function") {
2015-02-25 13:53:04 -05:00
return new FunctionDisposer(fn, this, createContext());
2014-10-01 16:29:39 -04:00
}
throw new TypeError();
};
};
2015-02-25 13:53:04 -05:00
},{"./errors.js":52,"./util.js":77}],77:[function(require,module,exports){
(function (process){
2014-10-01 16:29:39 -04:00
"use strict";
var es5 = require("./es5.js");
2015-02-25 13:53:04 -05:00
var canEvaluate = typeof navigator == "undefined";
2014-10-01 16:29:39 -04:00
var haveGetters = (function(){
try {
var o = {};
es5.defineProperty(o, "f", {
get: function () {
return 3;
}
});
return o.f === 3;
}
catch (e) {
return false;
}
})();
2015-02-25 13:53:04 -05:00
var errorObj = {e: {}};
var tryCatchTarget;
function tryCatcher() {
try {
return tryCatchTarget.apply(this, arguments);
} catch (e) {
2014-10-01 16:29:39 -04:00
errorObj.e = e;
return errorObj;
}
}
2015-02-25 13:53:04 -05:00
function tryCatch(fn) {
tryCatchTarget = fn;
return tryCatcher;
2014-10-01 16:29:39 -04:00
}
var inherits = function(Child, Parent) {
var hasProp = {}.hasOwnProperty;
function T() {
this.constructor = Child;
this.constructor$ = Parent;
2014-07-10 22:41:24 -04:00
for (var propertyName in Parent.prototype) {
if (hasProp.call(Parent.prototype, propertyName) &&
propertyName.charAt(propertyName.length-1) !== "$"
) {
this[propertyName + "$"] = Parent.prototype[propertyName];
}
}
}
T.prototype = Parent.prototype;
Child.prototype = new T();
return Child.prototype;
};
function isPrimitive(val) {
return val == null || val === true || val === false ||
typeof val === "string" || typeof val === "number";
}
function isObject(value) {
return !isPrimitive(value);
}
function maybeWrapAsError(maybeError) {
if (!isPrimitive(maybeError)) return maybeError;
2015-02-25 13:53:04 -05:00
return new Error(safeToString(maybeError));
2014-07-10 22:41:24 -04:00
}
function withAppended(target, appendee) {
var len = target.length;
var ret = new Array(len + 1);
var i;
for (i = 0; i < len; ++i) {
ret[i] = target[i];
}
ret[i] = appendee;
return ret;
}
2014-10-01 16:29:39 -04:00
function getDataPropertyOrDefault(obj, key, defaultValue) {
if (es5.isES5) {
var desc = Object.getOwnPropertyDescriptor(obj, key);
if (desc != null) {
return desc.get == null && desc.set == null
? desc.value
: defaultValue;
}
} else {
2015-02-25 13:53:04 -05:00
return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
2014-10-01 16:29:39 -04:00
}
}
2014-07-10 22:41:24 -04:00
function notEnumerableProp(obj, name, value) {
if (isPrimitive(obj)) return obj;
var descriptor = {
value: value,
configurable: true,
enumerable: false,
writable: true
};
es5.defineProperty(obj, name, descriptor);
return obj;
}
var wrapsPrimitiveReceiver = (function() {
return this !== "string";
}).call("string");
function thrower(r) {
throw r;
}
2014-10-01 16:29:39 -04:00
var inheritedDataKeys = (function() {
if (es5.isES5) {
2015-02-25 13:53:04 -05:00
var oProto = Object.prototype;
var getKeys = Object.getOwnPropertyNames;
return function(obj) {
2014-10-01 16:29:39 -04:00
var ret = [];
var visitedKeys = Object.create(null);
2015-02-25 13:53:04 -05:00
while (obj != null && obj !== oProto) {
2014-10-01 16:29:39 -04:00
var keys;
try {
keys = getKeys(obj);
} catch (e) {
return ret;
}
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
if (visitedKeys[key]) continue;
visitedKeys[key] = true;
var desc = Object.getOwnPropertyDescriptor(obj, key);
if (desc != null && desc.get == null && desc.set == null) {
ret.push(key);
}
}
obj = es5.getPrototypeOf(obj);
}
return ret;
};
} else {
return function(obj) {
var ret = [];
/*jshint forin:false */
for (var key in obj) {
ret.push(key);
}
return ret;
};
}
})();
function isClass(fn) {
try {
if (typeof fn === "function") {
2015-02-25 13:53:04 -05:00
var keys = es5.names(fn.prototype);
if (es5.isES5) return keys.length > 1;
2014-10-01 16:29:39 -04:00
return keys.length > 0 &&
!(keys.length === 1 && keys[0] === "constructor");
}
return false;
} catch (e) {
return false;
}
}
2014-07-10 22:41:24 -04:00
function toFastProperties(obj) {
/*jshint -W027*/
function f() {}
f.prototype = obj;
return f;
eval(obj);
}
2014-10-01 16:29:39 -04:00
var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
return rident.test(str);
}
function filledRange(count, prefix, suffix) {
var ret = new Array(count);
for(var i = 0; i < count; ++i) {
ret[i] = prefix + i + suffix;
}
return ret;
}
2015-02-25 13:53:04 -05:00
function safeToString(obj) {
try {
return obj + "";
} catch (e) {
return "[no string representation]";
}
}
function markAsOriginatingFromRejection(e) {
try {
notEnumerableProp(e, "isOperational", true);
}
catch(ignore) {}
}
function originatesFromRejection(e) {
if (e == null) return false;
return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
e["isOperational"] === true);
}
function canAttachTrace(obj) {
return obj instanceof Error && es5.propertyIsWritable(obj, "stack");
}
var ensureErrorObject = (function() {
if (!("stack" in new Error())) {
return function(value) {
if (canAttachTrace(value)) return value;
try {throw new Error(safeToString(value));}
catch(err) {return err;}
};
} else {
return function(value) {
if (canAttachTrace(value)) return value;
return new Error(safeToString(value));
};
}
})();
function classString(obj) {
return {}.toString.call(obj);
}
function copyDescriptors(from, to, filter) {
var keys = es5.names(from);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
if (filter(key)) {
es5.defineProperty(to, key, es5.getDescriptor(from, key));
}
}
}
2014-07-10 22:41:24 -04:00
var ret = {
2014-10-01 16:29:39 -04:00
isClass: isClass,
isIdentifier: isIdentifier,
inheritedDataKeys: inheritedDataKeys,
getDataPropertyOrDefault: getDataPropertyOrDefault,
2014-07-10 22:41:24 -04:00
thrower: thrower,
isArray: es5.isArray,
haveGetters: haveGetters,
notEnumerableProp: notEnumerableProp,
isPrimitive: isPrimitive,
isObject: isObject,
canEvaluate: canEvaluate,
errorObj: errorObj,
2015-02-25 13:53:04 -05:00
tryCatch: tryCatch,
2014-07-10 22:41:24 -04:00
inherits: inherits,
withAppended: withAppended,
maybeWrapAsError: maybeWrapAsError,
wrapsPrimitiveReceiver: wrapsPrimitiveReceiver,
2014-10-01 16:29:39 -04:00
toFastProperties: toFastProperties,
2015-02-25 13:53:04 -05:00
filledRange: filledRange,
toString: safeToString,
canAttachTrace: canAttachTrace,
ensureErrorObject: ensureErrorObject,
originatesFromRejection: originatesFromRejection,
markAsOriginatingFromRejection: markAsOriginatingFromRejection,
classString: classString,
copyDescriptors: copyDescriptors,
isNode: typeof process !== "undefined" &&
classString(process).toLowerCase() === "[object process]"
2014-07-10 22:41:24 -04:00
};
2015-02-25 13:53:04 -05:00
try {throw new Error(); } catch (e) {ret.lastLineError = e;}
2014-07-10 22:41:24 -04:00
module.exports = ret;
2015-02-25 13:53:04 -05:00
}).call(this,require('_process'))
},{"./es5.js":53,"_process":84}],78:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
},{}],79:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/
2014-10-01 16:29:39 -04:00
var base64 = require('base64-js')
var ieee754 = require('ieee754')
var isArray = require('is-array')
2014-07-10 22:41:24 -04:00
exports.Buffer = Buffer
exports.SlowBuffer = Buffer
exports.INSPECT_MAX_BYTES = 50
2014-10-01 16:29:39 -04:00
Buffer.poolSize = 8192 // not used by this implementation
var kMaxLength = 0x3fffffff
2014-07-10 22:41:24 -04:00
/**
2014-10-01 16:29:39 -04:00
* If `Buffer.TYPED_ARRAY_SUPPORT`:
2014-07-10 22:41:24 -04:00
* === true Use Uint8Array implementation (fastest)
2014-10-01 16:29:39 -04:00
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Note:
*
* - Implementation must support adding new properties to `Uint8Array` instances.
* Firefox 4-29 lacked support, fixed in Firefox 30+.
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
*
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
* get the Object implementation, which is slower but will work correctly.
2014-07-10 22:41:24 -04:00
*/
2014-10-01 16:29:39 -04:00
Buffer.TYPED_ARRAY_SUPPORT = (function () {
2014-07-10 22:41:24 -04:00
try {
var buf = new ArrayBuffer(0)
var arr = new Uint8Array(buf)
arr.foo = function () { return 42 }
2014-10-01 16:29:39 -04:00
return 42 === arr.foo() && // typed array instances can be augmented
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
2014-07-10 22:41:24 -04:00
} catch (e) {
return false
}
})()
/**
* Class: Buffer
* =============
*
* The Buffer constructor returns instances of `Uint8Array` that are augmented
* with function properties for all the node `Buffer` API functions. We use
* `Uint8Array` so that square bracket notation works as expected -- it returns
* a single octet.
*
* By augmenting the instances, we can avoid modifying the `Uint8Array`
* prototype.
*/
function Buffer (subject, encoding, noZero) {
if (!(this instanceof Buffer))
return new Buffer(subject, encoding, noZero)
var type = typeof subject
// Find the length
var length
if (type === 'number')
2014-10-01 16:29:39 -04:00
length = subject > 0 ? subject >>> 0 : 0
else if (type === 'string') {
if (encoding === 'base64')
subject = base64clean(subject)
2014-07-10 22:41:24 -04:00
length = Buffer.byteLength(subject, encoding)
2014-10-01 16:29:39 -04:00
} else if (type === 'object' && subject !== null) { // assume object is array-like
if (subject.type === 'Buffer' && isArray(subject.data))
subject = subject.data
length = +subject.length > 0 ? Math.floor(+subject.length) : 0
} else
throw new TypeError('must start with number, buffer, array or string')
if (this.length > kMaxLength)
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + kMaxLength.toString(16) + ' bytes')
2014-07-10 22:41:24 -04:00
var buf
2014-10-01 16:29:39 -04:00
if (Buffer.TYPED_ARRAY_SUPPORT) {
2014-07-10 22:41:24 -04:00
// Preferred: Return an augmented `Uint8Array` instance for best performance
buf = Buffer._augment(new Uint8Array(length))
} else {
// Fallback: Return THIS instance of Buffer (created by `new`)
buf = this
buf.length = length
buf._isBuffer = true
}
var i
2014-10-01 16:29:39 -04:00
if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') {
2014-07-10 22:41:24 -04:00
// Speed optimization -- use set if we're copying from a typed array
buf._set(subject)
} else if (isArrayish(subject)) {
// Treat array-ish objects as a byte array
if (Buffer.isBuffer(subject)) {
for (i = 0; i < length; i++)
buf[i] = subject.readUInt8(i)
} else {
for (i = 0; i < length; i++)
buf[i] = ((subject[i] % 256) + 256) % 256
}
} else if (type === 'string') {
buf.write(subject, 0, encoding)
2014-10-01 16:29:39 -04:00
} else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) {
2014-07-10 22:41:24 -04:00
for (i = 0; i < length; i++) {
buf[i] = 0
}
}
return buf
}
2014-10-01 16:29:39 -04:00
Buffer.isBuffer = function (b) {
return !!(b != null && b._isBuffer)
}
Buffer.compare = function (a, b) {
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b))
throw new TypeError('Arguments must be Buffers')
var x = a.length
var y = b.length
for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}
if (i !== len) {
x = a[i]
y = b[i]
}
if (x < y) return -1
if (y < x) return 1
return 0
}
2014-07-10 22:41:24 -04:00
Buffer.isEncoding = function (encoding) {
switch (String(encoding).toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'raw':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return true
default:
return false
}
}
Buffer.concat = function (list, totalLength) {
2014-10-01 16:29:39 -04:00
if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])')
2014-07-10 22:41:24 -04:00
if (list.length === 0) {
return new Buffer(0)
} else if (list.length === 1) {
return list[0]
}
var i
if (totalLength === undefined) {
totalLength = 0
for (i = 0; i < list.length; i++) {
totalLength += list[i].length
}
}
var buf = new Buffer(totalLength)
var pos = 0
for (i = 0; i < list.length; i++) {
var item = list[i]
item.copy(buf, pos)
pos += item.length
}
return buf
}
2014-10-01 16:29:39 -04:00
Buffer.byteLength = function (str, encoding) {
var ret
str = str + ''
switch (encoding || 'utf8') {
case 'ascii':
case 'binary':
case 'raw':
ret = str.length
break
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
ret = str.length * 2
break
case 'hex':
ret = str.length >>> 1
break
case 'utf8':
case 'utf-8':
ret = utf8ToBytes(str).length
break
case 'base64':
ret = base64ToBytes(str).length
break
default:
ret = str.length
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
return ret
}
// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined
// toString(encoding, start=0, end=buffer.length)
Buffer.prototype.toString = function (encoding, start, end) {
var loweredCase = false
start = start >>> 0
end = end === undefined || end === Infinity ? this.length : end >>> 0
if (!encoding) encoding = 'utf8'
if (start < 0) start = 0
if (end > this.length) end = this.length
if (end <= start) return ''
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end)
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end)
case 'ascii':
return asciiSlice(this, start, end)
case 'binary':
return binarySlice(this, start, end)
case 'base64':
return base64Slice(this, start, end)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end)
default:
if (loweredCase)
throw new TypeError('Unknown encoding: ' + encoding)
encoding = (encoding + '').toLowerCase()
loweredCase = true
}
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
}
Buffer.prototype.equals = function (b) {
if(!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
return Buffer.compare(this, b) === 0
}
Buffer.prototype.inspect = function () {
var str = ''
var max = exports.INSPECT_MAX_BYTES
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
if (this.length > max)
str += ' ... '
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
return '<Buffer ' + str + '>'
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
Buffer.prototype.compare = function (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
return Buffer.compare(this, b)
}
// `get` will be removed in Node 0.13+
Buffer.prototype.get = function (offset) {
console.log('.get() is deprecated. Access using array indexes instead.')
return this.readUInt8(offset)
}
// `set` will be removed in Node 0.13+
Buffer.prototype.set = function (v, offset) {
console.log('.set() is deprecated. Access using array indexes instead.')
return this.writeUInt8(v, offset)
}
2014-07-10 22:41:24 -04:00
function hexWrite (buf, string, offset, length) {
offset = Number(offset) || 0
var remaining = buf.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
// must be an even number of digits
var strLen = string.length
2014-10-01 16:29:39 -04:00
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
2014-07-10 22:41:24 -04:00
if (length > strLen / 2) {
length = strLen / 2
}
for (var i = 0; i < length; i++) {
var byte = parseInt(string.substr(i * 2, 2), 16)
2014-10-01 16:29:39 -04:00
if (isNaN(byte)) throw new Error('Invalid hex string')
2014-07-10 22:41:24 -04:00
buf[offset + i] = byte
}
return i
}
function utf8Write (buf, string, offset, length) {
var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length)
return charsWritten
}
function asciiWrite (buf, string, offset, length) {
var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)
return charsWritten
}
function binaryWrite (buf, string, offset, length) {
return asciiWrite(buf, string, offset, length)
}
function base64Write (buf, string, offset, length) {
var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)
return charsWritten
}
function utf16leWrite (buf, string, offset, length) {
2015-02-25 13:53:04 -05:00
var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length, 2)
2014-07-10 22:41:24 -04:00
return charsWritten
}
Buffer.prototype.write = function (string, offset, length, encoding) {
// Support both (string, offset, length, encoding)
// and the legacy (string, encoding, offset, length)
if (isFinite(offset)) {
if (!isFinite(length)) {
encoding = length
length = undefined
}
} else { // legacy
var swap = encoding
encoding = offset
offset = length
2014-10-01 16:29:39 -04:00
length = swap
}
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
offset = Number(offset) || 0
var remaining = this.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
2014-07-10 22:41:24 -04:00
encoding = String(encoding || 'utf8').toLowerCase()
var ret
switch (encoding) {
case 'hex':
2014-10-01 16:29:39 -04:00
ret = hexWrite(this, string, offset, length)
2014-07-10 22:41:24 -04:00
break
case 'utf8':
case 'utf-8':
2014-10-01 16:29:39 -04:00
ret = utf8Write(this, string, offset, length)
2014-07-10 22:41:24 -04:00
break
case 'ascii':
2014-10-01 16:29:39 -04:00
ret = asciiWrite(this, string, offset, length)
2014-07-10 22:41:24 -04:00
break
case 'binary':
2014-10-01 16:29:39 -04:00
ret = binaryWrite(this, string, offset, length)
2014-07-10 22:41:24 -04:00
break
case 'base64':
2014-10-01 16:29:39 -04:00
ret = base64Write(this, string, offset, length)
2014-07-10 22:41:24 -04:00
break
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
2014-10-01 16:29:39 -04:00
ret = utf16leWrite(this, string, offset, length)
2014-07-10 22:41:24 -04:00
break
default:
2014-10-01 16:29:39 -04:00
throw new TypeError('Unknown encoding: ' + encoding)
2014-07-10 22:41:24 -04:00
}
return ret
}
Buffer.prototype.toJSON = function () {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
}
}
function base64Slice (buf, start, end) {
if (start === 0 && end === buf.length) {
return base64.fromByteArray(buf)
} else {
return base64.fromByteArray(buf.slice(start, end))
}
}
function utf8Slice (buf, start, end) {
var res = ''
var tmp = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
if (buf[i] <= 0x7F) {
res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
tmp = ''
} else {
tmp += '%' + buf[i].toString(16)
}
}
return res + decodeUtf8Char(tmp)
}
function asciiSlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i])
}
return ret
}
function binarySlice (buf, start, end) {
return asciiSlice(buf, start, end)
}
function hexSlice (buf, start, end) {
var len = buf.length
if (!start || start < 0) start = 0
if (!end || end < 0 || end > len) end = len
var out = ''
for (var i = start; i < end; i++) {
out += toHex(buf[i])
}
return out
}
function utf16leSlice (buf, start, end) {
var bytes = buf.slice(start, end)
var res = ''
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
}
return res
}
Buffer.prototype.slice = function (start, end) {
var len = this.length
2014-10-01 16:29:39 -04:00
start = ~~start
end = end === undefined ? len : ~~end
if (start < 0) {
start += len;
if (start < 0)
start = 0
} else if (start > len) {
start = len
}
if (end < 0) {
end += len
if (end < 0)
end = 0
} else if (end > len) {
end = len
}
if (end < start)
end = start
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
if (Buffer.TYPED_ARRAY_SUPPORT) {
2014-07-10 22:41:24 -04:00
return Buffer._augment(this.subarray(start, end))
} else {
var sliceLen = end - start
var newBuf = new Buffer(sliceLen, undefined, true)
for (var i = 0; i < sliceLen; i++) {
newBuf[i] = this[i + start]
}
return newBuf
}
}
2014-10-01 16:29:39 -04:00
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset (offset, ext, length) {
if ((offset % 1) !== 0 || offset < 0)
throw new RangeError('offset is not uint')
if (offset + ext > length)
throw new RangeError('Trying to access beyond buffer length')
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readUInt8 = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 1, this.length)
2014-07-10 22:41:24 -04:00
return this[offset]
}
Buffer.prototype.readUInt16LE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 2, this.length)
return this[offset] | (this[offset + 1] << 8)
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readUInt16BE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 2, this.length)
return (this[offset] << 8) | this[offset + 1]
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readUInt32LE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 4, this.length)
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
return ((this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16)) +
(this[offset + 3] * 0x1000000)
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
Buffer.prototype.readUInt32BE = function (offset, noAssert) {
if (!noAssert)
checkOffset(offset, 4, this.length)
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
return (this[offset] * 0x1000000) +
((this[offset + 1] << 16) |
(this[offset + 2] << 8) |
this[offset + 3])
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
Buffer.prototype.readInt8 = function (offset, noAssert) {
if (!noAssert)
checkOffset(offset, 1, this.length)
if (!(this[offset] & 0x80))
return (this[offset])
return ((0xff - this[offset] + 1) * -1)
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readInt16LE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 2, this.length)
var val = this[offset] | (this[offset + 1] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readInt16BE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 2, this.length)
var val = this[offset + 1] | (this[offset] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readInt32LE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 4, this.length)
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
return (this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16) |
(this[offset + 3] << 24)
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
Buffer.prototype.readInt32BE = function (offset, noAssert) {
if (!noAssert)
checkOffset(offset, 4, this.length)
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
return (this[offset] << 24) |
(this[offset + 1] << 16) |
(this[offset + 2] << 8) |
(this[offset + 3])
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readFloatLE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, true, 23, 4)
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readFloatBE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, false, 23, 4)
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readDoubleLE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, true, 52, 8)
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.readDoubleBE = function (offset, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, false, 52, 8)
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function checkInt (buf, value, offset, ext, max, min) {
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
if (value > max || value < min) throw new TypeError('value is out of bounds')
if (offset + ext > buf.length) throw new TypeError('index out of range')
}
2014-07-10 22:41:24 -04:00
2014-10-01 16:29:39 -04:00
Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 1, 0xff, 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
2014-07-10 22:41:24 -04:00
this[offset] = value
return offset + 1
}
2014-10-01 16:29:39 -04:00
function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8
2014-07-10 22:41:24 -04:00
}
}
Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value
this[offset + 1] = (value >>> 8)
} else objectWriteUInt16(this, value, offset, true)
return offset + 2
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = value
} else objectWriteUInt16(this, value, offset, false)
return offset + 2
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
2014-07-10 22:41:24 -04:00
}
}
Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = (value >>> 24)
this[offset + 2] = (value >>> 16)
this[offset + 1] = (value >>> 8)
this[offset] = value
} else objectWriteUInt32(this, value, offset, true)
return offset + 4
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = value
} else objectWriteUInt32(this, value, offset, false)
return offset + 4
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 1, 0x7f, -0x80)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
if (value < 0) value = 0xff + value + 1
this[offset] = value
2014-07-10 22:41:24 -04:00
return offset + 1
}
Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value
this[offset + 1] = (value >>> 8)
} else objectWriteUInt16(this, value, offset, true)
return offset + 2
2014-07-10 22:41:24 -04:00
}
Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
2014-10-01 16:29:39 -04:00
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = value
} else objectWriteUInt16(this, value, offset, false)
return offset + 2
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value
this[offset + 1] = (value >>> 8)
this[offset + 2] = (value >>> 16)
this[offset + 3] = (value >>> 24)
} else objectWriteUInt32(this, value, offset, true)
2014-07-10 22:41:24 -04:00
return offset + 4
}
2014-10-01 16:29:39 -04:00
Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
value = +value
offset = offset >>> 0
if (!noAssert)
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (value < 0) value = 0xffffffff + value + 1
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = value
} else objectWriteUInt32(this, value, offset, false)
return offset + 4
2014-07-10 22:41:24 -04:00
}
2014-10-01 16:29:39 -04:00
function checkIEEE754 (buf, value, offset, ext, max, min) {
if (value > max || value < min) throw new TypeError('value is out of bounds')
if (offset + ext > buf.length) throw new TypeError('index out of range')
2014-07-10 22:41:24 -04:00
}
function writeFloat (buf, value, offset, littleEndian, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
2014-07-10 22:41:24 -04:00
ieee754.write(buf, value, offset, littleEndian, 23, 4)
return offset + 4
}
Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert)
}
Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert)
}
function writeDouble (buf, value, offset, littleEndian, noAssert) {
2014-10-01 16:29:39 -04:00
if (!noAssert)
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
2014-07-10 22:41:24 -04:00
ieee754.write(buf, value, offset, littleEndian, 52, 8)
return offset + 8
}
Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert)
}
Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert)
}
2014-10-01 16:29:39 -04:00
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function (target, target_start, start, end) {
var source = this
if (!start) start = 0
if (!end && end !== 0) end = this.length
if (!target_start) target_start = 0
// Copy 0 bytes; we're done
if (end === start) return
if (target.length === 0 || source.length === 0) return
// Fatal error conditions
if (end < start) throw new TypeError('sourceEnd < sourceStart')
if (target_start < 0 || target_start >= target.length)
throw new TypeError('targetStart out of bounds')
if (start < 0 || start >= source.length) throw new TypeError('sourceStart out of bounds')
if (end < 0 || end > source.length) throw new TypeError('sourceEnd out of bounds')
// Are we oob?
if (end > this.length)
end = this.length
if (target.length - target_start < end - start)
end = target.length - target_start + start
var len = end - start
2015-02-25 13:53:04 -05:00
if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
2014-10-01 16:29:39 -04:00
for (var i = 0; i < len; i++) {
target[i + target_start] = this[i + start]
}
} else {
target._set(this.subarray(start, start + len), target_start)
}
}
2014-07-10 22:41:24 -04:00
// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function (value, start, end) {
if (!value) value = 0
if (!start) start = 0
if (!end) end = this.length
2014-10-01 16:29:39 -04:00
if (end < start) throw new TypeError('end < start')
2014-07-10 22:41:24 -04:00
// Fill 0 bytes; we're done
if (end === start) return
if (this.length === 0) return
2014-10-01 16:29:39 -04:00
if (start < 0 || start >= this.length) throw new TypeError('start out of bounds')
if (end < 0 || end > this.length) throw new TypeError('end out of bounds')
2014-07-10 22:41:24 -04:00
var i
if (typeof value === 'number') {
for (i = start; i < end; i++) {
this[i] = value
}
} else {
var bytes = utf8ToBytes(value.toString())
var len = bytes.length
for (i = start; i < end; i++) {
this[i] = bytes[i % len]
}
}
return this
}
/**
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
*/
Buffer.prototype.toArrayBuffer = function () {
if (typeof Uint8Array !== 'undefined') {
2014-10-01 16:29:39 -04:00
if (Buffer.TYPED_ARRAY_SUPPORT) {
2014-07-10 22:41:24 -04:00
return (new Buffer(this)).buffer
} else {
var buf = new Uint8Array(this.length)
for (var i = 0, len = buf.length; i < len; i += 1) {
buf[i] = this[i]
}
return buf.buffer
}
} else {
2014-10-01 16:29:39 -04:00
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
2014-07-10 22:41:24 -04:00
}
}
// HELPER FUNCTIONS
// ================
var BP = Buffer.prototype
/**
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
*/
Buffer._augment = function (arr) {
2015-02-25 13:53:04 -05:00
arr.constructor = Buffer
2014-07-10 22:41:24 -04:00
arr._isBuffer = true
// save reference to original Uint8Array get/set methods before overwriting
arr._get = arr.get
arr._set = arr.set
// deprecated, will be removed in node 0.13+
arr.get = BP.get
arr.set = BP.set
arr.write = BP.write
arr.toString = BP.toString
arr.toLocaleString = BP.toString
arr.toJSON = BP.toJSON
arr.equals = BP.equals
arr.compare = BP.compare
arr.copy = BP.copy
arr.slice = BP.slice
arr.readUInt8 = BP.readUInt8
arr.readUInt16LE = BP.readUInt16LE
arr.readUInt16BE = BP.readUInt16BE
arr.readUInt32LE = BP.readUInt32LE
arr.readUInt32BE = BP.readUInt32BE
arr.readInt8 = BP.readInt8
arr.readInt16LE = BP.readInt16LE
arr.readInt16BE = BP.readInt16BE
arr.readInt32LE = BP.readInt32LE
arr.readInt32BE = BP.readInt32BE
arr.readFloatLE = BP.readFloatLE
arr.readFloatBE = BP.readFloatBE
arr.readDoubleLE = BP.readDoubleLE
arr.readDoubleBE = BP.readDoubleBE
arr.writeUInt8 = BP.writeUInt8
arr.writeUInt16LE = BP.writeUInt16LE
arr.writeUInt16BE = BP.writeUInt16BE
arr.writeUInt32LE = BP.writeUInt32LE
arr.writeUInt32BE = BP.writeUInt32BE
arr.writeInt8 = BP.writeInt8
arr.writeInt16LE = BP.writeInt16LE
arr.writeInt16BE = BP.writeInt16BE
arr.writeInt32LE = BP.writeInt32LE
arr.writeInt32BE = BP.writeInt32BE
arr.writeFloatLE = BP.writeFloatLE
arr.writeFloatBE = BP.writeFloatBE
arr.writeDoubleLE = BP.writeDoubleLE
arr.writeDoubleBE = BP.writeDoubleBE
arr.fill = BP.fill
arr.inspect = BP.inspect
arr.toArrayBuffer = BP.toArrayBuffer
return arr
}
var INVALID_BASE64_RE = /[^+\/0-9A-z]/g
function base64clean (str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '='
}
return str
}
function stringtrim (str) {
if (str.trim) return str.trim()
return str.replace(/^\s+|\s+$/g, '')
}
function isArrayish (subject) {
return isArray(subject) || Buffer.isBuffer(subject) ||
subject && typeof subject === 'object' &&
typeof subject.length === 'number'
}
function toHex (n) {
if (n < 16) return '0' + n.toString(16)
return n.toString(16)
}
function utf8ToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
var b = str.charCodeAt(i)
if (b <= 0x7F) {
byteArray.push(b)
} else {
var start = i
if (b >= 0xD800 && b <= 0xDFFF) i++
var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%')
for (var j = 0; j < h.length; j++) {
byteArray.push(parseInt(h[j], 16))
}
}
}
return byteArray
}
function asciiToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF)
}
return byteArray
}
function utf16leToBytes (str) {
var c, hi, lo
var byteArray = []
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i)
hi = c >> 8
lo = c % 256
byteArray.push(lo)
byteArray.push(hi)
}
return byteArray
}
function base64ToBytes (str) {
return base64.toByteArray(str)
}
2015-02-25 13:53:04 -05:00
function blitBuffer (src, dst, offset, length, unitSize) {
if (unitSize) length -= length % unitSize;
2014-07-10 22:41:24 -04:00
for (var i = 0; i < length; i++) {
if ((i + offset >= dst.length) || (i >= src.length))
break
dst[i + offset] = src[i]
}
return i
}
function decodeUtf8Char (str) {
try {
return decodeURIComponent(str)
} catch (err) {
return String.fromCharCode(0xFFFD) // UTF 8 invalid char
}
}
2015-02-25 13:53:04 -05:00
},{"base64-js":80,"ieee754":81,"is-array":82}],80:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
;(function (exports) {
'use strict';
var Arr = (typeof Uint8Array !== 'undefined')
? Uint8Array
: Array
var PLUS = '+'.charCodeAt(0)
var SLASH = '/'.charCodeAt(0)
var NUMBER = '0'.charCodeAt(0)
var LOWER = 'a'.charCodeAt(0)
var UPPER = 'A'.charCodeAt(0)
function decode (elt) {
var code = elt.charCodeAt(0)
if (code === PLUS)
return 62 // '+'
if (code === SLASH)
return 63 // '/'
if (code < NUMBER)
return -1 //no match
if (code < NUMBER + 10)
return code - NUMBER + 26 + 26
if (code < UPPER + 26)
return code - UPPER
if (code < LOWER + 26)
return code - LOWER + 26
}
function b64ToByteArray (b64) {
var i, j, l, tmp, placeHolders, arr
if (b64.length % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
var len = b64.length
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
// base64 is 4/3 + up to two characters of the original data
arr = new Arr(b64.length * 3 / 4 - placeHolders)
// if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? b64.length - 4 : b64.length
var L = 0
function push (v) {
arr[L++] = v
}
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
push((tmp & 0xFF0000) >> 16)
push((tmp & 0xFF00) >> 8)
push(tmp & 0xFF)
}
if (placeHolders === 2) {
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
push(tmp & 0xFF)
} else if (placeHolders === 1) {
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
push((tmp >> 8) & 0xFF)
push(tmp & 0xFF)
}
return arr
}
function uint8ToBase64 (uint8) {
var i,
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
output = "",
temp, length
function encode (num) {
return lookup.charAt(num)
}
function tripletToBase64 (num) {
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
}
// go through the array every three bytes, we'll deal with trailing stuff later
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
output += tripletToBase64(temp)
}
// pad the end with zeros, but make sure to not forget the extra bytes
switch (extraBytes) {
case 1:
temp = uint8[uint8.length - 1]
output += encode(temp >> 2)
output += encode((temp << 4) & 0x3F)
output += '=='
break
case 2:
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
output += encode(temp >> 10)
output += encode((temp >> 4) & 0x3F)
output += encode((temp << 2) & 0x3F)
output += '='
break
}
return output
}
exports.toByteArray = b64ToByteArray
exports.fromByteArray = uint8ToBase64
}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
2015-02-25 13:53:04 -05:00
},{}],81:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
exports.read = function(buffer, offset, isLE, mLen, nBytes) {
var e, m,
eLen = nBytes * 8 - mLen - 1,
eMax = (1 << eLen) - 1,
eBias = eMax >> 1,
nBits = -7,
i = isLE ? (nBytes - 1) : 0,
d = isLE ? -1 : 1,
s = buffer[offset + i];
i += d;
e = s & ((1 << (-nBits)) - 1);
s >>= (-nBits);
nBits += eLen;
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);
m = e & ((1 << (-nBits)) - 1);
e >>= (-nBits);
nBits += mLen;
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);
if (e === 0) {
e = 1 - eBias;
} else if (e === eMax) {
return m ? NaN : ((s ? -1 : 1) * Infinity);
} else {
m = m + Math.pow(2, mLen);
e = e - eBias;
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
};
exports.write = function(buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c,
eLen = nBytes * 8 - mLen - 1,
eMax = (1 << eLen) - 1,
eBias = eMax >> 1,
rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
i = isLE ? 0 : (nBytes - 1),
d = isLE ? 1 : -1,
s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
value = Math.abs(value);
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0;
e = eMax;
} else {
e = Math.floor(Math.log(value) / Math.LN2);
if (value * (c = Math.pow(2, -e)) < 1) {
e--;
c *= 2;
}
if (e + eBias >= 1) {
value += rt / c;
} else {
value += rt * Math.pow(2, 1 - eBias);
}
if (value * c >= 2) {
e++;
c /= 2;
}
if (e + eBias >= eMax) {
m = 0;
e = eMax;
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen);
e = e + eBias;
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
e = 0;
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);
e = (e << mLen) | m;
eLen += mLen;
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);
buffer[offset + i - d] |= s * 128;
};
2015-02-25 13:53:04 -05:00
},{}],82:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
/**
* isArray
*/
var isArray = Array.isArray;
/**
* toString
*/
var str = Object.prototype.toString;
/**
* Whether or not the given `val`
* is an array.
*
* example:
*
* isArray([]);
* // > true
* isArray(arguments);
* // > false
* isArray('');
* // > false
*
* @param {mixed} val
* @return {bool}
*/
module.exports = isArray || function (val) {
return !! val && '[object Array]' == str.call(val);
};
2015-02-25 13:53:04 -05:00
},{}],83:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
function EventEmitter() {
this._events = this._events || {};
this._maxListeners = this._maxListeners || undefined;
}
module.exports = EventEmitter;
// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
EventEmitter.defaultMaxListeners = 10;
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function(n) {
if (!isNumber(n) || n < 0 || isNaN(n))
throw TypeError('n must be a positive number');
this._maxListeners = n;
return this;
};
EventEmitter.prototype.emit = function(type) {
var er, handler, len, args, i, listeners;
if (!this._events)
this._events = {};
// If there is no 'error' event listener then throw.
if (type === 'error') {
if (!this._events.error ||
(isObject(this._events.error) && !this._events.error.length)) {
er = arguments[1];
if (er instanceof Error) {
throw er; // Unhandled 'error' event
}
2014-10-01 16:29:39 -04:00
throw TypeError('Uncaught, unspecified "error" event.');
2014-07-10 22:41:24 -04:00
}
}
handler = this._events[type];
if (isUndefined(handler))
return false;
if (isFunction(handler)) {
switch (arguments.length) {
// fast cases
case 1:
handler.call(this);
break;
case 2:
handler.call(this, arguments[1]);
break;
case 3:
handler.call(this, arguments[1], arguments[2]);
break;
// slower
default:
len = arguments.length;
args = new Array(len - 1);
for (i = 1; i < len; i++)
args[i - 1] = arguments[i];
handler.apply(this, args);
}
} else if (isObject(handler)) {
len = arguments.length;
args = new Array(len - 1);
for (i = 1; i < len; i++)
args[i - 1] = arguments[i];
listeners = handler.slice();
len = listeners.length;
for (i = 0; i < len; i++)
listeners[i].apply(this, args);
}
return true;
};
EventEmitter.prototype.addListener = function(type, listener) {
var m;
if (!isFunction(listener))
throw TypeError('listener must be a function');
if (!this._events)
this._events = {};
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if (this._events.newListener)
this.emit('newListener', type,
isFunction(listener.listener) ?
listener.listener : listener);
if (!this._events[type])
// Optimize the case of one listener. Don't need the extra array object.
this._events[type] = listener;
else if (isObject(this._events[type]))
// If we've already got an array, just append.
this._events[type].push(listener);
else
// Adding the second element, need to change to array.
this._events[type] = [this._events[type], listener];
// Check for listener leak
if (isObject(this._events[type]) && !this._events[type].warned) {
var m;
if (!isUndefined(this._maxListeners)) {
m = this._maxListeners;
} else {
m = EventEmitter.defaultMaxListeners;
}
if (m && m > 0 && this._events[type].length > m) {
this._events[type].warned = true;
console.error('(node) warning: possible EventEmitter memory ' +
'leak detected. %d listeners added. ' +
'Use emitter.setMaxListeners() to increase limit.',
this._events[type].length);
if (typeof console.trace === 'function') {
// not supported in IE 10
console.trace();
}
}
}
return this;
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.once = function(type, listener) {
if (!isFunction(listener))
throw TypeError('listener must be a function');
var fired = false;
function g() {
this.removeListener(type, g);
if (!fired) {
fired = true;
listener.apply(this, arguments);
}
}
g.listener = listener;
this.on(type, g);
return this;
};
// emits a 'removeListener' event iff the listener was removed
EventEmitter.prototype.removeListener = function(type, listener) {
var list, position, length, i;
if (!isFunction(listener))
throw TypeError('listener must be a function');
if (!this._events || !this._events[type])
return this;
list = this._events[type];
length = list.length;
position = -1;
if (list === listener ||
(isFunction(list.listener) && list.listener === listener)) {
delete this._events[type];
if (this._events.removeListener)
this.emit('removeListener', type, listener);
} else if (isObject(list)) {
for (i = length; i-- > 0;) {
if (list[i] === listener ||
(list[i].listener && list[i].listener === listener)) {
position = i;
break;
}
}
if (position < 0)
return this;
if (list.length === 1) {
list.length = 0;
delete this._events[type];
} else {
list.splice(position, 1);
}
if (this._events.removeListener)
this.emit('removeListener', type, listener);
}
return this;
};
EventEmitter.prototype.removeAllListeners = function(type) {
var key, listeners;
if (!this._events)
return this;
// not listening for removeListener, no need to emit
if (!this._events.removeListener) {
if (arguments.length === 0)
this._events = {};
else if (this._events[type])
delete this._events[type];
return this;
}
// emit removeListener for all listeners on all events
if (arguments.length === 0) {
for (key in this._events) {
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = {};
return this;
}
listeners = this._events[type];
if (isFunction(listeners)) {
this.removeListener(type, listeners);
} else {
// LIFO order
while (listeners.length)
this.removeListener(type, listeners[listeners.length - 1]);
}
delete this._events[type];
return this;
};
EventEmitter.prototype.listeners = function(type) {
var ret;
if (!this._events || !this._events[type])
ret = [];
else if (isFunction(this._events[type]))
ret = [this._events[type]];
else
ret = this._events[type].slice();
return ret;
};
EventEmitter.listenerCount = function(emitter, type) {
var ret;
if (!emitter._events || !emitter._events[type])
ret = 0;
else if (isFunction(emitter._events[type]))
ret = 1;
else
ret = emitter._events[type].length;
return ret;
};
function isFunction(arg) {
return typeof arg === 'function';
}
function isNumber(arg) {
return typeof arg === 'number';
}
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
function isUndefined(arg) {
return arg === void 0;
}
2015-02-25 13:53:04 -05:00
},{}],84:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// shim for using process in browser
var process = module.exports = {};
process.nextTick = (function () {
var canSetImmediate = typeof window !== 'undefined'
&& window.setImmediate;
var canPost = typeof window !== 'undefined'
&& window.postMessage && window.addEventListener
;
if (canSetImmediate) {
return function (f) { return window.setImmediate(f) };
}
if (canPost) {
var queue = [];
window.addEventListener('message', function (ev) {
var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation();
if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);
return function nextTick(fn) {
queue.push(fn);
window.postMessage('process-tick', '*');
};
}
return function nextTick(fn) {
setTimeout(fn, 0);
};
})();
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
}
// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
2015-02-25 13:53:04 -05:00
},{}],85:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = Stream;
2014-10-01 16:29:39 -04:00
var EE = require('events').EventEmitter;
var inherits = require('inherits');
2014-07-10 22:41:24 -04:00
inherits(Stream, EE);
2014-10-01 16:29:39 -04:00
Stream.Readable = require('readable-stream/readable.js');
Stream.Writable = require('readable-stream/writable.js');
Stream.Duplex = require('readable-stream/duplex.js');
Stream.Transform = require('readable-stream/transform.js');
Stream.PassThrough = require('readable-stream/passthrough.js');
2014-07-10 22:41:24 -04:00
// Backwards-compat with node 0.4.x
Stream.Stream = Stream;
// old-style streams. Note that the pipe method (the only relevant
// part of this class) is overridden in the Readable class.
function Stream() {
EE.call(this);
}
Stream.prototype.pipe = function(dest, options) {
var source = this;
function ondata(chunk) {
if (dest.writable) {
if (false === dest.write(chunk) && source.pause) {
source.pause();
}
}
}
source.on('data', ondata);
function ondrain() {
if (source.readable && source.resume) {
source.resume();
}
}
dest.on('drain', ondrain);
// If the 'end' option is not supplied, dest.end() will be called when
// source gets the 'end' or 'close' events. Only dest.end() once.
if (!dest._isStdio && (!options || options.end !== false)) {
source.on('end', onend);
source.on('close', onclose);
}
var didOnEnd = false;
function onend() {
if (didOnEnd) return;
didOnEnd = true;
dest.end();
}
function onclose() {
if (didOnEnd) return;
didOnEnd = true;
if (typeof dest.destroy === 'function') dest.destroy();
}
// don't leave dangling pipes when there are errors.
function onerror(er) {
cleanup();
if (EE.listenerCount(this, 'error') === 0) {
throw er; // Unhandled stream error in pipe.
}
}
source.on('error', onerror);
dest.on('error', onerror);
// remove all the event listeners that were added.
function cleanup() {
source.removeListener('data', ondata);
dest.removeListener('drain', ondrain);
source.removeListener('end', onend);
source.removeListener('close', onclose);
source.removeListener('error', onerror);
dest.removeListener('error', onerror);
source.removeListener('end', cleanup);
source.removeListener('close', cleanup);
dest.removeListener('close', cleanup);
}
source.on('end', cleanup);
source.on('close', cleanup);
dest.on('close', cleanup);
dest.emit('pipe', source);
// Allow for unix-like usage: A.pipe(B).pipe(C)
return dest;
};
2015-02-25 13:53:04 -05:00
},{"events":83,"inherits":87,"readable-stream/duplex.js":89,"readable-stream/passthrough.js":98,"readable-stream/readable.js":99,"readable-stream/transform.js":100,"readable-stream/writable.js":101}],86:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// Generic Pool Redux
//
// Fork of https://github.com/coopernurse/node-pool
// with prototypes, api changes, and support for the client.
// License: MIT
// ------------------------------------------------
(function(define) {
"use strict";
2014-10-01 16:29:39 -04:00
define(function(require, exports, module) {
2014-07-10 22:41:24 -04:00
// Initialize arrays to hold queue elements.
var PriorityQueue = function(size) {
this.slots = [];
this.queueSize = Math.max(+size | 0, 1);
for (var i = 0; i < this.queueSize; i += 1) {
this.slots.push([]);
}
};
PriorityQueue.prototype = {
total: null,
// Calculates the size of the queue, and sets
// the value to total.
size: function() {
if (this.total === null) {
this.total = 0;
for (var i = 0; i < this.queueSize; i += 1) {
this.total += this.slots[i].length;
}
}
return this.total;
},
// Clears the cache for total and adds an
// object to the queue, based on an optional priority.
enqueue: function(obj, priority) {
priority = priority && +priority | 0 || 0;
this.total = null;
if (priority) {
var priorityOrig = priority;
if (priority < 0 || priority >= this.queueSize) {
priority = (this.size - 1);
}
}
this.slots[priority].push(obj);
},
// Clears the cache for total and removes an object
// from the queue.
dequeue: function() {
var obj = null, i, sl = this.slots.length;
this.total = null;
for (i = 0; i < sl; i += 1) {
if (this.slots[i].length) {
obj = this.slots[i].shift();
break;
}
}
return obj;
}
};
// Constructor for a new pool.
var Pool = function(options) {
if (!(this instanceof Pool)) return new Pool(options);
this.idleTimeoutMillis = options.idleTimeoutMillis || 30000;
this.reapInterval = options.reapIntervalMillis || 1000;
this.destroyHandler = options.destroy || function() {};
this.refreshIdle = ('refreshIdle' in options) ? options.refreshIdle : true;
this.availableObjects = [];
this.waitingClients = new PriorityQueue(options.priorityRange || 1);
this.create = options.create || (function() {
throw new Error('A create method must be defined for the connection pool.');
})();
// If a validate method is provided, use that instead of the default.
if (options.validate) this.validate = options.validate;
// Set the max & min's on the options.
var max = parseInt(options.max, 10);
var min = parseInt(options.min, 10);
this.max = Math.max(isNaN(max) ? 1 : max, 1);
this.min = Math.min(isNaN(min) ? 0 : min, this.max - 1);
// Ensure the minimum is created.
this.ensureMinimum();
};
Pool.prototype = {
count: 0,
draining: false,
removeIdleTimer: null,
removeIdleScheduled: false,
// Default validate.
validate: function() {
return true;
},
// Request a new client. The callback will be called,
// when a new client will be availabe, passing the client to it.
// Optionally, yoy may specify a priority of the caller if there are no
// available resources. Lower numbers mean higher priority.
acquire: function(callback, priority) {
if (this.draining) return callback(new Error("Pool is draining and cannot accept work"));
this.waitingClients.enqueue(callback, priority);
this.dispense();
return (this.count < this.max);
},
// Return the client to the pool, in case it is no longer required.
release: function(obj, callback) {
// Check to see if this object has already been released (i.e., is back in the pool of availableObjects)
if (this.availableObjects.some(function(objWithTimeout) {
return (objWithTimeout.obj === obj);
})) {
if (callback) callback(new Error('Release called multiple times on the same object'));
return;
}
var objWithTimeout = {
obj: obj,
timeout: (new Date().getTime() + this.idleTimeoutMillis)
};
this.availableObjects.push(objWithTimeout);
this.dispense();
this.scheduleRemoveIdle();
if (callback) callback(null);
},
// Try to get a new client to work, and clean up pool unused (idle) items.
//
// - If there are available clients waiting, shift the first one out (LIFO),
// and call its callback.
// - If there are no waiting clients, try to create one if it won't exceed
// the maximum number of clients.
// - If creating a new client would exceed the maximum, add the client to
// the wait list.
dispense: function() {
var obj = null,
objWithTimeout = null,
err = null,
clientCb = null,
waitingCount = this.waitingClients.size();
if (waitingCount > 0) {
while (this.availableObjects.length > 0) {
objWithTimeout = this.availableObjects[0];
if (!this.validate(objWithTimeout.obj)) {
this.destroy(objWithTimeout.obj);
continue;
}
this.availableObjects.shift();
clientCb = this.waitingClients.dequeue();
return clientCb(err, objWithTimeout.obj);
}
if (this.count < this.max) {
this.createResource();
}
}
},
// Disallow any new requests and let the request backlog dissapate,
// Setting the `draining` flag so as to let any additional work on the queue
// dissapate.
drain: function(callback) {
this.draining = true;
var pool = this;
var checking = function() {
if (pool.waitingClients.size() > 0 || pool.availableObjects.length != pool.count) {
setTimeout(checking, 100);
} else {
if (callback) callback();
}
};
checking();
},
// Forcibly destroys all clients regardless of timeout. Intended to be
// invoked as part of a drain. Does not prevent the creation of new
// clients as a result of subsequent calls to acquire.
//
// Note that if this.min > 0, the pool will destroy all idle resources
// in the pool, but replace them with newly created resources up to the
// specified this.min value. If this is not desired, set this.min
// to zero before calling destroyAllNow()
destroyAllNow: function(callback) {
var willDie = this.availableObjects;
this.availableObjects = [];
var obj = willDie.shift();
while (obj !== null && obj !== undefined) {
this.destroy(obj.obj);
obj = willDie.shift();
}
this.removeIdleScheduled = false;
clearTimeout(this.removeIdleTimer);
if (callback) callback();
},
// Decorates a function to use a acquired client from the object pool when called.
pooled: function(decorated, priority) {
var pool = this;
return function() {
var callerArgs = arguments;
var callerCallback = callerArgs[callerArgs.length - 1];
var callerHasCallback = typeof callerCallback === 'function';
pool.acquire(function(err, client) {
if (err) {
if (callerHasCallback) callerCallback(err, null);
return;
}
var args = [client].concat(slice.call(callerArgs, 0, callerHasCallback ? -1 : undefined));
args.push(function() {
pool.release.call(pool, client);
if (callerHasCallback) callerCallback.apply(null, arguments);
});
decorated.apply(null, args);
}, priority);
};
},
// Request the client to be destroyed. The factory's destroy handler
// will also be called. This should be called within an acquire()
// block as an alternative to release().
destroy: function(obj) {
this.count -= 1;
this.availableObjects = this.availableObjects.filter(function(objWithTimeout) {
return (objWithTimeout.obj !== obj);
});
this.destroyHandler(obj);
this.ensureMinimum();
},
// Checks and removes the available (idle) clients that have timed out.
removeIdle: function() {
var toRemove = [],
now = new Date().getTime(),
i, availableLength, tr, timeout;
this.removeIdleScheduled = false;
// Go through the available (idle) items,
// check if they have timed out
for (i = 0, availableLength = this.availableObjects.length; i < availableLength && (this.refreshIdle || (this.count - this.min > toRemove.length)); i += 1) {
timeout = this.availableObjects[i].timeout;
if (now >= timeout) {
// Client timed out, so destroy it.
toRemove.push(this.availableObjects[i].obj);
}
}
for (i = 0, tr = toRemove.length; i < tr; i += 1) {
this.destroy(toRemove[i]);
}
// Replace the available items with the ones to keep.
availableLength = this.availableObjects.length;
if (availableLength > 0) {
this.scheduleRemoveIdle();
}
},
// Schedule removal of idle items in the pool.
// More schedules cannot run concurrently.
scheduleRemoveIdle: function() {
if (!this.removeIdleScheduled) {
this.removeIdleScheduled = true;
var pool = this;
this.removeIdleTimer = setTimeout(function() {
pool.removeIdle.call(pool);
}, this.reapInterval);
}
},
// Creates a new resource, adding an object to the pool
createResource: function() {
var pool = this;
this.count += 1;
this.create(function(err, obj) {
var clientCb = pool.waitingClients.dequeue();
if (err) {
pool.count -= 1;
if (clientCb) clientCb(err, null);
setTimeout(function() {
pool.dispense.call(pool);
}, 0);
} else {
if (clientCb) return clientCb(null, obj);
pool.release(obj);
}
});
},
// If the client isn't in the process of draining, this ensures
// that the minimum number of resources are always around.
ensureMinimum: function() {
var i, diff;
if (!this.draining && (this.count < this.min)) {
diff = this.min - this.count;
for (i = 0; i < diff; i++) {
this.createResource();
}
}
}
};
var slice = Array.prototype.slice;
module.exports = {
// Export the `Pool` constructor.
Pool: Pool,
// Export the PriorityQueue constructor, in case anyone wants to fiddle with that.
PriorityQueue: PriorityQueue
};
});
})(
2014-10-01 16:29:39 -04:00
typeof define === 'function' && define.amd ? define : function (factory) { factory(require, exports, module); }
2014-07-10 22:41:24 -04:00
);
2015-02-25 13:53:04 -05:00
},{}],87:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
if (typeof Object.create === 'function') {
// implementation from standard node.js 'util' module
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
} else {
// old school shim for old browsers
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
}
}
2015-02-25 13:53:04 -05:00
},{}],88:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
(function (global){
/**
* @license
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
* Build: `lodash modern -o ./dist/lodash.js`
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
* Available under MIT license <http://lodash.com/license>
*/
;(function() {
/** Used as a safe reference for `undefined` in pre ES5 environments */
var undefined;
/** Used to pool arrays and objects used internally */
var arrayPool = [],
objectPool = [];
/** Used to generate unique IDs */
var idCounter = 0;
/** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
var keyPrefix = +new Date + '';
/** Used as the size when optimizations are enabled for large arrays */
var largeArraySize = 75;
/** Used as the max size of the `arrayPool` and `objectPool` */
var maxPoolSize = 40;
/** Used to detect and test whitespace */
var whitespace = (
// whitespace
' \t\x0B\f\xA0\ufeff' +
// line terminators
'\n\r\u2028\u2029' +
// unicode category "Zs" space separators
'\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
);
/** Used to match empty string literals in compiled template source */
var reEmptyStringLeading = /\b__p \+= '';/g,
reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
/**
* Used to match ES6 template delimiters
* http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals
*/
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
/** Used to match regexp flags from their coerced string values */
var reFlags = /\w*$/;
/** Used to detected named functions */
var reFuncName = /^\s*function[ \n\r\t]+\w/;
/** Used to match "interpolate" template delimiters */
var reInterpolate = /<%=([\s\S]+?)%>/g;
/** Used to match leading whitespace and zeros to be removed */
var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');
/** Used to ensure capturing order of template delimiters */
var reNoMatch = /($^)/;
/** Used to detect functions containing a `this` reference */
var reThis = /\bthis\b/;
/** Used to match unescaped characters in compiled string literals */
var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
/** Used to assign default `context` object properties */
var contextProps = [
'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',
'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',
'parseInt', 'setTimeout'
];
/** Used to make template sourceURLs easier to identify */
var templateCounter = 0;
/** `Object#toString` result shortcuts */
var argsClass = '[object Arguments]',
arrayClass = '[object Array]',
boolClass = '[object Boolean]',
dateClass = '[object Date]',
funcClass = '[object Function]',
numberClass = '[object Number]',
objectClass = '[object Object]',
regexpClass = '[object RegExp]',
stringClass = '[object String]';
/** Used to identify object classifications that `_.clone` supports */
var cloneableClasses = {};
cloneableClasses[funcClass] = false;
cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
cloneableClasses[boolClass] = cloneableClasses[dateClass] =
cloneableClasses[numberClass] = cloneableClasses[objectClass] =
cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
/** Used as an internal `_.debounce` options object */
var debounceOptions = {
'leading': false,
'maxWait': 0,
'trailing': false
};
/** Used as the property descriptor for `__bindData__` */
var descriptor = {
'configurable': false,
'enumerable': false,
'value': null,
'writable': false
};
/** Used to determine if values are of the language type Object */
var objectTypes = {
'boolean': false,
'function': true,
'object': true,
'number': false,
'string': false,
'undefined': false
};
/** Used to escape characters for inclusion in compiled string literals */
var stringEscapes = {
'\\': '\\',
"'": "'",
'\n': 'n',
'\r': 'r',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
/** Used as a reference to the global object */
var root = (objectTypes[typeof window] && window) || this;
/** Detect free variable `exports` */
var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
/** Detect free variable `module` */
var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
/** Detect the popular CommonJS extension `module.exports` */
var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
/** Detect free variable `global` from Node.js or Browserified code and use it as `root` */
var freeGlobal = objectTypes[typeof global] && global;
if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
root = freeGlobal;
}
/*--------------------------------------------------------------------------*/
/**
* The base implementation of `_.indexOf` without support for binary searches
* or `fromIndex` constraints.
*
* @private
* @param {Array} array The array to search.
* @param {*} value The value to search for.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the matched value or `-1`.
*/
function baseIndexOf(array, value, fromIndex) {
var index = (fromIndex || 0) - 1,
length = array ? array.length : 0;
while (++index < length) {
if (array[index] === value) {
return index;
}
}
return -1;
}
/**
* An implementation of `_.contains` for cache objects that mimics the return
* signature of `_.indexOf` by returning `0` if the value is found, else `-1`.
*
* @private
* @param {Object} cache The cache object to inspect.
* @param {*} value The value to search for.
* @returns {number} Returns `0` if `value` is found, else `-1`.
*/
function cacheIndexOf(cache, value) {
var type = typeof value;
cache = cache.cache;
if (type == 'boolean' || value == null) {
return cache[value] ? 0 : -1;
}
if (type != 'number' && type != 'string') {
type = 'object';
}
var key = type == 'number' ? value : keyPrefix + value;
cache = (cache = cache[type]) && cache[key];
return type == 'object'
? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
: (cache ? 0 : -1);
}
/**
* Adds a given value to the corresponding cache object.
*
* @private
* @param {*} value The value to add to the cache.
*/
function cachePush(value) {
var cache = this.cache,
type = typeof value;
if (type == 'boolean' || value == null) {
cache[value] = true;
} else {
if (type != 'number' && type != 'string') {
type = 'object';
}
var key = type == 'number' ? value : keyPrefix + value,
typeCache = cache[type] || (cache[type] = {});
if (type == 'object') {
(typeCache[key] || (typeCache[key] = [])).push(value);
} else {
typeCache[key] = true;
}
}
}
/**
* Used by `_.max` and `_.min` as the default callback when a given
* collection is a string value.
*
* @private
* @param {string} value The character to inspect.
* @returns {number} Returns the code unit of given character.
*/
function charAtCallback(value) {
return value.charCodeAt(0);
}
/**
* Used by `sortBy` to compare transformed `collection` elements, stable sorting
* them in ascending order.
*
* @private
* @param {Object} a The object to compare to `b`.
* @param {Object} b The object to compare to `a`.
* @returns {number} Returns the sort order indicator of `1` or `-1`.
*/
function compareAscending(a, b) {
var ac = a.criteria,
bc = b.criteria,
index = -1,
length = ac.length;
while (++index < length) {
var value = ac[index],
other = bc[index];
if (value !== other) {
if (value > other || typeof value == 'undefined') {
return 1;
}
if (value < other || typeof other == 'undefined') {
return -1;
}
}
}
// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
// that causes it, under certain circumstances, to return the same value for
// `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247
//
// This also ensures a stable sort in V8 and other engines.
// See http://code.google.com/p/v8/issues/detail?id=90
return a.index - b.index;
}
/**
* Creates a cache object to optimize linear searches of large arrays.
*
* @private
* @param {Array} [array=[]] The array to search.
* @returns {null|Object} Returns the cache object or `null` if caching should not be used.
*/
function createCache(array) {
var index = -1,
length = array.length,
first = array[0],
mid = array[(length / 2) | 0],
last = array[length - 1];
if (first && typeof first == 'object' &&
mid && typeof mid == 'object' && last && typeof last == 'object') {
return false;
}
var cache = getObject();
cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;
var result = getObject();
result.array = array;
result.cache = cache;
result.push = cachePush;
while (++index < length) {
result.push(array[index]);
}
return result;
}
/**
* Used by `template` to escape characters for inclusion in compiled
* string literals.
*
* @private
* @param {string} match The matched character to escape.
* @returns {string} Returns the escaped character.
*/
function escapeStringChar(match) {
return '\\' + stringEscapes[match];
}
/**
* Gets an array from the array pool or creates a new one if the pool is empty.
*
* @private
* @returns {Array} The array from the pool.
*/
function getArray() {
return arrayPool.pop() || [];
}
/**
* Gets an object from the object pool or creates a new one if the pool is empty.
*
* @private
* @returns {Object} The object from the pool.
*/
function getObject() {
return objectPool.pop() || {
'array': null,
'cache': null,
'criteria': null,
'false': false,
'index': 0,
'null': false,
'number': null,
'object': null,
'push': null,
'string': null,
'true': false,
'undefined': false,
'value': null
};
}
/**
* Releases the given array back to the array pool.
*
* @private
* @param {Array} [array] The array to release.
*/
function releaseArray(array) {
array.length = 0;
if (arrayPool.length < maxPoolSize) {
arrayPool.push(array);
}
}
/**
* Releases the given object back to the object pool.
*
* @private
* @param {Object} [object] The object to release.
*/
function releaseObject(object) {
var cache = object.cache;
if (cache) {
releaseObject(cache);
}
object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;
if (objectPool.length < maxPoolSize) {
objectPool.push(object);
}
}
/**
* Slices the `collection` from the `start` index up to, but not including,
* the `end` index.
*
* Note: This function is used instead of `Array#slice` to support node lists
* in IE < 9 and to ensure dense arrays are returned.
*
* @private
* @param {Array|Object|string} collection The collection to slice.
* @param {number} start The start index.
* @param {number} end The end index.
* @returns {Array} Returns the new array.
*/
function slice(array, start, end) {
start || (start = 0);
if (typeof end == 'undefined') {
end = array ? array.length : 0;
}
var index = -1,
length = end - start || 0,
result = Array(length < 0 ? 0 : length);
while (++index < length) {
result[index] = array[start + index];
}
return result;
}
/*--------------------------------------------------------------------------*/
/**
* Create a new `lodash` function using the given context object.
*
* @static
* @memberOf _
* @category Utilities
* @param {Object} [context=root] The context object.
* @returns {Function} Returns the `lodash` function.
*/
function runInContext(context) {
// Avoid issues with some ES3 environments that attempt to use values, named
// after built-in constructors like `Object`, for the creation of literals.
// ES5 clears this up by stating that literals must use built-in constructors.
// See http://es5.github.io/#x11.1.5.
context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
/** Native constructor references */
var Array = context.Array,
Boolean = context.Boolean,
Date = context.Date,
Function = context.Function,
Math = context.Math,
Number = context.Number,
Object = context.Object,
RegExp = context.RegExp,
String = context.String,
TypeError = context.TypeError;
/**
* Used for `Array` method references.
*
* Normally `Array.prototype` would suffice, however, using an array literal
* avoids issues in Narwhal.
*/
var arrayRef = [];
/** Used for native method references */
var objectProto = Object.prototype;
/** Used to restore the original `_` reference in `noConflict` */
var oldDash = context._;
/** Used to resolve the internal [[Class]] of values */
var toString = objectProto.toString;
/** Used to detect if a method is native */
var reNative = RegExp('^' +
String(toString)
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
.replace(/toString| for [^\]]+/g, '.*?') + '$'
);
/** Native method shortcuts */
var ceil = Math.ceil,
clearTimeout = context.clearTimeout,
floor = Math.floor,
fnToString = Function.prototype.toString,
getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
hasOwnProperty = objectProto.hasOwnProperty,
push = arrayRef.push,
setTimeout = context.setTimeout,
splice = arrayRef.splice,
unshift = arrayRef.unshift;
/** Used to set meta data on functions */
var defineProperty = (function() {
// IE 8 only accepts DOM elements
try {
var o = {},
func = isNative(func = Object.defineProperty) && func,
result = func(o, o, o) && func;
} catch(e) { }
return result;
}());
/* Native method shortcuts for methods with the same name as other `lodash` methods */
var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
nativeIsFinite = context.isFinite,
nativeIsNaN = context.isNaN,
nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
nativeMax = Math.max,
nativeMin = Math.min,
nativeParseInt = context.parseInt,
nativeRandom = Math.random;
/** Used to lookup a built-in constructor by [[Class]] */
var ctorByClass = {};
ctorByClass[arrayClass] = Array;
ctorByClass[boolClass] = Boolean;
ctorByClass[dateClass] = Date;
ctorByClass[funcClass] = Function;
ctorByClass[objectClass] = Object;
ctorByClass[numberClass] = Number;
ctorByClass[regexpClass] = RegExp;
ctorByClass[stringClass] = String;
/*--------------------------------------------------------------------------*/
/**
* Creates a `lodash` object which wraps the given value to enable intuitive
* method chaining.
*
* In addition to Lo-Dash methods, wrappers also have the following `Array` methods:
* `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,
* and `unshift`
*
* Chaining is supported in custom builds as long as the `value` method is
* implicitly or explicitly included in the build.
*
* The chainable wrapper functions are:
* `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
* `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
* `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
* `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
* `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
* `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
* `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
* `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
* `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
* `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
* and `zip`
*
* The non-chainable wrapper functions are:
* `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
* `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,
* `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
* `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,
* `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,
* `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,
* `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,
* `template`, `unescape`, `uniqueId`, and `value`
*
* The wrapper functions `first` and `last` return wrapped values when `n` is
* provided, otherwise they return unwrapped values.
*
* Explicit chaining can be enabled by using the `_.chain` method.
*
* @name _
* @constructor
* @category Chaining
* @param {*} value The value to wrap in a `lodash` instance.
* @returns {Object} Returns a `lodash` instance.
* @example
*
* var wrapped = _([1, 2, 3]);
*
* // returns an unwrapped value
* wrapped.reduce(function(sum, num) {
* return sum + num;
* });
* // => 6
*
* // returns a wrapped value
* var squares = wrapped.map(function(num) {
* return num * num;
* });
*
* _.isArray(squares);
* // => false
*
* _.isArray(squares.value());
* // => true
*/
function lodash(value) {
// don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
? value
: new lodashWrapper(value);
}
/**
* A fast path for creating `lodash` wrapper objects.
*
* @private
* @param {*} value The value to wrap in a `lodash` instance.
* @param {boolean} chainAll A flag to enable chaining for all methods
* @returns {Object} Returns a `lodash` instance.
*/
function lodashWrapper(value, chainAll) {
this.__chain__ = !!chainAll;
this.__wrapped__ = value;
}
// ensure `new lodashWrapper` is an instance of `lodash`
lodashWrapper.prototype = lodash.prototype;
/**
* An object used to flag environments features.
*
* @static
* @memberOf _
* @type Object
*/
var support = lodash.support = {};
/**
* Detect if functions can be decompiled by `Function#toString`
* (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
*
* @memberOf _.support
* @type boolean
*/
support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);
/**
* Detect if `Function#name` is supported (all but IE).
*
* @memberOf _.support
* @type boolean
*/
support.funcNames = typeof Function.name == 'string';
/**
* By default, the template delimiters used by Lo-Dash are similar to those in
* embedded Ruby (ERB). Change the following template settings to use alternative
* delimiters.
*
* @static
* @memberOf _
* @type Object
*/
lodash.templateSettings = {
/**
* Used to detect `data` property values to be HTML-escaped.
*
* @memberOf _.templateSettings
* @type RegExp
*/
'escape': /<%-([\s\S]+?)%>/g,
/**
* Used to detect code to be evaluated.
*
* @memberOf _.templateSettings
* @type RegExp
*/
'evaluate': /<%([\s\S]+?)%>/g,
/**
* Used to detect `data` property values to inject.
*
* @memberOf _.templateSettings
* @type RegExp
*/
'interpolate': reInterpolate,
/**
* Used to reference the data object in the template text.
*
* @memberOf _.templateSettings
* @type string
*/
'variable': '',
/**
* Used to import variables into the compiled template.
*
* @memberOf _.templateSettings
* @type Object
*/
'imports': {
/**
* A reference to the `lodash` function.
*
* @memberOf _.templateSettings.imports
* @type Function
*/
'_': lodash
}
};
/*--------------------------------------------------------------------------*/
/**
* The base implementation of `_.bind` that creates the bound function and
* sets its meta data.
*
* @private
* @param {Array} bindData The bind data array.
* @returns {Function} Returns the new bound function.
*/
function baseBind(bindData) {
var func = bindData[0],
partialArgs = bindData[2],
thisArg = bindData[4];
function bound() {
// `Function#bind` spec
// http://es5.github.io/#x15.3.4.5
if (partialArgs) {
// avoid `arguments` object deoptimizations by using `slice` instead
// of `Array.prototype.slice.call` and not assigning `arguments` to a
// variable as a ternary expression
var args = slice(partialArgs);
push.apply(args, arguments);
}
// mimic the constructor's `return` behavior
// http://es5.github.io/#x13.2.2
if (this instanceof bound) {
// ensure `new bound` is an instance of `func`
var thisBinding = baseCreate(func.prototype),
result = func.apply(thisBinding, args || arguments);
return isObject(result) ? result : thisBinding;
}
return func.apply(thisArg, args || arguments);
}
setBindData(bound, bindData);
return bound;
}
/**
* The base implementation of `_.clone` without argument juggling or support
* for `thisArg` binding.
*
* @private
* @param {*} value The value to clone.
* @param {boolean} [isDeep=false] Specify a deep clone.
* @param {Function} [callback] The function to customize cloning values.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates clones with source counterparts.
* @returns {*} Returns the cloned value.
*/
function baseClone(value, isDeep, callback, stackA, stackB) {
if (callback) {
var result = callback(value);
if (typeof result != 'undefined') {
return result;
}
}
// inspect [[Class]]
var isObj = isObject(value);
if (isObj) {
var className = toString.call(value);
if (!cloneableClasses[className]) {
return value;
}
var ctor = ctorByClass[className];
switch (className) {
case boolClass:
case dateClass:
return new ctor(+value);
case numberClass:
case stringClass:
return new ctor(value);
case regexpClass:
result = ctor(value.source, reFlags.exec(value));
result.lastIndex = value.lastIndex;
return result;
}
} else {
return value;
}
var isArr = isArray(value);
if (isDeep) {
// check for circular references and return corresponding clone
var initedStack = !stackA;
stackA || (stackA = getArray());
stackB || (stackB = getArray());
var length = stackA.length;
while (length--) {
if (stackA[length] == value) {
return stackB[length];
}
}
result = isArr ? ctor(value.length) : {};
}
else {
result = isArr ? slice(value) : assign({}, value);
}
// add array properties assigned by `RegExp#exec`
if (isArr) {
if (hasOwnProperty.call(value, 'index')) {
result.index = value.index;
}
if (hasOwnProperty.call(value, 'input')) {
result.input = value.input;
}
}
// exit for shallow clone
if (!isDeep) {
return result;
}
// add the source value to the stack of traversed objects
// and associate it with its clone
stackA.push(value);
stackB.push(result);
// recursively populate clone (susceptible to call stack limits)
(isArr ? forEach : forOwn)(value, function(objValue, key) {
result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
});
if (initedStack) {
releaseArray(stackA);
releaseArray(stackB);
}
return result;
}
/**
* The base implementation of `_.create` without support for assigning
* properties to the created object.
*
* @private
* @param {Object} prototype The object to inherit from.
* @returns {Object} Returns the new object.
*/
function baseCreate(prototype, properties) {
return isObject(prototype) ? nativeCreate(prototype) : {};
}
// fallback for browsers without `Object.create`
if (!nativeCreate) {
baseCreate = (function() {
function Object() {}
return function(prototype) {
if (isObject(prototype)) {
Object.prototype = prototype;
var result = new Object;
Object.prototype = null;
}
return result || context.Object();
};
}());
}
/**
* The base implementation of `_.createCallback` without support for creating
* "_.pluck" or "_.where" style callbacks.
*
* @private
* @param {*} [func=identity] The value to convert to a callback.
* @param {*} [thisArg] The `this` binding of the created callback.
* @param {number} [argCount] The number of arguments the callback accepts.
* @returns {Function} Returns a callback function.
*/
function baseCreateCallback(func, thisArg, argCount) {
if (typeof func != 'function') {
return identity;
}
// exit early for no `thisArg` or already bound by `Function#bind`
if (typeof thisArg == 'undefined' || !('prototype' in func)) {
return func;
}
var bindData = func.__bindData__;
if (typeof bindData == 'undefined') {
if (support.funcNames) {
bindData = !func.name;
}
bindData = bindData || !support.funcDecomp;
if (!bindData) {
var source = fnToString.call(func);
if (!support.funcNames) {
bindData = !reFuncName.test(source);
}
if (!bindData) {
// checks if `func` references the `this` keyword and stores the result
bindData = reThis.test(source);
setBindData(func, bindData);
}
}
}
// exit early if there are no `this` references or `func` is bound
if (bindData === false || (bindData !== true && bindData[1] & 1)) {
return func;
}
switch (argCount) {
case 1: return function(value) {
return func.call(thisArg, value);
};
case 2: return function(a, b) {
return func.call(thisArg, a, b);
};
case 3: return function(value, index, collection) {
return func.call(thisArg, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(thisArg, accumulator, value, index, collection);
};
}
return bind(func, thisArg);
}
/**
* The base implementation of `createWrapper` that creates the wrapper and
* sets its meta data.
*
* @private
* @param {Array} bindData The bind data array.
* @returns {Function} Returns the new function.
*/
function baseCreateWrapper(bindData) {
var func = bindData[0],
bitmask = bindData[1],
partialArgs = bindData[2],
partialRightArgs = bindData[3],
thisArg = bindData[4],
arity = bindData[5];
var isBind = bitmask & 1,
isBindKey = bitmask & 2,
isCurry = bitmask & 4,
isCurryBound = bitmask & 8,
key = func;
function bound() {
var thisBinding = isBind ? thisArg : this;
if (partialArgs) {
var args = slice(partialArgs);
push.apply(args, arguments);
}
if (partialRightArgs || isCurry) {
args || (args = slice(arguments));
if (partialRightArgs) {
push.apply(args, partialRightArgs);
}
if (isCurry && args.length < arity) {
bitmask |= 16 & ~32;
return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
}
}
args || (args = arguments);
if (isBindKey) {
func = thisBinding[key];
}
if (this instanceof bound) {
thisBinding = baseCreate(func.prototype);
var result = func.apply(thisBinding, args);
return isObject(result) ? result : thisBinding;
}
return func.apply(thisBinding, args);
}
setBindData(bound, bindData);
return bound;
}
/**
* The base implementation of `_.difference` that accepts a single array
* of values to exclude.
*
* @private
* @param {Array} array The array to process.
* @param {Array} [values] The array of values to exclude.
* @returns {Array} Returns a new array of filtered values.
*/
function baseDifference(array, values) {
var index = -1,
indexOf = getIndexOf(),
length = array ? array.length : 0,
isLarge = length >= largeArraySize && indexOf === baseIndexOf,
result = [];
if (isLarge) {
var cache = createCache(values);
if (cache) {
indexOf = cacheIndexOf;
values = cache;
} else {
isLarge = false;
}
}
while (++index < length) {
var value = array[index];
if (indexOf(values, value) < 0) {
result.push(value);
}
}
if (isLarge) {
releaseObject(values);
}
return result;
}
/**
* The base implementation of `_.flatten` without support for callback
* shorthands or `thisArg` binding.
*
* @private
* @param {Array} array The array to flatten.
* @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
* @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.
* @param {number} [fromIndex=0] The index to start from.
* @returns {Array} Returns a new flattened array.
*/
function baseFlatten(array, isShallow, isStrict, fromIndex) {
var index = (fromIndex || 0) - 1,
length = array ? array.length : 0,
result = [];
while (++index < length) {
var value = array[index];
if (value && typeof value == 'object' && typeof value.length == 'number'
&& (isArray(value) || isArguments(value))) {
// recursively flatten arrays (susceptible to call stack limits)
if (!isShallow) {
value = baseFlatten(value, isShallow, isStrict);
}
var valIndex = -1,
valLength = value.length,
resIndex = result.length;
result.length += valLength;
while (++valIndex < valLength) {
result[resIndex++] = value[valIndex];
}
} else if (!isStrict) {
result.push(value);
}
}
return result;
}
/**
* The base implementation of `_.isEqual`, without support for `thisArg` binding,
* that allows partial "_.where" style comparisons.
*
* @private
* @param {*} a The value to compare.
* @param {*} b The other value to compare.
* @param {Function} [callback] The function to customize comparing values.
* @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.
* @param {Array} [stackA=[]] Tracks traversed `a` objects.
* @param {Array} [stackB=[]] Tracks traversed `b` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {
// used to indicate that when comparing objects, `a` has at least the properties of `b`
if (callback) {
var result = callback(a, b);
if (typeof result != 'undefined') {
return !!result;
}
}
// exit early for identical values
if (a === b) {
// treat `+0` vs. `-0` as not equal
return a !== 0 || (1 / a == 1 / b);
}
var type = typeof a,
otherType = typeof b;
// exit early for unlike primitive values
if (a === a &&
!(a && objectTypes[type]) &&
!(b && objectTypes[otherType])) {
return false;
}
// exit early for `null` and `undefined` avoiding ES3's Function#call behavior
// http://es5.github.io/#x15.3.4.4
if (a == null || b == null) {
return a === b;
}
// compare [[Class]] names
var className = toString.call(a),
otherClass = toString.call(b);
if (className == argsClass) {
className = objectClass;
}
if (otherClass == argsClass) {
otherClass = objectClass;
}
if (className != otherClass) {
return false;
}
switch (className) {
case boolClass:
case dateClass:
// coerce dates and booleans to numbers, dates to milliseconds and booleans
// to `1` or `0` treating invalid dates coerced to `NaN` as not equal
return +a == +b;
case numberClass:
// treat `NaN` vs. `NaN` as equal
return (a != +a)
? b != +b
// but treat `+0` vs. `-0` as not equal
: (a == 0 ? (1 / a == 1 / b) : a == +b);
case regexpClass:
case stringClass:
// coerce regexes to strings (http://es5.github.io/#x15.10.6.4)
// treat string primitives and their corresponding object instances as equal
return a == String(b);
}
var isArr = className == arrayClass;
if (!isArr) {
// unwrap any `lodash` wrapped values
var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
bWrapped = hasOwnProperty.call(b, '__wrapped__');
if (aWrapped || bWrapped) {
return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);
}
// exit for functions and DOM nodes
if (className != objectClass) {
return false;
}
// in older versions of Opera, `arguments` objects have `Array` constructors
var ctorA = a.constructor,
ctorB = b.constructor;
// non `Object` object instances with different constructors are not equal
if (ctorA != ctorB &&
!(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
('constructor' in a && 'constructor' in b)
) {
return false;
}
}
// assume cyclic structures are equal
// the algorithm for detecting cyclic structures is adapted from ES 5.1
// section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)
var initedStack = !stackA;
stackA || (stackA = getArray());
stackB || (stackB = getArray());
var length = stackA.length;
while (length--) {
if (stackA[length] == a) {
return stackB[length] == b;
}
}
var size = 0;
result = true;
// add `a` and `b` to the stack of traversed objects
stackA.push(a);
stackB.push(b);
// recursively compare objects and arrays (susceptible to call stack limits)
if (isArr) {
// compare lengths to determine if a deep comparison is necessary
length = a.length;
size = b.length;
result = size == length;
if (result || isWhere) {
// deep compare the contents, ignoring non-numeric properties
while (size--) {
var index = length,
value = b[size];
if (isWhere) {
while (index--) {
if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {
break;
}
}
} else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {
break;
}
}
}
}
else {
// deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`
// which, in this case, is more costly
forIn(b, function(value, key, b) {
if (hasOwnProperty.call(b, key)) {
// count the number of properties.
size++;
// deep compare each property value.
return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));
}
});
if (result && !isWhere) {
// ensure both objects have the same number of properties
forIn(a, function(value, key, a) {
if (hasOwnProperty.call(a, key)) {
// `size` will be `-1` if `a` has more properties than `b`
return (result = --size > -1);
}
});
}
}
stackA.pop();
stackB.pop();
if (initedStack) {
releaseArray(stackA);
releaseArray(stackB);
}
return result;
}
/**
* The base implementation of `_.merge` without argument juggling or support
* for `thisArg` binding.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @param {Function} [callback] The function to customize merging properties.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates values with source counterparts.
*/
function baseMerge(object, source, callback, stackA, stackB) {
(isArray(source) ? forEach : forOwn)(source, function(source, key) {
var found,
isArr,
result = source,
value = object[key];
if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
// avoid merging previously merged cyclic sources
var stackLength = stackA.length;
while (stackLength--) {
if ((found = stackA[stackLength] == source)) {
value = stackB[stackLength];
break;
}
}
if (!found) {
var isShallow;
if (callback) {
result = callback(value, source);
if ((isShallow = typeof result != 'undefined')) {
value = result;
}
}
if (!isShallow) {
value = isArr
? (isArray(value) ? value : [])
: (isPlainObject(value) ? value : {});
}
// add `source` and associated `value` to the stack of traversed objects
stackA.push(source);
stackB.push(value);
// recursively merge objects and arrays (susceptible to call stack limits)
if (!isShallow) {
baseMerge(value, source, callback, stackA, stackB);
}
}
}
else {
if (callback) {
result = callback(value, source);
if (typeof result == 'undefined') {
result = source;
}
}
if (typeof result != 'undefined') {
value = result;
}
}
object[key] = value;
});
}
/**
* The base implementation of `_.random` without argument juggling or support
* for returning floating-point numbers.
*
* @private
* @param {number} min The minimum possible value.
* @param {number} max The maximum possible value.
* @returns {number} Returns a random number.
*/
function baseRandom(min, max) {
return min + floor(nativeRandom() * (max - min + 1));
}
/**
* The base implementation of `_.uniq` without support for callback shorthands
* or `thisArg` binding.
*
* @private
* @param {Array} array The array to process.
* @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
* @param {Function} [callback] The function called per iteration.
* @returns {Array} Returns a duplicate-value-free array.
*/
function baseUniq(array, isSorted, callback) {
var index = -1,
indexOf = getIndexOf(),
length = array ? array.length : 0,
result = [];
var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,
seen = (callback || isLarge) ? getArray() : result;
if (isLarge) {
var cache = createCache(seen);
indexOf = cacheIndexOf;
seen = cache;
}
while (++index < length) {
var value = array[index],
computed = callback ? callback(value, index, array) : value;
if (isSorted
? !index || seen[seen.length - 1] !== computed
: indexOf(seen, computed) < 0
) {
if (callback || isLarge) {
seen.push(computed);
}
result.push(value);
}
}
if (isLarge) {
releaseArray(seen.array);
releaseObject(seen);
} else if (callback) {
releaseArray(seen);
}
return result;
}
/**
* Creates a function that aggregates a collection, creating an object composed
* of keys generated from the results of running each element of the collection
* through a callback. The given `setter` function sets the keys and values
* of the composed object.
*
* @private
* @param {Function} setter The setter function.
* @returns {Function} Returns the new aggregator function.
*/
function createAggregator(setter) {
return function(collection, callback, thisArg) {
var result = {};
callback = lodash.createCallback(callback, thisArg, 3);
var index = -1,
length = collection ? collection.length : 0;
if (typeof length == 'number') {
while (++index < length) {
var value = collection[index];
setter(result, value, callback(value, index, collection), collection);
}
} else {
forOwn(collection, function(value, key, collection) {
setter(result, value, callback(value, key, collection), collection);
});
}
return result;
};
}
/**
* Creates a function that, when called, either curries or invokes `func`
* with an optional `this` binding and partially applied arguments.
*
* @private
* @param {Function|string} func The function or method name to reference.
* @param {number} bitmask The bitmask of method flags to compose.
* The bitmask may be composed of the following flags:
* 1 - `_.bind`
* 2 - `_.bindKey`
* 4 - `_.curry`
* 8 - `_.curry` (bound)
* 16 - `_.partial`
* 32 - `_.partialRight`
* @param {Array} [partialArgs] An array of arguments to prepend to those
* provided to the new function.
* @param {Array} [partialRightArgs] An array of arguments to append to those
* provided to the new function.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new function.
*/
function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
var isBind = bitmask & 1,
isBindKey = bitmask & 2,
isCurry = bitmask & 4,
isCurryBound = bitmask & 8,
isPartial = bitmask & 16,
isPartialRight = bitmask & 32;
if (!isBindKey && !isFunction(func)) {
throw new TypeError;
}
if (isPartial && !partialArgs.length) {
bitmask &= ~16;
isPartial = partialArgs = false;
}
if (isPartialRight && !partialRightArgs.length) {
bitmask &= ~32;
isPartialRight = partialRightArgs = false;
}
var bindData = func && func.__bindData__;
if (bindData && bindData !== true) {
// clone `bindData`
bindData = slice(bindData);
if (bindData[2]) {
bindData[2] = slice(bindData[2]);
}
if (bindData[3]) {
bindData[3] = slice(bindData[3]);
}
// set `thisBinding` is not previously bound
if (isBind && !(bindData[1] & 1)) {
bindData[4] = thisArg;
}
// set if previously bound but not currently (subsequent curried functions)
if (!isBind && bindData[1] & 1) {
bitmask |= 8;
}
// set curried arity if not yet set
if (isCurry && !(bindData[1] & 4)) {
bindData[5] = arity;
}
// append partial left arguments
if (isPartial) {
push.apply(bindData[2] || (bindData[2] = []), partialArgs);
}
// append partial right arguments
if (isPartialRight) {
unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
}
// merge flags
bindData[1] |= bitmask;
return createWrapper.apply(null, bindData);
}
// fast path for `_.bind`
var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
}
/**
* Used by `escape` to convert characters to HTML entities.
*
* @private
* @param {string} match The matched character to escape.
* @returns {string} Returns the escaped character.
*/
function escapeHtmlChar(match) {
return htmlEscapes[match];
}
/**
* Gets the appropriate "indexOf" function. If the `_.indexOf` method is
* customized, this method returns the custom method, otherwise it returns
* the `baseIndexOf` function.
*
* @private
* @returns {Function} Returns the "indexOf" function.
*/
function getIndexOf() {
var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
return result;
}
/**
* Checks if `value` is a native function.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a native function, else `false`.
*/
function isNative(value) {
return typeof value == 'function' && reNative.test(value);
}
/**
* Sets `this` binding data on a given function.
*
* @private
* @param {Function} func The function to set data on.
* @param {Array} value The data array to set.
*/
var setBindData = !defineProperty ? noop : function(func, value) {
descriptor.value = value;
defineProperty(func, '__bindData__', descriptor);
};
/**
* A fallback implementation of `isPlainObject` which checks if a given value
* is an object created by the `Object` constructor, assuming objects created
* by the `Object` constructor have no inherited enumerable properties and that
* there are no `Object.prototype` extensions.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
*/
function shimIsPlainObject(value) {
var ctor,
result;
// avoid non Object objects, `arguments` objects, and DOM elements
if (!(value && toString.call(value) == objectClass) ||
(ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {
return false;
}
// In most environments an object's own properties are iterated before
// its inherited properties. If the last iterated property is an object's
// own property then there are no inherited enumerable properties.
forIn(value, function(value, key) {
result = key;
});
return typeof result == 'undefined' || hasOwnProperty.call(value, result);
}
/**
* Used by `unescape` to convert HTML entities to characters.
*
* @private
* @param {string} match The matched character to unescape.
* @returns {string} Returns the unescaped character.
*/
function unescapeHtmlChar(match) {
return htmlUnescapes[match];
}
/*--------------------------------------------------------------------------*/
/**
* Checks if `value` is an `arguments` object.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.
* @example
*
* (function() { return _.isArguments(arguments); })(1, 2, 3);
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
return value && typeof value == 'object' && typeof value.length == 'number' &&
toString.call(value) == argsClass || false;
}
/**
* Checks if `value` is an array.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is an array, else `false`.
* @example
*
* (function() { return _.isArray(arguments); })();
* // => false
*
* _.isArray([1, 2, 3]);
* // => true
*/
var isArray = nativeIsArray || function(value) {
return value && typeof value == 'object' && typeof value.length == 'number' &&
toString.call(value) == arrayClass || false;
};
/**
* A fallback implementation of `Object.keys` which produces an array of the
* given object's own enumerable property names.
*
* @private
* @type Function
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property names.
*/
var shimKeys = function(object) {
var index, iterable = object, result = [];
if (!iterable) return result;
if (!(objectTypes[typeof object])) return result;
for (index in iterable) {
if (hasOwnProperty.call(iterable, index)) {
result.push(index);
}
}
return result
};
/**
* Creates an array composed of the own enumerable property names of an object.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property names.
* @example
*
* _.keys({ 'one': 1, 'two': 2, 'three': 3 });
* // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
*/
var keys = !nativeKeys ? shimKeys : function(object) {
if (!isObject(object)) {
return [];
}
return nativeKeys(object);
};
/**
* Used to convert characters to HTML entities:
*
* Though the `>` character is escaped for symmetry, characters like `>` and `/`
* don't require escaping in HTML and have no special meaning unless they're part
* of a tag or an unquoted attribute value.
* http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
*/
var htmlEscapes = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;'
};
/** Used to convert HTML entities to characters */
var htmlUnescapes = invert(htmlEscapes);
/** Used to match HTML entities and HTML characters */
var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),
reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');
/*--------------------------------------------------------------------------*/
/**
* Assigns own enumerable properties of source object(s) to the destination
* object. Subsequent sources will overwrite property assignments of previous
* sources. If a callback is provided it will be executed to produce the
* assigned values. The callback is bound to `thisArg` and invoked with two
* arguments; (objectValue, sourceValue).
*
* @static
* @memberOf _
* @type Function
* @alias extend
* @category Objects
* @param {Object} object The destination object.
* @param {...Object} [source] The source objects.
* @param {Function} [callback] The function to customize assigning values.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns the destination object.
* @example
*
* _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
* // => { 'name': 'fred', 'employer': 'slate' }
*
* var defaults = _.partialRight(_.assign, function(a, b) {
* return typeof a == 'undefined' ? b : a;
* });
*
* var object = { 'name': 'barney' };
* defaults(object, { 'name': 'fred', 'employer': 'slate' });
* // => { 'name': 'barney', 'employer': 'slate' }
*/
var assign = function(object, source, guard) {
var index, iterable = object, result = iterable;
if (!iterable) return result;
var args = arguments,
argsIndex = 0,
argsLength = typeof guard == 'number' ? 2 : args.length;
if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {
var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);
} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {
callback = args[--argsLength];
}
while (++argsIndex < argsLength) {
iterable = args[argsIndex];
if (iterable && objectTypes[typeof iterable]) {
var ownIndex = -1,
ownProps = objectTypes[typeof iterable] && keys(iterable),
length = ownProps ? ownProps.length : 0;
while (++ownIndex < length) {
index = ownProps[ownIndex];
result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];
}
}
}
return result
};
/**
* Creates a clone of `value`. If `isDeep` is `true` nested objects will also
* be cloned, otherwise they will be assigned by reference. If a callback
* is provided it will be executed to produce the cloned values. If the
* callback returns `undefined` cloning will be handled by the method instead.
* The callback is bound to `thisArg` and invoked with one argument; (value).
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to clone.
* @param {boolean} [isDeep=false] Specify a deep clone.
* @param {Function} [callback] The function to customize cloning values.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the cloned value.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* var shallow = _.clone(characters);
* shallow[0] === characters[0];
* // => true
*
* var deep = _.clone(characters, true);
* deep[0] === characters[0];
* // => false
*
* _.mixin({
* 'clone': _.partialRight(_.clone, function(value) {
* return _.isElement(value) ? value.cloneNode(false) : undefined;
* })
* });
*
* var clone = _.clone(document.body);
* clone.childNodes.length;
* // => 0
*/
function clone(value, isDeep, callback, thisArg) {
// allows working with "Collections" methods without using their `index`
// and `collection` arguments for `isDeep` and `callback`
if (typeof isDeep != 'boolean' && isDeep != null) {
thisArg = callback;
callback = isDeep;
isDeep = false;
}
return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
}
/**
* Creates a deep clone of `value`. If a callback is provided it will be
* executed to produce the cloned values. If the callback returns `undefined`
* cloning will be handled by the method instead. The callback is bound to
* `thisArg` and invoked with one argument; (value).
*
* Note: This method is loosely based on the structured clone algorithm. Functions
* and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and
* objects created by constructors other than `Object` are cloned to plain `Object` objects.
* See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to deep clone.
* @param {Function} [callback] The function to customize cloning values.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the deep cloned value.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* var deep = _.cloneDeep(characters);
* deep[0] === characters[0];
* // => false
*
* var view = {
* 'label': 'docs',
* 'node': element
* };
*
* var clone = _.cloneDeep(view, function(value) {
* return _.isElement(value) ? value.cloneNode(true) : undefined;
* });
*
* clone.node == view.node;
* // => false
*/
function cloneDeep(value, callback, thisArg) {
return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
}
/**
* Creates an object that inherits from the given `prototype` object. If a
* `properties` object is provided its own enumerable properties are assigned
* to the created object.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} prototype The object to inherit from.
* @param {Object} [properties] The properties to assign to the object.
* @returns {Object} Returns the new object.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* function Circle() {
* Shape.call(this);
* }
*
* Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
*
* var circle = new Circle;
* circle instanceof Circle;
* // => true
*
* circle instanceof Shape;
* // => true
*/
function create(prototype, properties) {
var result = baseCreate(prototype);
return properties ? assign(result, properties) : result;
}
/**
* Assigns own enumerable properties of source object(s) to the destination
* object for all destination properties that resolve to `undefined`. Once a
* property is set, additional defaults of the same property will be ignored.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {Object} object The destination object.
* @param {...Object} [source] The source objects.
* @param- {Object} [guard] Allows working with `_.reduce` without using its
* `key` and `object` arguments as sources.
* @returns {Object} Returns the destination object.
* @example
*
* var object = { 'name': 'barney' };
* _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
* // => { 'name': 'barney', 'employer': 'slate' }
*/
var defaults = function(object, source, guard) {
var index, iterable = object, result = iterable;
if (!iterable) return result;
var args = arguments,
argsIndex = 0,
argsLength = typeof guard == 'number' ? 2 : args.length;
while (++argsIndex < argsLength) {
iterable = args[argsIndex];
if (iterable && objectTypes[typeof iterable]) {
var ownIndex = -1,
ownProps = objectTypes[typeof iterable] && keys(iterable),
length = ownProps ? ownProps.length : 0;
while (++ownIndex < length) {
index = ownProps[ownIndex];
if (typeof result[index] == 'undefined') result[index] = iterable[index];
}
}
}
return result
};
/**
* This method is like `_.findIndex` except that it returns the key of the
* first element that passes the callback check, instead of the element itself.
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to search.
* @param {Function|Object|string} [callback=identity] The function called per
* iteration. If a property name or object is provided it will be used to
* create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {string|undefined} Returns the key of the found element, else `undefined`.
* @example
*
* var characters = {
* 'barney': { 'age': 36, 'blocked': false },
* 'fred': { 'age': 40, 'blocked': true },
* 'pebbles': { 'age': 1, 'blocked': false }
* };
*
* _.findKey(characters, function(chr) {
* return chr.age < 40;
* });
* // => 'barney' (property order is not guaranteed across environments)
*
* // using "_.where" callback shorthand
* _.findKey(characters, { 'age': 1 });
* // => 'pebbles'
*
* // using "_.pluck" callback shorthand
* _.findKey(characters, 'blocked');
* // => 'fred'
*/
function findKey(object, callback, thisArg) {
var result;
callback = lodash.createCallback(callback, thisArg, 3);
forOwn(object, function(value, key, object) {
if (callback(value, key, object)) {
result = key;
return false;
}
});
return result;
}
/**
* This method is like `_.findKey` except that it iterates over elements
* of a `collection` in the opposite order.
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to search.
* @param {Function|Object|string} [callback=identity] The function called per
* iteration. If a property name or object is provided it will be used to
* create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {string|undefined} Returns the key of the found element, else `undefined`.
* @example
*
* var characters = {
* 'barney': { 'age': 36, 'blocked': true },
* 'fred': { 'age': 40, 'blocked': false },
* 'pebbles': { 'age': 1, 'blocked': true }
* };
*
* _.findLastKey(characters, function(chr) {
* return chr.age < 40;
* });
* // => returns `pebbles`, assuming `_.findKey` returns `barney`
*
* // using "_.where" callback shorthand
* _.findLastKey(characters, { 'age': 40 });
* // => 'fred'
*
* // using "_.pluck" callback shorthand
* _.findLastKey(characters, 'blocked');
* // => 'pebbles'
*/
function findLastKey(object, callback, thisArg) {
var result;
callback = lodash.createCallback(callback, thisArg, 3);
forOwnRight(object, function(value, key, object) {
if (callback(value, key, object)) {
result = key;
return false;
}
});
return result;
}
/**
* Iterates over own and inherited enumerable properties of an object,
* executing the callback for each property. The callback is bound to `thisArg`
* and invoked with three arguments; (value, key, object). Callbacks may exit
* iteration early by explicitly returning `false`.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns `object`.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* Shape.prototype.move = function(x, y) {
* this.x += x;
* this.y += y;
* };
*
* _.forIn(new Shape, function(value, key) {
* console.log(key);
* });
* // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)
*/
var forIn = function(collection, callback, thisArg) {
var index, iterable = collection, result = iterable;
if (!iterable) return result;
if (!objectTypes[typeof iterable]) return result;
callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
for (index in iterable) {
if (callback(iterable[index], index, collection) === false) return result;
}
return result
};
/**
* This method is like `_.forIn` except that it iterates over elements
* of a `collection` in the opposite order.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns `object`.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* Shape.prototype.move = function(x, y) {
* this.x += x;
* this.y += y;
* };
*
* _.forInRight(new Shape, function(value, key) {
* console.log(key);
* });
* // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'
*/
function forInRight(object, callback, thisArg) {
var pairs = [];
forIn(object, function(value, key) {
pairs.push(key, value);
});
var length = pairs.length;
callback = baseCreateCallback(callback, thisArg, 3);
while (length--) {
if (callback(pairs[length--], pairs[length], object) === false) {
break;
}
}
return object;
}
/**
* Iterates over own enumerable properties of an object, executing the callback
* for each property. The callback is bound to `thisArg` and invoked with three
* arguments; (value, key, object). Callbacks may exit iteration early by
* explicitly returning `false`.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns `object`.
* @example
*
* _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
* console.log(key);
* });
* // => logs '0', '1', and 'length' (property order is not guaranteed across environments)
*/
var forOwn = function(collection, callback, thisArg) {
var index, iterable = collection, result = iterable;
if (!iterable) return result;
if (!objectTypes[typeof iterable]) return result;
callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
var ownIndex = -1,
ownProps = objectTypes[typeof iterable] && keys(iterable),
length = ownProps ? ownProps.length : 0;
while (++ownIndex < length) {
index = ownProps[ownIndex];
if (callback(iterable[index], index, collection) === false) return result;
}
return result
};
/**
* This method is like `_.forOwn` except that it iterates over elements
* of a `collection` in the opposite order.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns `object`.
* @example
*
* _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
* console.log(key);
* });
* // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'
*/
function forOwnRight(object, callback, thisArg) {
var props = keys(object),
length = props.length;
callback = baseCreateCallback(callback, thisArg, 3);
while (length--) {
var key = props[length];
if (callback(object[key], key, object) === false) {
break;
}
}
return object;
}
/**
* Creates a sorted array of property names of all enumerable properties,
* own and inherited, of `object` that have function values.
*
* @static
* @memberOf _
* @alias methods
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property names that have function values.
* @example
*
* _.functions(_);
* // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
*/
function functions(object) {
var result = [];
forIn(object, function(value, key) {
if (isFunction(value)) {
result.push(key);
}
});
return result.sort();
}
/**
* Checks if the specified property name exists as a direct property of `object`,
* instead of an inherited property.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @param {string} key The name of the property to check.
* @returns {boolean} Returns `true` if key is a direct property, else `false`.
* @example
*
* _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
* // => true
*/
function has(object, key) {
return object ? hasOwnProperty.call(object, key) : false;
}
/**
* Creates an object composed of the inverted keys and values of the given object.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to invert.
* @returns {Object} Returns the created inverted object.
* @example
*
* _.invert({ 'first': 'fred', 'second': 'barney' });
* // => { 'fred': 'first', 'barney': 'second' }
*/
function invert(object) {
var index = -1,
props = keys(object),
length = props.length,
result = {};
while (++index < length) {
var key = props[index];
result[object[key]] = key;
}
return result;
}
/**
* Checks if `value` is a boolean value.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.
* @example
*
* _.isBoolean(null);
* // => false
*/
function isBoolean(value) {
return value === true || value === false ||
value && typeof value == 'object' && toString.call(value) == boolClass || false;
}
/**
* Checks if `value` is a date.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a date, else `false`.
* @example
*
* _.isDate(new Date);
* // => true
*/
function isDate(value) {
return value && typeof value == 'object' && toString.call(value) == dateClass || false;
}
/**
* Checks if `value` is a DOM element.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.
* @example
*
* _.isElement(document.body);
* // => true
*/
function isElement(value) {
return value && value.nodeType === 1 || false;
}
/**
* Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
* length of `0` and objects with no own enumerable properties are considered
* "empty".
*
* @static
* @memberOf _
* @category Objects
* @param {Array|Object|string} value The value to inspect.
* @returns {boolean} Returns `true` if the `value` is empty, else `false`.
* @example
*
* _.isEmpty([1, 2, 3]);
* // => false
*
* _.isEmpty({});
* // => true
*
* _.isEmpty('');
* // => true
*/
function isEmpty(value) {
var result = true;
if (!value) {
return result;
}
var className = toString.call(value),
length = value.length;
if ((className == arrayClass || className == stringClass || className == argsClass ) ||
(className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
return !length;
}
forOwn(value, function() {
return (result = false);
});
return result;
}
/**
* Performs a deep comparison between two values to determine if they are
* equivalent to each other. If a callback is provided it will be executed
* to compare values. If the callback returns `undefined` comparisons will
* be handled by the method instead. The callback is bound to `thisArg` and
* invoked with two arguments; (a, b).
*
* @static
* @memberOf _
* @category Objects
* @param {*} a The value to compare.
* @param {*} b The other value to compare.
* @param {Function} [callback] The function to customize comparing values.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'name': 'fred' };
* var copy = { 'name': 'fred' };
*
* object == copy;
* // => false
*
* _.isEqual(object, copy);
* // => true
*
* var words = ['hello', 'goodbye'];
* var otherWords = ['hi', 'goodbye'];
*
* _.isEqual(words, otherWords, function(a, b) {
* var reGreet = /^(?:hello|hi)$/i,
* aGreet = _.isString(a) && reGreet.test(a),
* bGreet = _.isString(b) && reGreet.test(b);
*
* return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
* });
* // => true
*/
function isEqual(a, b, callback, thisArg) {
return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
}
/**
* Checks if `value` is, or can be coerced to, a finite number.
*
* Note: This is not the same as native `isFinite` which will return true for
* booleans and empty strings. See http://es5.github.io/#x15.1.2.5.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is finite, else `false`.
* @example
*
* _.isFinite(-101);
* // => true
*
* _.isFinite('10');
* // => true
*
* _.isFinite(true);
* // => false
*
* _.isFinite('');
* // => false
*
* _.isFinite(Infinity);
* // => false
*/
function isFinite(value) {
return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
}
/**
* Checks if `value` is a function.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*/
function isFunction(value) {
return typeof value == 'function';
}
/**
* Checks if `value` is the language type of Object.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(1);
* // => false
*/
function isObject(value) {
// check if the value is the ECMAScript language type of Object
// http://es5.github.io/#x8
// and avoid a V8 bug
// http://code.google.com/p/v8/issues/detail?id=2291
return !!(value && objectTypes[typeof value]);
}
/**
* Checks if `value` is `NaN`.
*
* Note: This is not the same as native `isNaN` which will return `true` for
* `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
* @example
*
* _.isNaN(NaN);
* // => true
*
* _.isNaN(new Number(NaN));
* // => true
*
* isNaN(undefined);
* // => true
*
* _.isNaN(undefined);
* // => false
*/
function isNaN(value) {
// `NaN` as a primitive is the only value that is not equal to itself
// (perform the [[Class]] check first to avoid errors with some host objects in IE)
return isNumber(value) && value != +value;
}
/**
* Checks if `value` is `null`.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
* @example
*
* _.isNull(null);
* // => true
*
* _.isNull(undefined);
* // => false
*/
function isNull(value) {
return value === null;
}
/**
* Checks if `value` is a number.
*
* Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a number, else `false`.
* @example
*
* _.isNumber(8.4 * 5);
* // => true
*/
function isNumber(value) {
return typeof value == 'number' ||
value && typeof value == 'object' && toString.call(value) == numberClass || false;
}
/**
* Checks if `value` is an object created by the `Object` constructor.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* _.isPlainObject(new Shape);
* // => false
*
* _.isPlainObject([1, 2, 3]);
* // => false
*
* _.isPlainObject({ 'x': 0, 'y': 0 });
* // => true
*/
var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
if (!(value && toString.call(value) == objectClass)) {
return false;
}
var valueOf = value.valueOf,
objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
return objProto
? (value == objProto || getPrototypeOf(value) == objProto)
: shimIsPlainObject(value);
};
/**
* Checks if `value` is a regular expression.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.
* @example
*
* _.isRegExp(/fred/);
* // => true
*/
function isRegExp(value) {
return value && typeof value == 'object' && toString.call(value) == regexpClass || false;
}
/**
* Checks if `value` is a string.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a string, else `false`.
* @example
*
* _.isString('fred');
* // => true
*/
function isString(value) {
return typeof value == 'string' ||
value && typeof value == 'object' && toString.call(value) == stringClass || false;
}
/**
* Checks if `value` is `undefined`.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
* @example
*
* _.isUndefined(void 0);
* // => true
*/
function isUndefined(value) {
return typeof value == 'undefined';
}
/**
* Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through the callback.
* The callback is bound to `thisArg` and invoked with three arguments;
* (value, key, object).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new object with values of the results of each `callback` execution.
* @example
*
* _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
* // => { 'a': 3, 'b': 6, 'c': 9 }
*
* var characters = {
* 'fred': { 'name': 'fred', 'age': 40 },
* 'pebbles': { 'name': 'pebbles', 'age': 1 }
* };
*
* // using "_.pluck" callback shorthand
* _.mapValues(characters, 'age');
* // => { 'fred': 40, 'pebbles': 1 }
*/
function mapValues(object, callback, thisArg) {
var result = {};
callback = lodash.createCallback(callback, thisArg, 3);
forOwn(object, function(value, key, object) {
result[key] = callback(value, key, object);
});
return result;
}
/**
* Recursively merges own enumerable properties of the source object(s), that
* don't resolve to `undefined` into the destination object. Subsequent sources
* will overwrite property assignments of previous sources. If a callback is
* provided it will be executed to produce the merged values of the destination
* and source properties. If the callback returns `undefined` merging will
* be handled by the method instead. The callback is bound to `thisArg` and
* invoked with two arguments; (objectValue, sourceValue).
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The destination object.
* @param {...Object} [source] The source objects.
* @param {Function} [callback] The function to customize merging properties.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns the destination object.
* @example
*
* var names = {
* 'characters': [
* { 'name': 'barney' },
* { 'name': 'fred' }
* ]
* };
*
* var ages = {
* 'characters': [
* { 'age': 36 },
* { 'age': 40 }
* ]
* };
*
* _.merge(names, ages);
* // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
*
* var food = {
* 'fruits': ['apple'],
* 'vegetables': ['beet']
* };
*
* var otherFood = {
* 'fruits': ['banana'],
* 'vegetables': ['carrot']
* };
*
* _.merge(food, otherFood, function(a, b) {
* return _.isArray(a) ? a.concat(b) : undefined;
* });
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
*/
function merge(object) {
var args = arguments,
length = 2;
if (!isObject(object)) {
return object;
}
// allows working with `_.reduce` and `_.reduceRight` without using
// their `index` and `collection` arguments
if (typeof args[2] != 'number') {
length = args.length;
}
if (length > 3 && typeof args[length - 2] == 'function') {
var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
} else if (length > 2 && typeof args[length - 1] == 'function') {
callback = args[--length];
}
var sources = slice(arguments, 1, length),
index = -1,
stackA = getArray(),
stackB = getArray();
while (++index < length) {
baseMerge(object, sources[index], callback, stackA, stackB);
}
releaseArray(stackA);
releaseArray(stackB);
return object;
}
/**
* Creates a shallow clone of `object` excluding the specified properties.
* Property names may be specified as individual arguments or as arrays of
* property names. If a callback is provided it will be executed for each
* property of `object` omitting the properties the callback returns truey
* for. The callback is bound to `thisArg` and invoked with three arguments;
* (value, key, object).
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The source object.
* @param {Function|...string|string[]} [callback] The properties to omit or the
* function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns an object without the omitted properties.
* @example
*
* _.omit({ 'name': 'fred', 'age': 40 }, 'age');
* // => { 'name': 'fred' }
*
* _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
* return typeof value == 'number';
* });
* // => { 'name': 'fred' }
*/
function omit(object, callback, thisArg) {
var result = {};
if (typeof callback != 'function') {
var props = [];
forIn(object, function(value, key) {
props.push(key);
});
props = baseDifference(props, baseFlatten(arguments, true, false, 1));
var index = -1,
length = props.length;
while (++index < length) {
var key = props[index];
result[key] = object[key];
}
} else {
callback = lodash.createCallback(callback, thisArg, 3);
forIn(object, function(value, key, object) {
if (!callback(value, key, object)) {
result[key] = value;
}
});
}
return result;
}
/**
* Creates a two dimensional array of an object's key-value pairs,
* i.e. `[[key1, value1], [key2, value2]]`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns new array of key-value pairs.
* @example
*
* _.pairs({ 'barney': 36, 'fred': 40 });
* // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
*/
function pairs(object) {
var index = -1,
props = keys(object),
length = props.length,
result = Array(length);
while (++index < length) {
var key = props[index];
result[index] = [key, object[key]];
}
return result;
}
/**
* Creates a shallow clone of `object` composed of the specified properties.
* Property names may be specified as individual arguments or as arrays of
* property names. If a callback is provided it will be executed for each
* property of `object` picking the properties the callback returns truey
* for. The callback is bound to `thisArg` and invoked with three arguments;
* (value, key, object).
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The source object.
* @param {Function|...string|string[]} [callback] The function called per
* iteration or property names to pick, specified as individual property
* names or arrays of property names.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns an object composed of the picked properties.
* @example
*
* _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
* // => { 'name': 'fred' }
*
* _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
* return key.charAt(0) != '_';
* });
* // => { 'name': 'fred' }
*/
function pick(object, callback, thisArg) {
var result = {};
if (typeof callback != 'function') {
var index = -1,
props = baseFlatten(arguments, true, false, 1),
length = isObject(object) ? props.length : 0;
while (++index < length) {
var key = props[index];
if (key in object) {
result[key] = object[key];
}
}
} else {
callback = lodash.createCallback(callback, thisArg, 3);
forIn(object, function(value, key, object) {
if (callback(value, key, object)) {
result[key] = value;
}
});
}
return result;
}
/**
* An alternative to `_.reduce` this method transforms `object` to a new
* `accumulator` object which is the result of running each of its own
* enumerable properties through a callback, with each callback execution
* potentially mutating the `accumulator` object. The callback is bound to
* `thisArg` and invoked with four arguments; (accumulator, value, key, object).
* Callbacks may exit iteration early by explicitly returning `false`.
*
* @static
* @memberOf _
* @category Objects
* @param {Array|Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [accumulator] The custom accumulator value.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the accumulated value.
* @example
*
* var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {
* num *= num;
* if (num % 2) {
* return result.push(num) < 3;
* }
* });
* // => [1, 9, 25]
*
* var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
* result[key] = num * 3;
* });
* // => { 'a': 3, 'b': 6, 'c': 9 }
*/
function transform(object, callback, accumulator, thisArg) {
var isArr = isArray(object);
if (accumulator == null) {
if (isArr) {
accumulator = [];
} else {
var ctor = object && object.constructor,
proto = ctor && ctor.prototype;
accumulator = baseCreate(proto);
}
}
if (callback) {
callback = lodash.createCallback(callback, thisArg, 4);
(isArr ? forEach : forOwn)(object, function(value, index, object) {
return callback(accumulator, value, index, object);
});
}
return accumulator;
}
/**
* Creates an array composed of the own enumerable property values of `object`.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property values.
* @example
*
* _.values({ 'one': 1, 'two': 2, 'three': 3 });
* // => [1, 2, 3] (property order is not guaranteed across environments)
*/
function values(object) {
var index = -1,
props = keys(object),
length = props.length,
result = Array(length);
while (++index < length) {
result[index] = object[props[index]];
}
return result;
}
/*--------------------------------------------------------------------------*/
/**
* Creates an array of elements from the specified indexes, or keys, of the
* `collection`. Indexes may be specified as individual arguments or as arrays
* of indexes.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {...(number|number[]|string|string[])} [index] The indexes of `collection`
* to retrieve, specified as individual indexes or arrays of indexes.
* @returns {Array} Returns a new array of elements corresponding to the
* provided indexes.
* @example
*
* _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
* // => ['a', 'c', 'e']
*
* _.at(['fred', 'barney', 'pebbles'], 0, 2);
* // => ['fred', 'pebbles']
*/
function at(collection) {
var args = arguments,
index = -1,
props = baseFlatten(args, true, false, 1),
length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,
result = Array(length);
while(++index < length) {
result[index] = collection[props[index]];
}
return result;
}
/**
* Checks if a given value is present in a collection using strict equality
* for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the
* offset from the end of the collection.
*
* @static
* @memberOf _
* @alias include
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {*} target The value to check for.
* @param {number} [fromIndex=0] The index to search from.
* @returns {boolean} Returns `true` if the `target` element is found, else `false`.
* @example
*
* _.contains([1, 2, 3], 1);
* // => true
*
* _.contains([1, 2, 3], 1, 2);
* // => false
*
* _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
* // => true
*
* _.contains('pebbles', 'eb');
* // => true
*/
function contains(collection, target, fromIndex) {
var index = -1,
indexOf = getIndexOf(),
length = collection ? collection.length : 0,
result = false;
fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
if (isArray(collection)) {
result = indexOf(collection, target, fromIndex) > -1;
} else if (typeof length == 'number') {
result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;
} else {
forOwn(collection, function(value) {
if (++index >= fromIndex) {
return !(result = value === target);
}
});
}
return result;
}
/**
* Creates an object composed of keys generated from the results of running
* each element of `collection` through the callback. The corresponding value
* of each key is the number of times the key was returned by the callback.
* The callback is bound to `thisArg` and invoked with three arguments;
* (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns the composed aggregate object.
* @example
*
* _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });
* // => { '4': 1, '6': 2 }
*
* _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
* // => { '4': 1, '6': 2 }
*
* _.countBy(['one', 'two', 'three'], 'length');
* // => { '3': 2, '5': 1 }
*/
var countBy = createAggregator(function(result, value, key) {
(hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
});
/**
* Checks if the given callback returns truey value for **all** elements of
* a collection. The callback is bound to `thisArg` and invoked with three
* arguments; (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias all
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {boolean} Returns `true` if all elements passed the callback check,
* else `false`.
* @example
*
* _.every([true, 1, null, 'yes']);
* // => false
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* // using "_.pluck" callback shorthand
* _.every(characters, 'age');
* // => true
*
* // using "_.where" callback shorthand
* _.every(characters, { 'age': 36 });
* // => false
*/
function every(collection, callback, thisArg) {
var result = true;
callback = lodash.createCallback(callback, thisArg, 3);
var index = -1,
length = collection ? collection.length : 0;
if (typeof length == 'number') {
while (++index < length) {
if (!(result = !!callback(collection[index], index, collection))) {
break;
}
}
} else {
forOwn(collection, function(value, index, collection) {
return (result = !!callback(value, index, collection));
});
}
return result;
}
/**
* Iterates over elements of a collection, returning an array of all elements
* the callback returns truey for. The callback is bound to `thisArg` and
* invoked with three arguments; (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias select
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new array of elements that passed the callback check.
* @example
*
* var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
* // => [2, 4, 6]
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'blocked': false },
* { 'name': 'fred', 'age': 40, 'blocked': true }
* ];
*
* // using "_.pluck" callback shorthand
* _.filter(characters, 'blocked');
* // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
*
* // using "_.where" callback shorthand
* _.filter(characters, { 'age': 36 });
* // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
*/
function filter(collection, callback, thisArg) {
var result = [];
callback = lodash.createCallback(callback, thisArg, 3);
var index = -1,
length = collection ? collection.length : 0;
if (typeof length == 'number') {
while (++index < length) {
var value = collection[index];
if (callback(value, index, collection)) {
result.push(value);
}
}
} else {
forOwn(collection, function(value, index, collection) {
if (callback(value, index, collection)) {
result.push(value);
}
});
}
return result;
}
/**
* Iterates over elements of a collection, returning the first element that
* the callback returns truey for. The callback is bound to `thisArg` and
* invoked with three arguments; (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias detect, findWhere
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the found element, else `undefined`.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'blocked': false },
* { 'name': 'fred', 'age': 40, 'blocked': true },
* { 'name': 'pebbles', 'age': 1, 'blocked': false }
* ];
*
* _.find(characters, function(chr) {
* return chr.age < 40;
* });
* // => { 'name': 'barney', 'age': 36, 'blocked': false }
*
* // using "_.where" callback shorthand
* _.find(characters, { 'age': 1 });
* // => { 'name': 'pebbles', 'age': 1, 'blocked': false }
*
* // using "_.pluck" callback shorthand
* _.find(characters, 'blocked');
* // => { 'name': 'fred', 'age': 40, 'blocked': true }
*/
function find(collection, callback, thisArg) {
callback = lodash.createCallback(callback, thisArg, 3);
var index = -1,
length = collection ? collection.length : 0;
if (typeof length == 'number') {
while (++index < length) {
var value = collection[index];
if (callback(value, index, collection)) {
return value;
}
}
} else {
var result;
forOwn(collection, function(value, index, collection) {
if (callback(value, index, collection)) {
result = value;
return false;
}
});
return result;
}
}
/**
* This method is like `_.find` except that it iterates over elements
* of a `collection` from right to left.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the found element, else `undefined`.
* @example
*
* _.findLast([1, 2, 3, 4], function(num) {
* return num % 2 == 1;
* });
* // => 3
*/
function findLast(collection, callback, thisArg) {
var result;
callback = lodash.createCallback(callback, thisArg, 3);
forEachRight(collection, function(value, index, collection) {
if (callback(value, index, collection)) {
result = value;
return false;
}
});
return result;
}
/**
* Iterates over elements of a collection, executing the callback for each
* element. The callback is bound to `thisArg` and invoked with three arguments;
* (value, index|key, collection). Callbacks may exit iteration early by
* explicitly returning `false`.
*
* Note: As with other "Collections" methods, objects with a `length` property
* are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
* may be used for object iteration.
*
* @static
* @memberOf _
* @alias each
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array|Object|string} Returns `collection`.
* @example
*
* _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
* // => logs each number and returns '1,2,3'
*
* _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
* // => logs each number and returns the object (property order is not guaranteed across environments)
*/
function forEach(collection, callback, thisArg) {
var index = -1,
length = collection ? collection.length : 0;
callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
if (typeof length == 'number') {
while (++index < length) {
if (callback(collection[index], index, collection) === false) {
break;
}
}
} else {
forOwn(collection, callback);
}
return collection;
}
/**
* This method is like `_.forEach` except that it iterates over elements
* of a `collection` from right to left.
*
* @static
* @memberOf _
* @alias eachRight
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array|Object|string} Returns `collection`.
* @example
*
* _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');
* // => logs each number from right to left and returns '3,2,1'
*/
function forEachRight(collection, callback, thisArg) {
var length = collection ? collection.length : 0;
callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
if (typeof length == 'number') {
while (length--) {
if (callback(collection[length], length, collection) === false) {
break;
}
}
} else {
var props = keys(collection);
length = props.length;
forOwn(collection, function(value, key, collection) {
key = props ? props[--length] : --length;
return callback(collection[key], key, collection);
});
}
return collection;
}
/**
* Creates an object composed of keys generated from the results of running
* each element of a collection through the callback. The corresponding value
* of each key is an array of the elements responsible for generating the key.
* The callback is bound to `thisArg` and invoked with three arguments;
* (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns the composed aggregate object.
* @example
*
* _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
* // => { '4': [4.2], '6': [6.1, 6.4] }
*
* _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
* // => { '4': [4.2], '6': [6.1, 6.4] }
*
* // using "_.pluck" callback shorthand
* _.groupBy(['one', 'two', 'three'], 'length');
* // => { '3': ['one', 'two'], '5': ['three'] }
*/
var groupBy = createAggregator(function(result, value, key) {
(hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
});
/**
* Creates an object composed of keys generated from the results of running
* each element of the collection through the given callback. The corresponding
* value of each key is the last element responsible for generating the key.
* The callback is bound to `thisArg` and invoked with three arguments;
* (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns the composed aggregate object.
* @example
*
* var keys = [
* { 'dir': 'left', 'code': 97 },
* { 'dir': 'right', 'code': 100 }
* ];
*
* _.indexBy(keys, 'dir');
* // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
*
* _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
* // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
*
* _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
* // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
*/
var indexBy = createAggregator(function(result, value, key) {
result[key] = value;
});
/**
* Invokes the method named by `methodName` on each element in the `collection`
* returning an array of the results of each invoked method. Additional arguments
* will be provided to each invoked method. If `methodName` is a function it
* will be invoked for, and `this` bound to, each element in the `collection`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|string} methodName The name of the method to invoke or
* the function invoked per iteration.
* @param {...*} [arg] Arguments to invoke the method with.
* @returns {Array} Returns a new array of the results of each invoked method.
* @example
*
* _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
* // => [[1, 5, 7], [1, 2, 3]]
*
* _.invoke([123, 456], String.prototype.split, '');
* // => [['1', '2', '3'], ['4', '5', '6']]
*/
function invoke(collection, methodName) {
var args = slice(arguments, 2),
index = -1,
isFunc = typeof methodName == 'function',
length = collection ? collection.length : 0,
result = Array(typeof length == 'number' ? length : 0);
forEach(collection, function(value) {
result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);
});
return result;
}
/**
* Creates an array of values by running each element in the collection
* through the callback. The callback is bound to `thisArg` and invoked with
* three arguments; (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias collect
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new array of the results of each `callback` execution.
* @example
*
* _.map([1, 2, 3], function(num) { return num * 3; });
* // => [3, 6, 9]
*
* _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
* // => [3, 6, 9] (property order is not guaranteed across environments)
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* // using "_.pluck" callback shorthand
* _.map(characters, 'name');
* // => ['barney', 'fred']
*/
function map(collection, callback, thisArg) {
var index = -1,
length = collection ? collection.length : 0;
callback = lodash.createCallback(callback, thisArg, 3);
if (typeof length == 'number') {
var result = Array(length);
while (++index < length) {
result[index] = callback(collection[index], index, collection);
}
} else {
result = [];
forOwn(collection, function(value, key, collection) {
result[++index] = callback(value, key, collection);
});
}
return result;
}
/**
* Retrieves the maximum value of a collection. If the collection is empty or
* falsey `-Infinity` is returned. If a callback is provided it will be executed
* for each value in the collection to generate the criterion by which the value
* is ranked. The callback is bound to `thisArg` and invoked with three
* arguments; (value, index, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the maximum value.
* @example
*
* _.max([4, 2, 8, 6]);
* // => 8
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* _.max(characters, function(chr) { return chr.age; });
* // => { 'name': 'fred', 'age': 40 };
*
* // using "_.pluck" callback shorthand
* _.max(characters, 'age');
* // => { 'name': 'fred', 'age': 40 };
*/
function max(collection, callback, thisArg) {
var computed = -Infinity,
result = computed;
// allows working with functions like `_.map` without using
// their `index` argument as a callback
if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
callback = null;
}
if (callback == null && isArray(collection)) {
var index = -1,
length = collection.length;
while (++index < length) {
var value = collection[index];
if (value > result) {
result = value;
}
}
} else {
callback = (callback == null && isString(collection))
? charAtCallback
: lodash.createCallback(callback, thisArg, 3);
forEach(collection, function(value, index, collection) {
var current = callback(value, index, collection);
if (current > computed) {
computed = current;
result = value;
}
});
}
return result;
}
/**
* Retrieves the minimum value of a collection. If the collection is empty or
* falsey `Infinity` is returned. If a callback is provided it will be executed
* for each value in the collection to generate the criterion by which the value
* is ranked. The callback is bound to `thisArg` and invoked with three
* arguments; (value, index, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the minimum value.
* @example
*
* _.min([4, 2, 8, 6]);
* // => 2
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* _.min(characters, function(chr) { return chr.age; });
* // => { 'name': 'barney', 'age': 36 };
*
* // using "_.pluck" callback shorthand
* _.min(characters, 'age');
* // => { 'name': 'barney', 'age': 36 };
*/
function min(collection, callback, thisArg) {
var computed = Infinity,
result = computed;
// allows working with functions like `_.map` without using
// their `index` argument as a callback
if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
callback = null;
}
if (callback == null && isArray(collection)) {
var index = -1,
length = collection.length;
while (++index < length) {
var value = collection[index];
if (value < result) {
result = value;
}
}
} else {
callback = (callback == null && isString(collection))
? charAtCallback
: lodash.createCallback(callback, thisArg, 3);
forEach(collection, function(value, index, collection) {
var current = callback(value, index, collection);
if (current < computed) {
computed = current;
result = value;
}
});
}
return result;
}
/**
* Retrieves the value of a specified property from all elements in the collection.
*
* @static
* @memberOf _
* @type Function
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {string} property The name of the property to pluck.
* @returns {Array} Returns a new array of property values.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* _.pluck(characters, 'name');
* // => ['barney', 'fred']
*/
var pluck = map;
/**
* Reduces a collection to a value which is the accumulated result of running
* each element in the collection through the callback, where each successive
* callback execution consumes the return value of the previous execution. If
* `accumulator` is not provided the first element of the collection will be
* used as the initial `accumulator` value. The callback is bound to `thisArg`
* and invoked with four arguments; (accumulator, value, index|key, collection).
*
* @static
* @memberOf _
* @alias foldl, inject
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [accumulator] Initial value of the accumulator.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the accumulated value.
* @example
*
* var sum = _.reduce([1, 2, 3], function(sum, num) {
* return sum + num;
* });
* // => 6
*
* var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
* result[key] = num * 3;
* return result;
* }, {});
* // => { 'a': 3, 'b': 6, 'c': 9 }
*/
function reduce(collection, callback, accumulator, thisArg) {
if (!collection) return accumulator;
var noaccum = arguments.length < 3;
callback = lodash.createCallback(callback, thisArg, 4);
var index = -1,
length = collection.length;
if (typeof length == 'number') {
if (noaccum) {
accumulator = collection[++index];
}
while (++index < length) {
accumulator = callback(accumulator, collection[index], index, collection);
}
} else {
forOwn(collection, function(value, index, collection) {
accumulator = noaccum
? (noaccum = false, value)
: callback(accumulator, value, index, collection)
});
}
return accumulator;
}
/**
* This method is like `_.reduce` except that it iterates over elements
* of a `collection` from right to left.
*
* @static
* @memberOf _
* @alias foldr
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [accumulator] Initial value of the accumulator.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the accumulated value.
* @example
*
* var list = [[0, 1], [2, 3], [4, 5]];
* var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
* // => [4, 5, 2, 3, 0, 1]
*/
function reduceRight(collection, callback, accumulator, thisArg) {
var noaccum = arguments.length < 3;
callback = lodash.createCallback(callback, thisArg, 4);
forEachRight(collection, function(value, index, collection) {
accumulator = noaccum
? (noaccum = false, value)
: callback(accumulator, value, index, collection);
});
return accumulator;
}
/**
* The opposite of `_.filter` this method returns the elements of a
* collection that the callback does **not** return truey for.
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new array of elements that failed the callback check.
* @example
*
* var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
* // => [1, 3, 5]
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'blocked': false },
* { 'name': 'fred', 'age': 40, 'blocked': true }
* ];
*
* // using "_.pluck" callback shorthand
* _.reject(characters, 'blocked');
* // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
*
* // using "_.where" callback shorthand
* _.reject(characters, { 'age': 36 });
* // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
*/
function reject(collection, callback, thisArg) {
callback = lodash.createCallback(callback, thisArg, 3);
return filter(collection, function(value, index, collection) {
return !callback(value, index, collection);
});
}
/**
* Retrieves a random element or `n` random elements from a collection.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to sample.
* @param {number} [n] The number of elements to sample.
* @param- {Object} [guard] Allows working with functions like `_.map`
* without using their `index` arguments as `n`.
* @returns {Array} Returns the random sample(s) of `collection`.
* @example
*
* _.sample([1, 2, 3, 4]);
* // => 2
*
* _.sample([1, 2, 3, 4], 2);
* // => [3, 1]
*/
function sample(collection, n, guard) {
if (collection && typeof collection.length != 'number') {
collection = values(collection);
}
if (n == null || guard) {
return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
}
var result = shuffle(collection);
result.length = nativeMin(nativeMax(0, n), result.length);
return result;
}
/**
* Creates an array of shuffled values, using a version of the Fisher-Yates
* shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to shuffle.
* @returns {Array} Returns a new shuffled collection.
* @example
*
* _.shuffle([1, 2, 3, 4, 5, 6]);
* // => [4, 1, 6, 3, 5, 2]
*/
function shuffle(collection) {
var index = -1,
length = collection ? collection.length : 0,
result = Array(typeof length == 'number' ? length : 0);
forEach(collection, function(value) {
var rand = baseRandom(0, ++index);
result[index] = result[rand];
result[rand] = value;
});
return result;
}
/**
* Gets the size of the `collection` by returning `collection.length` for arrays
* and array-like objects or the number of own enumerable properties for objects.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to inspect.
* @returns {number} Returns `collection.length` or number of own enumerable properties.
* @example
*
* _.size([1, 2]);
* // => 2
*
* _.size({ 'one': 1, 'two': 2, 'three': 3 });
* // => 3
*
* _.size('pebbles');
* // => 7
*/
function size(collection) {
var length = collection ? collection.length : 0;
return typeof length == 'number' ? length : keys(collection).length;
}
/**
* Checks if the callback returns a truey value for **any** element of a
* collection. The function returns as soon as it finds a passing value and
* does not iterate over the entire collection. The callback is bound to
* `thisArg` and invoked with three arguments; (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias any
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {boolean} Returns `true` if any element passed the callback check,
* else `false`.
* @example
*
* _.some([null, 0, 'yes', false], Boolean);
* // => true
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'blocked': false },
* { 'name': 'fred', 'age': 40, 'blocked': true }
* ];
*
* // using "_.pluck" callback shorthand
* _.some(characters, 'blocked');
* // => true
*
* // using "_.where" callback shorthand
* _.some(characters, { 'age': 1 });
* // => false
*/
function some(collection, callback, thisArg) {
var result;
callback = lodash.createCallback(callback, thisArg, 3);
var index = -1,
length = collection ? collection.length : 0;
if (typeof length == 'number') {
while (++index < length) {
if ((result = callback(collection[index], index, collection))) {
break;
}
}
} else {
forOwn(collection, function(value, index, collection) {
return !(result = callback(value, index, collection));
});
}
return !!result;
}
/**
* Creates an array of elements, sorted in ascending order by the results of
* running each element in a collection through the callback. This method
* performs a stable sort, that is, it will preserve the original sort order
* of equal elements. The callback is bound to `thisArg` and invoked with
* three arguments; (value, index|key, collection).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an array of property names is provided for `callback` the collection
* will be sorted by each property value.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Array|Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new array of sorted elements.
* @example
*
* _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
* // => [3, 1, 2]
*
* _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
* // => [3, 1, 2]
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 },
* { 'name': 'barney', 'age': 26 },
* { 'name': 'fred', 'age': 30 }
* ];
*
* // using "_.pluck" callback shorthand
* _.map(_.sortBy(characters, 'age'), _.values);
* // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
*
* // sorting by multiple properties
* _.map(_.sortBy(characters, ['name', 'age']), _.values);
* // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
*/
function sortBy(collection, callback, thisArg) {
var index = -1,
isArr = isArray(callback),
length = collection ? collection.length : 0,
result = Array(typeof length == 'number' ? length : 0);
if (!isArr) {
callback = lodash.createCallback(callback, thisArg, 3);
}
forEach(collection, function(value, key, collection) {
var object = result[++index] = getObject();
if (isArr) {
object.criteria = map(callback, function(key) { return value[key]; });
} else {
(object.criteria = getArray())[0] = callback(value, key, collection);
}
object.index = index;
object.value = value;
});
length = result.length;
result.sort(compareAscending);
while (length--) {
var object = result[length];
result[length] = object.value;
if (!isArr) {
releaseArray(object.criteria);
}
releaseObject(object);
}
return result;
}
/**
* Converts the `collection` to an array.
*
* @static
* @memberOf _
* @category Collections
* @param {Array|Object|string} collection The collection to convert.
* @returns {Array} Returns the new converted array.
* @example
*
* (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
* // => [2, 3, 4]
*/
function toArray(collection) {
if (collection && typeof collection.length == 'number') {
return slice(collection);
}
return values(collection);
}
/**
* Performs a deep comparison of each element in a `collection` to the given
* `properties` object, returning an array of all elements that have equivalent
* property values.
*
* @static
* @memberOf _
* @type Function
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Object} props The object of property values to filter by.
* @returns {Array} Returns a new array of elements that have the given properties.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
* { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }
* ];
*
* _.where(characters, { 'age': 36 });
* // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
*
* _.where(characters, { 'pets': ['dino'] });
* // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
*/
var where = filter;
/*--------------------------------------------------------------------------*/
/**
* Creates an array with all falsey values removed. The values `false`, `null`,
* `0`, `""`, `undefined`, and `NaN` are all falsey.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to compact.
* @returns {Array} Returns a new array of filtered values.
* @example
*
* _.compact([0, 1, false, 2, '', 3]);
* // => [1, 2, 3]
*/
function compact(array) {
var index = -1,
length = array ? array.length : 0,
result = [];
while (++index < length) {
var value = array[index];
if (value) {
result.push(value);
}
}
return result;
}
/**
* Creates an array excluding all values of the provided arrays using strict
* equality for comparisons, i.e. `===`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to process.
* @param {...Array} [values] The arrays of values to exclude.
* @returns {Array} Returns a new array of filtered values.
* @example
*
* _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
* // => [1, 3, 4]
*/
function difference(array) {
return baseDifference(array, baseFlatten(arguments, true, true, 1));
}
/**
* This method is like `_.find` except that it returns the index of the first
* element that passes the callback check, instead of the element itself.
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to search.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {number} Returns the index of the found element, else `-1`.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'blocked': false },
* { 'name': 'fred', 'age': 40, 'blocked': true },
* { 'name': 'pebbles', 'age': 1, 'blocked': false }
* ];
*
* _.findIndex(characters, function(chr) {
* return chr.age < 20;
* });
* // => 2
*
* // using "_.where" callback shorthand
* _.findIndex(characters, { 'age': 36 });
* // => 0
*
* // using "_.pluck" callback shorthand
* _.findIndex(characters, 'blocked');
* // => 1
*/
function findIndex(array, callback, thisArg) {
var index = -1,
length = array ? array.length : 0;
callback = lodash.createCallback(callback, thisArg, 3);
while (++index < length) {
if (callback(array[index], index, array)) {
return index;
}
}
return -1;
}
/**
* This method is like `_.findIndex` except that it iterates over elements
* of a `collection` from right to left.
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to search.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {number} Returns the index of the found element, else `-1`.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36, 'blocked': true },
* { 'name': 'fred', 'age': 40, 'blocked': false },
* { 'name': 'pebbles', 'age': 1, 'blocked': true }
* ];
*
* _.findLastIndex(characters, function(chr) {
* return chr.age > 30;
* });
* // => 1
*
* // using "_.where" callback shorthand
* _.findLastIndex(characters, { 'age': 36 });
* // => 0
*
* // using "_.pluck" callback shorthand
* _.findLastIndex(characters, 'blocked');
* // => 2
*/
function findLastIndex(array, callback, thisArg) {
var length = array ? array.length : 0;
callback = lodash.createCallback(callback, thisArg, 3);
while (length--) {
if (callback(array[length], length, array)) {
return length;
}
}
return -1;
}
/**
* Gets the first element or first `n` elements of an array. If a callback
* is provided elements at the beginning of the array are returned as long
* as the callback returns truey. The callback is bound to `thisArg` and
* invoked with three arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias head, take
* @category Arrays
* @param {Array} array The array to query.
* @param {Function|Object|number|string} [callback] The function called
* per element or the number of elements to return. If a property name or
* object is provided it will be used to create a "_.pluck" or "_.where"
* style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the first element(s) of `array`.
* @example
*
* _.first([1, 2, 3]);
* // => 1
*
* _.first([1, 2, 3], 2);
* // => [1, 2]
*
* _.first([1, 2, 3], function(num) {
* return num < 3;
* });
* // => [1, 2]
*
* var characters = [
* { 'name': 'barney', 'blocked': true, 'employer': 'slate' },
* { 'name': 'fred', 'blocked': false, 'employer': 'slate' },
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
* ];
*
* // using "_.pluck" callback shorthand
* _.first(characters, 'blocked');
* // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
*
* // using "_.where" callback shorthand
* _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
* // => ['barney', 'fred']
*/
function first(array, callback, thisArg) {
var n = 0,
length = array ? array.length : 0;
if (typeof callback != 'number' && callback != null) {
var index = -1;
callback = lodash.createCallback(callback, thisArg, 3);
while (++index < length && callback(array[index], index, array)) {
n++;
}
} else {
n = callback;
if (n == null || thisArg) {
return array ? array[0] : undefined;
}
}
return slice(array, 0, nativeMin(nativeMax(0, n), length));
}
/**
* Flattens a nested array (the nesting can be to any depth). If `isShallow`
* is truey, the array will only be flattened a single level. If a callback
* is provided each element of the array is passed through the callback before
* flattening. The callback is bound to `thisArg` and invoked with three
* arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to flatten.
* @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new flattened array.
* @example
*
* _.flatten([1, [2], [3, [[4]]]]);
* // => [1, 2, 3, 4];
*
* _.flatten([1, [2], [3, [[4]]]], true);
* // => [1, 2, 3, [[4]]];
*
* var characters = [
* { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
* { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }
* ];
*
* // using "_.pluck" callback shorthand
* _.flatten(characters, 'pets');
* // => ['hoppy', 'baby puss', 'dino']
*/
function flatten(array, isShallow, callback, thisArg) {
// juggle arguments
if (typeof isShallow != 'boolean' && isShallow != null) {
thisArg = callback;
callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
isShallow = false;
}
if (callback != null) {
array = map(array, callback, thisArg);
}
return baseFlatten(array, isShallow);
}
/**
* Gets the index at which the first occurrence of `value` is found using
* strict equality for comparisons, i.e. `===`. If the array is already sorted
* providing `true` for `fromIndex` will run a faster binary search.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to search.
* @param {*} value The value to search for.
* @param {boolean|number} [fromIndex=0] The index to search from or `true`
* to perform a binary search on a sorted array.
* @returns {number} Returns the index of the matched value or `-1`.
* @example
*
* _.indexOf([1, 2, 3, 1, 2, 3], 2);
* // => 1
*
* _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
* // => 4
*
* _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
* // => 2
*/
function indexOf(array, value, fromIndex) {
if (typeof fromIndex == 'number') {
var length = array ? array.length : 0;
fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
} else if (fromIndex) {
var index = sortedIndex(array, value);
return array[index] === value ? index : -1;
}
return baseIndexOf(array, value, fromIndex);
}
/**
* Gets all but the last element or last `n` elements of an array. If a
* callback is provided elements at the end of the array are excluded from
* the result as long as the callback returns truey. The callback is bound
* to `thisArg` and invoked with three arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to query.
* @param {Function|Object|number|string} [callback=1] The function called
* per element or the number of elements to exclude. If a property name or
* object is provided it will be used to create a "_.pluck" or "_.where"
* style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a slice of `array`.
* @example
*
* _.initial([1, 2, 3]);
* // => [1, 2]
*
* _.initial([1, 2, 3], 2);
* // => [1]
*
* _.initial([1, 2, 3], function(num) {
* return num > 1;
* });
* // => [1]
*
* var characters = [
* { 'name': 'barney', 'blocked': false, 'employer': 'slate' },
* { 'name': 'fred', 'blocked': true, 'employer': 'slate' },
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
* ];
*
* // using "_.pluck" callback shorthand
* _.initial(characters, 'blocked');
* // => [{ 'name': 'barney', 'blocked': false, 'employer': 'slate' }]
*
* // using "_.where" callback shorthand
* _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
* // => ['barney', 'fred']
*/
function initial(array, callback, thisArg) {
var n = 0,
length = array ? array.length : 0;
if (typeof callback != 'number' && callback != null) {
var index = length;
callback = lodash.createCallback(callback, thisArg, 3);
while (index-- && callback(array[index], index, array)) {
n++;
}
} else {
n = (callback == null || thisArg) ? 1 : callback || n;
}
return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
}
/**
* Creates an array of unique values present in all provided arrays using
* strict equality for comparisons, i.e. `===`.
*
* @static
* @memberOf _
* @category Arrays
* @param {...Array} [array] The arrays to inspect.
* @returns {Array} Returns an array of shared values.
* @example
*
* _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
* // => [1, 2]
*/
function intersection() {
var args = [],
argsIndex = -1,
argsLength = arguments.length,
caches = getArray(),
indexOf = getIndexOf(),
trustIndexOf = indexOf === baseIndexOf,
seen = getArray();
while (++argsIndex < argsLength) {
var value = arguments[argsIndex];
if (isArray(value) || isArguments(value)) {
args.push(value);
caches.push(trustIndexOf && value.length >= largeArraySize &&
createCache(argsIndex ? args[argsIndex] : seen));
}
}
var array = args[0],
index = -1,
length = array ? array.length : 0,
result = [];
outer:
while (++index < length) {
var cache = caches[0];
value = array[index];
if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
argsIndex = argsLength;
(cache || seen).push(value);
while (--argsIndex) {
cache = caches[argsIndex];
if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
continue outer;
}
}
result.push(value);
}
}
while (argsLength--) {
cache = caches[argsLength];
if (cache) {
releaseObject(cache);
}
}
releaseArray(caches);
releaseArray(seen);
return result;
}
/**
* Gets the last element or last `n` elements of an array. If a callback is
* provided elements at the end of the array are returned as long as the
* callback returns truey. The callback is bound to `thisArg` and invoked
* with three arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to query.
* @param {Function|Object|number|string} [callback] The function called
* per element or the number of elements to return. If a property name or
* object is provided it will be used to create a "_.pluck" or "_.where"
* style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the last element(s) of `array`.
* @example
*
* _.last([1, 2, 3]);
* // => 3
*
* _.last([1, 2, 3], 2);
* // => [2, 3]
*
* _.last([1, 2, 3], function(num) {
* return num > 1;
* });
* // => [2, 3]
*
* var characters = [
* { 'name': 'barney', 'blocked': false, 'employer': 'slate' },
* { 'name': 'fred', 'blocked': true, 'employer': 'slate' },
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
* ];
*
* // using "_.pluck" callback shorthand
* _.pluck(_.last(characters, 'blocked'), 'name');
* // => ['fred', 'pebbles']
*
* // using "_.where" callback shorthand
* _.last(characters, { 'employer': 'na' });
* // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
*/
function last(array, callback, thisArg) {
var n = 0,
length = array ? array.length : 0;
if (typeof callback != 'number' && callback != null) {
var index = length;
callback = lodash.createCallback(callback, thisArg, 3);
while (index-- && callback(array[index], index, array)) {
n++;
}
} else {
n = callback;
if (n == null || thisArg) {
return array ? array[length - 1] : undefined;
}
}
return slice(array, nativeMax(0, length - n));
}
/**
* Gets the index at which the last occurrence of `value` is found using strict
* equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
* as the offset from the end of the collection.
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to search.
* @param {*} value The value to search for.
* @param {number} [fromIndex=array.length-1] The index to search from.
* @returns {number} Returns the index of the matched value or `-1`.
* @example
*
* _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
* // => 4
*
* _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
* // => 1
*/
function lastIndexOf(array, value, fromIndex) {
var index = array ? array.length : 0;
if (typeof fromIndex == 'number') {
index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;
}
while (index--) {
if (array[index] === value) {
return index;
}
}
return -1;
}
/**
* Removes all provided values from the given array using strict equality for
* comparisons, i.e. `===`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to modify.
* @param {...*} [value] The values to remove.
* @returns {Array} Returns `array`.
* @example
*
* var array = [1, 2, 3, 1, 2, 3];
* _.pull(array, 2, 3);
* console.log(array);
* // => [1, 1]
*/
function pull(array) {
var args = arguments,
argsIndex = 0,
argsLength = args.length,
length = array ? array.length : 0;
while (++argsIndex < argsLength) {
var index = -1,
value = args[argsIndex];
while (++index < length) {
if (array[index] === value) {
splice.call(array, index--, 1);
length--;
}
}
}
return array;
}
/**
* Creates an array of numbers (positive and/or negative) progressing from
* `start` up to but not including `end`. If `start` is less than `stop` a
* zero-length range is created unless a negative `step` is specified.
*
* @static
* @memberOf _
* @category Arrays
* @param {number} [start=0] The start of the range.
* @param {number} end The end of the range.
* @param {number} [step=1] The value to increment or decrement by.
* @returns {Array} Returns a new range array.
* @example
*
* _.range(4);
* // => [0, 1, 2, 3]
*
* _.range(1, 5);
* // => [1, 2, 3, 4]
*
* _.range(0, 20, 5);
* // => [0, 5, 10, 15]
*
* _.range(0, -4, -1);
* // => [0, -1, -2, -3]
*
* _.range(1, 4, 0);
* // => [1, 1, 1]
*
* _.range(0);
* // => []
*/
function range(start, end, step) {
start = +start || 0;
step = typeof step == 'number' ? step : (+step || 1);
if (end == null) {
end = start;
start = 0;
}
// use `Array(length)` so engines like Chakra and V8 avoid slower modes
// http://youtu.be/XAqIpGU8ZZk#t=17m25s
var index = -1,
length = nativeMax(0, ceil((end - start) / (step || 1))),
result = Array(length);
while (++index < length) {
result[index] = start;
start += step;
}
return result;
}
/**
* Removes all elements from an array that the callback returns truey for
* and returns an array of removed elements. The callback is bound to `thisArg`
* and invoked with three arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to modify.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a new array of removed elements.
* @example
*
* var array = [1, 2, 3, 4, 5, 6];
* var evens = _.remove(array, function(num) { return num % 2 == 0; });
*
* console.log(array);
* // => [1, 3, 5]
*
* console.log(evens);
* // => [2, 4, 6]
*/
function remove(array, callback, thisArg) {
var index = -1,
length = array ? array.length : 0,
result = [];
callback = lodash.createCallback(callback, thisArg, 3);
while (++index < length) {
var value = array[index];
if (callback(value, index, array)) {
result.push(value);
splice.call(array, index--, 1);
length--;
}
}
return result;
}
/**
* The opposite of `_.initial` this method gets all but the first element or
* first `n` elements of an array. If a callback function is provided elements
* at the beginning of the array are excluded from the result as long as the
* callback returns truey. The callback is bound to `thisArg` and invoked
* with three arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias drop, tail
* @category Arrays
* @param {Array} array The array to query.
* @param {Function|Object|number|string} [callback=1] The function called
* per element or the number of elements to exclude. If a property name or
* object is provided it will be used to create a "_.pluck" or "_.where"
* style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a slice of `array`.
* @example
*
* _.rest([1, 2, 3]);
* // => [2, 3]
*
* _.rest([1, 2, 3], 2);
* // => [3]
*
* _.rest([1, 2, 3], function(num) {
* return num < 3;
* });
* // => [3]
*
* var characters = [
* { 'name': 'barney', 'blocked': true, 'employer': 'slate' },
* { 'name': 'fred', 'blocked': false, 'employer': 'slate' },
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
* ];
*
* // using "_.pluck" callback shorthand
* _.pluck(_.rest(characters, 'blocked'), 'name');
* // => ['fred', 'pebbles']
*
* // using "_.where" callback shorthand
* _.rest(characters, { 'employer': 'slate' });
* // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
*/
function rest(array, callback, thisArg) {
if (typeof callback != 'number' && callback != null) {
var n = 0,
index = -1,
length = array ? array.length : 0;
callback = lodash.createCallback(callback, thisArg, 3);
while (++index < length && callback(array[index], index, array)) {
n++;
}
} else {
n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);
}
return slice(array, n);
}
/**
* Uses a binary search to determine the smallest index at which a value
* should be inserted into a given sorted array in order to maintain the sort
* order of the array. If a callback is provided it will be executed for
* `value` and each element of `array` to compute their sort ranking. The
* callback is bound to `thisArg` and invoked with one argument; (value).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to inspect.
* @param {*} value The value to evaluate.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
* @example
*
* _.sortedIndex([20, 30, 50], 40);
* // => 2
*
* // using "_.pluck" callback shorthand
* _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
* // => 2
*
* var dict = {
* 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
* };
*
* _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
* return dict.wordToNumber[word];
* });
* // => 2
*
* _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
* return this.wordToNumber[word];
* }, dict);
* // => 2
*/
function sortedIndex(array, value, callback, thisArg) {
var low = 0,
high = array ? array.length : low;
// explicitly reference `identity` for better inlining in Firefox
callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
value = callback(value);
while (low < high) {
var mid = (low + high) >>> 1;
(callback(array[mid]) < value)
? low = mid + 1
: high = mid;
}
return low;
}
/**
* Creates an array of unique values, in order, of the provided arrays using
* strict equality for comparisons, i.e. `===`.
*
* @static
* @memberOf _
* @category Arrays
* @param {...Array} [array] The arrays to inspect.
* @returns {Array} Returns an array of combined values.
* @example
*
* _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
* // => [1, 2, 3, 5, 4]
*/
function union() {
return baseUniq(baseFlatten(arguments, true, true));
}
/**
* Creates a duplicate-value-free version of an array using strict equality
* for comparisons, i.e. `===`. If the array is sorted, providing
* `true` for `isSorted` will use a faster algorithm. If a callback is provided
* each element of `array` is passed through the callback before uniqueness
* is computed. The callback is bound to `thisArg` and invoked with three
* arguments; (value, index, array).
*
* If a property name is provided for `callback` the created "_.pluck" style
* callback will return the property value of the given element.
*
* If an object is provided for `callback` the created "_.where" style callback
* will return `true` for elements that have the properties of the given object,
* else `false`.
*
* @static
* @memberOf _
* @alias unique
* @category Arrays
* @param {Array} array The array to process.
* @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
* @param {Function|Object|string} [callback=identity] The function called
* per iteration. If a property name or object is provided it will be used
* to create a "_.pluck" or "_.where" style callback, respectively.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns a duplicate-value-free array.
* @example
*
* _.uniq([1, 2, 1, 3, 1]);
* // => [1, 2, 3]
*
* _.uniq([1, 1, 2, 2, 3], true);
* // => [1, 2, 3]
*
* _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });
* // => ['A', 'b', 'C']
*
* _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);
* // => [1, 2.5, 3]
*
* // using "_.pluck" callback shorthand
* _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 1 }, { 'x': 2 }]
*/
function uniq(array, isSorted, callback, thisArg) {
// juggle arguments
if (typeof isSorted != 'boolean' && isSorted != null) {
thisArg = callback;
callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
isSorted = false;
}
if (callback != null) {
callback = lodash.createCallback(callback, thisArg, 3);
}
return baseUniq(array, isSorted, callback);
}
/**
* Creates an array excluding all provided values using strict equality for
* comparisons, i.e. `===`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to filter.
* @param {...*} [value] The values to exclude.
* @returns {Array} Returns a new array of filtered values.
* @example
*
* _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
* // => [2, 3, 4]
*/
function without(array) {
return baseDifference(array, slice(arguments, 1));
}
/**
* Creates an array that is the symmetric difference of the provided arrays.
* See http://en.wikipedia.org/wiki/Symmetric_difference.
*
* @static
* @memberOf _
* @category Arrays
* @param {...Array} [array] The arrays to inspect.
* @returns {Array} Returns an array of values.
* @example
*
* _.xor([1, 2, 3], [5, 2, 1, 4]);
* // => [3, 5, 4]
*
* _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
* // => [1, 4, 5]
*/
function xor() {
var index = -1,
length = arguments.length;
while (++index < length) {
var array = arguments[index];
if (isArray(array) || isArguments(array)) {
var result = result
? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
: array;
}
}
return result || [];
}
/**
* Creates an array of grouped elements, the first of which contains the first
* elements of the given arrays, the second of which contains the second
* elements of the given arrays, and so on.
*
* @static
* @memberOf _
* @alias unzip
* @category Arrays
* @param {...Array} [array] Arrays to process.
* @returns {Array} Returns a new array of grouped elements.
* @example
*
* _.zip(['fred', 'barney'], [30, 40], [true, false]);
* // => [['fred', 30, true], ['barney', 40, false]]
*/
function zip() {
var array = arguments.length > 1 ? arguments : arguments[0],
index = -1,
length = array ? max(pluck(array, 'length')) : 0,
result = Array(length < 0 ? 0 : length);
while (++index < length) {
result[index] = pluck(array, index);
}
return result;
}
/**
* Creates an object composed from arrays of `keys` and `values`. Provide
* either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`
* or two arrays, one of `keys` and one of corresponding `values`.
*
* @static
* @memberOf _
* @alias object
* @category Arrays
* @param {Array} keys The array of keys.
* @param {Array} [values=[]] The array of values.
* @returns {Object} Returns an object composed of the given keys and
* corresponding values.
* @example
*
* _.zipObject(['fred', 'barney'], [30, 40]);
* // => { 'fred': 30, 'barney': 40 }
*/
function zipObject(keys, values) {
var index = -1,
length = keys ? keys.length : 0,
result = {};
if (!values && length && !isArray(keys[0])) {
values = [];
}
while (++index < length) {
var key = keys[index];
if (values) {
result[key] = values[index];
} else if (key) {
result[key[0]] = key[1];
}
}
return result;
}
/*--------------------------------------------------------------------------*/
/**
* Creates a function that executes `func`, with the `this` binding and
* arguments of the created function, only after being called `n` times.
*
* @static
* @memberOf _
* @category Functions
* @param {number} n The number of times the function must be called before
* `func` is executed.
* @param {Function} func The function to restrict.
* @returns {Function} Returns the new restricted function.
* @example
*
* var saves = ['profile', 'settings'];
*
* var done = _.after(saves.length, function() {
* console.log('Done saving!');
* });
*
* _.forEach(saves, function(type) {
* asyncSave({ 'type': type, 'complete': done });
* });
* // => logs 'Done saving!', after all saves have completed
*/
function after(n, func) {
if (!isFunction(func)) {
throw new TypeError;
}
return function() {
if (--n < 1) {
return func.apply(this, arguments);
}
};
}
/**
* Creates a function that, when called, invokes `func` with the `this`
* binding of `thisArg` and prepends any additional `bind` arguments to those
* provided to the bound function.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to bind.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {...*} [arg] Arguments to be partially applied.
* @returns {Function} Returns the new bound function.
* @example
*
* var func = function(greeting) {
* return greeting + ' ' + this.name;
* };
*
* func = _.bind(func, { 'name': 'fred' }, 'hi');
* func();
* // => 'hi fred'
*/
function bind(func, thisArg) {
return arguments.length > 2
? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
: createWrapper(func, 1, null, null, thisArg);
}
/**
* Binds methods of an object to the object itself, overwriting the existing
* method. Method names may be specified as individual arguments or as arrays
* of method names. If no method names are provided all the function properties
* of `object` will be bound.
*
* @static
* @memberOf _
* @category Functions
* @param {Object} object The object to bind and assign the bound methods to.
* @param {...string} [methodName] The object method names to
* bind, specified as individual method names or arrays of method names.
* @returns {Object} Returns `object`.
* @example
*
* var view = {
* 'label': 'docs',
* 'onClick': function() { console.log('clicked ' + this.label); }
* };
*
* _.bindAll(view);
* jQuery('#docs').on('click', view.onClick);
* // => logs 'clicked docs', when the button is clicked
*/
function bindAll(object) {
var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),
index = -1,
length = funcs.length;
while (++index < length) {
var key = funcs[index];
object[key] = createWrapper(object[key], 1, null, null, object);
}
return object;
}
/**
* Creates a function that, when called, invokes the method at `object[key]`
* and prepends any additional `bindKey` arguments to those provided to the bound
* function. This method differs from `_.bind` by allowing bound functions to
* reference methods that will be redefined or don't yet exist.
* See http://michaux.ca/articles/lazy-function-definition-pattern.
*
* @static
* @memberOf _
* @category Functions
* @param {Object} object The object the method belongs to.
* @param {string} key The key of the method.
* @param {...*} [arg] Arguments to be partially applied.
* @returns {Function} Returns the new bound function.
* @example
*
* var object = {
* 'name': 'fred',
* 'greet': function(greeting) {
* return greeting + ' ' + this.name;
* }
* };
*
* var func = _.bindKey(object, 'greet', 'hi');
* func();
* // => 'hi fred'
*
* object.greet = function(greeting) {
* return greeting + 'ya ' + this.name + '!';
* };
*
* func();
* // => 'hiya fred!'
*/
function bindKey(object, key) {
return arguments.length > 2
? createWrapper(key, 19, slice(arguments, 2), null, object)
: createWrapper(key, 3, null, null, object);
}
/**
* Creates a function that is the composition of the provided functions,
* where each function consumes the return value of the function that follows.
* For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.
* Each function is executed with the `this` binding of the composed function.
*
* @static
* @memberOf _
* @category Functions
* @param {...Function} [func] Functions to compose.
* @returns {Function} Returns the new composed function.
* @example
*
* var realNameMap = {
* 'pebbles': 'penelope'
* };
*
* var format = function(name) {
* name = realNameMap[name.toLowerCase()] || name;
* return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
* };
*
* var greet = function(formatted) {
* return 'Hiya ' + formatted + '!';
* };
*
* var welcome = _.compose(greet, format);
* welcome('pebbles');
* // => 'Hiya Penelope!'
*/
function compose() {
var funcs = arguments,
length = funcs.length;
while (length--) {
if (!isFunction(funcs[length])) {
throw new TypeError;
}
}
return function() {
var args = arguments,
length = funcs.length;
while (length--) {
args = [funcs[length].apply(this, args)];
}
return args[0];
};
}
/**
* Creates a function which accepts one or more arguments of `func` that when
* invoked either executes `func` returning its result, if all `func` arguments
* have been provided, or returns a function that accepts one or more of the
* remaining `func` arguments, and so on. The arity of `func` can be specified
* if `func.length` is not sufficient.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to curry.
* @param {number} [arity=func.length] The arity of `func`.
* @returns {Function} Returns the new curried function.
* @example
*
* var curried = _.curry(function(a, b, c) {
* console.log(a + b + c);
* });
*
* curried(1)(2)(3);
* // => 6
*
* curried(1, 2)(3);
* // => 6
*
* curried(1, 2, 3);
* // => 6
*/
function curry(func, arity) {
arity = typeof arity == 'number' ? arity : (+arity || func.length);
return createWrapper(func, 4, null, null, null, arity);
}
/**
* Creates a function that will delay the execution of `func` until after
* `wait` milliseconds have elapsed since the last time it was invoked.
* Provide an options object to indicate that `func` should be invoked on
* the leading and/or trailing edge of the `wait` timeout. Subsequent calls
* to the debounced function will return the result of the last `func` call.
*
* Note: If `leading` and `trailing` options are `true` `func` will be called
* on the trailing edge of the timeout only if the the debounced function is
* invoked more than once during the `wait` timeout.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to debounce.
* @param {number} wait The number of milliseconds to delay.
* @param {Object} [options] The options object.
* @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.
* @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.
* @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
* @returns {Function} Returns the new debounced function.
* @example
*
* // avoid costly calculations while the window size is in flux
* var lazyLayout = _.debounce(calculateLayout, 150);
* jQuery(window).on('resize', lazyLayout);
*
* // execute `sendMail` when the click event is fired, debouncing subsequent calls
* jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
* 'leading': true,
* 'trailing': false
* });
*
* // ensure `batchLog` is executed once after 1 second of debounced calls
* var source = new EventSource('/stream');
* source.addEventListener('message', _.debounce(batchLog, 250, {
* 'maxWait': 1000
* }, false);
*/
function debounce(func, wait, options) {
var args,
maxTimeoutId,
result,
stamp,
thisArg,
timeoutId,
trailingCall,
lastCalled = 0,
maxWait = false,
trailing = true;
if (!isFunction(func)) {
throw new TypeError;
}
wait = nativeMax(0, wait) || 0;
if (options === true) {
var leading = true;
trailing = false;
} else if (isObject(options)) {
leading = options.leading;
maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
trailing = 'trailing' in options ? options.trailing : trailing;
}
var delayed = function() {
var remaining = wait - (now() - stamp);
if (remaining <= 0) {
if (maxTimeoutId) {
clearTimeout(maxTimeoutId);
}
var isCalled = trailingCall;
maxTimeoutId = timeoutId = trailingCall = undefined;
if (isCalled) {
lastCalled = now();
result = func.apply(thisArg, args);
if (!timeoutId && !maxTimeoutId) {
args = thisArg = null;
}
}
} else {
timeoutId = setTimeout(delayed, remaining);
}
};
var maxDelayed = function() {
if (timeoutId) {
clearTimeout(timeoutId);
}
maxTimeoutId = timeoutId = trailingCall = undefined;
if (trailing || (maxWait !== wait)) {
lastCalled = now();
result = func.apply(thisArg, args);
if (!timeoutId && !maxTimeoutId) {
args = thisArg = null;
}
}
};
return function() {
args = arguments;
stamp = now();
thisArg = this;
trailingCall = trailing && (timeoutId || !leading);
if (maxWait === false) {
var leadingCall = leading && !timeoutId;
} else {
if (!maxTimeoutId && !leading) {
lastCalled = stamp;
}
var remaining = maxWait - (stamp - lastCalled),
isCalled = remaining <= 0;
if (isCalled) {
if (maxTimeoutId) {
maxTimeoutId = clearTimeout(maxTimeoutId);
}
lastCalled = stamp;
result = func.apply(thisArg, args);
}
else if (!maxTimeoutId) {
maxTimeoutId = setTimeout(maxDelayed, remaining);
}
}
if (isCalled && timeoutId) {
timeoutId = clearTimeout(timeoutId);
}
else if (!timeoutId && wait !== maxWait) {
timeoutId = setTimeout(delayed, wait);
}
if (leadingCall) {
isCalled = true;
result = func.apply(thisArg, args);
}
if (isCalled && !timeoutId && !maxTimeoutId) {
args = thisArg = null;
}
return result;
};
}
/**
* Defers executing the `func` function until the current call stack has cleared.
* Additional arguments will be provided to `func` when it is invoked.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to defer.
* @param {...*} [arg] Arguments to invoke the function with.
* @returns {number} Returns the timer id.
* @example
*
* _.defer(function(text) { console.log(text); }, 'deferred');
* // logs 'deferred' after one or more milliseconds
*/
function defer(func) {
if (!isFunction(func)) {
throw new TypeError;
}
var args = slice(arguments, 1);
return setTimeout(function() { func.apply(undefined, args); }, 1);
}
/**
* Executes the `func` function after `wait` milliseconds. Additional arguments
* will be provided to `func` when it is invoked.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay execution.
* @param {...*} [arg] Arguments to invoke the function with.
* @returns {number} Returns the timer id.
* @example
*
* _.delay(function(text) { console.log(text); }, 1000, 'later');
* // => logs 'later' after one second
*/
function delay(func, wait) {
if (!isFunction(func)) {
throw new TypeError;
}
var args = slice(arguments, 2);
return setTimeout(function() { func.apply(undefined, args); }, wait);
}
/**
* Creates a function that memoizes the result of `func`. If `resolver` is
* provided it will be used to determine the cache key for storing the result
* based on the arguments provided to the memoized function. By default, the
* first argument provided to the memoized function is used as the cache key.
* The `func` is executed with the `this` binding of the memoized function.
* The result cache is exposed as the `cache` property on the memoized function.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to have its output memoized.
* @param {Function} [resolver] A function used to resolve the cache key.
* @returns {Function} Returns the new memoizing function.
* @example
*
* var fibonacci = _.memoize(function(n) {
* return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
* });
*
* fibonacci(9)
* // => 34
*
* var data = {
* 'fred': { 'name': 'fred', 'age': 40 },
* 'pebbles': { 'name': 'pebbles', 'age': 1 }
* };
*
* // modifying the result cache
* var get = _.memoize(function(name) { return data[name]; }, _.identity);
* get('pebbles');
* // => { 'name': 'pebbles', 'age': 1 }
*
* get.cache.pebbles.name = 'penelope';
* get('pebbles');
* // => { 'name': 'penelope', 'age': 1 }
*/
function memoize(func, resolver) {
if (!isFunction(func)) {
throw new TypeError;
}
var memoized = function() {
var cache = memoized.cache,
key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];
return hasOwnProperty.call(cache, key)
? cache[key]
: (cache[key] = func.apply(this, arguments));
}
memoized.cache = {};
return memoized;
}
/**
* Creates a function that is restricted to execute `func` once. Repeat calls to
* the function will return the value of the first call. The `func` is executed
* with the `this` binding of the created function.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to restrict.
* @returns {Function} Returns the new restricted function.
* @example
*
* var initialize = _.once(createApplication);
* initialize();
* initialize();
* // `initialize` executes `createApplication` once
*/
function once(func) {
var ran,
result;
if (!isFunction(func)) {
throw new TypeError;
}
return function() {
if (ran) {
return result;
}
ran = true;
result = func.apply(this, arguments);
// clear the `func` variable so the function may be garbage collected
func = null;
return result;
};
}
/**
* Creates a function that, when called, invokes `func` with any additional
* `partial` arguments prepended to those provided to the new function. This
* method is similar to `_.bind` except it does **not** alter the `this` binding.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to partially apply arguments to.
* @param {...*} [arg] Arguments to be partially applied.
* @returns {Function} Returns the new partially applied function.
* @example
*
* var greet = function(greeting, name) { return greeting + ' ' + name; };
* var hi = _.partial(greet, 'hi');
* hi('fred');
* // => 'hi fred'
*/
function partial(func) {
return createWrapper(func, 16, slice(arguments, 1));
}
/**
* This method is like `_.partial` except that `partial` arguments are
* appended to those provided to the new function.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to partially apply arguments to.
* @param {...*} [arg] Arguments to be partially applied.
* @returns {Function} Returns the new partially applied function.
* @example
*
* var defaultsDeep = _.partialRight(_.merge, _.defaults);
*
* var options = {
* 'variable': 'data',
* 'imports': { 'jq': $ }
* };
*
* defaultsDeep(options, _.templateSettings);
*
* options.variable
* // => 'data'
*
* options.imports
* // => { '_': _, 'jq': $ }
*/
function partialRight(func) {
return createWrapper(func, 32, null, slice(arguments, 1));
}
/**
* Creates a function that, when executed, will only call the `func` function
* at most once per every `wait` milliseconds. Provide an options object to
* indicate that `func` should be invoked on the leading and/or trailing edge
* of the `wait` timeout. Subsequent calls to the throttled function will
* return the result of the last `func` call.
*
* Note: If `leading` and `trailing` options are `true` `func` will be called
* on the trailing edge of the timeout only if the the throttled function is
* invoked more than once during the `wait` timeout.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to throttle.
* @param {number} wait The number of milliseconds to throttle executions to.
* @param {Object} [options] The options object.
* @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.
* @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
* @returns {Function} Returns the new throttled function.
* @example
*
* // avoid excessively updating the position while scrolling
* var throttled = _.throttle(updatePosition, 100);
* jQuery(window).on('scroll', throttled);
*
* // execute `renewToken` when the click event is fired, but not more than once every 5 minutes
* jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
* 'trailing': false
* }));
*/
function throttle(func, wait, options) {
var leading = true,
trailing = true;
if (!isFunction(func)) {
throw new TypeError;
}
if (options === false) {
leading = false;
} else if (isObject(options)) {
leading = 'leading' in options ? options.leading : leading;
trailing = 'trailing' in options ? options.trailing : trailing;
}
debounceOptions.leading = leading;
debounceOptions.maxWait = wait;
debounceOptions.trailing = trailing;
return debounce(func, wait, debounceOptions);
}
/**
* Creates a function that provides `value` to the wrapper function as its
* first argument. Additional arguments provided to the function are appended
* to those provided to the wrapper function. The wrapper is executed with
* the `this` binding of the created function.
*
* @static
* @memberOf _
* @category Functions
* @param {*} value The value to wrap.
* @param {Function} wrapper The wrapper function.
* @returns {Function} Returns the new function.
* @example
*
* var p = _.wrap(_.escape, function(func, text) {
* return '<p>' + func(text) + '</p>';
* });
*
* p('Fred, Wilma, & Pebbles');
* // => '<p>Fred, Wilma, &amp; Pebbles</p>'
*/
function wrap(value, wrapper) {
return createWrapper(wrapper, 16, [value]);
}
/*--------------------------------------------------------------------------*/
/**
* Creates a function that returns `value`.
*
* @static
* @memberOf _
* @category Utilities
* @param {*} value The value to return from the new function.
* @returns {Function} Returns the new function.
* @example
*
* var object = { 'name': 'fred' };
* var getter = _.constant(object);
* getter() === object;
* // => true
*/
function constant(value) {
return function() {
return value;
};
}
/**
* Produces a callback bound to an optional `thisArg`. If `func` is a property
* name the created callback will return the property value for a given element.
* If `func` is an object the created callback will return `true` for elements
* that contain the equivalent object properties, otherwise it will return `false`.
*
* @static
* @memberOf _
* @category Utilities
* @param {*} [func=identity] The value to convert to a callback.
* @param {*} [thisArg] The `this` binding of the created callback.
* @param {number} [argCount] The number of arguments the callback accepts.
* @returns {Function} Returns a callback function.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* // wrap to create custom callback shorthands
* _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
* var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
* return !match ? func(callback, thisArg) : function(object) {
* return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
* };
* });
*
* _.filter(characters, 'age__gt38');
* // => [{ 'name': 'fred', 'age': 40 }]
*/
function createCallback(func, thisArg, argCount) {
var type = typeof func;
if (func == null || type == 'function') {
return baseCreateCallback(func, thisArg, argCount);
}
// handle "_.pluck" style callback shorthands
if (type != 'object') {
return property(func);
}
var props = keys(func),
key = props[0],
a = func[key];
// handle "_.where" style callback shorthands
if (props.length == 1 && a === a && !isObject(a)) {
// fast path the common case of providing an object with a single
// property containing a primitive value
return function(object) {
var b = object[key];
return a === b && (a !== 0 || (1 / a == 1 / b));
};
}
return function(object) {
var length = props.length,
result = false;
while (length--) {
if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
break;
}
}
return result;
};
}
/**
* Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
* corresponding HTML entities.
*
* @static
* @memberOf _
* @category Utilities
* @param {string} string The string to escape.
* @returns {string} Returns the escaped string.
* @example
*
* _.escape('Fred, Wilma, & Pebbles');
* // => 'Fred, Wilma, &amp; Pebbles'
*/
function escape(string) {
return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
}
/**
* This method returns the first argument provided to it.
*
* @static
* @memberOf _
* @category Utilities
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'name': 'fred' };
* _.identity(object) === object;
* // => true
*/
function identity(value) {
return value;
}
/**
* Adds function properties of a source object to the destination object.
* If `object` is a function methods will be added to its prototype as well.
*
* @static
* @memberOf _
* @category Utilities
* @param {Function|Object} [object=lodash] object The destination object.
* @param {Object} source The object of functions to add.
* @param {Object} [options] The options object.
* @param {boolean} [options.chain=true] Specify whether the functions added are chainable.
* @example
*
* function capitalize(string) {
* return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
* }
*
* _.mixin({ 'capitalize': capitalize });
* _.capitalize('fred');
* // => 'Fred'
*
* _('fred').capitalize().value();
* // => 'Fred'
*
* _.mixin({ 'capitalize': capitalize }, { 'chain': false });
* _('fred').capitalize();
* // => 'Fred'
*/
function mixin(object, source, options) {
var chain = true,
methodNames = source && functions(source);
if (!source || (!options && !methodNames.length)) {
if (options == null) {
options = source;
}
ctor = lodashWrapper;
source = object;
object = lodash;
methodNames = functions(source);
}
if (options === false) {
chain = false;
} else if (isObject(options) && 'chain' in options) {
chain = options.chain;
}
var ctor = object,
isFunc = isFunction(ctor);
forEach(methodNames, function(methodName) {
var func = object[methodName] = source[methodName];
if (isFunc) {
ctor.prototype[methodName] = function() {
var chainAll = this.__chain__,
value = this.__wrapped__,
args = [value];
push.apply(args, arguments);
var result = func.apply(object, args);
if (chain || chainAll) {
if (value === result && isObject(result)) {
return this;
}
result = new ctor(result);
result.__chain__ = chainAll;
}
return result;
};
}
});
}
/**
* Reverts the '_' variable to its previous value and returns a reference to
* the `lodash` function.
*
* @static
* @memberOf _
* @category Utilities
* @returns {Function} Returns the `lodash` function.
* @example
*
* var lodash = _.noConflict();
*/
function noConflict() {
context._ = oldDash;
return this;
}
/**
* A no-operation function.
*
* @static
* @memberOf _
* @category Utilities
* @example
*
* var object = { 'name': 'fred' };
* _.noop(object) === undefined;
* // => true
*/
function noop() {
// no operation performed
}
/**
* Gets the number of milliseconds that have elapsed since the Unix epoch
* (1 January 1970 00:00:00 UTC).
*
* @static
* @memberOf _
* @category Utilities
* @example
*
* var stamp = _.now();
* _.defer(function() { console.log(_.now() - stamp); });
* // => logs the number of milliseconds it took for the deferred function to be called
*/
var now = isNative(now = Date.now) && now || function() {
return new Date().getTime();
};
/**
* Converts the given value into an integer of the specified radix.
* If `radix` is `undefined` or `0` a `radix` of `10` is used unless the
* `value` is a hexadecimal, in which case a `radix` of `16` is used.
*
* Note: This method avoids differences in native ES3 and ES5 `parseInt`
* implementations. See http://es5.github.io/#E.
*
* @static
* @memberOf _
* @category Utilities
* @param {string} value The value to parse.
* @param {number} [radix] The radix used to interpret the value to parse.
* @returns {number} Returns the new integer value.
* @example
*
* _.parseInt('08');
* // => 8
*/
var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
// Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`
return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
};
/**
* Creates a "_.pluck" style function, which returns the `key` value of a
* given object.
*
* @static
* @memberOf _
* @category Utilities
* @param {string} key The name of the property to retrieve.
* @returns {Function} Returns the new function.
* @example
*
* var characters = [
* { 'name': 'fred', 'age': 40 },
* { 'name': 'barney', 'age': 36 }
* ];
*
* var getName = _.property('name');
*
* _.map(characters, getName);
* // => ['barney', 'fred']
*
* _.sortBy(characters, getName);
* // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }]
*/
function property(key) {
return function(object) {
return object[key];
};
}
/**
* Produces a random number between `min` and `max` (inclusive). If only one
* argument is provided a number between `0` and the given number will be
* returned. If `floating` is truey or either `min` or `max` are floats a
* floating-point number will be returned instead of an integer.
*
* @static
* @memberOf _
* @category Utilities
* @param {number} [min=0] The minimum possible value.
* @param {number} [max=1] The maximum possible value.
* @param {boolean} [floating=false] Specify returning a floating-point number.
* @returns {number} Returns a random number.
* @example
*
* _.random(0, 5);
* // => an integer between 0 and 5
*
* _.random(5);
* // => also an integer between 0 and 5
*
* _.random(5, true);
* // => a floating-point number between 0 and 5
*
* _.random(1.2, 5.2);
* // => a floating-point number between 1.2 and 5.2
*/
function random(min, max, floating) {
var noMin = min == null,
noMax = max == null;
if (floating == null) {
if (typeof min == 'boolean' && noMax) {
floating = min;
min = 1;
}
else if (!noMax && typeof max == 'boolean') {
floating = max;
noMax = true;
}
}
if (noMin && noMax) {
max = 1;
}
min = +min || 0;
if (noMax) {
max = min;
min = 0;
} else {
max = +max || 0;
}
if (floating || min % 1 || max % 1) {
var rand = nativeRandom();
return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);
}
return baseRandom(min, max);
}
/**
* Resolves the value of property `key` on `object`. If `key` is a function
* it will be invoked with the `this` binding of `object` and its result returned,
* else the property value is returned. If `object` is falsey then `undefined`
* is returned.
*
* @static
* @memberOf _
* @category Utilities
* @param {Object} object The object to inspect.
* @param {string} key The name of the property to resolve.
* @returns {*} Returns the resolved value.
* @example
*
* var object = {
* 'cheese': 'crumpets',
* 'stuff': function() {
* return 'nonsense';
* }
* };
*
* _.result(object, 'cheese');
* // => 'crumpets'
*
* _.result(object, 'stuff');
* // => 'nonsense'
*/
function result(object, key) {
if (object) {
var value = object[key];
return isFunction(value) ? object[key]() : value;
}
}
/**
* A micro-templating method that handles arbitrary delimiters, preserves
* whitespace, and correctly escapes quotes within interpolated code.
*
* Note: In the development build, `_.template` utilizes sourceURLs for easier
* debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
*
* For more information on precompiling templates see:
* http://lodash.com/custom-builds
*
* For more information on Chrome extension sandboxes see:
* http://developer.chrome.com/stable/extensions/sandboxingEval.html
*
* @static
* @memberOf _
* @category Utilities
* @param {string} text The template text.
* @param {Object} data The data object used to populate the text.
* @param {Object} [options] The options object.
* @param {RegExp} [options.escape] The "escape" delimiter.
* @param {RegExp} [options.evaluate] The "evaluate" delimiter.
* @param {Object} [options.imports] An object to import into the template as local variables.
* @param {RegExp} [options.interpolate] The "interpolate" delimiter.
* @param {string} [sourceURL] The sourceURL of the template's compiled source.
* @param {string} [variable] The data object variable name.
* @returns {Function|string} Returns a compiled function when no `data` object
* is given, else it returns the interpolated text.
* @example
*
* // using the "interpolate" delimiter to create a compiled template
* var compiled = _.template('hello <%= name %>');
* compiled({ 'name': 'fred' });
* // => 'hello fred'
*
* // using the "escape" delimiter to escape HTML in data property values
* _.template('<b><%- value %></b>', { 'value': '<script>' });
* // => '<b>&lt;script&gt;</b>'
*
* // using the "evaluate" delimiter to generate HTML
* var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';
* _.template(list, { 'people': ['fred', 'barney'] });
* // => '<li>fred</li><li>barney</li>'
*
* // using the ES6 delimiter as an alternative to the default "interpolate" delimiter
* _.template('hello ${ name }', { 'name': 'pebbles' });
* // => 'hello pebbles'
*
* // using the internal `print` function in "evaluate" delimiters
* _.template('<% print("hello " + name); %>!', { 'name': 'barney' });
* // => 'hello barney!'
*
* // using a custom template delimiters
* _.templateSettings = {
* 'interpolate': /{{([\s\S]+?)}}/g
* };
*
* _.template('hello {{ name }}!', { 'name': 'mustache' });
* // => 'hello mustache!'
*
* // using the `imports` option to import jQuery
* var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';
* _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });
* // => '<li>fred</li><li>barney</li>'
*
* // using the `sourceURL` option to specify a custom sourceURL for the template
* var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
* compiled(data);
* // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
*
* // using the `variable` option to ensure a with-statement isn't used in the compiled template
* var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });
* compiled.source;
* // => function(data) {
* var __t, __p = '', __e = _.escape;
* __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';
* return __p;
* }
*
* // using the `source` property to inline compiled templates for meaningful
* // line numbers in error messages and a stack trace
* fs.writeFileSync(path.join(cwd, 'jst.js'), '\
* var JST = {\
* "main": ' + _.template(mainText).source + '\
* };\
* ');
*/
function template(text, data, options) {
// based on John Resig's `tmpl` implementation
// http://ejohn.org/blog/javascript-micro-templating/
// and Laura Doktorova's doT.js
// https://github.com/olado/doT
var settings = lodash.templateSettings;
text = String(text || '');
// avoid missing dependencies when `iteratorTemplate` is not defined
options = defaults({}, options, settings);
var imports = defaults({}, options.imports, settings.imports),
importsKeys = keys(imports),
importsValues = values(imports);
var isEvaluating,
index = 0,
interpolate = options.interpolate || reNoMatch,
source = "__p += '";
// compile the regexp to match each delimiter
var reDelimiters = RegExp(
(options.escape || reNoMatch).source + '|' +
interpolate.source + '|' +
(interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
(options.evaluate || reNoMatch).source + '|$'
, 'g');
text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
interpolateValue || (interpolateValue = esTemplateValue);
// escape characters that cannot be included in string literals
source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);
// replace delimiters with snippets
if (escapeValue) {
source += "' +\n__e(" + escapeValue + ") +\n'";
}
if (evaluateValue) {
isEvaluating = true;
source += "';\n" + evaluateValue + ";\n__p += '";
}
if (interpolateValue) {
source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
}
index = offset + match.length;
// the JS engine embedded in Adobe products requires returning the `match`
// string in order to produce the correct `offset` value
return match;
});
source += "';\n";
// if `variable` is not specified, wrap a with-statement around the generated
// code to add the data object to the top of the scope chain
var variable = options.variable,
hasVariable = variable;
if (!hasVariable) {
variable = 'obj';
source = 'with (' + variable + ') {\n' + source + '\n}\n';
}
// cleanup code by stripping empty strings
source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
.replace(reEmptyStringMiddle, '$1')
.replace(reEmptyStringTrailing, '$1;');
// frame code as the function body
source = 'function(' + variable + ') {\n' +
(hasVariable ? '' : variable + ' || (' + variable + ' = {});\n') +
"var __t, __p = '', __e = _.escape" +
(isEvaluating
? ', __j = Array.prototype.join;\n' +
"function print() { __p += __j.call(arguments, '') }\n"
: ';\n'
) +
source +
'return __p\n}';
// Use a sourceURL for easier debugging.
// http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
var sourceURL = '\n/*\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\n*/';
try {
var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);
} catch(e) {
e.source = source;
throw e;
}
if (data) {
return result(data);
}
// provide the compiled function's source by its `toString` method, in
// supported environments, or the `source` property as a convenience for
// inlining compiled templates during the build process
result.source = source;
return result;
}
/**
* Executes the callback `n` times, returning an array of the results
* of each callback execution. The callback is bound to `thisArg` and invoked
* with one argument; (index).
*
* @static
* @memberOf _
* @category Utilities
* @param {number} n The number of times to execute the callback.
* @param {Function} callback The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns an array of the results of each `callback` execution.
* @example
*
* var diceRolls = _.times(3, _.partial(_.random, 1, 6));
* // => [3, 6, 4]
*
* _.times(3, function(n) { mage.castSpell(n); });
* // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively
*
* _.times(3, function(n) { this.cast(n); }, mage);
* // => also calls `mage.castSpell(n)` three times
*/
function times(n, callback, thisArg) {
n = (n = +n) > -1 ? n : 0;
var index = -1,
result = Array(n);
callback = baseCreateCallback(callback, thisArg, 1);
while (++index < n) {
result[index] = callback(index);
}
return result;
}
/**
* The inverse of `_.escape` this method converts the HTML entities
* `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their
* corresponding characters.
*
* @static
* @memberOf _
* @category Utilities
* @param {string} string The string to unescape.
* @returns {string} Returns the unescaped string.
* @example
*
* _.unescape('Fred, Barney &amp; Pebbles');
* // => 'Fred, Barney & Pebbles'
*/
function unescape(string) {
return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
}
/**
* Generates a unique ID. If `prefix` is provided the ID will be appended to it.
*
* @static
* @memberOf _
* @category Utilities
* @param {string} [prefix] The value to prefix the ID with.
* @returns {string} Returns the unique ID.
* @example
*
* _.uniqueId('contact_');
* // => 'contact_104'
*
* _.uniqueId();
* // => '105'
*/
function uniqueId(prefix) {
var id = ++idCounter;
return String(prefix == null ? '' : prefix) + id;
}
/*--------------------------------------------------------------------------*/
/**
* Creates a `lodash` object that wraps the given value with explicit
* method chaining enabled.
*
* @static
* @memberOf _
* @category Chaining
* @param {*} value The value to wrap.
* @returns {Object} Returns the wrapper object.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 },
* { 'name': 'pebbles', 'age': 1 }
* ];
*
* var youngest = _.chain(characters)
* .sortBy('age')
* .map(function(chr) { return chr.name + ' is ' + chr.age; })
* .first()
* .value();
* // => 'pebbles is 1'
*/
function chain(value) {
value = new lodashWrapper(value);
value.__chain__ = true;
return value;
}
/**
* Invokes `interceptor` with the `value` as the first argument and then
* returns `value`. The purpose of this method is to "tap into" a method
* chain in order to perform operations on intermediate results within
* the chain.
*
* @static
* @memberOf _
* @category Chaining
* @param {*} value The value to provide to `interceptor`.
* @param {Function} interceptor The function to invoke.
* @returns {*} Returns `value`.
* @example
*
* _([1, 2, 3, 4])
* .tap(function(array) { array.pop(); })
* .reverse()
* .value();
* // => [3, 2, 1]
*/
function tap(value, interceptor) {
interceptor(value);
return value;
}
/**
* Enables explicit method chaining on the wrapper object.
*
* @name chain
* @memberOf _
* @category Chaining
* @returns {*} Returns the wrapper object.
* @example
*
* var characters = [
* { 'name': 'barney', 'age': 36 },
* { 'name': 'fred', 'age': 40 }
* ];
*
* // without explicit chaining
* _(characters).first();
* // => { 'name': 'barney', 'age': 36 }
*
* // with explicit chaining
* _(characters).chain()
* .first()
* .pick('age')
* .value();
* // => { 'age': 36 }
*/
function wrapperChain() {
this.__chain__ = true;
return this;
}
/**
* Produces the `toString` result of the wrapped value.
*
* @name toString
* @memberOf _
* @category Chaining
* @returns {string} Returns the string result.
* @example
*
* _([1, 2, 3]).toString();
* // => '1,2,3'
*/
function wrapperToString() {
return String(this.__wrapped__);
}
/**
* Extracts the wrapped value.
*
* @name valueOf
* @memberOf _
* @alias value
* @category Chaining
* @returns {*} Returns the wrapped value.
* @example
*
* _([1, 2, 3]).valueOf();
* // => [1, 2, 3]
*/
function wrapperValueOf() {
return this.__wrapped__;
}
/*--------------------------------------------------------------------------*/
// add functions that return wrapped values when chaining
lodash.after = after;
lodash.assign = assign;
lodash.at = at;
lodash.bind = bind;
lodash.bindAll = bindAll;
lodash.bindKey = bindKey;
lodash.chain = chain;
lodash.compact = compact;
lodash.compose = compose;
lodash.constant = constant;
lodash.countBy = countBy;
lodash.create = create;
lodash.createCallback = createCallback;
lodash.curry = curry;
lodash.debounce = debounce;
lodash.defaults = defaults;
lodash.defer = defer;
lodash.delay = delay;
lodash.difference = difference;
lodash.filter = filter;
lodash.flatten = flatten;
lodash.forEach = forEach;
lodash.forEachRight = forEachRight;
lodash.forIn = forIn;
lodash.forInRight = forInRight;
lodash.forOwn = forOwn;
lodash.forOwnRight = forOwnRight;
lodash.functions = functions;
lodash.groupBy = groupBy;
lodash.indexBy = indexBy;
lodash.initial = initial;
lodash.intersection = intersection;
lodash.invert = invert;
lodash.invoke = invoke;
lodash.keys = keys;
lodash.map = map;
lodash.mapValues = mapValues;
lodash.max = max;
lodash.memoize = memoize;
lodash.merge = merge;
lodash.min = min;
lodash.omit = omit;
lodash.once = once;
lodash.pairs = pairs;
lodash.partial = partial;
lodash.partialRight = partialRight;
lodash.pick = pick;
lodash.pluck = pluck;
lodash.property = property;
lodash.pull = pull;
lodash.range = range;
lodash.reject = reject;
lodash.remove = remove;
lodash.rest = rest;
lodash.shuffle = shuffle;
lodash.sortBy = sortBy;
lodash.tap = tap;
lodash.throttle = throttle;
lodash.times = times;
lodash.toArray = toArray;
lodash.transform = transform;
lodash.union = union;
lodash.uniq = uniq;
lodash.values = values;
lodash.where = where;
lodash.without = without;
lodash.wrap = wrap;
lodash.xor = xor;
lodash.zip = zip;
lodash.zipObject = zipObject;
// add aliases
lodash.collect = map;
lodash.drop = rest;
lodash.each = forEach;
lodash.eachRight = forEachRight;
lodash.extend = assign;
lodash.methods = functions;
lodash.object = zipObject;
lodash.select = filter;
lodash.tail = rest;
lodash.unique = uniq;
lodash.unzip = zip;
// add functions to `lodash.prototype`
mixin(lodash);
/*--------------------------------------------------------------------------*/
// add functions that return unwrapped values when chaining
lodash.clone = clone;
lodash.cloneDeep = cloneDeep;
lodash.contains = contains;
lodash.escape = escape;
lodash.every = every;
lodash.find = find;
lodash.findIndex = findIndex;
lodash.findKey = findKey;
lodash.findLast = findLast;
lodash.findLastIndex = findLastIndex;
lodash.findLastKey = findLastKey;
lodash.has = has;
lodash.identity = identity;
lodash.indexOf = indexOf;
lodash.isArguments = isArguments;
lodash.isArray = isArray;
lodash.isBoolean = isBoolean;
lodash.isDate = isDate;
lodash.isElement = isElement;
lodash.isEmpty = isEmpty;
lodash.isEqual = isEqual;
lodash.isFinite = isFinite;
lodash.isFunction = isFunction;
lodash.isNaN = isNaN;
lodash.isNull = isNull;
lodash.isNumber = isNumber;
lodash.isObject = isObject;
lodash.isPlainObject = isPlainObject;
lodash.isRegExp = isRegExp;
lodash.isString = isString;
lodash.isUndefined = isUndefined;
lodash.lastIndexOf = lastIndexOf;
lodash.mixin = mixin;
lodash.noConflict = noConflict;
lodash.noop = noop;
lodash.now = now;
lodash.parseInt = parseInt;
lodash.random = random;
lodash.reduce = reduce;
lodash.reduceRight = reduceRight;
lodash.result = result;
lodash.runInContext = runInContext;
lodash.size = size;
lodash.some = some;
lodash.sortedIndex = sortedIndex;
lodash.template = template;
lodash.unescape = unescape;
lodash.uniqueId = uniqueId;
// add aliases
lodash.all = every;
lodash.any = some;
lodash.detect = find;
lodash.findWhere = find;
lodash.foldl = reduce;
lodash.foldr = reduceRight;
lodash.include = contains;
lodash.inject = reduce;
mixin(function() {
var source = {}
forOwn(lodash, function(func, methodName) {
if (!lodash.prototype[methodName]) {
source[methodName] = func;
}
});
return source;
}(), false);
/*--------------------------------------------------------------------------*/
// add functions capable of returning wrapped and unwrapped values when chaining
lodash.first = first;
lodash.last = last;
lodash.sample = sample;
// add aliases
lodash.take = first;
lodash.head = first;
forOwn(lodash, function(func, methodName) {
var callbackable = methodName !== 'sample';
if (!lodash.prototype[methodName]) {
lodash.prototype[methodName]= function(n, guard) {
var chainAll = this.__chain__,
result = func(this.__wrapped__, n, guard);
return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))
? result
: new lodashWrapper(result, chainAll);
};
}
});
/*--------------------------------------------------------------------------*/
/**
* The semantic version number.
*
* @static
* @memberOf _
* @type string
*/
lodash.VERSION = '2.4.1';
// add "Chaining" functions to the wrapper
lodash.prototype.chain = wrapperChain;
lodash.prototype.toString = wrapperToString;
lodash.prototype.value = wrapperValueOf;
lodash.prototype.valueOf = wrapperValueOf;
// add `Array` functions that return unwrapped values
forEach(['join', 'pop', 'shift'], function(methodName) {
var func = arrayRef[methodName];
lodash.prototype[methodName] = function() {
var chainAll = this.__chain__,
result = func.apply(this.__wrapped__, arguments);
return chainAll
? new lodashWrapper(result, chainAll)
: result;
};
});
// add `Array` functions that return the existing wrapped value
forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
var func = arrayRef[methodName];
lodash.prototype[methodName] = function() {
func.apply(this.__wrapped__, arguments);
return this;
};
});
// add `Array` functions that return new wrapped values
forEach(['concat', 'slice', 'splice'], function(methodName) {
var func = arrayRef[methodName];
lodash.prototype[methodName] = function() {
return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
};
});
return lodash;
}
/*--------------------------------------------------------------------------*/
// expose Lo-Dash
var _ = runInContext();
// some AMD build optimizers like r.js check for condition patterns like the following:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
// Expose Lo-Dash to the global object even when an AMD loader is present in
// case Lo-Dash is loaded with a RequireJS shim config.
// See http://requirejs.org/docs/api.html#config-shim
root._ = _;
// define as an anonymous module so, through path mapping, it can be
// referenced as the "underscore" module
define(function() {
return _;
});
}
// check for `exports` after `define` in case a build optimizer adds an `exports` object
else if (freeExports && freeModule) {
// in Node.js or RingoJS
if (moduleExports) {
(freeModule.exports = _)._ = _;
}
// in Narwhal or Rhino -require
else {
freeExports._ = _;
}
}
else {
// in a browser or Rhino
root._ = _;
}
}.call(this));
2014-10-01 16:29:39 -04:00
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2015-02-25 13:53:04 -05:00
},{}],89:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
module.exports = require("./lib/_stream_duplex.js")
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
},{"./lib/_stream_duplex.js":90}],90:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.
module.exports = Duplex;
/*<replacement>*/
var objectKeys = Object.keys || function (obj) {
var keys = [];
for (var key in obj) keys.push(key);
return keys;
}
/*</replacement>*/
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var util = require('core-util-is');
util.inherits = require('inherits');
2014-07-10 22:41:24 -04:00
/*</replacement>*/
2014-10-01 16:29:39 -04:00
var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');
2014-07-10 22:41:24 -04:00
util.inherits(Duplex, Readable);
forEach(objectKeys(Writable.prototype), function(method) {
if (!Duplex.prototype[method])
Duplex.prototype[method] = Writable.prototype[method];
});
function Duplex(options) {
if (!(this instanceof Duplex))
return new Duplex(options);
Readable.call(this, options);
Writable.call(this, options);
if (options && options.readable === false)
this.readable = false;
if (options && options.writable === false)
this.writable = false;
this.allowHalfOpen = true;
if (options && options.allowHalfOpen === false)
this.allowHalfOpen = false;
this.once('end', onend);
}
// the no-half-open enforcer
function onend() {
// if we allow half-open state, or if the writable side ended,
// then we're ok.
if (this.allowHalfOpen || this._writableState.ended)
return;
// no more data can be written.
// But allow more writes to happen in this tick.
process.nextTick(this.end.bind(this));
}
function forEach (xs, f) {
for (var i = 0, l = xs.length; i < l; i++) {
f(xs[i], i);
}
}
2014-10-01 16:29:39 -04:00
}).call(this,require('_process'))
2015-02-25 13:53:04 -05:00
},{"./_stream_readable":92,"./_stream_writable":94,"_process":84,"core-util-is":95,"inherits":87}],91:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.
module.exports = PassThrough;
2014-10-01 16:29:39 -04:00
var Transform = require('./_stream_transform');
2014-07-10 22:41:24 -04:00
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var util = require('core-util-is');
util.inherits = require('inherits');
2014-07-10 22:41:24 -04:00
/*</replacement>*/
util.inherits(PassThrough, Transform);
function PassThrough(options) {
if (!(this instanceof PassThrough))
return new PassThrough(options);
Transform.call(this, options);
}
PassThrough.prototype._transform = function(chunk, encoding, cb) {
cb(null, chunk);
};
2015-02-25 13:53:04 -05:00
},{"./_stream_transform":93,"core-util-is":95,"inherits":87}],92:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = Readable;
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var isArray = require('isarray');
2014-07-10 22:41:24 -04:00
/*</replacement>*/
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var Buffer = require('buffer').Buffer;
2014-07-10 22:41:24 -04:00
/*</replacement>*/
Readable.ReadableState = ReadableState;
2014-10-01 16:29:39 -04:00
var EE = require('events').EventEmitter;
2014-07-10 22:41:24 -04:00
/*<replacement>*/
if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
return emitter.listeners(type).length;
};
/*</replacement>*/
2014-10-01 16:29:39 -04:00
var Stream = require('stream');
2014-07-10 22:41:24 -04:00
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var util = require('core-util-is');
util.inherits = require('inherits');
2014-07-10 22:41:24 -04:00
/*</replacement>*/
var StringDecoder;
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var debug = require('util');
2014-07-10 22:41:24 -04:00
if (debug && debug.debuglog) {
debug = debug.debuglog('stream');
} else {
debug = function () {};
}
/*</replacement>*/
util.inherits(Readable, Stream);
function ReadableState(options, stream) {
2014-10-01 16:29:39 -04:00
var Duplex = require('./_stream_duplex');
2014-07-10 22:41:24 -04:00
options = options || {};
// the point at which it stops calling _read() to fill the buffer
// Note: 0 is a valid value, means "don't call _read preemptively ever"
var hwm = options.highWaterMark;
var defaultHwm = options.objectMode ? 16 : 16 * 1024;
this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;
// cast to ints.
this.highWaterMark = ~~this.highWaterMark;
this.buffer = [];
this.length = 0;
this.pipes = null;
this.pipesCount = 0;
this.flowing = null;
this.ended = false;
this.endEmitted = false;
this.reading = false;
// a flag to be able to tell if the onwrite cb is called immediately,
// or on a later tick. We set this to true at first, because any
// actions that shouldn't happen until "later" should generally also
// not happen before the first write call.
this.sync = true;
// whenever we return null, then we set a flag to say
// that we're awaiting a 'readable' event emission.
this.needReadable = false;
this.emittedReadable = false;
this.readableListening = false;
// object stream flag. Used to make read(n) ignore n and to
// make all the buffer merging and length checks go away
this.objectMode = !!options.objectMode;
2014-10-01 16:29:39 -04:00
if (stream instanceof Duplex)
this.objectMode = this.objectMode || !!options.readableObjectMode;
2014-07-10 22:41:24 -04:00
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = options.defaultEncoding || 'utf8';
// when piping, we only care about 'readable' events that happen
// after read()ing all the bytes and not getting any pushback.
this.ranOut = false;
// the number of writers that are awaiting a drain event in .pipe()s
this.awaitDrain = 0;
// if true, a maybeReadMore has been scheduled
this.readingMore = false;
this.decoder = null;
this.encoding = null;
if (options.encoding) {
if (!StringDecoder)
2014-10-01 16:29:39 -04:00
StringDecoder = require('string_decoder/').StringDecoder;
2014-07-10 22:41:24 -04:00
this.decoder = new StringDecoder(options.encoding);
this.encoding = options.encoding;
}
}
function Readable(options) {
2014-10-01 16:29:39 -04:00
var Duplex = require('./_stream_duplex');
2014-07-10 22:41:24 -04:00
if (!(this instanceof Readable))
return new Readable(options);
this._readableState = new ReadableState(options, this);
// legacy
this.readable = true;
Stream.call(this);
}
// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function(chunk, encoding) {
var state = this._readableState;
if (util.isString(chunk) && !state.objectMode) {
encoding = encoding || state.defaultEncoding;
if (encoding !== state.encoding) {
chunk = new Buffer(chunk, encoding);
encoding = '';
}
}
return readableAddChunk(this, state, chunk, encoding, false);
};
// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function(chunk) {
var state = this._readableState;
return readableAddChunk(this, state, chunk, '', true);
};
function readableAddChunk(stream, state, chunk, encoding, addToFront) {
var er = chunkInvalid(state, chunk);
if (er) {
stream.emit('error', er);
} else if (util.isNullOrUndefined(chunk)) {
state.reading = false;
if (!state.ended)
onEofChunk(stream, state);
} else if (state.objectMode || chunk && chunk.length > 0) {
if (state.ended && !addToFront) {
var e = new Error('stream.push() after EOF');
stream.emit('error', e);
} else if (state.endEmitted && addToFront) {
var e = new Error('stream.unshift() after end event');
stream.emit('error', e);
} else {
if (state.decoder && !addToFront && !encoding)
chunk = state.decoder.write(chunk);
if (!addToFront)
state.reading = false;
// if we want the data now, just emit it.
if (state.flowing && state.length === 0 && !state.sync) {
stream.emit('data', chunk);
stream.read(0);
} else {
// update the buffer info.
state.length += state.objectMode ? 1 : chunk.length;
if (addToFront)
state.buffer.unshift(chunk);
else
state.buffer.push(chunk);
if (state.needReadable)
emitReadable(stream);
}
maybeReadMore(stream, state);
}
} else if (!addToFront) {
state.reading = false;
}
return needMoreData(state);
}
// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes. This is to work around cases where hwm=0,
// such as the repl. Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
function needMoreData(state) {
return !state.ended &&
(state.needReadable ||
state.length < state.highWaterMark ||
state.length === 0);
}
// backwards compatibility.
Readable.prototype.setEncoding = function(enc) {
if (!StringDecoder)
2014-10-01 16:29:39 -04:00
StringDecoder = require('string_decoder/').StringDecoder;
2014-07-10 22:41:24 -04:00
this._readableState.decoder = new StringDecoder(enc);
this._readableState.encoding = enc;
return this;
};
// Don't raise the hwm > 128MB
var MAX_HWM = 0x800000;
function roundUpToNextPowerOf2(n) {
if (n >= MAX_HWM) {
n = MAX_HWM;
} else {
// Get the next highest power of 2
n--;
for (var p = 1; p < 32; p <<= 1) n |= n >> p;
n++;
}
return n;
}
function howMuchToRead(n, state) {
if (state.length === 0 && state.ended)
return 0;
if (state.objectMode)
return n === 0 ? 0 : 1;
if (isNaN(n) || util.isNull(n)) {
// only flow one buffer at a time
if (state.flowing && state.buffer.length)
return state.buffer[0].length;
else
return state.length;
}
if (n <= 0)
return 0;
// If we're asking for more than the target buffer level,
// then raise the water mark. Bump up to the next highest
// power of 2, to prevent increasing it excessively in tiny
// amounts.
if (n > state.highWaterMark)
state.highWaterMark = roundUpToNextPowerOf2(n);
// don't have that much. return null, unless we've ended.
if (n > state.length) {
if (!state.ended) {
state.needReadable = true;
return 0;
} else
return state.length;
}
return n;
}
// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function(n) {
debug('read', n);
var state = this._readableState;
var nOrig = n;
if (!util.isNumber(n) || n > 0)
state.emittedReadable = false;
// if we're doing read(0) to trigger a readable event, but we
// already have a bunch of data in the buffer, then just trigger
// the 'readable' event and move on.
if (n === 0 &&
state.needReadable &&
(state.length >= state.highWaterMark || state.ended)) {
debug('read: emitReadable', state.length, state.ended);
if (state.length === 0 && state.ended)
endReadable(this);
else
emitReadable(this);
return null;
}
n = howMuchToRead(n, state);
// if we've ended, and we're now clear, then finish it up.
if (n === 0 && state.ended) {
if (state.length === 0)
endReadable(this);
return null;
}
// All the actual chunk generation logic needs to be
// *below* the call to _read. The reason is that in certain
// synthetic stream cases, such as passthrough streams, _read
// may be a completely synchronous operation which may change
// the state of the read buffer, providing enough data when
// before there was *not* enough.
//
// So, the steps are:
// 1. Figure out what the state of things will be after we do
// a read from the buffer.
//
// 2. If that resulting state will trigger a _read, then call _read.
// Note that this may be asynchronous, or synchronous. Yes, it is
// deeply ugly to write APIs this way, but that still doesn't mean
// that the Readable class should behave improperly, as streams are
// designed to be sync/async agnostic.
// Take note if the _read call is sync or async (ie, if the read call
// has returned yet), so that we know whether or not it's safe to emit
// 'readable' etc.
//
// 3. Actually pull the requested chunks out of the buffer and return.
// if we need a readable event, then we need to do some reading.
var doRead = state.needReadable;
debug('need readable', doRead);
// if we currently have less than the highWaterMark, then also read some
if (state.length === 0 || state.length - n < state.highWaterMark) {
doRead = true;
debug('length less than watermark', doRead);
}
// however, if we've ended, then there's no point, and if we're already
// reading, then it's unnecessary.
if (state.ended || state.reading) {
doRead = false;
debug('reading or ended', doRead);
}
if (doRead) {
debug('do read');
state.reading = true;
state.sync = true;
// if the length is currently zero, then we *need* a readable event.
if (state.length === 0)
state.needReadable = true;
// call internal read method
this._read(state.highWaterMark);
state.sync = false;
}
// If _read pushed data synchronously, then `reading` will be false,
// and we need to re-evaluate how much data we can return to the user.
if (doRead && !state.reading)
n = howMuchToRead(nOrig, state);
var ret;
if (n > 0)
ret = fromList(n, state);
else
ret = null;
if (util.isNull(ret)) {
state.needReadable = true;
n = 0;
}
state.length -= n;
// If we have nothing in the buffer, then we want to know
// as soon as we *do* get something into the buffer.
if (state.length === 0 && !state.ended)
state.needReadable = true;
// If we tried to read() past the EOF, then emit end on the next tick.
if (nOrig !== n && state.ended && state.length === 0)
endReadable(this);
if (!util.isNull(ret))
this.emit('data', ret);
return ret;
};
function chunkInvalid(state, chunk) {
var er = null;
if (!util.isBuffer(chunk) &&
!util.isString(chunk) &&
!util.isNullOrUndefined(chunk) &&
!state.objectMode) {
er = new TypeError('Invalid non-string/buffer chunk');
}
return er;
}
function onEofChunk(stream, state) {
if (state.decoder && !state.ended) {
var chunk = state.decoder.end();
if (chunk && chunk.length) {
state.buffer.push(chunk);
state.length += state.objectMode ? 1 : chunk.length;
}
}
state.ended = true;
// emit 'readable' now to make sure it gets picked up.
emitReadable(stream);
}
// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow. This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
var state = stream._readableState;
state.needReadable = false;
if (!state.emittedReadable) {
debug('emitReadable', state.flowing);
state.emittedReadable = true;
if (state.sync)
process.nextTick(function() {
emitReadable_(stream);
});
else
emitReadable_(stream);
}
}
function emitReadable_(stream) {
debug('emit readable');
stream.emit('readable');
flow(stream);
}
// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data. that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
if (!state.readingMore) {
state.readingMore = true;
process.nextTick(function() {
maybeReadMore_(stream, state);
});
}
}
function maybeReadMore_(stream, state) {
var len = state.length;
while (!state.reading && !state.flowing && !state.ended &&
state.length < state.highWaterMark) {
debug('maybeReadMore read 0');
stream.read(0);
if (len === state.length)
// didn't get any data, stop spinning.
break;
else
len = state.length;
}
state.readingMore = false;
}
// abstract method. to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function(n) {
this.emit('error', new Error('not implemented'));
};
Readable.prototype.pipe = function(dest, pipeOpts) {
var src = this;
var state = this._readableState;
switch (state.pipesCount) {
case 0:
state.pipes = dest;
break;
case 1:
state.pipes = [state.pipes, dest];
break;
default:
state.pipes.push(dest);
break;
}
state.pipesCount += 1;
debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
dest !== process.stdout &&
dest !== process.stderr;
var endFn = doEnd ? onend : cleanup;
if (state.endEmitted)
process.nextTick(endFn);
else
src.once('end', endFn);
dest.on('unpipe', onunpipe);
function onunpipe(readable) {
debug('onunpipe');
if (readable === src) {
cleanup();
}
}
function onend() {
debug('onend');
dest.end();
}
// when the dest drains, it reduces the awaitDrain counter
// on the source. This would be more elegant with a .once()
// handler in flow(), but adding and removing repeatedly is
// too slow.
var ondrain = pipeOnDrain(src);
dest.on('drain', ondrain);
function cleanup() {
debug('cleanup');
// cleanup event handlers once the pipe is broken
dest.removeListener('close', onclose);
dest.removeListener('finish', onfinish);
dest.removeListener('drain', ondrain);
dest.removeListener('error', onerror);
dest.removeListener('unpipe', onunpipe);
src.removeListener('end', onend);
src.removeListener('end', cleanup);
src.removeListener('data', ondata);
// if the reader is waiting for a drain event from this
// specific writer, then it would cause it to never start
// flowing again.
// So, if this is awaiting a drain, then we just call it now.
// If we don't know, then assume that we are waiting for one.
if (state.awaitDrain &&
(!dest._writableState || dest._writableState.needDrain))
ondrain();
}
src.on('data', ondata);
function ondata(chunk) {
debug('ondata');
var ret = dest.write(chunk);
if (false === ret) {
debug('false write response, pause',
src._readableState.awaitDrain);
src._readableState.awaitDrain++;
src.pause();
}
}
// if the dest has an error, then stop piping into it.
// however, don't suppress the throwing behavior for this.
function onerror(er) {
debug('onerror', er);
unpipe();
dest.removeListener('error', onerror);
if (EE.listenerCount(dest, 'error') === 0)
dest.emit('error', er);
}
// This is a brutally ugly hack to make sure that our error handler
// is attached before any userland ones. NEVER DO THIS.
if (!dest._events || !dest._events.error)
dest.on('error', onerror);
else if (isArray(dest._events.error))
dest._events.error.unshift(onerror);
else
dest._events.error = [onerror, dest._events.error];
// Both close and finish should trigger unpipe, but only once.
function onclose() {
dest.removeListener('finish', onfinish);
unpipe();
}
dest.once('close', onclose);
function onfinish() {
debug('onfinish');
dest.removeListener('close', onclose);
unpipe();
}
dest.once('finish', onfinish);
function unpipe() {
debug('unpipe');
src.unpipe(dest);
}
// tell the dest that it's being piped to
dest.emit('pipe', src);
// start the flow if it hasn't been started already.
if (!state.flowing) {
debug('pipe resume');
src.resume();
}
return dest;
};
function pipeOnDrain(src) {
return function() {
var state = src._readableState;
debug('pipeOnDrain', state.awaitDrain);
if (state.awaitDrain)
state.awaitDrain--;
if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) {
state.flowing = true;
flow(src);
}
};
}
Readable.prototype.unpipe = function(dest) {
var state = this._readableState;
// if we're not piping anywhere, then do nothing.
if (state.pipesCount === 0)
return this;
// just one destination. most common case.
if (state.pipesCount === 1) {
// passed in one, but it's not the right one.
if (dest && dest !== state.pipes)
return this;
if (!dest)
dest = state.pipes;
// got a match.
state.pipes = null;
state.pipesCount = 0;
state.flowing = false;
if (dest)
dest.emit('unpipe', this);
return this;
}
// slow case. multiple pipe destinations.
if (!dest) {
// remove all.
var dests = state.pipes;
var len = state.pipesCount;
state.pipes = null;
state.pipesCount = 0;
state.flowing = false;
for (var i = 0; i < len; i++)
dests[i].emit('unpipe', this);
return this;
}
// try to find the right one.
var i = indexOf(state.pipes, dest);
if (i === -1)
return this;
state.pipes.splice(i, 1);
state.pipesCount -= 1;
if (state.pipesCount === 1)
state.pipes = state.pipes[0];
dest.emit('unpipe', this);
return this;
};
// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function(ev, fn) {
var res = Stream.prototype.on.call(this, ev, fn);
// If listening to data, and it has not explicitly been paused,
// then call resume to start the flow of data on the next tick.
if (ev === 'data' && false !== this._readableState.flowing) {
this.resume();
}
if (ev === 'readable' && this.readable) {
var state = this._readableState;
if (!state.readableListening) {
state.readableListening = true;
state.emittedReadable = false;
state.needReadable = true;
if (!state.reading) {
var self = this;
process.nextTick(function() {
debug('readable nexttick read 0');
self.read(0);
});
} else if (state.length) {
emitReadable(this, state);
}
}
}
return res;
};
Readable.prototype.addListener = Readable.prototype.on;
// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function() {
var state = this._readableState;
if (!state.flowing) {
debug('resume');
state.flowing = true;
if (!state.reading) {
debug('resume read 0');
this.read(0);
}
resume(this, state);
}
return this;
};
function resume(stream, state) {
if (!state.resumeScheduled) {
state.resumeScheduled = true;
process.nextTick(function() {
resume_(stream, state);
});
}
}
function resume_(stream, state) {
state.resumeScheduled = false;
stream.emit('resume');
flow(stream);
if (state.flowing && !state.reading)
stream.read(0);
}
Readable.prototype.pause = function() {
debug('call pause flowing=%j', this._readableState.flowing);
if (false !== this._readableState.flowing) {
debug('pause');
this._readableState.flowing = false;
this.emit('pause');
}
return this;
};
function flow(stream) {
var state = stream._readableState;
debug('flow', state.flowing);
if (state.flowing) {
do {
var chunk = stream.read();
} while (null !== chunk && state.flowing);
}
}
// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function(stream) {
var state = this._readableState;
var paused = false;
var self = this;
stream.on('end', function() {
debug('wrapped end');
if (state.decoder && !state.ended) {
var chunk = state.decoder.end();
if (chunk && chunk.length)
self.push(chunk);
}
self.push(null);
});
stream.on('data', function(chunk) {
debug('wrapped data');
if (state.decoder)
chunk = state.decoder.write(chunk);
if (!chunk || !state.objectMode && !chunk.length)
return;
var ret = self.push(chunk);
if (!ret) {
paused = true;
stream.pause();
}
});
// proxy all the other methods.
// important when wrapping filters and duplexes.
for (var i in stream) {
if (util.isFunction(stream[i]) && util.isUndefined(this[i])) {
this[i] = function(method) { return function() {
return stream[method].apply(stream, arguments);
}}(i);
}
}
// proxy certain important events.
var events = ['error', 'close', 'destroy', 'pause', 'resume'];
forEach(events, function(ev) {
stream.on(ev, self.emit.bind(self, ev));
});
// when we try to consume some more bytes, simply unpause the
// underlying stream.
self._read = function(n) {
debug('wrapped _read', n);
if (paused) {
paused = false;
stream.resume();
}
};
return self;
};
// exposed for testing purposes only.
Readable._fromList = fromList;
// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
function fromList(n, state) {
var list = state.buffer;
var length = state.length;
var stringMode = !!state.decoder;
var objectMode = !!state.objectMode;
var ret;
// nothing in the list, definitely empty.
if (list.length === 0)
return null;
if (length === 0)
ret = null;
else if (objectMode)
ret = list.shift();
else if (!n || n >= length) {
// read it all, truncate the array.
if (stringMode)
ret = list.join('');
else
ret = Buffer.concat(list, length);
list.length = 0;
} else {
// read just some of it.
if (n < list[0].length) {
// just take a part of the first list item.
// slice is the same for buffers and strings.
var buf = list[0];
ret = buf.slice(0, n);
list[0] = buf.slice(n);
} else if (n === list[0].length) {
// first list is a perfect match
ret = list.shift();
} else {
// complex case.
// we have enough to cover it, but it spans past the first buffer.
if (stringMode)
ret = '';
else
ret = new Buffer(n);
var c = 0;
for (var i = 0, l = list.length; i < l && c < n; i++) {
var buf = list[0];
var cpy = Math.min(n - c, buf.length);
if (stringMode)
ret += buf.slice(0, cpy);
else
buf.copy(ret, c, 0, cpy);
if (cpy < buf.length)
list[0] = buf.slice(cpy);
else
list.shift();
c += cpy;
}
}
}
return ret;
}
function endReadable(stream) {
var state = stream._readableState;
// If we get here before consuming all the bytes, then that is a
// bug in node. Should never happen.
if (state.length > 0)
throw new Error('endReadable called on non-empty stream');
if (!state.endEmitted) {
state.ended = true;
process.nextTick(function() {
// Check that we didn't get one last unshift.
if (!state.endEmitted && state.length === 0) {
state.endEmitted = true;
stream.readable = false;
stream.emit('end');
}
});
}
}
function forEach (xs, f) {
for (var i = 0, l = xs.length; i < l; i++) {
f(xs[i], i);
}
}
function indexOf (xs, x) {
for (var i = 0, l = xs.length; i < l; i++) {
if (xs[i] === x) return i;
}
return -1;
}
2014-10-01 16:29:39 -04:00
}).call(this,require('_process'))
2015-02-25 13:53:04 -05:00
},{"./_stream_duplex":90,"_process":84,"buffer":79,"core-util-is":95,"events":83,"inherits":87,"isarray":96,"stream":85,"string_decoder/":97,"util":78}],93:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a transform stream is a readable/writable stream where you do
// something with the data. Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored. (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation. For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes. When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up. When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer. When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks. If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk. However,
// a pathological inflate type of transform can cause excessive buffering
// here. For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output. In this case, you could write a very small
// amount of input, and end up with a very large amount of output. In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform. A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.
module.exports = Transform;
2014-10-01 16:29:39 -04:00
var Duplex = require('./_stream_duplex');
2014-07-10 22:41:24 -04:00
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var util = require('core-util-is');
util.inherits = require('inherits');
2014-07-10 22:41:24 -04:00
/*</replacement>*/
util.inherits(Transform, Duplex);
function TransformState(options, stream) {
this.afterTransform = function(er, data) {
return afterTransform(stream, er, data);
};
this.needTransform = false;
this.transforming = false;
this.writecb = null;
this.writechunk = null;
}
function afterTransform(stream, er, data) {
var ts = stream._transformState;
ts.transforming = false;
var cb = ts.writecb;
if (!cb)
return stream.emit('error', new Error('no writecb in Transform class'));
ts.writechunk = null;
ts.writecb = null;
if (!util.isNullOrUndefined(data))
stream.push(data);
if (cb)
cb(er);
var rs = stream._readableState;
rs.reading = false;
if (rs.needReadable || rs.length < rs.highWaterMark) {
stream._read(rs.highWaterMark);
}
}
function Transform(options) {
if (!(this instanceof Transform))
return new Transform(options);
Duplex.call(this, options);
this._transformState = new TransformState(options, this);
// when the writable side finishes, then flush out anything remaining.
var stream = this;
// start out asking for a readable event once data is transformed.
this._readableState.needReadable = true;
// we have implemented the _read method, and done the other things
// that Readable wants before the first _read call, so unset the
// sync guard flag.
this._readableState.sync = false;
this.once('prefinish', function() {
if (util.isFunction(this._flush))
this._flush(function(er) {
done(stream, er);
});
else
done(stream);
});
}
Transform.prototype.push = function(chunk, encoding) {
this._transformState.needTransform = false;
return Duplex.prototype.push.call(this, chunk, encoding);
};
// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side. You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk. If you pass
// an error, then that'll put the hurt on the whole operation. If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function(chunk, encoding, cb) {
throw new Error('not implemented');
};
Transform.prototype._write = function(chunk, encoding, cb) {
var ts = this._transformState;
ts.writecb = cb;
ts.writechunk = chunk;
ts.writeencoding = encoding;
if (!ts.transforming) {
var rs = this._readableState;
if (ts.needTransform ||
rs.needReadable ||
rs.length < rs.highWaterMark)
this._read(rs.highWaterMark);
}
};
// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function(n) {
var ts = this._transformState;
if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) {
ts.transforming = true;
this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
} else {
// mark that we need a transform, so that any data that comes in
// will get processed, now that we've asked for it.
ts.needTransform = true;
}
};
function done(stream, er) {
if (er)
return stream.emit('error', er);
// if there's nothing in the write buffer, then that means
// that nothing more will ever be provided
var ws = stream._writableState;
var ts = stream._transformState;
if (ws.length)
throw new Error('calling transform done when ws.length != 0');
if (ts.transforming)
throw new Error('calling transform done when still transforming');
return stream.push(null);
}
2015-02-25 13:53:04 -05:00
},{"./_stream_duplex":90,"core-util-is":95,"inherits":87}],94:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// A bit simpler than readable streams.
// Implement an async ._write(chunk, cb), and it'll handle all
// the drain event emission and buffering.
module.exports = Writable;
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var Buffer = require('buffer').Buffer;
2014-07-10 22:41:24 -04:00
/*</replacement>*/
Writable.WritableState = WritableState;
/*<replacement>*/
2014-10-01 16:29:39 -04:00
var util = require('core-util-is');
util.inherits = require('inherits');
2014-07-10 22:41:24 -04:00
/*</replacement>*/
2014-10-01 16:29:39 -04:00
var Stream = require('stream');
2014-07-10 22:41:24 -04:00
util.inherits(Writable, Stream);
function WriteReq(chunk, encoding, cb) {
this.chunk = chunk;
this.encoding = encoding;
this.callback = cb;
}
function WritableState(options, stream) {
2014-10-01 16:29:39 -04:00
var Duplex = require('./_stream_duplex');
2014-07-10 22:41:24 -04:00
options = options || {};
// the point at which write() starts returning false
// Note: 0 is a valid value, means that we always return false if
// the entire buffer is not flushed immediately on write()
var hwm = options.highWaterMark;
var defaultHwm = options.objectMode ? 16 : 16 * 1024;
this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;
// object stream flag to indicate whether or not this stream
// contains buffers or objects.
this.objectMode = !!options.objectMode;
2014-10-01 16:29:39 -04:00
if (stream instanceof Duplex)
this.objectMode = this.objectMode || !!options.writableObjectMode;
2014-07-10 22:41:24 -04:00
// cast to ints.
this.highWaterMark = ~~this.highWaterMark;
this.needDrain = false;
// at the start of calling end()
this.ending = false;
// when end() has been called, and returned
this.ended = false;
// when 'finish' is emitted
this.finished = false;
// should we decode strings into buffers before passing to _write?
// this is here so that some node-core streams can optimize string
// handling at a lower level.
var noDecode = options.decodeStrings === false;
this.decodeStrings = !noDecode;
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = options.defaultEncoding || 'utf8';
// not an actual buffer we keep track of, but a measurement
// of how much we're waiting to get pushed to some underlying
// socket or file.
this.length = 0;
// a flag to see when we're in the middle of a write.
this.writing = false;
// when true all writes will be buffered until .uncork() call
this.corked = 0;
// a flag to be able to tell if the onwrite cb is called immediately,
// or on a later tick. We set this to true at first, because any
// actions that shouldn't happen until "later" should generally also
// not happen before the first write call.
this.sync = true;
// a flag to know if we're processing previously buffered items, which
// may call the _write() callback in the same tick, so that we don't
// end up in an overlapped onwrite situation.
this.bufferProcessing = false;
// the callback that's passed to _write(chunk,cb)
this.onwrite = function(er) {
onwrite(stream, er);
};
// the callback that the user supplies to write(chunk,encoding,cb)
this.writecb = null;
// the amount that is being written when _write is called.
this.writelen = 0;
this.buffer = [];
// number of pending user-supplied write callbacks
// this must be 0 before 'finish' can be emitted
this.pendingcb = 0;
// emit prefinish if the only thing we're waiting for is _write cbs
// This is relevant for synchronous Transform streams
this.prefinished = false;
// True if the error was already emitted and should not be thrown again
this.errorEmitted = false;
}
function Writable(options) {
2014-10-01 16:29:39 -04:00
var Duplex = require('./_stream_duplex');
2014-07-10 22:41:24 -04:00
// Writable ctor is applied to Duplexes, though they're not
// instanceof Writable, they're instanceof Readable.
if (!(this instanceof Writable) && !(this instanceof Duplex))
return new Writable(options);
this._writableState = new WritableState(options, this);
// legacy.
this.writable = true;
Stream.call(this);
}
// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function() {
this.emit('error', new Error('Cannot pipe. Not readable.'));
};
function writeAfterEnd(stream, state, cb) {
var er = new Error('write after end');
// TODO: defer error events consistently everywhere, not just the cb
stream.emit('error', er);
process.nextTick(function() {
cb(er);
});
}
// If we get something that is not a buffer, string, null, or undefined,
// and we're not in objectMode, then that's an error.
// Otherwise stream chunks are all considered to be of length=1, and the
// watermarks determine how many objects to keep in the buffer, rather than
// how many bytes or characters.
function validChunk(stream, state, chunk, cb) {
var valid = true;
if (!util.isBuffer(chunk) &&
!util.isString(chunk) &&
!util.isNullOrUndefined(chunk) &&
!state.objectMode) {
var er = new TypeError('Invalid non-string/buffer chunk');
stream.emit('error', er);
process.nextTick(function() {
cb(er);
});
valid = false;
}
return valid;
}
Writable.prototype.write = function(chunk, encoding, cb) {
var state = this._writableState;
var ret = false;
if (util.isFunction(encoding)) {
cb = encoding;
encoding = null;
}
if (util.isBuffer(chunk))
encoding = 'buffer';
else if (!encoding)
encoding = state.defaultEncoding;
if (!util.isFunction(cb))
cb = function() {};
if (state.ended)
writeAfterEnd(this, state, cb);
else if (validChunk(this, state, chunk, cb)) {
state.pendingcb++;
ret = writeOrBuffer(this, state, chunk, encoding, cb);
}
return ret;
};
Writable.prototype.cork = function() {
var state = this._writableState;
state.corked++;
};
Writable.prototype.uncork = function() {
var state = this._writableState;
if (state.corked) {
state.corked--;
if (!state.writing &&
!state.corked &&
!state.finished &&
!state.bufferProcessing &&
state.buffer.length)
clearBuffer(this, state);
}
};
function decodeChunk(state, chunk, encoding) {
if (!state.objectMode &&
state.decodeStrings !== false &&
util.isString(chunk)) {
chunk = new Buffer(chunk, encoding);
}
return chunk;
}
// if we're already writing something, then just put this
// in the queue, and wait our turn. Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, chunk, encoding, cb) {
chunk = decodeChunk(state, chunk, encoding);
if (util.isBuffer(chunk))
encoding = 'buffer';
var len = state.objectMode ? 1 : chunk.length;
state.length += len;
var ret = state.length < state.highWaterMark;
// we must ensure that previous needDrain will not be reset to false.
if (!ret)
state.needDrain = true;
if (state.writing || state.corked)
state.buffer.push(new WriteReq(chunk, encoding, cb));
else
doWrite(stream, state, false, len, chunk, encoding, cb);
return ret;
}
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
state.writelen = len;
state.writecb = cb;
state.writing = true;
state.sync = true;
if (writev)
stream._writev(chunk, state.onwrite);
else
stream._write(chunk, encoding, state.onwrite);
state.sync = false;
}
function onwriteError(stream, state, sync, er, cb) {
if (sync)
process.nextTick(function() {
state.pendingcb--;
cb(er);
});
else {
state.pendingcb--;
cb(er);
}
stream._writableState.errorEmitted = true;
stream.emit('error', er);
}
function onwriteStateUpdate(state) {
state.writing = false;
state.writecb = null;
state.length -= state.writelen;
state.writelen = 0;
}
function onwrite(stream, er) {
var state = stream._writableState;
var sync = state.sync;
var cb = state.writecb;
onwriteStateUpdate(state);
if (er)
onwriteError(stream, state, sync, er, cb);
else {
// Check if we're actually ready to finish, but don't emit yet
var finished = needFinish(stream, state);
if (!finished &&
!state.corked &&
!state.bufferProcessing &&
state.buffer.length) {
clearBuffer(stream, state);
}
if (sync) {
process.nextTick(function() {
afterWrite(stream, state, finished, cb);
});
} else {
afterWrite(stream, state, finished, cb);
}
}
}
function afterWrite(stream, state, finished, cb) {
if (!finished)
onwriteDrain(stream, state);
state.pendingcb--;
cb();
finishMaybe(stream, state);
}
// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
if (state.length === 0 && state.needDrain) {
state.needDrain = false;
stream.emit('drain');
}
}
// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
state.bufferProcessing = true;
if (stream._writev && state.buffer.length > 1) {
// Fast case, write everything using _writev()
var cbs = [];
for (var c = 0; c < state.buffer.length; c++)
cbs.push(state.buffer[c].callback);
// count the one we are adding, as well.
// TODO(isaacs) clean this up
state.pendingcb++;
doWrite(stream, state, true, state.length, state.buffer, '', function(err) {
for (var i = 0; i < cbs.length; i++) {
state.pendingcb--;
cbs[i](err);
}
});
// Clear buffer
state.buffer = [];
} else {
// Slow case, write chunks one-by-one
for (var c = 0; c < state.buffer.length; c++) {
var entry = state.buffer[c];
var chunk = entry.chunk;
var encoding = entry.encoding;
var cb = entry.callback;
var len = state.objectMode ? 1 : chunk.length;
doWrite(stream, state, false, len, chunk, encoding, cb);
// if we didn't call the onwrite immediately, then
// it means that we need to wait until it does.
// also, that means that the chunk and cb are currently
// being processed, so move the buffer counter past them.
if (state.writing) {
c++;
break;
}
}
if (c < state.buffer.length)
state.buffer = state.buffer.slice(c);
else
state.buffer.length = 0;
}
state.bufferProcessing = false;
}
Writable.prototype._write = function(chunk, encoding, cb) {
cb(new Error('not implemented'));
};
Writable.prototype._writev = null;
Writable.prototype.end = function(chunk, encoding, cb) {
var state = this._writableState;
if (util.isFunction(chunk)) {
cb = chunk;
chunk = null;
encoding = null;
} else if (util.isFunction(encoding)) {
cb = encoding;
encoding = null;
}
if (!util.isNullOrUndefined(chunk))
this.write(chunk, encoding);
// .end() fully uncorks
if (state.corked) {
state.corked = 1;
this.uncork();
}
// ignore unnecessary end() calls.
if (!state.ending && !state.finished)
endWritable(this, state, cb);
};
function needFinish(stream, state) {
return (state.ending &&
state.length === 0 &&
!state.finished &&
!state.writing);
}
function prefinish(stream, state) {
if (!state.prefinished) {
state.prefinished = true;
stream.emit('prefinish');
}
}
function finishMaybe(stream, state) {
var need = needFinish(stream, state);
if (need) {
if (state.pendingcb === 0) {
prefinish(stream, state);
state.finished = true;
stream.emit('finish');
} else
prefinish(stream, state);
}
return need;
}
function endWritable(stream, state, cb) {
state.ending = true;
finishMaybe(stream, state);
if (cb) {
if (state.finished)
process.nextTick(cb);
else
stream.once('finish', cb);
}
state.ended = true;
}
2014-10-01 16:29:39 -04:00
}).call(this,require('_process'))
2015-02-25 13:53:04 -05:00
},{"./_stream_duplex":90,"_process":84,"buffer":79,"core-util-is":95,"inherits":87,"stream":85}],95:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
(function (Buffer){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;
function isBoolean(arg) {
return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;
function isNull(arg) {
return arg === null;
}
exports.isNull = isNull;
function isNullOrUndefined(arg) {
return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;
function isNumber(arg) {
return typeof arg === 'number';
}
exports.isNumber = isNumber;
function isString(arg) {
return typeof arg === 'string';
}
exports.isString = isString;
function isSymbol(arg) {
return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;
function isUndefined(arg) {
return arg === void 0;
}
exports.isUndefined = isUndefined;
function isRegExp(re) {
return isObject(re) && objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;
function isDate(d) {
return isObject(d) && objectToString(d) === '[object Date]';
}
exports.isDate = isDate;
function isError(e) {
return isObject(e) &&
(objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;
function isFunction(arg) {
return typeof arg === 'function';
}
exports.isFunction = isFunction;
function isPrimitive(arg) {
return arg === null ||
typeof arg === 'boolean' ||
typeof arg === 'number' ||
typeof arg === 'string' ||
typeof arg === 'symbol' || // ES6 symbol
typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;
function isBuffer(arg) {
return Buffer.isBuffer(arg);
}
exports.isBuffer = isBuffer;
function objectToString(o) {
return Object.prototype.toString.call(o);
}
2014-10-01 16:29:39 -04:00
}).call(this,require("buffer").Buffer)
2015-02-25 13:53:04 -05:00
},{"buffer":79}],96:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
module.exports = Array.isArray || function (arr) {
return Object.prototype.toString.call(arr) == '[object Array]';
};
2015-02-25 13:53:04 -05:00
},{}],97:[function(require,module,exports){
2014-07-10 22:41:24 -04:00
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
2014-10-01 16:29:39 -04:00
var Buffer = require('buffer').Buffer;
2014-07-10 22:41:24 -04:00
var isBufferEncoding = Buffer.isEncoding
|| function(encoding) {
switch (encoding && encoding.toLowerCase()) {
case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
default: return false;
}
}
function assertEncoding(encoding) {
if (encoding && !isBufferEncoding(encoding)) {
throw new Error('Unknown encoding: ' + encoding);
}
}
2014-10-01 16:29:39 -04:00
// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters. CESU-8 is handled as part of the UTF-8 encoding.
//
// @TODO Handling all encodings inside a single object makes it very difficult
// to reason about this code, so it should be split up in the future.
// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
// points as used by CESU-8.
2014-07-10 22:41:24 -04:00
var StringDecoder = exports.StringDecoder = function(encoding) {
this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
assertEncoding(encoding);
switch (this.encoding) {
case 'utf8':
// CESU-8 represents each of Surrogate Pair by 3-bytes
this.surrogateSize = 3;
break;
case 'ucs2':
case 'utf16le':
// UTF-16 represents each of Surrogate Pair by 2-bytes
this.surrogateSize = 2;
this.detectIncompleteChar = utf16DetectIncompleteChar;
break;
case 'base64':
// Base-64 stores 3 bytes in 4 chars, and pads the remainder.
this.surrogateSize = 3;
this.detectIncompleteChar = base64DetectIncompleteChar;
break;
default:
this.write = passThroughWrite;
return;
}
2014-10-01 16:29:39 -04:00
// Enough space to store all bytes of a single character. UTF-8 needs 4
// bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
2014-07-10 22:41:24 -04:00
this.charBuffer = new Buffer(6);
2014-10-01 16:29:39 -04:00
// Number of bytes received for the current incomplete multi-byte character.
2014-07-10 22:41:24 -04:00
this.charReceived = 0;
2014-10-01 16:29:39 -04:00
// Number of bytes expected for the current incomplete multi-byte character.
2014-07-10 22:41:24 -04:00
this.charLength = 0;
};
2014-10-01 16:29:39 -04:00
// write decodes the given buffer and returns it as JS string that is
// guaranteed to not contain any partial multi-byte characters. Any partial
// character found at the end of the buffer is buffered up, and will be
// returned when calling write again with the remaining bytes.
//
// Note: Converting a Buffer containing an orphan surrogate to a String
// currently works, but converting a String to a Buffer (via `new Buffer`, or
// Buffer#write) will replace incomplete surrogates with the unicode
// replacement character. See https://codereview.chromium.org/121173009/ .
2014-07-10 22:41:24 -04:00
StringDecoder.prototype.write = function(buffer) {
var charStr = '';
// if our last write ended with an incomplete multibyte character
while (this.charLength) {
// determine how many remaining bytes this buffer has to offer for this char
2014-10-01 16:29:39 -04:00
var available = (buffer.length >= this.charLength - this.charReceived) ?
this.charLength - this.charReceived :
buffer.length;
2014-07-10 22:41:24 -04:00
// add the new bytes to the char buffer
2014-10-01 16:29:39 -04:00
buffer.copy(this.charBuffer, this.charReceived, 0, available);
this.charReceived += available;
2014-07-10 22:41:24 -04:00
if (this.charReceived < this.charLength) {
// still not enough chars in this buffer? wait for more ...
return '';
}
2014-10-01 16:29:39 -04:00
// remove bytes belonging to the current character from the buffer
buffer = buffer.slice(available, buffer.length);
2014-07-10 22:41:24 -04:00
// get the character that was split
charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
2014-10-01 16:29:39 -04:00
// CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
2014-07-10 22:41:24 -04:00
var charCode = charStr.charCodeAt(charStr.length - 1);
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
this.charLength += this.surrogateSize;
charStr = '';
continue;
}
this.charReceived = this.charLength = 0;
// if there are no more bytes in this buffer, just emit our char
2014-10-01 16:29:39 -04:00
if (buffer.length === 0) {
return charStr;
}
2014-07-10 22:41:24 -04:00
break;
}
2014-10-01 16:29:39 -04:00
// determine and set charLength / charReceived
this.detectIncompleteChar(buffer);
2014-07-10 22:41:24 -04:00
var end = buffer.length;
if (this.charLength) {
// buffer the incomplete character bytes we got
2014-10-01 16:29:39 -04:00
buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
end -= this.charReceived;
2014-07-10 22:41:24 -04:00
}
charStr += buffer.toString(this.encoding, 0, end);
var end = charStr.length - 1;
var charCode = charStr.charCodeAt(end);
2014-10-01 16:29:39 -04:00
// CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
2014-07-10 22:41:24 -04:00
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
var size = this.surrogateSize;
this.charLength += size;
this.charReceived += size;
this.charBuffer.copy(this.charBuffer, size, 0, size);
2014-10-01 16:29:39 -04:00
buffer.copy(this.charBuffer, 0, 0, size);
2014-07-10 22:41:24 -04:00
return charStr.substring(0, end);
}
// or just emit the charStr
return charStr;
};
2014-10-01 16:29:39 -04:00
// detectIncompleteChar determines if there is an incomplete UTF-8 character at
// the end of the given buffer. If so, it sets this.charLength to the byte
// length that character, and sets this.charReceived to the number of bytes
// that are available for this character.
2014-07-10 22:41:24 -04:00
StringDecoder.prototype.detectIncompleteChar = function(buffer) {
// determine how many bytes we have to check at the end of this buffer
var i = (buffer.length >= 3) ? 3 : buffer.length;
// Figure out if one of the last i bytes of our buffer announces an
// incomplete char.
for (; i > 0; i--) {
var c = buffer[buffer.length - i];
// See http://en.wikipedia.org/wiki/UTF-8#Description
// 110XXXXX
if (i == 1 && c >> 5 == 0x06) {
this.charLength = 2;
break;
}
// 1110XXXX
if (i <= 2 && c >> 4 == 0x0E) {
this.charLength = 3;
break;
}
// 11110XXX
if (i <= 3 && c >> 3 == 0x1E) {
this.charLength = 4;
break;
}
}
2014-10-01 16:29:39 -04:00
this.charReceived = i;
2014-07-10 22:41:24 -04:00
};
StringDecoder.prototype.end = function(buffer) {
var res = '';
if (buffer && buffer.length)
res = this.write(buffer);
if (this.charReceived) {
var cr = this.charReceived;
var buf = this.charBuffer;
var enc = this.encoding;
res += buf.slice(0, cr).toString(enc);
}
return res;
};
function passThroughWrite(buffer) {
return buffer.toString(this.encoding);
}
function utf16DetectIncompleteChar(buffer) {
2014-10-01 16:29:39 -04:00
this.charReceived = buffer.length % 2;
this.charLength = this.charReceived ? 2 : 0;
2014-07-10 22:41:24 -04:00
}
function base64DetectIncompleteChar(buffer) {
2014-10-01 16:29:39 -04:00
this.charReceived = buffer.length % 3;
this.charLength = this.charReceived ? 3 : 0;
2014-07-10 22:41:24 -04:00
}
2015-02-25 13:53:04 -05:00
},{"buffer":79}],98:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
module.exports = require("./lib/_stream_passthrough.js")
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
},{"./lib/_stream_passthrough.js":91}],99:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = require('stream');
2014-07-10 22:41:24 -04:00
exports.Readable = exports;
2014-10-01 16:29:39 -04:00
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
},{"./lib/_stream_duplex.js":90,"./lib/_stream_passthrough.js":91,"./lib/_stream_readable.js":92,"./lib/_stream_transform.js":93,"./lib/_stream_writable.js":94,"stream":85}],100:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
module.exports = require("./lib/_stream_transform.js")
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
},{"./lib/_stream_transform.js":93}],101:[function(require,module,exports){
2014-10-01 16:29:39 -04:00
module.exports = require("./lib/_stream_writable.js")
2014-07-10 22:41:24 -04:00
2015-02-25 13:53:04 -05:00
},{"./lib/_stream_writable.js":94}]},{},[1])(1)
});