!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);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o', '<=', '>=', '<>', '!=', 'like', 'not like', 'between', 'ilike', '&', '|', '<<', '>>' ]; // 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) { if (memo.key === void 0) { memo[key] = this._wrapString(key); } return memo[key]; }; }()); Formatter_SQLite3.prototype._wrap = wrapperMemo; // Assign the formatter to the the client. client.Formatter = Formatter_SQLite3; }; },{"../../formatter":19,"inherits":45}],5:[function(_dereq_,module,exports){ // SQLite3 // ------- var inherits = _dereq_('inherits'); var Client = _dereq_('../../client'); var Promise = _dereq_('../../promise'); 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; Client_SQLite3.prototype.dialect = 'sqlite3', Client_SQLite3.prototype.initTransaction = function() { _dereq_('./transaction')(this); }; Client_SQLite3.prototype.initFormatter = function() { _dereq_('./formatter')(this); }; // Lazy-load the sqlite3 dependency. Client_SQLite3.prototype.initDriver = function() { sqlite3 = sqlite3 || _dereq_('sqlite3'); }; // Initialize the raw connection on the client. Client_SQLite3.prototype.initRaw = function() { _dereq_('./raw')(this); }; // 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() { _dereq_('./query')(this); }; // Initializes a new pool instance for the current client. Client_SQLite3.prototype.initPool = function() { _dereq_('./pool')(this); }; // Initialize the query "runner" Client_SQLite3.prototype.initRunner = function() { _dereq_('./runner')(this); }; // Lazy-load the schema dependencies. Client_SQLite3.prototype.initSchema = function() { _dereq_('./schema')(this); }; // Lazy-load the migration dependency Client_SQLite3.prototype.initMigrator = function() { _dereq_('./migrator')(this); }; // 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; },{"../../client":2,"../../promise":24,"./formatter":4,"./migrator":6,"./pool":7,"./query":8,"./raw":9,"./runner":10,"./schema":13,"./transaction":16,"inherits":45}],6:[function(_dereq_,module,exports){ module.exports = function(client) { var Migrator = _dereq_('../../migrate'); var inherits = _dereq_('inherits'); // Inherit from the `Migrator` constructor's prototype, // so we can add the correct `then` method. function Migrator_SQLite3() { this.client = client; Migrator.apply(this, arguments); } inherits(Migrator_SQLite3, Migrator); // Assign the newly extended `Migrator` constructor to the client object. client.Migrator = Migrator_SQLite3; }; },{"inherits":45}],7:[function(_dereq_,module,exports){ module.exports = function(client) { var Pool = _dereq_('../../pool'); var inherits = _dereq_('inherits'); var _ = _dereq_('lodash'); // 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; }; },{"../../pool":23,"inherits":45,"lodash":"K2RcUv"}],8:[function(_dereq_,module,exports){ // SQLite3 Query Builder & Compiler // ------- module.exports = function(client) { var _ = _dereq_('lodash'); var inherits = _dereq_('inherits'); var QueryBuilder = _dereq_('../../query/builder'); var QueryCompiler = _dereq_('../../query/compiler'); // Query Builder // ------- function QueryBuilder_SQLite3() { this.client = client; QueryBuilder.apply(this, arguments); } inherits(QueryBuilder_SQLite3, QueryBuilder); // 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 + ' '; if (_.isEmpty(this.single.insert)) return sql + 'default values'; var insertData = this._prepInsert(insert); 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 '); }; // Adds a `order by` clause to the query, using "collate nocase" for the sort. QueryCompiler_SQLite3.prototype.order = function() { var orders = this.grouped.order; if (!orders) return ''; return _.map(orders, function(order) { var cols = _.isArray(order.value) ? order.value : [order.value]; return 'order by ' + this.formatter.columnize(cols) + ' collate nocase ' + this.formatter.direction(order.direction); }, this); }; // Compiles an `update` query. QueryCompiler_SQLite3.prototype.update = function() { var updateData = this._prepUpdate(this.single.update); var joins = this.join(); var wheres = this.where(); return 'update ' + this.tableName + (joins ? ' ' + joins : '') + ' set ' + updateData.join(', ') + (wheres ? ' ' + wheres : ''); }; // 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; return { sql: 'PRAGMA table_info(' + this.single.table +')', output: function(resp) { var maxLengthRegex = /.*\((\d+)\)/; var out = _.reduce(resp, function (columns, val) { 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; } }; }; client.QueryBuilder = QueryBuilder_SQLite3; client.QueryCompiler = QueryCompiler_SQLite3; }; },{"../../query/builder":25,"../../query/compiler":26,"inherits":45,"lodash":"K2RcUv"}],9:[function(_dereq_,module,exports){ // Raw // ------- module.exports = function(client) { var Raw = _dereq_('../../raw'); var inherits = _dereq_('inherits'); // 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; }; },{"../../raw":29,"inherits":45}],10:[function(_dereq_,module,exports){ // Runner // ------- module.exports = function(client) { var Promise = _dereq_('../../promise'); var Runner = _dereq_('../../runner'); var helpers = _dereq_('../../helpers'); var inherits = _dereq_('inherits'); // 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); var callMethod = (method === 'insert' || method === 'update' || method === 'del') ? 'run' : 'all'; 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 Runner_SQLite3.prototype._stream = Promise.method(function(sql, stream, options) { var runner = this; return new Promise(function(resolver, rejecter) { stream.on('error', rejecter); stream.on('end', resolver); return runner.query().map(function(row) { stream.write(row); }).catch(function() { stream.emit('error'); }).then(function() { 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); if (obj.method === 'select') { response = helpers.skim(response); } else if (obj.method === 'insert') { response = [ctx.lastID]; } else if (obj.method === 'del' || obj.method === 'update') { response = ctx.changes; } return response; }; // Assign the newly extended `Runner` constructor to the client object. client.Runner = Runner_SQLite3; }; },{"../../helpers":20,"../../promise":24,"../../runner":30,"inherits":45}],11:[function(_dereq_,module,exports){ // SQLite3: Column Builder & Compiler // ------- module.exports = function(client) { var inherits = _dereq_('inherits'); var Schema = _dereq_('../../../schema'); // 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'; // Compile a drop column command. ColumnCompiler_SQLite3.prototype.dropColumn = function() { throw new Error("Drop column not supported for SQLite."); }; client.ColumnBuilder = ColumnBuilder_SQLite3; client.ColumnCompiler = ColumnCompiler_SQLite3; }; },{"../../../schema":35,"inherits":45}],12:[function(_dereq_,module,exports){ // SQLite3_DDL // // All of the SQLite3 specific DDL helpers for renaming/dropping // columns and changing datatypes. // ------- module.exports = function(client) { var _ = _dereq_('lodash'); var Promise = _dereq_('../../../promise'); // 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; this.formatter = new client.Formatter; 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) { return this.runner.query({sql: 'begin transaction;'}); } }); SQLite3_DDL.prototype.commitTransaction = Promise.method(function() { return this.runner.commitTransaction(); }); SQLite3_DDL.prototype.rollbackTransaction = function(e) { return this.runner.rollbackTransaction().then(function() { throw e; }); }; 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++; 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); } batch.push(row); 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; return this.getColumn(from) .bind(this) .tap(function(col) { currentCol = col; }) .then(this.ensureTransaction) .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)}); }).then(this.reinsertData(function(row) { row[to] = row[from]; return _.omit(row, from); })).then(this.dropTempTable); }) .tap(this.commitTransaction) .catch(this.rollbackTransaction); }); SQLite3_DDL.prototype.dropColumn = Promise.method(function(column) { return this.getColumn(column) .then(function() { }); }); client.SQLite3_DDL = SQLite3_DDL; }; },{"../../../promise":24,"lodash":"K2RcUv"}],13:[function(_dereq_,module,exports){ module.exports = function(client) { _dereq_('./ddl')(client); _dereq_('./schema')(client); _dereq_('./table')(client); _dereq_('./column')(client); }; },{"./column":11,"./ddl":12,"./schema":14,"./table":15}],14:[function(_dereq_,module,exports){ // SQLite3: Column Builder & Compiler // ------- module.exports = function(client) { var _ = _dereq_('lodash'); var inherits = _dereq_('inherits'); var Schema = _dereq_('../../../schema'); // 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) { return _.findWhere(resp, {name: column}) != null; } }); }; // 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; }; },{"../../../schema":35,"inherits":45,"lodash":"K2RcUv"}],15:[function(_dereq_,module,exports){ // SQLite3: Column Builder & Compiler // ------- module.exports = function(client) { var _ = _dereq_('lodash'); var inherits = _dereq_('inherits'); var Schema = _dereq_('../../../schema'); // 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. TableCompiler_SQLite3.prototype.createQuery = function(columns) { var sql = 'create table ' + this.tableName() + ' (' + columns.sql.join(', '); // 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. TableCompiler_SQLite3.prototype.dropUnique = function(columns, indexName) { indexName = indexName || this._indexCommand('unique', this.tableNameRaw, columns); this.pushQuery('drop index ' + indexName); }; TableCompiler_SQLite3.prototype.dropIndex = function(columns, indexName) { indexName = indexName || this._indexCommand('index', this.tableNameRaw, columns); this.pushQuery('drop index ' + indexName); }; // 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') { throw new Error('Foreign & Primary keys may only be added on create'); } }; TableCompiler_SQLite3.prototype.primaryKeys = function() { var pks = _.where(this.grouped.alterTable || [], {method: 'primary'}); if (pks.length > 0 && pks[0].args.length > 0) { return ', primary key (' + this.formatter.columnize(pks[0].args) + ')'; } }; 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; }; },{"../../../schema":35,"inherits":45,"lodash":"K2RcUv"}],16:[function(_dereq_,module,exports){ // SQLite3 Transaction // ------- module.exports = function(client) { var inherits = _dereq_('inherits'); var Transaction = _dereq_('../../transaction'); function Transaction_SQLite3() { this.client = client; Transaction.apply(this, arguments); } inherits(Transaction_SQLite3, Transaction); client.Transaction = Transaction_SQLite3; }; },{"../../transaction":39,"inherits":45}],17:[function(_dereq_,module,exports){ // WebSQL // ------- var inherits = _dereq_('inherits'); var Client_SQLite3 = _dereq_('../sqlite3/index'); var Promise = _dereq_('../../promise'); function Client_WebSQL(config) { config = config || {}; Client_SQLite3.super_.apply(this, arguments); if (config.debug) this.isDebugging = true; this.name = config.name || 'knex_database'; this.initDriver(); this.initRunner(); } inherits(Client_WebSQL, Client_SQLite3); Client_WebSQL.prototype.dialect = 'websql', Client_WebSQL.prototype.initDriver = function() {}; Client_WebSQL.prototype.initPool = function() {}; Client_WebSQL.prototype.initMigrator = function() {}; // Initialize the query "runner" Client_WebSQL.prototype.initRunner = function() { _dereq_('./runner')(this); }; // 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 { var db = openDatabase(client.name, '1.0', client.name, 65536); 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. Client_WebSQL.prototype.releaseConnection = Promise.method(function(connection) {}); module.exports = Client_WebSQL; },{"../../promise":24,"../sqlite3/index":5,"./runner":18,"inherits":45}],18:[function(_dereq_,module,exports){ // Runner // ------- module.exports = function(client) { var Promise = _dereq_('../../promise'); // Require the SQLite3 Runner. _dereq_('../sqlite3/runner')(client); var Runner_SQLite3 = client.Runner; var inherits = _dereq_('inherits'); // 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) { console.error(err); rejecter(err); }); }); }); // Ensures the response is returned in the same format as other clients. Runner_WebSQL.prototype.processResponse = function(obj) { var resp = obj.response; if (obj.method === 'select') { var results = []; for (var i = 0, l = resp.rows.length; i < l; i++) { results[i] = _.clone(resp.rows.item(i)); } return results; } else if (obj.method === 'insert') { resp = [resp.insertId]; } else if (obj.method === 'delete' || obj.method === 'update') { resp = resp.rowsAffected; } return resp; }; // Assign the newly extended `Runner` constructor to the client object. client.Runner = Runner_WebSQL; }; },{"../../promise":24,"../sqlite3/runner":10,"inherits":45}],19:[function(_dereq_,module,exports){ // Mixed into the query compiler & schema pieces. Assumes a `grammar` // property exists on the current object. var _ = _dereq_('lodash'); var QueryBuilder = _dereq_('./query/builder'); var Raw = _dereq_('./raw'); 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)) { return '(' + this.compileCallback(value) + ')'; } 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); return query.sql; } if (value instanceof Raw) { if (value.bindings) push.apply(this.bindings, value.bindings); return value.sql; } if (parameter) this.bindings.push(value); }; Formatter.prototype.rawOrFn = function(value, wrap) { var sql = ''; if (_.isFunction(value)) { sql = this.compileCallback(value); } else { sql = this.checkRaw(value); } return sql ? (wrap ? '(' + sql + ')' : sql) : ''; }; // 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. Formatter.prototype.wrap = function(val) { var raw; if (raw = this.checkRaw(val)) return raw; if (_.isNumber(val)) return val; return this._wrap(val + ''); }; // 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) { wrapped.push(this.wrap(value)); } else { wrapped.push(this.wrapValue(value)); } } 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) { var raw; if (raw = this.checkRaw(value)) return raw; if (!_.contains(this.operators, value)) { throw new TypeError('The operator "' + value + '" is not permitted'); } return value; }; // Specify the direction of the ordering. Formatter.prototype.direction = function(value) { var raw; if (raw = this.checkRaw(value)) return raw; return _.contains(orderBys, (value || '').toLowerCase()) ? value : 'asc'; }; // Compiles a callback using the MySQL query builder. 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. return compiler.toSQL(method || 'select').sql; }; module.exports = Formatter; },{"./query/builder":25,"./raw":29,"lodash":"K2RcUv"}],20:[function(_dereq_,module,exports){ // helpers.js // ------- // Just some common functions needed in multiple places within the library. var _ = _dereq_('lodash'); 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; },{"lodash":"K2RcUv"}],21:[function(_dereq_,module,exports){ module.exports = function(Target) { var _ = _dereq_('lodash'); var SqlString = _dereq_('./dialects/mysql/string'); Target.prototype.toQuery = function(tz) { var data = this.toSQL(this._method); if (this._errors && this._errors.length > 0) throw this._errors[0]; 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); }; // Create a new instance of the `Runner`, passing in the current object. Target.prototype.then = function(onFulfilled, onRejected) { var Runner = this.client.Runner; return new Runner(this).run().then(onFulfilled, onRejected); }; // 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 || []; this._options.push(opts); 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) { this._debug = (val == null ? true : val); 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); }; // Creates a method which "coerces" to a promise, by calling a // "then" method on the current `Target` _.each(['bind', 'catch', 'spread', 'otherwise', 'tap', 'thenReturn', 'return', 'yield', 'ensure', 'nodeify', 'exec'], function(method) { Target.prototype[method] = function() { var then = this.then(); return then[method].apply(then, arguments); }; }); }; },{"./dialects/mysql/string":3,"lodash":"K2RcUv"}],22:[function(_dereq_,module,exports){ module.exports = ['make', 'latest', 'rollback', 'currentVersion']; },{}],23:[function(_dereq_,module,exports){ // Pool // ------- var _ = _dereq_('lodash'); var GenericPool = _dereq_('generic-pool-redux').Pool; var Promise = _dereq_('./promise'); // 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. var Pool = function(config) { this.config = _.clone(config) || {}; this.initialize(); }; // Typically only called internally, this initializes // a new `GenericPool` instance, based on the `config` // options passed into the constructor. Pool.prototype.initialize = function() { this.genericPool = this.genericPool || new GenericPool(_.defaults(this.config, _.result(this, 'defaults'))); }; // 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() { connection.end(); }); } connection.end(); } }; }; // Acquires a connection from the pool. Pool.prototype.acquire = function(callback, priority) { return this.genericPool.acquire(callback, priority); }; // Release a connection back to the connection pool. Pool.prototype.release = function(connection, callback) { return this.genericPool.release(connection, callback); }; // 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; },{"./promise":24,"lodash":"K2RcUv"}],24:[function(_dereq_,module,exports){ var Promise = _dereq_('bluebird'); 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; },{"bluebird":"EjIH/G"}],25:[function(_dereq_,module,exports){ // Builder // ------- var _ = _dereq_('lodash'); var inherits = _dereq_('inherits'); var EventEmitter = _dereq_('events').EventEmitter; var Raw = _dereq_('../raw'); var helpers = _dereq_('../helpers'); var JoinClause = _dereq_('./joinclause'); // 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'; } inherits(QueryBuilder, EventEmitter); // Valid values for the `order by` clause generation. var orderBys = ['asc', 'desc']; 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 = QueryBuilder.prototype.column = function() { this._statements.push({ grouping: 'columns', value: helpers.normalizeArr.apply(null, arguments) }); return this; }; // 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. QueryBuilder.prototype.join = function(table, first, operator, second) { var i, args = new Array(arguments.length); for (i = 0; i < args.length; i++) { args[i] = arguments[i]; } if (args.length === 5) { helpers.deprecate('The five argument join syntax is now deprecated, ' + 'please check the docs and update your code.'); return this._joinType(args[4]).join(table, first, operator, second); } var join; if (_.isFunction(first)) { if (args.length > 2) { helpers.deprecate('The [table, fn, type] join syntax is deprecated, ' + 'please check the docs and update your code.'); return this._joinType(args[2]).join(table, first); } join = new JoinClause(table, this._joinType()); first.call(join, join); } else { join = new JoinClause(table, this._joinType()); join.on.apply(join, args.slice(1)); } 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); }; // 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) { // 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); // 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); } } // lower case the operator for comparison purposes var checkOperator = ('' + operator).toLowerCase().trim(); // If there are 3 arguments, check whether 'in' is one of them. if (arguments.length === 3) { if (checkOperator === 'in' || checkOperator === 'not in') { return this.whereIn(arguments[0], arguments[2], (checkOperator === 'not in')); } if (checkOperator === 'between' || checkOperator === 'not between') { return this.whereBetween(arguments[0], arguments[2], (checkOperator === 'not between')); } } // 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') { return this.whereNull(column, bool, (checkOperator === 'is not')); } } // Push onto the where statement stack. 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); }; // 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]); } return this; }; // Adds a raw `where` clause to the query. QueryBuilder.prototype.whereRaw = QueryBuilder.prototype.andWhereRaw = function(sql, bindings) { 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); }; // 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; }; // Adds a `where exists` clause to the query. QueryBuilder.prototype.whereExists = function(callback, not) { this._statements.push({ grouping: 'where', type: 'whereExists', value: callback, not: not || false, 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) { return this.whereExists(callback, true); }; // Adds a `or where not exists` clause to the query. QueryBuilder.prototype.orWhereNotExists = function(callback) { return this._bool('or').whereExists(callback, true); }; // Adds a `where in` clause to the query. QueryBuilder.prototype.whereIn = function(column, values, not) { this._statements.push({ grouping: 'where', type: 'whereIn', column: column, value: values, not: not || false, 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) { return this.whereIn(column, values, true); }; // Adds a `or where not in` clause to the query. QueryBuilder.prototype.orWhereNotIn = function(column, values) { return this._bool('or').whereIn(column, values, true); }; // Adds a `where null` clause to the query. QueryBuilder.prototype.whereNull = function(column, not) { this._statements.push({ grouping: 'where', type: 'whereNull', column: column, not: not || false, 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) { return this.whereNull(column, ' is not null'); }; // Adds a `or where not null` clause to the query. QueryBuilder.prototype.orWhereNotNull = function(column) { return this._bool('or').whereNull(column, ' is not null'); }; // Adds a `where between` clause to the query. QueryBuilder.prototype.whereBetween = function(column, values, not) { 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, not: not || false, bool: this._bool() }); return this; }; // Adds a `where not between` clause to the query. QueryBuilder.prototype.whereNotBetween = function(column, values) { return this.whereBetween(column, values, true); }; // 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) { return this._bool('or').whereNotBetwen(column, values); }; // Adds a `group by` clause to the query. QueryBuilder.prototype.groupBy = function() { this._statements.push({ grouping: 'group', value: helpers.normalizeArr.apply(null, arguments) }); return this; }; // Adds a `order by` clause to the query. QueryBuilder.prototype.orderBy = function(column, direction) { if (!(direction instanceof Raw)) { if (!_.contains(orderBys, (direction || '').toLowerCase())) direction = 'asc'; } this._statements.push({ grouping: 'order', value: column, direction: direction }); return this; }; // Add a union statement to the query. QueryBuilder.prototype.union = function(callback, wrap) { if (arguments.length > 1) { var args = new Array(arguments.length); for (var i = 0, l = args.length; i < l; i++) { args[i] = arguments[i]; this.union(args[i]); } return this; } this._statements.push({ grouping: 'union', clause: 'union', value: callback, wrap: wrap || false }); 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) { if (column instanceof Raw && arguments.length === 1) { return this._havingRaw(column); } 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'; this._statements.push({ grouping: 'column', 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) { this._method = 'columnInfo'; this._single.columnInfo = column; 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; }; // 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; }; // Attach all of the top level promise methods that should be chainable. _dereq_('../interface')(QueryBuilder); module.exports = QueryBuilder; },{"../helpers":20,"../interface":21,"../raw":29,"./joinclause":27,"events":44,"inherits":45,"lodash":"K2RcUv"}],26:[function(_dereq_,module,exports){ // Query Compiler // ------- var _ = _dereq_('lodash'); var helpers = _dereq_('../helpers'); var Raw = _dereq_('../raw'); // 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'); this.tableName = this.single.table ? this.formatter.wrap(this.single.table) : ''; } // 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}; } return _.extend(defaults, val); }; 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; QueryCompiler.prototype.pluck = QueryCompiler.prototype.select; // Compiles an "insert" query, allowing for multiple // inserts using a single query statement. QueryCompiler.prototype.insert = function() { var sql = 'insert into ' + this.tableName + ' '; if (_.isEmpty(this.single.insert)) { sql += this._emptyInsertValue; } else { var insertData = this._prepInsert(this.single.insert); if (_.isString(insertData)) { sql += insertData; } else { sql += '(' + this.formatter.columnize(insertData.columns) + ') values (' + _.map(insertData.values, this.formatter.parameterize, this.formatter).join('), (') + ')'; } } return sql; }; // Compiles the "update" query. QueryCompiler.prototype.update = function() { obj = helpers.sortObject(obj); var vals = []; for (var i = 0; i < obj.length; i++) { var value = obj[i]; vals.push(this.formatter.wrap(value[0]) + ' = ' + this.formatter.parameter(value[1])); } if (!_.isEmpty(ret)) this.returning(ret); return { grouping: 'update', columns: vals.join(', ') }; }; // 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 ''; var sql = []; for (var i = 0, l = joins.length; i < l; i++) { var stmt = joins[i]; var str = stmt.joinType + ' join ' + this.formatter.wrap(stmt.table); for (var i2 = 0, l2 = stmt.clauses.length; i2 < l2; i2++) { var clause = stmt.clauses[i2]; if (i2 > 0) { str += ' ' + clause[1] + ' '; } else { str += ' on '; } str += this.formatter.wrap(clause[2]) + ' ' + this.formatter.operator(clause[3]) + ' ' + this.formatter.wrap(clause[4]); } sql.push(str); } 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)); } else { sql.push(str + this.formatter.checkRaw(s.value)); } } 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 + ' '; sql += this.formatter.rawOrFn(union.value, union.wrap); } 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() { if (this.single.limit == void 0) return ''; return 'limit ' + this.formatter.parameter(this.single.limit); }; QueryCompiler.prototype.offset = function() { if (this.single.offset == void 0) return ''; return 'offset ' + this.formatter.parameter(this.single.offset); }; // Compiles a `delete` query. QueryCompiler.prototype.del = function() { var wheres = this.where(); return 'delete from ' + this.tableName + (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 ''; var sql = []; for (var i = 0, l = items.length; i < l; i++) { var item = items[i]; var str = this.formatter.columnize(item.value); if (type === 'order') { str += ' ' + this.formatter.direction(item.direction); } sql.push(str); } return sql.length > 0 ? type + ' by ' + sql.join(', ') : ''; }; // 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) { return this._not(statement, 'exists') + ' (' + this.formatter.compileCallback(statement.value) + ')'; }; QueryCompiler.prototype.whereWrapped = function(statement) { return '(' + this.formatter.compileCallback(statement.value, 'where').slice(6) + ')'; }; 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; if (!_.isArray(data)) data = data ? [data] : []; for (var i = 0, l = data.length; i 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'; ColumnCompiler.prototype.bit = ColumnCompiler.prototype.json = 'text'; ColumnCompiler.prototype.uuid = 'char(36)'; ColumnCompiler.prototype.specificType = function(type) { 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 ''; } else if (value instanceof Raw) { value = value.toQuery(); } else if (this.type === 'bool') { if (value === 'false') value = 0; value = (value ? 1 : 0); } else if (value === true || value === false) { value = parseInt(value, 10); } else if (this.type === 'json' && _.isObject(value)) { return JSON.stringify(value); } else { value = "'" + value + "'"; } return 'default ' + value; }; ColumnCompiler.prototype._num = function(val, fallback) { if (val == null) return fallback; var number = parseInt(val, 10); return isNaN(number) ? fallback : number; }; module.exports = ColumnCompiler; },{"../raw":29,"lodash":"K2RcUv"}],34:[function(_dereq_,module,exports){ // 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'); SchemaCompiler.prototype.alterTable = buildTable('alter'); 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; }; module.exports = SchemaCompiler; },{}],35:[function(_dereq_,module,exports){ var _ = _dereq_('lodash'); var Builder = _dereq_('./builder'); var Compiler = _dereq_('./compiler'); var TableBuilder = _dereq_('./tablebuilder'); var TableCompiler = _dereq_('./tablecompiler'); var ColumnBuilder = _dereq_('./columnbuilder'); var ColumnCompiler = _dereq_('./columncompiler'); // 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); }; module.exports = { Builder: Builder, Compiler: Compiler, TableBuilder: TableBuilder, TableCompiler: TableCompiler, ColumnBuilder: ColumnBuilder, ColumnCompiler: ColumnCompiler }; },{"./builder":31,"./columnbuilder":32,"./columncompiler":33,"./compiler":34,"./tablebuilder":37,"./tablecompiler":38,"lodash":"K2RcUv"}],36:[function(_dereq_,module,exports){ module.exports = ['table', 'createTable', 'editTable', 'dropTable', 'dropTableIfExists', 'renameTable', 'hasTable', 'hasColumn']; },{}],37:[function(_dereq_,module,exports){ // 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. // ------ var _ = _dereq_('lodash'); 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(); }; 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; }; _.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) { warn('Knex only supports ' + method + ' statement with mysql.'); } if (this.__method === 'alter') { warn('Knex does not support altering the ' + method + ' outside of the create table, please use knex.raw statement.'); } 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; },{"lodash":"K2RcUv"}],38:[function(_dereq_,module,exports){ // Table Compiler // ------- var _ = _dereq_('lodash'); var helpers = _dereq_('../helpers'); 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. TableCompiler.prototype.create = function() { var columns = this.getColumns(); var columnTypes = this.getColumnTypes(columns); this.createQuery(columnTypes); this.columnQueries(columns); delete this.single.comment; this.alterTable(); }; // 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); return 'alter table ' + this.tableName() + ' add constraint ' + keyName + ' ' + 'foreign key (' + column + ') references ' + inTable + ' (' + references + ')'; } }; // 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); 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]); } }; // 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; },{"../helpers":20,"lodash":"K2RcUv"}],39:[function(_dereq_,module,exports){ // Transaction // ------- var Promise = _dereq_('./promise'); var inherits = _dereq_('inherits'); var EventEmitter = _dereq_('events').EventEmitter; // 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. Transaction.prototype.containerObject = function(runner) { var Knex = _dereq_('../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); }; // Rolls back the transaction. transactor.rollback = function(error) { runner.finishTransaction(1, transactor, error); }; transactor._runner = runner; return transactor; }; Transaction.prototype.initiateDeferred = function(transactor) { // 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(); // 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') { result.then(transactor.commit).catch(transactor.rollback); } // 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. _dereq_('./interface')(Transaction); // Passed a `container` function, this method runs the current // transaction, returning a promise. Transaction.prototype.then = function(onFulfilled, onRejected) { var Runner = this.client.Runner; // Create a new "runner" object, passing the "runner" // object along, so we can easily keep track of every // query run on the current connection. return new Runner(this) .startTransaction() .bind(this) .then(this.containerObject) .then(this.initiateDeferred) .then(onFulfilled, onRejected) .bind(); }; module.exports = Transaction; },{"../knex":1,"./interface":21,"./promise":24,"events":44,"inherits":45}],40:[function(_dereq_,module,exports){ module.exports = { pgBindings: function(sql) { var questionCount = 0; return sql.replace(/\?/g, function() { questionCount++; return '$' + questionCount; }); } }; },{}],41:[function(_dereq_,module,exports){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ var base64 = _dereq_('base64-js') var ieee754 = _dereq_('ieee754') exports.Buffer = Buffer exports.SlowBuffer = Buffer exports.INSPECT_MAX_BYTES = 50 Buffer.poolSize = 8192 /** * If `Buffer._useTypedArrays`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (compatible down to IE6) */ Buffer._useTypedArrays = (function () { // Detect if browser supports Typed Arrays. Supported browsers are IE 10+, Firefox 4+, // Chrome 7+, Safari 5.1+, Opera 11.6+, iOS 4.2+. If the browser does not support adding // properties to `Uint8Array` instances, then that's the same as no `Uint8Array` support // because we need to be able to add all the node Buffer API methods. This is an issue // in Firefox 4-29. Now fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=695438 try { var buf = new ArrayBuffer(0) var arr = new Uint8Array(buf) arr.foo = function () { return 42 } return 42 === arr.foo() && typeof arr.subarray === 'function' // Chrome 9-10 lack `subarray` } 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 // Workaround: node's base64 implementation allows for non-padded strings // while base64-js does not. if (encoding === 'base64' && type === 'string') { subject = stringtrim(subject) while (subject.length % 4 !== 0) { subject = subject + '=' } } // Find the length var length if (type === 'number') length = coerce(subject) else if (type === 'string') length = Buffer.byteLength(subject, encoding) else if (type === 'object') length = coerce(subject.length) // assume that object is array-like else throw new Error('First argument needs to be a number, array or string.') var buf if (Buffer._useTypedArrays) { // 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 if (Buffer._useTypedArrays && typeof subject.byteLength === 'number') { // 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) } else if (type === 'number' && !Buffer._useTypedArrays && !noZero) { for (i = 0; i < length; i++) { buf[i] = 0 } } return buf } // STATIC METHODS // ============== 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.isBuffer = function (b) { return !!(b !== null && b !== undefined && b._isBuffer) } Buffer.byteLength = function (str, encoding) { var ret str = str.toString() switch (encoding || 'utf8') { case 'hex': ret = str.length / 2 break case 'utf8': case 'utf-8': ret = utf8ToBytes(str).length break case 'ascii': case 'binary': case 'raw': ret = str.length break case 'base64': ret = base64ToBytes(str).length break case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': ret = str.length * 2 break default: throw new Error('Unknown encoding') } return ret } Buffer.concat = function (list, totalLength) { assert(isArray(list), 'Usage: Buffer.concat(list[, length])') 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 } Buffer.compare = function (a, b) { assert(Buffer.isBuffer(a) && Buffer.isBuffer(b), '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 } // BUFFER INSTANCE METHODS // ======================= 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 assert(strLen % 2 === 0, 'Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; i++) { var byte = parseInt(string.substr(i * 2, 2), 16) assert(!isNaN(byte), 'Invalid hex string') 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) { var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length) 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 length = swap } offset = Number(offset) || 0 var remaining = this.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } encoding = String(encoding || 'utf8').toLowerCase() var ret switch (encoding) { case 'hex': ret = hexWrite(this, string, offset, length) break case 'utf8': case 'utf-8': ret = utf8Write(this, string, offset, length) break case 'ascii': ret = asciiWrite(this, string, offset, length) break case 'binary': ret = binaryWrite(this, string, offset, length) break case 'base64': ret = base64Write(this, string, offset, length) break case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': ret = utf16leWrite(this, string, offset, length) break default: throw new Error('Unknown encoding') } return ret } Buffer.prototype.toString = function (encoding, start, end) { var self = this encoding = String(encoding || 'utf8').toLowerCase() start = Number(start) || 0 end = (end === undefined) ? self.length : Number(end) // Fastpath empty strings if (end === start) return '' var ret switch (encoding) { case 'hex': ret = hexSlice(self, start, end) break case 'utf8': case 'utf-8': ret = utf8Slice(self, start, end) break case 'ascii': ret = asciiSlice(self, start, end) break case 'binary': ret = binarySlice(self, start, end) break case 'base64': ret = base64Slice(self, start, end) break case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': ret = utf16leSlice(self, start, end) break default: throw new Error('Unknown encoding') } return ret } Buffer.prototype.toJSON = function () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } Buffer.prototype.equals = function (b) { assert(Buffer.isBuffer(b), 'Argument must be a Buffer') return Buffer.compare(this, b) === 0 } Buffer.prototype.compare = function (b) { assert(Buffer.isBuffer(b), 'Argument must be a Buffer') return Buffer.compare(this, b) } // 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 assert(end >= start, 'sourceEnd < sourceStart') assert(target_start >= 0 && target_start < target.length, 'targetStart out of bounds') assert(start >= 0 && start < source.length, 'sourceStart out of bounds') assert(end >= 0 && end <= source.length, '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 if (len < 100 || !Buffer._useTypedArrays) { for (var i = 0; i < len; i++) { target[i + target_start] = this[i + start] } } else { target._set(this.subarray(start, start + len), target_start) } } 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 start = clamp(start, len, 0) end = clamp(end, len, len) if (Buffer._useTypedArrays) { 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 } } // `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) } Buffer.prototype.readUInt8 = function (offset, noAssert) { if (!noAssert) { assert(offset !== undefined && offset !== null, 'missing offset') assert(offset < this.length, 'Trying to read beyond buffer length') } if (offset >= this.length) return return this[offset] } function readUInt16 (buf, offset, littleEndian, noAssert) { if (!noAssert) { assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 1 < buf.length, 'Trying to read beyond buffer length') } var len = buf.length if (offset >= len) return var val if (littleEndian) { val = buf[offset] if (offset + 1 < len) val |= buf[offset + 1] << 8 } else { val = buf[offset] << 8 if (offset + 1 < len) val |= buf[offset + 1] } return val } Buffer.prototype.readUInt16LE = function (offset, noAssert) { return readUInt16(this, offset, true, noAssert) } Buffer.prototype.readUInt16BE = function (offset, noAssert) { return readUInt16(this, offset, false, noAssert) } function readUInt32 (buf, offset, littleEndian, noAssert) { if (!noAssert) { assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 3 < buf.length, 'Trying to read beyond buffer length') } var len = buf.length if (offset >= len) return var val if (littleEndian) { if (offset + 2 < len) val = buf[offset + 2] << 16 if (offset + 1 < len) val |= buf[offset + 1] << 8 val |= buf[offset] if (offset + 3 < len) val = val + (buf[offset + 3] << 24 >>> 0) } else { if (offset + 1 < len) val = buf[offset + 1] << 16 if (offset + 2 < len) val |= buf[offset + 2] << 8 if (offset + 3 < len) val |= buf[offset + 3] val = val + (buf[offset] << 24 >>> 0) } return val } Buffer.prototype.readUInt32LE = function (offset, noAssert) { return readUInt32(this, offset, true, noAssert) } Buffer.prototype.readUInt32BE = function (offset, noAssert) { return readUInt32(this, offset, false, noAssert) } Buffer.prototype.readInt8 = function (offset, noAssert) { if (!noAssert) { assert(offset !== undefined && offset !== null, 'missing offset') assert(offset < this.length, 'Trying to read beyond buffer length') } if (offset >= this.length) return var neg = this[offset] & 0x80 if (neg) return (0xff - this[offset] + 1) * -1 else return this[offset] } function readInt16 (buf, offset, littleEndian, noAssert) { if (!noAssert) { assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 1 < buf.length, 'Trying to read beyond buffer length') } var len = buf.length if (offset >= len) return var val = readUInt16(buf, offset, littleEndian, true) var neg = val & 0x8000 if (neg) return (0xffff - val + 1) * -1 else return val } Buffer.prototype.readInt16LE = function (offset, noAssert) { return readInt16(this, offset, true, noAssert) } Buffer.prototype.readInt16BE = function (offset, noAssert) { return readInt16(this, offset, false, noAssert) } function readInt32 (buf, offset, littleEndian, noAssert) { if (!noAssert) { assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 3 < buf.length, 'Trying to read beyond buffer length') } var len = buf.length if (offset >= len) return var val = readUInt32(buf, offset, littleEndian, true) var neg = val & 0x80000000 if (neg) return (0xffffffff - val + 1) * -1 else return val } Buffer.prototype.readInt32LE = function (offset, noAssert) { return readInt32(this, offset, true, noAssert) } Buffer.prototype.readInt32BE = function (offset, noAssert) { return readInt32(this, offset, false, noAssert) } function readFloat (buf, offset, littleEndian, noAssert) { if (!noAssert) { assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset + 3 < buf.length, 'Trying to read beyond buffer length') } return ieee754.read(buf, offset, littleEndian, 23, 4) } Buffer.prototype.readFloatLE = function (offset, noAssert) { return readFloat(this, offset, true, noAssert) } Buffer.prototype.readFloatBE = function (offset, noAssert) { return readFloat(this, offset, false, noAssert) } function readDouble (buf, offset, littleEndian, noAssert) { if (!noAssert) { assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset + 7 < buf.length, 'Trying to read beyond buffer length') } return ieee754.read(buf, offset, littleEndian, 52, 8) } Buffer.prototype.readDoubleLE = function (offset, noAssert) { return readDouble(this, offset, true, noAssert) } Buffer.prototype.readDoubleBE = function (offset, noAssert) { return readDouble(this, offset, false, noAssert) } Buffer.prototype.writeUInt8 = function (value, offset, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset < this.length, 'trying to write beyond buffer length') verifuint(value, 0xff) } if (offset >= this.length) return this[offset] = value return offset + 1 } function writeUInt16 (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 1 < buf.length, 'trying to write beyond buffer length') verifuint(value, 0xffff) } var len = buf.length if (offset >= len) return for (var i = 0, j = Math.min(len - offset, 2); i < j; i++) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } return offset + 2 } Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) { return writeUInt16(this, value, offset, true, noAssert) } Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) { return writeUInt16(this, value, offset, false, noAssert) } function writeUInt32 (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 3 < buf.length, 'trying to write beyond buffer length') verifuint(value, 0xffffffff) } var len = buf.length if (offset >= len) return for (var i = 0, j = Math.min(len - offset, 4); i < j; i++) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } return offset + 4 } Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) { return writeUInt32(this, value, offset, true, noAssert) } Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) { return writeUInt32(this, value, offset, false, noAssert) } Buffer.prototype.writeInt8 = function (value, offset, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset < this.length, 'Trying to write beyond buffer length') verifsint(value, 0x7f, -0x80) } if (offset >= this.length) return if (value >= 0) this.writeUInt8(value, offset, noAssert) else this.writeUInt8(0xff + value + 1, offset, noAssert) return offset + 1 } function writeInt16 (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 1 < buf.length, 'Trying to write beyond buffer length') verifsint(value, 0x7fff, -0x8000) } var len = buf.length if (offset >= len) return if (value >= 0) writeUInt16(buf, value, offset, littleEndian, noAssert) else writeUInt16(buf, 0xffff + value + 1, offset, littleEndian, noAssert) return offset + 2 } Buffer.prototype.writeInt16LE = function (value, offset, noAssert) { return writeInt16(this, value, offset, true, noAssert) } Buffer.prototype.writeInt16BE = function (value, offset, noAssert) { return writeInt16(this, value, offset, false, noAssert) } function writeInt32 (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 3 < buf.length, 'Trying to write beyond buffer length') verifsint(value, 0x7fffffff, -0x80000000) } var len = buf.length if (offset >= len) return if (value >= 0) writeUInt32(buf, value, offset, littleEndian, noAssert) else writeUInt32(buf, 0xffffffff + value + 1, offset, littleEndian, noAssert) return offset + 4 } Buffer.prototype.writeInt32LE = function (value, offset, noAssert) { return writeInt32(this, value, offset, true, noAssert) } Buffer.prototype.writeInt32BE = function (value, offset, noAssert) { return writeInt32(this, value, offset, false, noAssert) } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 3 < buf.length, 'Trying to write beyond buffer length') verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38) } var len = buf.length if (offset >= len) return 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) { if (!noAssert) { assert(value !== undefined && value !== null, 'missing value') assert(typeof littleEndian === 'boolean', 'missing or invalid endian') assert(offset !== undefined && offset !== null, 'missing offset') assert(offset + 7 < buf.length, 'Trying to write beyond buffer length') verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308) } var len = buf.length if (offset >= len) return 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) } // 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 assert(end >= start, 'end < start') // Fill 0 bytes; we're done if (end === start) return if (this.length === 0) return assert(start >= 0 && start < this.length, 'start out of bounds') assert(end >= 0 && end <= this.length, 'end out of bounds') 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 } Buffer.prototype.inspect = function () { var out = [] var len = this.length for (var i = 0; i < len; i++) { out[i] = toHex(this[i]) if (i === exports.INSPECT_MAX_BYTES) { out[i + 1] = '...' break } } return '' } /** * 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') { if (Buffer._useTypedArrays) { 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 { throw new Error('Buffer.toArrayBuffer not supported in this browser') } } // HELPER FUNCTIONS // ================ var BP = Buffer.prototype /** * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods */ Buffer._augment = function (arr) { 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 } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } // slice(start, end) function clamp (index, len, defaultValue) { if (typeof index !== 'number') return defaultValue index = ~~index; // Coerce to integer. if (index >= len) return len if (index >= 0) return index index += len if (index >= 0) return index return 0 } function coerce (length) { // Coerce length to a number (possibly NaN), round up // in case it's fractional (e.g. 123.456) then do a // double negate to coerce a NaN to 0. Easy, right? length = ~~Math.ceil(+length) return length < 0 ? 0 : length } function isArray (subject) { return (Array.isArray || function (subject) { return Object.prototype.toString.call(subject) === '[object Array]' })(subject) } 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) } function blitBuffer (src, dst, offset, length) { 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 } } /* * We have to make sure that the value is a valid integer. This means that it * is non-negative. It has no fractional component and that it does not * exceed the maximum allowed value. */ function verifuint (value, max) { assert(typeof value === 'number', 'cannot write a non-number as a number') assert(value >= 0, 'specified a negative value for writing an unsigned value') assert(value <= max, 'value is larger than maximum value for type') assert(Math.floor(value) === value, 'value has a fractional component') } function verifsint (value, max, min) { assert(typeof value === 'number', 'cannot write a non-number as a number') assert(value <= max, 'value larger than maximum allowed value') assert(value >= min, 'value smaller than minimum allowed value') assert(Math.floor(value) === value, 'value has a fractional component') } function verifIEEE754 (value, max, min) { assert(typeof value === 'number', 'cannot write a non-number as a number') assert(value <= max, 'value larger than maximum allowed value') assert(value >= min, 'value smaller than minimum allowed value') } function assert (test, message) { if (!test) throw new Error(message || 'Failed assertion') } },{"base64-js":42,"ieee754":43}],42:[function(_dereq_,module,exports){ var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; ;(function (exports) { 'use strict'; var Arr = (typeof Uint8Array !== 'undefined') ? Uint8Array : Array var ZERO = '0'.charCodeAt(0) 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 } module.exports.toByteArray = b64ToByteArray module.exports.fromByteArray = uint8ToBase64 }()) },{}],43:[function(_dereq_,module,exports){ 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; }; },{}],44:[function(_dereq_,module,exports){ // 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 } else { throw TypeError('Uncaught, unspecified "error" event.'); } return false; } } 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; } },{}],45:[function(_dereq_,module,exports){ 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 } } },{}]},{},[1]) (1) });