From e83c5fb7f461dc1cbfbaa76742dc67cfb1bb6520 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Wed, 18 Jul 2018 19:02:21 -0500 Subject: [PATCH 01/11] Functioning group by and join --- README.md | 8 +- index.js | 238 +++++++++++++++++++++++++++++++++------------- package-lock.json | 6 +- package.json | 2 +- test.js | 37 ++++--- 5 files changed, 194 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 9e1946b..562aa5a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # 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 @@ -8,11 +8,11 @@ Database-js-firebase is a [database-js](https://github.com/mlaanderson/database- 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..2d393ad 100644 --- a/index.js +++ b/index.js @@ -48,17 +48,18 @@ class Firebase { * @returns {boolean} if the row matches the where object * @memberof Firebase */ - doWhere(where, row) { + doWhere(where, row, namespace) { if (where === null) return true; - var self = this; + namespace = !!namespace; - function getVal(obj) { - if (obj.type === "column_ref") return row[obj.column]; - if (obj.type === "binary_expr") return self.doWhere(obj, row); + var getVal = (obj) => { + let field = namespace ? obj.table + "." + obj.column : obj.column; + if (obj.type === "column_ref") return row[field]; + if (obj.type === "binary_expr") return this.doWhere(obj, row); return obj.value; } - function replaceIfNotPrecededBy(notPrecededBy, replacement) { + var replaceIfNotPrecededBy = (notPrecededBy, replacement) => { return function(match) { return match.slice(0, notPrecededBy.length) === notPrecededBy ? match @@ -66,7 +67,7 @@ class Firebase { } } - function like2RegExp(like) { + var like2RegExp = (like) => { var restring = like; restring = restring.replace(/([\.\*\?\$\^])/g, "\\$1"); restring = restring.replace(/(?:\\)?%/g, replaceIfNotPrecededBy('\\', '.*?')); @@ -105,7 +106,6 @@ class Firebase { default: return false; } - break; default: return false; } @@ -121,41 +121,61 @@ class Firebase { * @returns * @memberof Firebase */ - chooseFields(sqlObj, data, row) { + chooseFields(sqlObj, data, row, namespace) { if (sqlObj.columns === "*") { data.push(row); return; } + namespace = !!namespace; + let isAggregate = sqlObj.columns.some((col) => { return col.expr.type === 'aggr_func'; }); if (isAggregate === true) { - if (data.length === 0) { - data.push({}); + + var groupby = () => { + if (sqlObj.groupby == null) { + if (data.length < 1) { + data.push({}); + } + return 0; + } + let result = data.findIndex(drow => { + return sqlObj.groupby.every(group => drow[group.column] == row[group.column]); + }); + + if (result <= 0) { + data.push({}); + return data.length - 1; + } + + return result; } + var index = groupby(); + 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]; + data[index][name] = row[col.expr.column]; break; - case 'aggr_func': // TODO implement group by + case 'aggr_func': 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; + if (data[index][name] === undefined) { + data[index][name] = 0; } - data[0][name] += row[col.expr.args.expr.column]; + data[index][name] += row[col.expr.args.expr.column]; break; case 'COUNT': - if (data[0][name] === undefined) { - data[0][name] = 0; + if (data[index][name] === undefined) { + data[index][name] = 0; } - data[0][name]++; + data[index][name]++; break; } break; @@ -164,13 +184,93 @@ class Firebase { } else { let result = {}; for (let col of sqlObj.columns) { - let name = col.as || col.expr.column; - result[name] = row[col.expr.column]; + let field = namespace ? col.expr.table + "." + col.expr.column : col.expr.column; + let name = col.as || field; + result[name] = row[field]; } data.push(result); } } + doSingleSelect(sqlobj, rows, namespace) { + let result = []; + namespace = !!namespace; + + // apply where and group by + rows = rows.filter(row => this.doWhere(sqlobj.where, row, namespace)); + + // apply order by + if (sqlobj.orderby) { + rows.sort((a, b) => { + for (let orderer of sqlobj.orderby) { + let column = namespace ? orderer.expr.table + "." + orderer.expr.column : orderer.expr.column; + 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[column]) { + return orderer.type == 'ASC' ? 1 : -1; + } + if (a[orderer.expr.column] < b[column]) { + return orderer.type == 'ASC' ? -1 : 1; + } + } + return 0; + }); + } + + // pick only the fields the query specifies + rows.map(row => this.chooseFields(sqlobj, result, row, namespace)); + + // apply limits + 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); + result = result.slice(offs, offs + len); + } + + return result; + } + + join(dest, src, query, includeAllDest, includeAllSrc, namespace = false) { + var rows = []; + + let destRows = dest.map(row => { + return { used: false, row: row }; + }); + + let srcRows = src.map(row => { + return { used: false, row: row }; + }); + + for (let destRow of destRows) { + + for (let srcRow of srcRows) { + var bigrow = {} + for (var k in destRow.row) { bigrow[k] = destRow.row[k]; } + for (var k in srcRow.row) { bigrow[k] = srcRow.row[k]; } + if (this.doWhere(query, bigrow, namespace)) { + rows.push(bigrow); + destRow.used = true; + srcRow.used = true; + } + } + } + + if (includeAllDest) { + destRows.filter(row => row.used == false).map(row => rows.push(row.row)); + } + if (includeAllSrc) { + srcRows.filter(row => row.used == false).map(row => rows.push(row.row)); + } + + return rows; + } + + /** * Performs an SQL SELECT. This is called from a Promise. * @@ -181,50 +281,61 @@ class Firebase { * @memberof Firebase */ 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"); - } + var promises = []; + var namespace = sqlObj.from.length > 1; - 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]); - } - } + for (var n = 0; n < sqlObj.from.length; n++) { + promises.push(this[m_root].child(sqlObj.from[n].table).once('value')); + } - 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"); + Promise.all(promises).then((snapshots) => { + // populate the table objects + var tables = snapshots.map((snapshot, n) => { + var result = { + from: sqlObj.from[n], + name: sqlObj.from[n].table, + rows: [] + }; + + var rows = Object.values(snapshot.val()); + if (namespace) { + result.rows = rows.map(row => { + var nsRow = {} + for (var key in row) { + nsRow[sqlObj.from[n].table + "." + key] = row[key]; } + return nsRow; + }); + } else { + result.rows = rows; + } - 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; - }); - } + return result; + }); - if (sqlObj.limit) { - if (sqlObj.limit.length !== 2) { - throw new Error("Invalid LIMIT expression: Use LIMIT [offset,] number"); + // perform joins + while (tables.length > 1) { + switch(tables[1].from.join) { + case 'INNER JOIN': + tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, false, false, namespace); + break; + case 'LEFT JOIN': + tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, true, false, namespace); + break; + case 'RIGHT JOIN': + tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, false, true, namespace); + break; + case 'FULL JOIN': + tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, true, true, namespace); + break; } - let offs = parseInt(sqlObj.limit[0].value); - let len = parseInt(sqlObj.limit[1].value); - rows = rows.slice(offs, offs + len); + tables.splice(1,1); } - resolve(rows); + + // the join is performed, do a single select on the resulting big table + let result = this.doSingleSelect(sqlObj, tables[0].rows, namespace); + + resolve(result); }); } @@ -330,16 +441,7 @@ class Firebase { 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); - } + reject(err); } switch(sqlObj.type) { diff --git a/package-lock.json b/package-lock.json index f284b2f..e968158 100644 --- a/package-lock.json +++ b/package-lock.json @@ -146,9 +146,9 @@ } }, "node-sqlparser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-sqlparser/-/node-sqlparser-1.0.2.tgz", - "integrity": "sha1-DrcMm1Sd5tPeFqWQStMSN/B/9VI=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-sqlparser/-/node-sqlparser-1.0.4.tgz", + "integrity": "sha512-aw3UIkk+4J6e55x7JH03ZbrYBsfyoMQaCHukfOXgSGqFgc0UG/zM7njxk3y1bc5DXmmtHXlm9yLCacc+qaMBmg==" } } } diff --git a/package.json b/package.json index ee3e450..67f6028 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "homepage": "https://github.com/mlaanderson/database-js-firebase#readme", "dependencies": { "firebase": "^4.1.3", - "node-sqlparser": "^1.0.2" + "node-sqlparser": "^1.0.4" }, "devDependencies": { "database-js": "^3.0.2" diff --git a/test.js b/test.js index 34a3202..9c01f35 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 SUM(State) FROM states"); + 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 From dc190713a11afb8b7d0d519a5ec6d3140e39a416 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Thu, 19 Jul 2018 13:18:02 -0500 Subject: [PATCH 02/11] Moved to working off the database-js-sqlparser library --- index.js | 468 +++++----------------------------------------- package-lock.json | 8 + package.json | 2 +- test.js | 2 +- 4 files changed, 52 insertions(+), 428 deletions(-) diff --git a/index.js b/index.js index 2d393ad..bf92571 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ +const AbstractDriver = require("database-js-sqlparser"); var firebase = require('firebase'); -var parse = require('node-sqlparser').parse; var m_root = Symbol('root'); var m_credentials = Symbol('credentials'); @@ -7,7 +7,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 +15,7 @@ class Firebase { * @memberof Firebase */ constructor(root, credentials) { - var self = this; + super(); var resolveAuth; this[m_root] = firebase.database().ref(root); @@ -39,454 +39,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, namespace) { - if (where === null) return true; - namespace = !!namespace; - - var getVal = (obj) => { - let field = namespace ? obj.table + "." + obj.column : obj.column; - if (obj.type === "column_ref") return row[field]; - if (obj.type === "binary_expr") return this.doWhere(obj, row); - return obj.value; - } - - var replaceIfNotPrecededBy = (notPrecededBy, replacement) => { - return function(match) { - return match.slice(0, notPrecededBy.length) === notPrecededBy - ? match - : replacement; - } - } - - var 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; - } - 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, namespace) { - if (sqlObj.columns === "*") { - data.push(row); - return; - } - - namespace = !!namespace; - - let isAggregate = sqlObj.columns.some((col) => { return col.expr.type === 'aggr_func'; }); - - if (isAggregate === true) { - - var groupby = () => { - if (sqlObj.groupby == null) { - if (data.length < 1) { - data.push({}); - } - return 0; - } - let result = data.findIndex(drow => { - return sqlObj.groupby.every(group => drow[group.column] == row[group.column]); - }); - - if (result <= 0) { - data.push({}); - return data.length - 1; - } - - return result; - } - - var index = groupby(); - - for (let col of sqlObj.columns) { - let name, data_row; - switch(col.expr.type) { - case 'column_ref': - name = col.as || col.expr.column; - data[index][name] = row[col.expr.column]; - break; - case 'aggr_func': - name = col.as || col.expr.name.toUpperCase() + "(" + col.expr.args.expr.column + ")"; - - switch(col.expr.name.toUpperCase()) { - case 'SUM': - if (data[index][name] === undefined) { - data[index][name] = 0; - } - data[index][name] += row[col.expr.args.expr.column]; - break; - case 'COUNT': - if (data[index][name] === undefined) { - data[index][name] = 0; - } - data[index][name]++; - break; - } - break; - } - } - } else { - let result = {}; - for (let col of sqlObj.columns) { - let field = namespace ? col.expr.table + "." + col.expr.column : col.expr.column; - let name = col.as || field; - result[name] = row[field]; - } - data.push(result); - } - } - - doSingleSelect(sqlobj, rows, namespace) { - let result = []; - namespace = !!namespace; - - // apply where and group by - rows = rows.filter(row => this.doWhere(sqlobj.where, row, namespace)); - - // apply order by - if (sqlobj.orderby) { - rows.sort((a, b) => { - for (let orderer of sqlobj.orderby) { - let column = namespace ? orderer.expr.table + "." + orderer.expr.column : orderer.expr.column; - 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[column]) { - return orderer.type == 'ASC' ? 1 : -1; - } - if (a[orderer.expr.column] < b[column]) { - return orderer.type == 'ASC' ? -1 : 1; - } - } - return 0; - }); - } - - // pick only the fields the query specifies - rows.map(row => this.chooseFields(sqlobj, result, row, namespace)); - - // apply limits - 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); - result = result.slice(offs, offs + len); - } - - return result; - } - - join(dest, src, query, includeAllDest, includeAllSrc, namespace = false) { - var rows = []; - - let destRows = dest.map(row => { - return { used: false, row: row }; - }); - - let srcRows = src.map(row => { - return { used: false, row: row }; - }); - - for (let destRow of destRows) { - - for (let srcRow of srcRows) { - var bigrow = {} - for (var k in destRow.row) { bigrow[k] = destRow.row[k]; } - for (var k in srcRow.row) { bigrow[k] = srcRow.row[k]; } - if (this.doWhere(query, bigrow, namespace)) { - rows.push(bigrow); - destRow.used = true; - srcRow.used = true; - } - } - } - - if (includeAllDest) { - destRows.filter(row => row.used == false).map(row => rows.push(row.row)); - } - if (includeAllSrc) { - srcRows.filter(row => row.used == false).map(row => rows.push(row.row)); - } - - return rows; - } - - - /** - * 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) { - var promises = []; - var namespace = sqlObj.from.length > 1; - - for (var n = 0; n < sqlObj.from.length; n++) { - promises.push(this[m_root].child(sqlObj.from[n].table).once('value')); - } - - Promise.all(promises).then((snapshots) => { - // populate the table objects - var tables = snapshots.map((snapshot, n) => { - var result = { - from: sqlObj.from[n], - name: sqlObj.from[n].table, - rows: [] - }; - - var rows = Object.values(snapshot.val()); - if (namespace) { - result.rows = rows.map(row => { - var nsRow = {} - for (var key in row) { - nsRow[sqlObj.from[n].table + "." + key] = row[key]; - } - return nsRow; - }); - } else { - result.rows = rows; - } - - return result; - }); - - // perform joins - while (tables.length > 1) { - switch(tables[1].from.join) { - case 'INNER JOIN': - tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, false, false, namespace); - break; - case 'LEFT JOIN': - tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, true, false, namespace); - break; - case 'RIGHT JOIN': - tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, false, true, namespace); - break; - case 'FULL JOIN': - tables[0].rows = this.join(tables[0].rows, tables[1].rows, tables[1].from.on, true, true, namespace); - break; - } - tables.splice(1,1); - } - - // the join is performed, do a single select on the resulting big table - let result = this.doSingleSelect(sqlObj, tables[0].rows, namespace); - - resolve(result); + 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) { - 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. * @@ -497,6 +109,10 @@ class Firebase { firebase.database().goOffline(); return Promise.resolve(true); } + + ready() { + return this[m_authenticator]; + } } module.exports = { diff --git a/package-lock.json b/package-lock.json index e968158..9d8efa8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,14 @@ "integrity": "sha512-YoCw6q95dwzbD/3PlZm6+CcxJY8QbEvbEt5bRCUVdskyT5j97Ofjt77in6GpCbxDUbKBZ7eGzlyJ7pLPH7raAg==", "dev": true }, + "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" + } + }, "firebase": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/firebase/-/firebase-4.1.3.tgz", diff --git a/package.json b/package.json index 67f6028..1996393 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "homepage": "https://github.com/mlaanderson/database-js-firebase#readme", "dependencies": { "firebase": "^4.1.3", - "node-sqlparser": "^1.0.4" + "database-js-sqlparser": "^1.0.0" }, "devDependencies": { "database-js": "^3.0.2" diff --git a/test.js b/test.js index 9c01f35..00f48c9 100644 --- a/test.js +++ b/test.js @@ -4,7 +4,7 @@ var Connection = require('database-js').Connection; (async function() { try { let conn = new Connection('firebase://user@example.com:password@statesdemo/ewJviY6wboTKJ57A2dZkvq8kxYo1?apiKey=AIzaSyD1ypTmnJb_d8ZOyfc-KBMe0tw8owYCwjA', driver); - let stmt = conn.prepareStatement("SELECT SUM(State) FROM states"); + 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); From 9979c8a05bac8f63fa6a86d42df48675b49b2194 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Thu, 19 Jul 2018 13:49:23 -0500 Subject: [PATCH 03/11] 1.2.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d8efa8..143cc0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "database-js-firebase", - "version": "1.1.3", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1996393..48d22c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "database-js-firebase", - "version": "1.1.3", + "version": "1.2.0", "description": "Database-js interface for Firebase", "main": "index.js", "scripts": { From 91a4379c069e6dcc19c3504780e09db90b0719d5 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Thu, 19 Jul 2018 13:58:06 -0500 Subject: [PATCH 04/11] Removing support for Node 6 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 42ea8dc..8a8fd31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js node_js: + - "9" - "8" - - "7" - - "6" \ No newline at end of file + - "7" \ No newline at end of file From 8f9fe696a0ec2ae5abb120bf257b3ab51119ea1a Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Fri, 21 Sep 2018 14:56:26 -0500 Subject: [PATCH 05/11] Added in Node 10 to CI --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8a8fd31..62809df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: node_js node_js: + - "10" - "9" - "8" - "7" \ No newline at end of file From 897330dd623661a07cc085154404a6f66571f2cc Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Fri, 21 Sep 2018 15:00:52 -0500 Subject: [PATCH 06/11] Upgraded firebase to fix vulnerabilities in sub packages --- package-lock.json | 974 +++++++++++++++++++++++++++++++++++++++++----- package.json | 5 +- 2 files changed, 885 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 143cc0e..ea284c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,159 +4,949 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@firebase/app": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.4.tgz", + "integrity": "sha512-Q6sNpWZ3x+FeuBkLCCRrsOraGJOKVLUCc9Amj8zu2vAC1v2uWifRR6kZ60TrpaIxtY4N6pcPTaG0YIUT5lgeSA==", + "requires": { + "@firebase/app-types": "0.3.2", + "@firebase/util": "0.2.2", + "dom-storage": "2.1.0", + "tslib": "1.9.0", + "xmlhttprequest": "1.8.0" + } + }, + "@firebase/app-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.2.tgz", + "integrity": "sha512-ZD8lTgW07NGgo75bTyBJA8Lt9+NweNzot7lrsBtIvfciwUzaFJLsv2EShqjBeuhF7RpG6YFucJ6m67w5buCtzw==" + }, + "@firebase/auth": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.7.6.tgz", + "integrity": "sha512-tiX0ZuxlpcE+QLR6dFcSB2lLj/iBFOCSmNKjQSUltWa55psGJX6w5wwXDo+NBA0UFbGMkaC504cUJ3IsAIVyfQ==", + "requires": { + "@firebase/auth-types": "0.3.4" + } + }, + "@firebase/auth-types": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.3.4.tgz", + "integrity": "sha512-0r3gSQk9jw5orFHCTUIgao0zan6dHt2J0BO3t/uEzbod+uwqvUn/gh+yg+kK6HX92Fg8E7y030KX4Bw/aXt0Ew==" + }, + "@firebase/database": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.6.tgz", + "integrity": "sha512-r02JOqTLcd2/qn7QkkJvIAxMiMxmeyd5B76kl9hHAs+3cil5mUzHnI3svtb4h0VIJYDHFKJMlVl/bE3GfcTR3A==", + "requires": { + "@firebase/database-types": "0.3.2", + "@firebase/logger": "0.1.1", + "@firebase/util": "0.2.2", + "faye-websocket": "0.11.1", + "tslib": "1.9.0" + } + }, + "@firebase/database-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.2.tgz", + "integrity": "sha512-9ZYdvYQ6r3aaHJarhUM5Hf6lQWu3ZJme+RR0o8qfBb9L04TL3uNjt+AJFku1ysVPntTn+9GqJjiIB2/OC3JtwA==" + }, + "@firebase/firestore": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.8.1.tgz", + "integrity": "sha512-cKs6J7citpK6xYJWGMoXIhBdu4PuTJHpH4z3UjIdz5RP24mrENoCojOdbzVENxSfSQhyX41Ddovykz5OnZXscA==", + "requires": { + "@firebase/firestore-types": "0.7.0", + "@firebase/logger": "0.1.1", + "@firebase/webchannel-wrapper": "0.2.9", + "grpc": "1.13.1", + "tslib": "1.9.0" + } + }, + "@firebase/firestore-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.7.0.tgz", + "integrity": "sha512-jyKRcKnSh3CSEPL4xGOZNoOXEiv7YmFK/JEcdd/4cAH17/Xo+Pk67gk1E648LRKh6QPghgNvzNTY5R10mKbQNw==" + }, + "@firebase/functions": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.3.1.tgz", + "integrity": "sha512-6A38x7zPU6zCTyOgGx2v+z4ugcsWnciL6YkcZXLNlCLveUmFdL0DmaW5MEBSpSOOe8kOJMl7f3aaD6lWUHNOBg==", + "requires": { + "@firebase/functions-types": "0.2.0", + "@firebase/messaging-types": "0.2.3", + "isomorphic-fetch": "2.2.1", + "tslib": "1.9.0" + } + }, + "@firebase/functions-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.2.0.tgz", + "integrity": "sha512-q1FB3YKEAnWd+FpIL5Xn0B1BXO2IowrAdrSViXkFxNZVpp9iCzQ8Ytcbr3V1xUr3dnmoW/V7zkZJZGuwBgiVhw==" + }, + "@firebase/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-5jn3HHbEfdOwychyIEIkP1cik+MW/vvoOavTOzwDkH+fv6Bx+HBUOzh09M7sCYzXFtKzjbUax9+g39mJNBLklQ==" + }, + "@firebase/messaging": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.3.6.tgz", + "integrity": "sha512-Sz/fWOXMa3HxDZxE64Fm335kwP9um1rmun5PIka7od7I4hZ8US+SjYVyUe6jWTh1V/YjcqDi6Xkhoj2nF8yu9g==", + "requires": { + "@firebase/messaging-types": "0.2.3", + "@firebase/util": "0.2.2", + "tslib": "1.9.0" + } + }, + "@firebase/messaging-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.2.3.tgz", + "integrity": "sha512-avwCgZzcx2uxIW/wT3p3G/EyHftIrvMyiTS7AA7dxDlzfx+8dpAeTsb1+jsHJT4F6foSh5HG17Nw8sDzYuxH1Q==" + }, + "@firebase/polyfill": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.3.tgz", + "integrity": "sha512-xs8IZf1WEbufYXyfV8YjmiFZOaujRRq0T03NteihYfuGVTTym7z5SmvLvEHLEUjf2fgeobPEzZ2JgrCQHS+QHw==", + "requires": { + "core-js": "2.5.5", + "promise-polyfill": "7.1.2", + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, + "@firebase/storage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.2.3.tgz", + "integrity": "sha512-2sq5jckWszW53gfQMkPNc7EumJ92oErRhzGJANbVzBumwR8qwKZU8/I+/uV9SPK1tVmSUc3S21jdoW5oOJVEuA==", + "requires": { + "@firebase/storage-types": "0.2.3", + "tslib": "1.9.0" + } + }, + "@firebase/storage-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.2.3.tgz", + "integrity": "sha512-RaZeam2LgsB7xwAtOQr4G0Geoyf7D5TnLF3a12By6Rh0Z9PqBSlWn0SVYGW3SkmxIdqvWZMZvCyamUlqQvQzWw==" + }, + "@firebase/util": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.2.tgz", + "integrity": "sha512-vfRjmCWuxtJx3txHocaNlDwCDwwv6KLL5YtlSNi73wBdvF3UfnpLGrth7G3X6gn5rDhOKamRg2+9L8cfsjSS1A==", + "requires": { + "tslib": "1.9.0" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.9.tgz", + "integrity": "sha512-Hx30hgRw078+39G6GqHuBaW7xCQQjGx7gALtCeKR0fklDzpRazqudjLKV8Rh5LbcdczrgpsOmLuZQAlqbCBaFw==" + }, + "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" + } + }, + "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": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, "database-js": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/database-js/-/database-js-3.0.2.tgz", "integrity": "sha512-YoCw6q95dwzbD/3PlZm6+CcxJY8QbEvbEt5bRCUVdskyT5j97Ofjt77in6GpCbxDUbKBZ7eGzlyJ7pLPH7raAg==", "dev": true }, + "database-js-common": { + "version": "git+https://github.com/mlaanderson/database-js-common.git#db3f163dcb1ba62f53a569914d0b2ba1da589710", + "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" + "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.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "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": "5.5.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-5.5.1.tgz", + "integrity": "sha512-2n8/7+qCcXpEC/4fNB2qWgX0yQx7U2EUoyh6YxgctSyd5gyqtpbjcTMqrCnjMHA514eduVZmjoI+C8GeKXZEUw==", + "requires": { + "@firebase/app": "0.3.4", + "@firebase/auth": "0.7.6", + "@firebase/database": "0.3.6", + "@firebase/firestore": "0.8.1", + "@firebase/functions": "0.3.1", + "@firebase/messaging": "0.3.6", + "@firebase/polyfill": "0.3.3", + "@firebase/storage": "0.2.3" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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.13.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.13.1.tgz", + "integrity": "sha512-yl0xChnlUISTefOPU2NQ1cYPh5m/DTatEUV6jdRyQPE9NCrtPq7Gn6J2alMTglN7ufYbJapOd00dvhGurHH6HQ==", + "requires": { + "lodash": "^4.17.5", + "nan": "^2.0.0", + "node-pre-gyp": "^0.10.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 }, - "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=" + "ansi-regex": { + "version": "2.1.1", + "bundled": true }, - "dom-storage": { - "version": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz", - "integrity": "sha1-7RfL9oq9EOCu+BgnE+KXxeS1ALA=" + "aproba": { + "version": "1.2.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=", + "are-we-there-yet": { + "version": "1.1.5", + "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" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", - "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "requires": { - "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true }, - "isemail": { - "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + "console-control-strings": { + "version": "1.1.0", + "bundled": true }, - "joi": { - "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "debug": { + "version": "2.6.9", + "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" + "ms": "2.0.0" } }, - "jsonwebtoken": { - "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz", - "integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=", + "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.5", + "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" + "minipass": "^2.2.1" } }, - "jwa": { - "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", - "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "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" + "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" } }, - "jws": { - "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", - "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "glob": { + "version": "7.1.2", + "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" + "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" } }, - "lodash.once": { - "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "has-unicode": { + "version": "2.0.1", + "bundled": true }, - "moment": { - "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "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 + } + } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0", + "bundled": true + }, + "needle": { + "version": "2.2.1", + "bundled": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } }, - "promise-polyfill": { - "version": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", - "integrity": "sha1-2chtPcTcLfkBboiUbe/Wm0m0EWI=" + "node-pre-gyp": { + "version": "0.10.3", + "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.3", + "bundled": true + }, + "npm-packlist": { + "version": "1.1.11", + "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.0", + "bundled": true + }, + "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.2", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } }, "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.5.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.2", + "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": { - "websocket-extensions": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz" + "ansi-regex": "^2.0.0" } }, - "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=" + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "4.4.4", + "bundled": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.3", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } }, - "xmlhttprequest": { - "version": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "util-deprecate": { + "version": "1.0.2", + "bundled": true }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true } } }, + "http-parser-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" + }, + "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" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "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": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==" + }, + "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": "http://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": "7.1.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", + "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" + }, + "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" + } + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "requires": { + "http-parser-js": ">=0.4.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": "http://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/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": "http://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 48d22c3..dcaee0f 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,9 @@ }, "homepage": "https://github.com/mlaanderson/database-js-firebase#readme", "dependencies": { - "firebase": "^4.1.3", - "database-js-sqlparser": "^1.0.0" + "database-js-common": "git+https://github.com/mlaanderson/database-js-common.git", + "database-js-sqlparser": "^1.0.0", + "firebase": "^5.5.1" }, "devDependencies": { "database-js": "^3.0.2" From b93ec8529379420aa87804a56e3d5a17043d8328 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Fri, 21 Sep 2018 15:03:17 -0500 Subject: [PATCH 07/11] Moved to using database-js-common for connection params --- index.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index bf92571..f5a42e7 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,5 @@ const AbstractDriver = require("database-js-sqlparser"); +const Common = require('database-js-common'); var firebase = require('firebase'); var m_root = Symbol('root'); @@ -122,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 || "", From e9fc1ca34e17f7c60ef2b32fd22f3f758aef3ad7 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Fri, 21 Sep 2018 15:04:47 -0500 Subject: [PATCH 08/11] 1.2.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea284c2..5a9113b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "database-js-firebase", - "version": "1.2.0", + "version": "1.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index dcaee0f..556d21f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "database-js-firebase", - "version": "1.2.0", + "version": "1.2.1", "description": "Database-js interface for Firebase", "main": "index.js", "scripts": { From 3dcc082b09990f2d25abb80fa3625167321f279b Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Fri, 21 Sep 2018 15:09:01 -0500 Subject: [PATCH 09/11] Added link to firebase library --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 562aa5a..00504c3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 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. From 0b6f6fa7052766d9f9cb3f1f4fed0c2c100a1405 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Mon, 19 Aug 2019 09:07:20 -0500 Subject: [PATCH 10/11] Upgraded to firebase@6.40 --- package-lock.json | 540 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 352 insertions(+), 190 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a9113b..b334dd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,148 +5,258 @@ "requires": true, "dependencies": { "@firebase/app": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.4.tgz", - "integrity": "sha512-Q6sNpWZ3x+FeuBkLCCRrsOraGJOKVLUCc9Amj8zu2vAC1v2uWifRR6kZ60TrpaIxtY4N6pcPTaG0YIUT5lgeSA==", + "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.3.2", - "@firebase/util": "0.2.2", + "@firebase/app-types": "0.4.3", + "@firebase/logger": "0.1.22", + "@firebase/util": "0.2.25", "dom-storage": "2.1.0", - "tslib": "1.9.0", + "tslib": "1.10.0", "xmlhttprequest": "1.8.0" } }, "@firebase/app-types": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.2.tgz", - "integrity": "sha512-ZD8lTgW07NGgo75bTyBJA8Lt9+NweNzot7lrsBtIvfciwUzaFJLsv2EShqjBeuhF7RpG6YFucJ6m67w5buCtzw==" + "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.7.6", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.7.6.tgz", - "integrity": "sha512-tiX0ZuxlpcE+QLR6dFcSB2lLj/iBFOCSmNKjQSUltWa55psGJX6w5wwXDo+NBA0UFbGMkaC504cUJ3IsAIVyfQ==", + "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.3.4" + "@firebase/auth-types": "0.7.2" } }, "@firebase/auth-types": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.3.4.tgz", - "integrity": "sha512-0r3gSQk9jw5orFHCTUIgao0zan6dHt2J0BO3t/uEzbod+uwqvUn/gh+yg+kK6HX92Fg8E7y030KX4Bw/aXt0Ew==" + "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.3.6", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.6.tgz", - "integrity": "sha512-r02JOqTLcd2/qn7QkkJvIAxMiMxmeyd5B76kl9hHAs+3cil5mUzHnI3svtb4h0VIJYDHFKJMlVl/bE3GfcTR3A==", + "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.3.2", - "@firebase/logger": "0.1.1", - "@firebase/util": "0.2.2", - "faye-websocket": "0.11.1", - "tslib": "1.9.0" + "@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.3.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.2.tgz", - "integrity": "sha512-9ZYdvYQ6r3aaHJarhUM5Hf6lQWu3ZJme+RR0o8qfBb9L04TL3uNjt+AJFku1ysVPntTn+9GqJjiIB2/OC3JtwA==" + "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": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.8.1.tgz", - "integrity": "sha512-cKs6J7citpK6xYJWGMoXIhBdu4PuTJHpH4z3UjIdz5RP24mrENoCojOdbzVENxSfSQhyX41Ddovykz5OnZXscA==", + "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": "0.7.0", - "@firebase/logger": "0.1.1", - "@firebase/webchannel-wrapper": "0.2.9", - "grpc": "1.13.1", - "tslib": "1.9.0" + "@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": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.7.0.tgz", - "integrity": "sha512-jyKRcKnSh3CSEPL4xGOZNoOXEiv7YmFK/JEcdd/4cAH17/Xo+Pk67gk1E648LRKh6QPghgNvzNTY5R10mKbQNw==" + "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.3.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.3.1.tgz", - "integrity": "sha512-6A38x7zPU6zCTyOgGx2v+z4ugcsWnciL6YkcZXLNlCLveUmFdL0DmaW5MEBSpSOOe8kOJMl7f3aaD6lWUHNOBg==", + "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.2.0", - "@firebase/messaging-types": "0.2.3", + "@firebase/functions-types": "0.3.8", + "@firebase/messaging-types": "0.3.2", "isomorphic-fetch": "2.2.1", - "tslib": "1.9.0" + "tslib": "1.10.0" } }, "@firebase/functions-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.2.0.tgz", - "integrity": "sha512-q1FB3YKEAnWd+FpIL5Xn0B1BXO2IowrAdrSViXkFxNZVpp9iCzQ8Ytcbr3V1xUr3dnmoW/V7zkZJZGuwBgiVhw==" + "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.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-5jn3HHbEfdOwychyIEIkP1cik+MW/vvoOavTOzwDkH+fv6Bx+HBUOzh09M7sCYzXFtKzjbUax9+g39mJNBLklQ==" + "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.3.6", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.3.6.tgz", - "integrity": "sha512-Sz/fWOXMa3HxDZxE64Fm335kwP9um1rmun5PIka7od7I4hZ8US+SjYVyUe6jWTh1V/YjcqDi6Xkhoj2nF8yu9g==", + "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.2.3", - "@firebase/util": "0.2.2", - "tslib": "1.9.0" + "@firebase/messaging-types": "0.3.2", + "@firebase/util": "0.2.25", + "tslib": "1.10.0" } }, "@firebase/messaging-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.2.3.tgz", - "integrity": "sha512-avwCgZzcx2uxIW/wT3p3G/EyHftIrvMyiTS7AA7dxDlzfx+8dpAeTsb1+jsHJT4F6foSh5HG17Nw8sDzYuxH1Q==" + "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.3", - "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.3.tgz", - "integrity": "sha512-xs8IZf1WEbufYXyfV8YjmiFZOaujRRq0T03NteihYfuGVTTym7z5SmvLvEHLEUjf2fgeobPEzZ2JgrCQHS+QHw==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.19.tgz", + "integrity": "sha512-70gNPxxHCaSKcNw1g9XfBe15LWrvzvgzUGBVgAdv7zkpgtHMu/uEuklb+A0H1GJtNn6ijyHEAJGXR3KHJ92HEg==", "requires": { - "core-js": "2.5.5", - "promise-polyfill": "7.1.2", + "core-js": "3.1.4", + "promise-polyfill": "8.1.3", "whatwg-fetch": "2.0.4" }, "dependencies": { "whatwg-fetch": { "version": "2.0.4", - "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" } } }, "@firebase/storage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.2.3.tgz", - "integrity": "sha512-2sq5jckWszW53gfQMkPNc7EumJ92oErRhzGJANbVzBumwR8qwKZU8/I+/uV9SPK1tVmSUc3S21jdoW5oOJVEuA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.9.tgz", + "integrity": "sha512-Fxku8HVilac2zx1hnxshcnh4WhbY5DWT10dQwrFYNUFW1RuRfTB0zm3SNOVy4NAt7xpVIjqSjFs8mWDXGe7qaQ==", "requires": { - "@firebase/storage-types": "0.2.3", - "tslib": "1.9.0" + "@firebase/storage-types": "0.3.3", + "@firebase/util": "0.2.25", + "tslib": "1.10.0" } }, "@firebase/storage-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.2.3.tgz", - "integrity": "sha512-RaZeam2LgsB7xwAtOQr4G0Geoyf7D5TnLF3a12By6Rh0Z9PqBSlWn0SVYGW3SkmxIdqvWZMZvCyamUlqQvQzWw==" + "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.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.2.tgz", - "integrity": "sha512-vfRjmCWuxtJx3txHocaNlDwCDwwv6KLL5YtlSNi73wBdvF3UfnpLGrth7G3X6gn5rDhOKamRg2+9L8cfsjSS1A==", + "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.9.0" + "tslib": "1.10.0" } }, "@firebase/webchannel-wrapper": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.9.tgz", - "integrity": "sha512-Hx30hgRw078+39G6GqHuBaW7xCQQjGx7gALtCeKR0fklDzpRazqudjLKV8Rh5LbcdczrgpsOmLuZQAlqbCBaFw==" + "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", @@ -182,6 +292,13 @@ "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": { @@ -215,18 +332,18 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + "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#db3f163dcb1ba62f53a569914d0b2ba1da589710", + "version": "git+https://github.com/mlaanderson/database-js-common.git#e4e114208175abbe286f8e27f321e6e8521b6817", "from": "git+https://github.com/mlaanderson/database-js-common.git" }, "database-js-sqlparser": { @@ -256,26 +373,30 @@ } }, "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "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": "5.5.1", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-5.5.1.tgz", - "integrity": "sha512-2n8/7+qCcXpEC/4fNB2qWgX0yQx7U2EUoyh6YxgctSyd5gyqtpbjcTMqrCnjMHA514eduVZmjoI+C8GeKXZEUw==", + "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.3.4", - "@firebase/auth": "0.7.6", - "@firebase/database": "0.3.6", - "@firebase/firestore": "0.8.1", - "@firebase/functions": "0.3.1", - "@firebase/messaging": "0.3.6", - "@firebase/polyfill": "0.3.3", - "@firebase/storage": "0.2.3" + "@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": { @@ -284,9 +405,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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", @@ -297,13 +418,14 @@ } }, "grpc": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.13.1.tgz", - "integrity": "sha512-yl0xChnlUISTefOPU2NQ1cYPh5m/DTatEUV6jdRyQPE9NCrtPq7Gn6J2alMTglN7ufYbJapOd00dvhGurHH6HQ==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.22.2.tgz", + "integrity": "sha512-gaK59oAA5/mlOIn+hQO5JROPoAzsaGRpEMcrAayW5WGETS8QScpBoQ+XBxEWAAF0kbeGIELuGRCVEObKS1SLmw==", "requires": { - "lodash": "^4.17.5", - "nan": "^2.0.0", - "node-pre-gyp": "^0.10.0", + "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": { @@ -340,7 +462,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true }, "code-point-at": { @@ -359,13 +481,6 @@ "version": "1.0.2", "bundled": true }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - } - }, "deep-extend": { "version": "0.6.0", "bundled": true @@ -379,7 +494,7 @@ "bundled": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.6", "bundled": true, "requires": { "minipass": "^2.2.1" @@ -403,18 +518,6 @@ "wide-align": "^1.1.0" } }, - "glob": { - "version": "7.1.2", - "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" - } - }, "has-unicode": { "version": "2.0.1", "bundled": true @@ -472,7 +575,7 @@ "bundled": true }, "minipass": { - "version": "2.3.3", + "version": "2.3.5", "bundled": true, "requires": { "safe-buffer": "^5.1.2", @@ -480,7 +583,7 @@ } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "requires": { "minipass": "^2.2.1" @@ -499,21 +602,30 @@ } } }, - "ms": { - "version": "2.0.0", - "bundled": true - }, "needle": { - "version": "2.2.1", + "version": "2.4.0", "bundled": true, "requires": { - "debug": "^2.1.2", + "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.10.3", + "version": "0.13.0", "bundled": true, "requires": { "detect-libc": "^1.0.2", @@ -537,11 +649,11 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true }, "npm-packlist": { - "version": "1.1.11", + "version": "1.4.1", "bundled": true, "requires": { "ignore-walk": "^3.0.1", @@ -594,9 +706,20 @@ "bundled": true }, "process-nextick-args": { - "version": "2.0.0", + "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, @@ -621,10 +744,24 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "requires": { - "glob": "^7.0.5" + "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": { @@ -640,7 +777,7 @@ "bundled": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true }, "set-blocking": { @@ -648,7 +785,7 @@ "bundled": true }, "signal-exit": { - "version": "3.0.2", + "version": "3.0.1", "bundled": true }, "string-width": { @@ -679,16 +816,16 @@ "bundled": true }, "tar": { - "version": "4.4.4", + "version": "4.4.10", "bundled": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "util-deprecate": { @@ -707,15 +844,15 @@ "bundled": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true } } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" + "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", @@ -725,6 +862,11 @@ "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", @@ -735,9 +877,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "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", @@ -774,15 +916,20 @@ "invert-kv": "^1.0.0" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "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": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + "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", @@ -793,9 +940,9 @@ } }, "nan": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", - "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==" + "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", @@ -831,7 +978,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { "lcid": "^1.0.0" @@ -843,21 +990,35 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "promise-polyfill": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", - "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" + "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": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" + "@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", @@ -882,16 +1043,17 @@ } }, "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + "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.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "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", + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -912,7 +1074,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -936,7 +1098,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { "camelcase": "^2.0.1", diff --git a/package.json b/package.json index 556d21f..6e4c4e2 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "database-js-common": "git+https://github.com/mlaanderson/database-js-common.git", "database-js-sqlparser": "^1.0.0", - "firebase": "^5.5.1" + "firebase": "^6.4.0" }, "devDependencies": { "database-js": "^3.0.2" From 4c9cbdbefe44f57c992f0e5ba6a97c32bd477cf5 Mon Sep 17 00:00:00 2001 From: Michael Anderson Date: Mon, 19 Aug 2019 09:11:12 -0500 Subject: [PATCH 11/11] Adding node 11 and 12 to CI --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 62809df..662e61d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: node_js node_js: + - "12" + - "11" - "10" - "9" - "8"