diff --git a/.travis.yml b/.travis.yml index 42ea8dc..662e61d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: node_js node_js: + - "12" + - "11" + - "10" + - "9" - "8" - - "7" - - "6" \ No newline at end of file + - "7" \ No newline at end of file diff --git a/README.md b/README.md index 9e1946b..00504c3 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ # database-js-firebase -[![Build Status](https://travis-ci.org/mlaanderson/database-js-sqlite.svg?branch=master)](https://travis-ci.org/mlaanderson/database-js-sqlite) +[![Build Status](https://travis-ci.org/mlaanderson/database-js-firebase.svg?branch=master)](https://travis-ci.org/mlaanderson/database-js-firebase) Database-js interface for Firebase ## About -Database-js-firebase is a [database-js](https://github.com/mlaanderson/database-js) wrapper around the Firebase database library. It creates a Promises wrapper around an SQL to Firebase (NoSQL) interpreter. +Database-js-firebase is a [database-js](https://github.com/mlaanderson/database-js) wrapper around the [Firebase database library](https://github.com/firebase/firebase-js-sdk). It creates a Promises wrapper around an SQL to Firebase (NoSQL) interpreter. It significantly restricts the structure Firebase as well as the access to Firebase. Right now access is limited to email and password. -Data must be stored using Firebase's ref.push. SQL commands are limited to SELECT, UPDATE, INSERT and DELETE. WHERE works well. JOINs are not allowed. GROUP BY is not supported. LIMIT and OFFSET are combined into a single LIMIT syntax: `LIMIT [offset,]number` +Data must be stored using Firebase's ref.push. SQL commands are limited to CREATE, SELECT, UPDATE, INSERT and DELETE. WHERE, GROUP BY, and LIMIT are all functional. INNER JOIN, LEFT JOIN and RIGHT JOIN work, OUTER JOIN is not supported. Aggregate functions COUNT and SUM are supported. -While a SELECT command can return a JSON object for a given field, JSON values cannot be UPDATEd or INSERTed, or be part of a WHERE clause. +CREATEs do not create a table structure because Firebase does not need a table to exist in order to insert data. -You probably should not use this, it was built as an experiment. +While a SELECT command can return a JSON object for a given field, JSON values cannot be UPDATEd or INSERTed, or be part of a WHERE clause. [RunKit Demo](https://runkit.com/mlaanderson/runkit-npm-database-js2) diff --git a/index.js b/index.js index b367f5b..f5a42e7 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ +const AbstractDriver = require("database-js-sqlparser"); +const Common = require('database-js-common'); var firebase = require('firebase'); -var parse = require('node-sqlparser').parse; var m_root = Symbol('root'); var m_credentials = Symbol('credentials'); @@ -7,7 +8,7 @@ var m_authenticated = Symbol('authenticated'); var m_authenticator = Symbol('authenticator'); -class Firebase { +class Firebase extends AbstractDriver { /** * Creates an instance of Firebase. * @param {string} root @@ -15,7 +16,7 @@ class Firebase { * @memberof Firebase */ constructor(root, credentials) { - var self = this; + super(); var resolveAuth; this[m_root] = firebase.database().ref(root); @@ -39,352 +40,66 @@ class Firebase { } /** - * Tests the passed row based on the where array. - * This could be faster on the server if the data has been - * indexed, and if the user only wants a single WHERE. - * - * @param {object} where Where object from the SQL Parser - * @param {object} row Row to compare - * @returns {boolean} if the row matches the where object - * @memberof Firebase - */ - doWhere(where, row) { - if (where === null) return true; - var self = this; - - function getVal(obj) { - if (obj.type === "column_ref") return row[obj.column]; - if (obj.type === "binary_expr") return self.doWhere(obj, row); - return obj.value; - } - - function replaceIfNotPrecededBy(notPrecededBy, replacement) { - return function(match) { - return match.slice(0, notPrecededBy.length) === notPrecededBy - ? match - : replacement; - } - } - - function like2RegExp(like) { - var restring = like; - restring = restring.replace(/([\.\*\?\$\^])/g, "\\$1"); - restring = restring.replace(/(?:\\)?%/g, replaceIfNotPrecededBy('\\', '.*?')); - restring = restring.replace(/(?:\\)?_/g, replaceIfNotPrecededBy('\\', '.')); - restring = restring.replace('\\%', '%'); - restring = restring.replace('\\_', '_'); - return new RegExp('^' + restring + '$'); - } - - switch (where.type) { - case "binary_expr": - switch(where.operator) { - case "=": - return getVal(where.left) == getVal(where.right); - case "!=": - case "<>": - return getVal(where.left) != getVal(where.right); - case "<": - return getVal(where.left) < getVal(where.right); - case "<=": - return getVal(where.left) <= getVal(where.right); - case ">": - return getVal(where.left) > getVal(where.right); - case ">=": - return getVal(where.left) >= getVal(where.right); - case "AND": - return getVal(where.left) && getVal(where.right); - case "OR": - return getVal(where.left) && getVal(where.right); - case "IS": - return getVal(where.left) === getVal(where.right) - case "LIKE": - return like2RegExp(getVal(where.right)).test(getVal(where.left)) === true; - case "NOT LIKE": - return like2RegExp(getVal(where.right)).test(getVal(where.left)) === false; - default: - return false; - } - break; - default: - return false; - } - } - - /** - * Used to push a row into the data object. If the fields are limited - * in the query, only places the requested fields. - * - * @param {object} sqlObj - * @param {Array} data - * @param {object} row - * @returns - * @memberof Firebase - */ - chooseFields(sqlObj, data, row) { - if (sqlObj.columns === "*") { - data.push(row); - return; - } - - let isAggregate = sqlObj.columns.some((col) => { return col.expr.type === 'aggr_func'; }); - - if (isAggregate === true) { - if (data.length === 0) { - data.push({}); - } - - for (let col of sqlObj.columns) { - let name, data_row; - switch(col.expr.type) { - case 'column_ref': - name = col.as || col.expr.column; - data[0][name] = row[col.expr.column]; - break; - case 'aggr_func': // TODO implement group by - name = col.as || col.expr.name.toUpperCase() + "(" + col.expr.args.expr.column + ")"; - - switch(col.expr.name.toUpperCase()) { - case 'SUM': - if (data[0][name] === undefined) { - data[0][name] = 0; - } - data[0][name] += row[col.expr.args.expr.column]; - break; - case 'COUNT': - if (data[0][name] === undefined) { - data[0][name] = 0; - } - data[0][name]++; - break; - } - break; - } - } - } else { - let result = {}; - for (let col of sqlObj.columns) { - let name = col.as || col.expr.column; - result[name] = row[col.expr.column]; - } - data.push(result); - } - } - - /** - * Performs an SQL SELECT. This is called from a Promise. - * - * @param {function} resolve - * @param {function} reject - * @param {any} sqlObj - * @returns - * @memberof Firebase + * Load all rows from a given table. Promise returns each row associated with + * and index value that is string or integer + * @param {string} table The table name to load rows from + * @returns {Promise<{[key:string|number]:any}>} */ - doSelect(resolve, reject, sqlObj) { - if (sqlObj.from.length !== 1) { - return reject("Selects from more than one table are not supported"); - } - - if (sqlObj.groupby !== null) { - console.warn("GROUP BY is unsupported"); - } - - this[m_root].child(sqlObj.from[0].table).once('value').then((snapshot) => { - let raw = snapshot.val(); - let rows = []; - for (let row_id in raw) { - if (this.doWhere(sqlObj.where, raw[row_id]) === true) { - this.chooseFields(sqlObj, rows, raw[row_id]); - } - } - - if (sqlObj.orderby) { - rows.sort((a, b) => { - for (let orderer of sqlObj.orderby) { - if (orderer.expr.type !== 'column_ref') { - throw new Error("ORDER BY only supported for columns, aggregates are not supported"); - } - - if (a[orderer.expr.column] > b[orderer.expr.column]) { - return orderer.type == 'ASC' ? 1 : -1; - } - if (a[orderer.expr.column] < b[orderer.expr.column]) { - return orderer.type == 'ASC' ? -1 : 1; - } - } - return 0; - }); - } - - if (sqlObj.limit) { - if (sqlObj.limit.length !== 2) { - throw new Error("Invalid LIMIT expression: Use LIMIT [offset,] number"); - } - let offs = parseInt(sqlObj.limit[0].value); - let len = parseInt(sqlObj.limit[1].value); - rows = rows.slice(offs, offs + len); - } - resolve(rows); + load(table) { + return new Promise((resolve, reject) => { + this[m_root].child(table).once('value').then((snapshot) => { + resolve(snapshot.val()); + }).catch(err => reject(err));; }); } /** - * Performs an SQL UPDATE. This is called from a Promise - * - * @param {function} resolve - * @param {function} reject - * @param {any} sqlObj - * @memberof Firebase + * Stores a row into the table + * @param {string} table The name of the destination table + * @param {number|string} index The array index or object key for the table row, null to insert + * @param {any} row The data to store + * @returns {number|string} Then index or object key which was stored */ - doUpdate(resolve, reject, sqlObj) { - - this[m_root].child(sqlObj.table).once('value').then((snapshot) => { - let raw = snapshot.val(); - let rows = []; - let promises = []; - let updateObj = {}; - - for (let item of sqlObj.set) { - updateObj[item.column] = item.value.value; - } - - for (let row_id in raw) { - if (this.doWhere(sqlObj.where, raw[row_id]) === true) { - promises.push(this[m_root].child(`${sqlObj.table}/${row_id}`).update(updateObj)); - rows.push(row_id); - } + store(table, index, row) { + return new Promise((resolve, reject) => { + if (index) { + this[m_root].child(table).child(index).set(row).then(() => resolve(index)).catch(err => reject(err)); + } else { + var ref = this[m_root].child(table).push(row).then(() => resolve(ref.key)).catch(err => reject(err)); } - Promise.all(promises).then((values) => { - resolve(rows); - }).catch((reason) => { - reject(reason); - }); }); } /** - * Performs an SQL INSERT. This is called from a Promise. - * - * @param {function} resolve - * @param {function} reject - * @param {any} sqlObj - * @memberof Firebase + * Removes a row from the table + * @param {string} table The name of the table + * @param {number|string} index The array index or object key for the table row */ - doInsert(resolve, reject, sqlObj) { - let rows = []; - for (let i = 0; i < sqlObj.values.length; i++) { - let data = {}; - for (let n = 0; n < sqlObj.columns.length; n++) { - data[sqlObj.columns[n]] = sqlObj.values[i].value[n].value; - } - - - rows.push(this[m_root].child(sqlObj.table).push(data)); - } - Promise.all(rows).then((values) => { - resolve(values.map((o) => o.key)); - }).catch((reason) => { - reject(reason); + remove(table, index) { + return new Promise((resolve, reject) => { + this[m_root].child(table).child(index).remove().then(() => resolve(index)).catch(err => reject(err)); }); } /** - * Performs an SQL DELETE. This is called from a Promise - * - * @param {function} resolve - * @param {function} reject - * @param {any} sqlObj - * @memberof Firebase + * Creates a new table - actually does nothing since Firebase doesn't need the definition created + * @param {string} table The name of the table to create + * @param {Array<{name:string,index:number,type:string,length?:number,pad?:string}>} definition The definition of the table to create */ - doDelete(resolve, reject, sqlObj) { - this[m_root].child(sqlObj.from[0].table).once('value').then((snapshot) => { - let raw = snapshot.val(); - let promises = [], rowIds = []; - for (let row_id in raw) { - if (this.doWhere(sqlObj.where, raw[row_id]) === true) { - rowIds.push(row_id); - promises.push(this[m_root].child(sqlObj.from[0].table).child(row_id).remove()); - } - } - Promise.all(promises).then((values) => { - resolve(rowIds); - }).catch((reason) => { - reject(reason); - }); - }); + create(table, definition) { + return Promise.resolve(true); } /** - * Runs the SQL statement - * - * @param {string} sql - * @returns {Promise} Promise of array of selected rows, updated rows, inserted rows, or deleted row Firebase keys - * @memberof Firebase + * Drops a table, deletes all the data associated with the table + * @param {string} table The name of the table to drop */ - runSQL(sql) { - var self = this; + drop(table) { return new Promise((resolve, reject) => { - this[m_authenticator].then(() => { - // we are now authenticated - let sqlObj; - try { - sqlObj = parse(sql); - } catch (err) { - // deletes aren't yet supported by the node-sqlparser - // so fake a SELECT and then change the type after the parse - if (/^delete/i.test(sql) === true) { - sql = sql.replace(/^delete/i, 'SELECT * '); - sqlObj = parse(sql); - sqlObj.type = 'delete'; - delete sqlObj.columns; - } else { - reject(err); - } - } - - switch(sqlObj.type) { - case 'select': - this.doSelect(resolve, reject, sqlObj); - break; - case 'update': - this.doUpdate(resolve, reject, sqlObj); - break; - case 'insert': - this.doInsert(resolve, reject, sqlObj); - break; - case 'delete': - this.doDelete(resolve, reject, sqlObj); - break; - default: - resolve(sqlObj); - break; - } - }); + this[m_root].child(table).remove().then(() => resolve(true)); }); } - /** - * Executes the passed SQL - * - * @param {string} sql - * @returns {Promise} Promise of array of selected rows, updated rows, inserted rows, or deleted row Firebase keys - * @memberof Firebase - */ - execute(sql) { - return this.runSQL(sql); - } - - /** - * Executes the passed SQL - * - * @param {string} sql - * @returns {Promise} Promise of array of selected rows, updated rows, inserted rows, or deleted row Firebase keys - * @memberof Firebase - */ - query(sql) { - return this.runSQL(sql); - } - /** * Closes the connection, sets Firebase to offline mode. * @@ -395,6 +110,10 @@ class Firebase { firebase.database().goOffline(); return Promise.resolve(true); } + + ready() { + return this[m_authenticator]; + } } module.exports = { @@ -404,13 +123,7 @@ module.exports = { * @returns {Firebase} */ open: function(connection) { - let params = {}; - let paramArray = connection.Parameters ? connection.Parameters.split(/[&]/g) : []; - - paramArray.map((p) => { - let parts = p.split('='); - params[parts[0]] = parts[1]; - }); + let params = connection.Parameters ? Common.parseConnectionParams(connection.Parameters) : {}; let config = { apiKey: params.apiKey || "", diff --git a/package-lock.json b/package-lock.json index f284b2f..b334dd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,154 +1,1114 @@ { "name": "database-js-firebase", - "version": "1.1.3", + "version": "1.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@firebase/app": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.4.14.tgz", + "integrity": "sha512-2awiJkYz/SMOAEGg5Qvq/596RywoefRckhjUS42kZC7C1HZ06EcQHr26ejAMFk9qeXWYLs4eumSw/V4SDYR3Kw==", + "requires": { + "@firebase/app-types": "0.4.3", + "@firebase/logger": "0.1.22", + "@firebase/util": "0.2.25", + "dom-storage": "2.1.0", + "tslib": "1.10.0", + "xmlhttprequest": "1.8.0" + } + }, + "@firebase/app-types": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.4.3.tgz", + "integrity": "sha512-VU5c+ZjejvefLVH4cjiX3Hy1w9HYMv7TtZ1tF9ZmOqT4DSIU1a3VISWoo8///cGGffr5IirMO+Q/WZLI4p8VcA==" + }, + "@firebase/auth": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.11.8.tgz", + "integrity": "sha512-aMSWaOCQmQtLKb1j96O7tErRx+kgq2OV3tMV/sKLkXp1J7SP03ejQfi+wOGDYnTWD6mNv+7b8ra1po+IHkydtg==", + "requires": { + "@firebase/auth-types": "0.7.2" + } + }, + "@firebase/auth-types": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.7.2.tgz", + "integrity": "sha512-xm3evp6671LoI+6M8Om3OhikabLf88Ivz1e7aR8uZjVBYptEYbF3seDIyHn/3wWdVYbp20WK4aWixKlRnHl+6Q==" + }, + "@firebase/database": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.0.tgz", + "integrity": "sha512-7XLy33bdVRpc+Z46SAk2XzbNuGD/jgOilYRuY+HlPt5qbhzhWHe4lnBLS6toMU299Vcvk6vLRup73qLui8FQpQ==", + "requires": { + "@firebase/database-types": "0.4.2", + "@firebase/logger": "0.1.22", + "@firebase/util": "0.2.25", + "faye-websocket": "0.11.3", + "tslib": "1.10.0" + } + }, + "@firebase/database-types": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.4.2.tgz", + "integrity": "sha512-rBF/Sp4S4zzVg+a6h0iEiXR2GdNRrvx2BR6IcvGHnSPF7XVpj9UuUWtZMJyO+vWP3zlIGDvlNRJ4qF01Y6KxGg==" + }, + "@firebase/firestore": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.4.10.tgz", + "integrity": "sha512-TyPwuWdY64G0cWm4H/7x6XJESHINIQIOK0gmjw1BYA+kPudzNaoyeJ6nxZRzZ7lcNol78FLCU7eb/ChDKVAo9g==", + "requires": { + "@firebase/firestore-types": "1.4.4", + "@firebase/logger": "0.1.22", + "@firebase/util": "0.2.25", + "@firebase/webchannel-wrapper": "0.2.24", + "@grpc/proto-loader": "^0.5.0", + "grpc": "1.22.2", + "tslib": "1.10.0" + } + }, + "@firebase/firestore-types": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.4.4.tgz", + "integrity": "sha512-kFpmzkUKfzrXkcMad+TQlMs55dWNY0q1UxGICW82EneX3Yg6HN3Nx36kYfqH+SLBFUN1ZTikN07alMp0MA9p9g==" + }, + "@firebase/functions": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.15.tgz", + "integrity": "sha512-mAOOHKaHqGRP2+5jlKesGUPQFiiy/sgjW5iURvzv0OJUdhERGlfCj9JM5w/1zosXG0oAiiu9Q+K/84dXyeaw4A==", + "requires": { + "@firebase/functions-types": "0.3.8", + "@firebase/messaging-types": "0.3.2", + "isomorphic-fetch": "2.2.1", + "tslib": "1.10.0" + } + }, + "@firebase/functions-types": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.3.8.tgz", + "integrity": "sha512-9hajHxA4UWVCGFmoL8PBYHpamE3JTNjObieMmnvZw3cMRTP2EwipMpzZi+GPbMlA/9swF9yHCY/XFAEkwbvdgQ==" + }, + "@firebase/installations": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.2.4.tgz", + "integrity": "sha512-lJlqVa7r/HuI9/d+oSr0CxyN/A1nMMgqDJJr0geDLqfDokrmFhkRxbtb28saGaGnfLzc1KhvIB/TdhzDJ/fDJA==", + "requires": { + "@firebase/installations-types": "0.1.2", + "@firebase/util": "0.2.25", + "idb": "3.0.2", + "tslib": "1.10.0" + } + }, + "@firebase/installations-types": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.1.2.tgz", + "integrity": "sha512-fQaWIW8hyX1XUN7+FCSPjvM1agFjGidVuF4Sxi7aFwfyh5t+4fD2VpM4wCQbWmodnx4fZLvsuQd9mkxxU+lGYQ==" + }, + "@firebase/logger": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.22.tgz", + "integrity": "sha512-os1vG5FohEF9gl27duZeTtEphOP7oHQ+YjnT+sT2dGprkTIAyaEkzH6G8AgLPUqmASSsoa6BqY5kFXHQi9+xGw==" + }, + "@firebase/messaging": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.4.8.tgz", + "integrity": "sha512-+NPRHQt4v2V07vmw98/ybOTwIspA3EaRc5Ni6D05d7N0U6RQaiqJae6T3VBMvQovXWzLRqA244KO1Z9OVTQdKg==", + "requires": { + "@firebase/messaging-types": "0.3.2", + "@firebase/util": "0.2.25", + "tslib": "1.10.0" + } + }, + "@firebase/messaging-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.3.2.tgz", + "integrity": "sha512-2qa2qNKqpalmtwaUV3+wQqfCm5myP/dViIBv+pXF8HinemIfO1IPQtr9pCNfsSYyus78qEhtfldnPWXxUH5v0w==" + }, + "@firebase/performance": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.2.15.tgz", + "integrity": "sha512-I0DYGx59n7r+U0xRi3ee3pidjQF/lp865pHdd+x+lxSLHE3u0XxS3tiSr2xePqm4C7v+syW+wEQRowd9z7UzoA==", + "requires": { + "@firebase/installations": "0.2.4", + "@firebase/logger": "0.1.22", + "@firebase/performance-types": "0.0.3", + "@firebase/util": "0.2.25", + "tslib": "1.10.0" + } + }, + "@firebase/performance-types": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.3.tgz", + "integrity": "sha512-RuC63nYJPJU65AsrNMc3fTRcRgHiyNcQLh9ufeKUT1mEsFgpxr167gMb+tpzNU4jsbvM6+c6nQAFdHpqcGkRlQ==" + }, + "@firebase/polyfill": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.19.tgz", + "integrity": "sha512-70gNPxxHCaSKcNw1g9XfBe15LWrvzvgzUGBVgAdv7zkpgtHMu/uEuklb+A0H1GJtNn6ijyHEAJGXR3KHJ92HEg==", + "requires": { + "core-js": "3.1.4", + "promise-polyfill": "8.1.3", + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, + "@firebase/storage": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.9.tgz", + "integrity": "sha512-Fxku8HVilac2zx1hnxshcnh4WhbY5DWT10dQwrFYNUFW1RuRfTB0zm3SNOVy4NAt7xpVIjqSjFs8mWDXGe7qaQ==", + "requires": { + "@firebase/storage-types": "0.3.3", + "@firebase/util": "0.2.25", + "tslib": "1.10.0" + } + }, + "@firebase/storage-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.3.tgz", + "integrity": "sha512-fUp4kpbxwDiWs/aIBJqBvXgFHZvgoND2JA0gJYSEsXtWtVwfgzY/710plErgZDeQKopX5eOR1sHskZkQUy0U6w==" + }, + "@firebase/util": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.25.tgz", + "integrity": "sha512-J/JgYhvFLCpejzfzjzNDZGFZD3kNtTlMu+2EjiQ3tCII6w0N/uEza5GtFiYTKCjGBa51Lmi2j/OPLz+yhlQCWg==", + "requires": { + "tslib": "1.10.0" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.24.tgz", + "integrity": "sha512-/wt/p0GrYp1cKTGMx1Ak8LpMH6PAJI7rMTYeROXi6+bZ30mhdIjpmLs11Bx26fzcZEH0jWlHXLfVdVDS5WXi2Q==" + }, + "@grpc/proto-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.1.tgz", + "integrity": "sha512-3y0FhacYAwWvyXshH18eDkUI40wT/uGio7MAegzY8lO5+wVsc19+1A7T0pPptae4kl7bdITL+0cHpnAPmryBjQ==", + "requires": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@types/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", + "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" + }, + "@types/node": { + "version": "10.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.15.tgz", + "integrity": "sha512-CBR5avlLcu0YCILJiDIXeU2pTw7UK/NIxfC63m7d7CVamho1qDEzXKkOtEauQRPMy6MI8mLozth+JJkas7HY6g==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", + "requires": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "requires": { + "long": "~3" + }, + "dependencies": { + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + } + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==" + }, "database-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/database-js/-/database-js-3.0.2.tgz", - "integrity": "sha512-YoCw6q95dwzbD/3PlZm6+CcxJY8QbEvbEt5bRCUVdskyT5j97Ofjt77in6GpCbxDUbKBZ7eGzlyJ7pLPH7raAg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/database-js/-/database-js-3.0.9.tgz", + "integrity": "sha512-khaHbjOFLQLWSPm65Ix3G86iAXTLGof1JUQUDY/knuR0kBmN9Z8Lb7HXAl8FD9bBpIPRJ9Bh2dPKcWv7p3AwJw==", "dev": true }, + "database-js-common": { + "version": "git+https://github.com/mlaanderson/database-js-common.git#e4e114208175abbe286f8e27f321e6e8521b6817", + "from": "git+https://github.com/mlaanderson/database-js-common.git" + }, + "database-js-sqlparser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/database-js-sqlparser/-/database-js-sqlparser-1.0.0.tgz", + "integrity": "sha512-3tRG4viUKviIQKB58KA4V8YTfBWzzVfZ3qJACXhQpi41m6Gitc8XoRbiGsVeQzdCfXsaeTobJUCzdjnf48xw7w==", + "requires": { + "node-sqlparser": "^1.0.4" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, "firebase": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-4.1.3.tgz", - "integrity": "sha1-5dcyc2bIVNwSRhYzuov+6i9cc1g=", - "requires": { - "dom-storage": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz", - "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", - "jsonwebtoken": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz", - "promise-polyfill": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", - "xmlhttprequest": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-6.4.0.tgz", + "integrity": "sha512-9ZzowmeBEGaHIiuJMVZL3oLkOvbNwRFAystAZi2ADqv0Kpo1cg3Anp5l1O+5ZILfG8a7/phr3nfsw/nGvf5gcQ==", + "requires": { + "@firebase/app": "0.4.14", + "@firebase/app-types": "0.4.3", + "@firebase/auth": "0.11.8", + "@firebase/database": "0.5.0", + "@firebase/firestore": "1.4.10", + "@firebase/functions": "0.4.15", + "@firebase/installations": "0.2.4", + "@firebase/messaging": "0.4.8", + "@firebase/performance": "0.2.15", + "@firebase/polyfill": "0.3.19", + "@firebase/storage": "0.3.9", + "@firebase/util": "0.2.25" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "grpc": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.22.2.tgz", + "integrity": "sha512-gaK59oAA5/mlOIn+hQO5JROPoAzsaGRpEMcrAayW5WGETS8QScpBoQ+XBxEWAAF0kbeGIELuGRCVEObKS1SLmw==", + "requires": { + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "node-pre-gyp": "^0.13.0", + "protobufjs": "^5.0.3" }, "dependencies": { - "base64url": { - "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", - "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true }, - "buffer-equal-constant-time": { - "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } }, - "dom-storage": { - "version": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz", - "integrity": "sha1-7RfL9oq9EOCu+BgnE+KXxeS1ALA=" + "balanced-match": { + "version": "1.0.0", + "bundled": true }, - "ecdsa-sig-formatter": { - "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", - "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "requires": { - "base64url": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", - "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true + }, + "fs-minipass": { + "version": "1.2.6", + "bundled": true, "requires": { - "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" + "minipass": "^2.2.1" } }, - "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } }, - "isemail": { - "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + "has-unicode": { + "version": "2.0.1", + "bundled": true }, - "joi": { - "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", + "iconv-lite": { + "version": "0.4.23", + "bundled": true, "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "isemail": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "moment": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "topo": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz" + "safer-buffer": ">= 2.1.2 < 3" } }, - "jsonwebtoken": { - "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz", - "integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=", + "ignore-walk": { + "version": "3.0.1", + "bundled": true, "requires": { - "joi": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "jws": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", - "lodash.once": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "minimatch": "^3.0.4" } }, - "jwa": { - "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", - "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "inflight": { + "version": "1.0.6", + "bundled": true, "requires": { - "base64url": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", - "buffer-equal-constant-time": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "ecdsa-sig-formatter": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz" + "once": "^1.3.0", + "wrappy": "1" } }, - "jws": { - "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", - "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, "requires": { - "base64url": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", - "jwa": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz" + "number-is-nan": "^1.0.0" } }, - "lodash.once": { - "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "isarray": { + "version": "1.0.0", + "bundled": true }, - "moment": { - "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "minimist": { + "version": "1.2.0", + "bundled": true }, - "promise-polyfill": { - "version": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", - "integrity": "sha1-2chtPcTcLfkBboiUbe/Wm0m0EWI=" + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "bundled": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true + } + } + }, + "node-pre-gyp": { + "version": "0.13.0", + "bundled": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } }, "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", - "integrity": "sha1-/kyEYDl/nqqqWOc75GJzQIpF4iM=" + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "sax": { + "version": "1.2.4", + "bundled": true + }, + "semver": { + "version": "5.7.0", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true }, - "topo": { - "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", - "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", + "signal-exit": { + "version": "3.0.1", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + "safe-buffer": "~5.1.0" } }, - "websocket-driver": { - "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "4.4.10", + "bundled": true, "requires": { - "websocket-extensions": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } }, - "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=" + "util-deprecate": { + "version": "1.0.2", + "bundled": true }, - "xmlhttprequest": { - "version": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true } } }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-sqlparser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-sqlparser/-/node-sqlparser-1.0.4.tgz", + "integrity": "sha512-aw3UIkk+4J6e55x7JH03ZbrYBsfyoMQaCHukfOXgSGqFgc0UG/zM7njxk3y1bc5DXmmtHXlm9yLCacc+qaMBmg==" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" + }, + "protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-sqlparser/-/node-sqlparser-1.0.2.tgz", - "integrity": "sha1-DrcMm1Sd5tPeFqWQStMSN/B/9VI=" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } } } } diff --git a/package.json b/package.json index ee3e450..6e4c4e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "database-js-firebase", - "version": "1.1.3", + "version": "1.2.1", "description": "Database-js interface for Firebase", "main": "index.js", "scripts": { @@ -21,8 +21,9 @@ }, "homepage": "https://github.com/mlaanderson/database-js-firebase#readme", "dependencies": { - "firebase": "^4.1.3", - "node-sqlparser": "^1.0.2" + "database-js-common": "git+https://github.com/mlaanderson/database-js-common.git", + "database-js-sqlparser": "^1.0.0", + "firebase": "^6.4.0" }, "devDependencies": { "database-js": "^3.0.2" diff --git a/test.js b/test.js index 34a3202..00f48c9 100644 --- a/test.js +++ b/test.js @@ -1,23 +1,18 @@ -var db = require('.'); +var driver = require('.'); +var Connection = require('database-js').Connection; -var connection = db.open({ - Parameters: "apiKey=AIzaSyD1ypTmnJb_d8ZOyfc-KBMe0tw8owYCwjA", - Hostname: 'statesdemo', - Database: 'ewJviY6wboTKJ57A2dZkvq8kxYo1', - Username: 'user@example.com', - Password: 'password' -}); - -function handleError(error) { - console.log("ERROR:", error); - process.exit(1); -} - -connection.query("SELECT * FROM states WHERE State = 'South Dakota'").then((data) => { - if (data.length != 1) { - handleError(new Error("Invalid data returned")); - } - connection.close().then(() => { +(async function() { + try { + let conn = new Connection('firebase://user@example.com:password@statesdemo/ewJviY6wboTKJ57A2dZkvq8kxYo1?apiKey=AIzaSyD1ypTmnJb_d8ZOyfc-KBMe0tw8owYCwjA', driver); + let stmt = conn.prepareStatement("SELECT abbr.Abbr, states.Ranking, states.Population FROM states INNER JOIN abbr ON states.State = abbr.State"); + let rows = await stmt.query(); + + console.log(rows); + + await conn.close(); process.exit(0); - }).catch(handleError); -}).catch(handleError); \ No newline at end of file + } catch (err) { + console.log(err); + process.exit(1); + } +})(); \ No newline at end of file