From c4bb1ab7f2379d3738efb23692a50c5b686e51f2 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 13:19:45 -0500 Subject: [PATCH 01/10] some more changes for ts --- lib/knex/db.ts | 195 +++-------------------------- lib/knex/mongoQuery/MongoQuery.ts | 199 ++++++++++++++++++++++++++++++ lib/knex/synchronize/Indexes.ts | 53 ++++++++ 3 files changed, 268 insertions(+), 179 deletions(-) create mode 100644 lib/knex/mongoQuery/MongoQuery.ts create mode 100644 lib/knex/synchronize/Indexes.ts diff --git a/lib/knex/db.ts b/lib/knex/db.ts index fabb4f6..e512a5b 100644 --- a/lib/knex/db.ts +++ b/lib/knex/db.ts @@ -1,6 +1,7 @@ import {DeleteQueries, PersistorTransaction} from '../types'; import {LoggerHelpers} from '../LoggerHelpers'; import {Transaction} from './commit/Transaction'; +import {MongoQuery} from './mongoQuery/MongoQuery'; module.exports = function (PersistObjectTemplate) { @@ -40,7 +41,7 @@ module.exports = function (PersistObjectTemplate) { if (typeof(queryOrChains) == 'function') queryOrChains(select); else if (queryOrChains) - select = this.convertMongoQueryToChains(tableName, select, queryOrChains); + select = MongoQuery.convertMongoQueryToChains(tableName, select, queryOrChains); // Convert mongo style sort if (options && options.sort) { @@ -169,7 +170,7 @@ module.exports = function (PersistObjectTemplate) { if (typeof(queryOrChains) == 'function') queryOrChains(knex); else if (queryOrChains) - (this.convertMongoQueryToChains)(tableName, knex, queryOrChains); + MongoQuery.convertMongoQueryToChains(tableName, knex, queryOrChains); return knex.count('_id').then(function (ret) { return ret[0].count * 1; @@ -637,7 +638,8 @@ module.exports = function (PersistObjectTemplate) { return (_dbschema, tableName); } - return knex.schema.hasTable(schemaTable).then(function(exists) { + return knex.schema.hasTable(schemaTable) + .then(function(exists) { if (!exists) { return knex.schema.createTable(schemaTable, function(table) { table.increments('sequence_id').primary(); @@ -813,17 +815,17 @@ module.exports = function (PersistObjectTemplate) { }) }; - return Promise.resolve() - .then(loadSchema.bind(this, tableName)) - .spread(loadTableDef) - .spread(diffTable) - .then(generateChanges.bind(this, template)) - .then(mergeChanges) - .then(applyTableChanges) - .then(makeSchemaUpdates) - .catch(function(e) { - throw e; - }) + return Promise.resolve() + .then(loadSchema.bind(this, tableName)) + .spread(loadTableDef) + .spread(diffTable) + .then(generateChanges.bind(this, template)) + .then(mergeChanges) + .then(applyTableChanges) + .then(makeSchemaUpdates) + .catch(function(e) { + throw e; + }) } @@ -960,171 +962,6 @@ module.exports = function (PersistObjectTemplate) { return knex.schema.dropTableIfExists(tableName); }; - /** - * Take a query object like {$or: [{type: 'foo'}, {x: {$gt: 4}, y: {$lte: 6}}]} - * which could also be expressed as: {$or: [{type: 'foo'}, {$and: [{x: {$gt: 4}}, {y: {$lte: 6}}]}]} - * and append to a knex statement like knex('table').select('*') these chains ... - * .where('type', '=', 'foo').orWhere(function () { - * this.where(x, '>', 4).andWhere(y, '<=', 6) - * }); - * - * {$or: [{type: 'foo', subtype: 'bar'}, {$or:[{x: {$gt: 4}}, {x: 9}], y: {$lte: 6}}]} - * .where('type', '=', 'foo').orWhere(function () { - * this.where(function () { - * this.where(x, '>', 4).orWhere(x, '=' 9) - * }).andWhere(y, '<=', 6) - * }); * - * @param {string} alias db alias name used when setting the database client object - * @param {string} statement knex query - * @param {object} query mongo style query object - * @returns {*} - */ - PersistObjectTemplate.convertMongoQueryToChains = function (alias, statement, query) { - - /** - * Traverse an object and produce a promise chain of where and andWhere - * @param {object} statement knex query - * @param {object} query mongo style query object - * @returns {*} - */ - function traverse(statement, query) { - var firstProp = true; - for (var prop in query) { - var params = processProp(statement, prop, query[prop]); - statement = firstProp ? - (params.length > 1 ? statement.where(params[0], params[1], params[2]) : - statement.where(params[0])) : - (params.length > 1 ? statement.andWhere(params[0], params[1], params[2]) : - statement.andWhere(params[0])); - firstProp = false; - } - return statement; - } - - function processProp(_statement, prop, value) { - if (value instanceof Array) - return processArrayProp(prop, value); - else - return processNonArrayProp(prop, value) - } - - function processArrayProp(prop, value) { - return [function () { - var firstProp; - var statement = this; - if (prop.toLowerCase() == '$and') { - firstProp = true; - _.each(value, function (obj) { - var params = processObject(statement, obj); - statement = firstProp ? - (params.length > 1 ? statement.where(params[0], params[1], params[2]) : - statement.where(params[0])) : - (params.length > 1 ? statement.andWhere(params[0], params[1], params[2]) : - statement.andWhere(params[0])); - firstProp = false; - }); - } else if (prop.toLowerCase() == '$or') { - firstProp = true; - _.each(value, function (obj) { - var params = processObject(statement, obj); - statement = firstProp ? - (params.length > 1 ? statement.where(params[0], params[1], params[2]) : - statement.where(params[0])) : - (params.length > 1 ? statement.orWhere(params[0], params[1], params[2]) : - statement.andWhere(params[0])); - firstProp = false - }); - } else if (prop.toLowerCase() == '$in') - statement = statement.whereIn(value); - else if (prop.toLowerCase() == '$nin') - statement = statement.whereNotIn(value); - else - throw 'Don\'t support ' + prop + ':' + JSON.stringify(value) - }]; - } - - /** - * Process an array element of a $or or $and. This will result in either three parameters in - * the form of prop, compare operator, value or a single parameter which is a function that - * will chain together a nested expression. - * @param {object} statement knex query object - * @param {object} obj object of supertype - * @returns {Function} - */ - function processObject(statement, obj) { - var propCount = 0; - var singleProp; - - // Do we have more than one prop - for (var prop in obj) { - singleProp = prop; - ++propCount; - } - - // If so fetch the 3 parameters for a where, orWhere or andWhere chain - // Otherwise return a function that will chain sub-ordinate clauses - if (propCount == 1) - return processProp(statement, singleProp, obj[singleProp]); - else - return [function () { - traverse(statement, obj) - }] - } - - function processNonArrayProp(prop, value) { - var params = []; - if (value instanceof Date || typeof(value) == 'string' || typeof(value) == 'number') { - params[0] = alias + '.' + prop; - params[1] = '='; - params[2] = value; - } else - for (var subProp in value) { - params[0] = alias + '.' + prop; - params[2] = value[subProp]; - if (subProp.toLowerCase() == '$eq') - params[1] = '='; - else if (subProp.toLowerCase() == '$gt') - params[1] = '>'; - else if (subProp.toLowerCase() == '$gte') - params[1] = '>='; - else if (subProp.toLowerCase() == '$lt') - params[1] = '<'; - else if (subProp.toLowerCase() == '$lte') - params[1] = '<='; - else if (subProp.toLowerCase() == '$ne') - params[1] = '!='; - else if (subProp.toLowerCase() == '$in') { - (function () { - var attr = params[0]; - var values = params[2]; - params = [function () { - this.whereIn(attr, values) - }]; - })() - } - else if (subProp.toLowerCase() == '$nin') - (function () { - var attr = params[0]; - var values = params[2]; - params = [function () { - this.whereNotIn(attr, values) - }]; - })() - else if (subProp.toLowerCase() == '$regex') { - params[1] = value.$options && value.$options.match(/i/) ? '~*' : '~'; - delete value['$options'] - if (params[2] && params[2].source) - params[2] = params[2].source; - } else - throw 'Can\'t handle ' + prop + ':' + JSON.stringify((value)); - } - return params; - } - - return traverse(statement, query) - }; - - // Start the knex transaction // We generate SQLs to save and to Delete and touches // Each save / delete is done in 2 stages diff --git a/lib/knex/mongoQuery/MongoQuery.ts b/lib/knex/mongoQuery/MongoQuery.ts new file mode 100644 index 0000000..553a8df --- /dev/null +++ b/lib/knex/mongoQuery/MongoQuery.ts @@ -0,0 +1,199 @@ +import {QueryBuilder} from 'knex'; +import * as _ from 'underscore'; + +/** + * Take a query object like {$or: [{type: 'foo'}, {x: {$gt: 4}, y: {$lte: 6}}]} + * which could also be expressed as: {$or: [{type: 'foo'}, {$and: [{x: {$gt: 4}}, {y: {$lte: 6}}]}]} + * and append to a knex statement like knex('table').select('*') these chains ... + * .where('type', '=', 'foo').orWhere(function () { + * this.where(x, '>', 4).andWhere(y, '<=', 6) + * }); + * + * {$or: [{type: 'foo', subtype: 'bar'}, {$or:[{x: {$gt: 4}}, {x: 9}], y: {$lte: 6}}]} + * .where('type', '=', 'foo').orWhere(function () { + * this.where(function () { + * this.where(x, '>', 4).orWhere(x, '=' 9) + * }).andWhere(y, '<=', 6) + * }); * + * @param {string} alias db alias name used when setting the database client object + * @param {string} statement knex query + * @param {object} query mongo style query object + * @returns {*} + */ +export namespace MongoQuery { + + export function convertMongoQueryToChains (alias: string, statement: QueryBuilder, query): QueryBuilder { + return traverse(statement, query, alias) + } + + /** + * Traverse an object and produce a promise chain of where and andWhere + * @param {object} statement knex query + * @param {object} query mongo style query object + * @param alias + * @returns {*} + */ + function traverse(statement: QueryBuilder, query, alias: string) { + var firstProp = true; + for (var prop in query) { + var params = processProp(statement, prop, query[prop], alias); + + if (firstProp) { + if (params.length > 1) { + statement = statement.where(params[0], params[1], params[2]); + } + else { + statement = statement.where(params[0]); + } + } + else { + if (params.length > 1) { + statement = statement.andWhere(params[0], params[1], params[2]); + } + else { + statement = statement.andWhere(params[0]); + } + } + + firstProp = false; + } + return statement; + } + + function processProp(statement: QueryBuilder, prop, value, alias: string) { + if (value instanceof Array) + return processArrayProp(prop, value, alias); + else + return processNonArrayProp(prop, value, alias) + } + + function processArrayProp(prop, value, alias: string) { + return [innerFunc(prop, value, alias)]; + } + + function innerFunc(prop: string, value: any, alias: string) { + return function boundInnerFunc () { + var firstProp; + var statement = this; + + if (prop.toLowerCase() == '$and') { + firstProp = true; + _.each(value, function (obj) { + var params = processObject(statement, obj, alias); + statement = andOrStatementBuilder(statement, params, firstProp, 'and'); + firstProp = false; + }); + } else if (prop.toLowerCase() == '$or') { + firstProp = true; + _.each(value, function (obj) { + var params = processObject(statement, obj, alias); + statement = andOrStatementBuilder(statement, params, firstProp, 'or'); + firstProp = false + }); + } else if (prop.toLowerCase() == '$in') + statement = statement.whereIn(value); + else if (prop.toLowerCase() == '$nin') + statement = statement.whereNotIn(value); + else + throw `Don't support ${prop}:${JSON.stringify(value)}`; + } + } + + function andOrStatementBuilder(statement: QueryBuilder, params: any, firstProp: boolean, andOrOr: 'and' | 'or') { + if (firstProp) { + if (params.length > 1) { + return statement.where(params[0], params[1], params[2]); + } + else { + return statement.where(params[0]); + } + } else { + if (params.length > 1) { + if (andOrOr === 'or') { + return statement.orWhere(params[0], params[1], params[2]); + } + else { + return statement.andWhere(params[0], params[1], params[2]); + } + } + else { + return statement.andWhere(params[0]); + } + } + } + + /** + * Process an array element of a $or or $and. This will result in either three parameters in + * the form of prop, compare operator, value or a single parameter which is a function that + * will chain together a nested expression. + * @param {object} statement knex query object + * @param {object} obj object of supertype + * @returns {Function} + */ + function processObject(statement: QueryBuilder, obj, alias: string) { + var propCount = 0; + var singleProp; + + // Do we have more than one prop + for (var prop in obj) { + singleProp = prop; + ++propCount; + } + + // If so fetch the 3 parameters for a where, orWhere or andWhere chain + // Otherwise return a function that will chain sub-ordinate clauses + if (propCount == 1) + return processProp(statement, singleProp, obj[singleProp], alias); + else + return [function () { + traverse(statement, obj, alias) + }] + } + + // Params is either a Function or a set of 3 values ex. [key name, op, value] + function processNonArrayProp(prop: string, value, alias: string): Array { + var params: Array = []; + if (value instanceof Date || typeof(value) == 'string' || typeof(value) == 'number') { + params = [`${alias}.${prop}`, '=', value]; + } else + for (var subProp in value) { + params = [`${alias}.${prop}`, undefined, value[subProp]]; + const lowerCase = subProp.toLowerCase(); + if (lowerCase == '$eq') + params[1] = '='; + else if (lowerCase == '$gt') + params[1] = '>'; + else if (lowerCase == '$gte') + params[1] = '>='; + else if (lowerCase == '$lt') + params[1] = '<'; + else if (lowerCase == '$lte') + params[1] = '<='; + else if (lowerCase == '$ne') + params[1] = '!='; + else if (lowerCase == '$in') { + const attr = params[0]; + const values = params[2]; + params = [function () { + this.whereIn(attr, values) + }]; + } + else if (lowerCase == '$nin') { + const attr = params[0]; + const values = params[2]; + params = [function () { + this.whereNotIn(attr, values) + }]; + } + else if (lowerCase == '$regex') { + params[1] = value.$options && value.$options.match(/i/) ? '~*' : '~'; + delete value['$options'] + if (params[2] && params[2].source) + params[2] = params[2].source; + } else + throw `Can't handle ${prop}${JSON.stringify(value)}`; + } + return params; + } + +} \ No newline at end of file diff --git a/lib/knex/synchronize/Indexes.ts b/lib/knex/synchronize/Indexes.ts new file mode 100644 index 0000000..42c1ca0 --- /dev/null +++ b/lib/knex/synchronize/Indexes.ts @@ -0,0 +1,53 @@ +import * as Knex from 'knex'; + +export namespace Indexes { + export function synchronizeIndexes (persistor, template) { + var aliasedTableName = template.__table__; + tableName = this.dealias(aliasedTableName); + + while (template.__parent__) { + template = template.__parent__; + } + + if (!template.__table__) { + throw new Error(`${template.__name__} is missing a schema entry`); + } + var knex = persistor.getDB(persistor.getDBAlias(template.__table__)).connection; + var schema = this._schema; + + var _dbschema; + var _changes = {}; + var schemaTable = 'index_schema_history'; + var schemaField = 'schema'; + + return Promise.resolve() + .then(loadSchema.bind(this, tableName)) + .spread(loadTableDef) + .spread(diffTable) + .then(generateChanges.bind(this, template)) + .then(mergeChanges) + .then(applyTableChanges) + .then(makeSchemaUpdates) + .catch(function(e) { + throw e; + }) + } + + async function loadSchema (tableName: string, knex: Knex, _dbSchema) { + if (!!_dbSchema) { + return (_dbSchema, tableName); // @TODO: What does this return; + } + + const exists = await knex.schema.hasTable(schemaTable); + + // create + if (!exists) { + knex.schema.createTable(schemaTable, (table) => { // Do we do anything with this? + table.increments('sequence_id').primary(); + table.text(schemaField); + table.timestamps(); + }) + } + + } +} \ No newline at end of file From 78084400ad7ecb6ea59a9707a40b6a28cd96a750 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 14:54:08 -0500 Subject: [PATCH 02/10] init commit --- lib/knex/db.ts | 225 +------------------- lib/knex/synchronize/Indexes.ts | 221 +++++++++++++++++-- package-lock.json | 362 ++++++++++++++++---------------- package.json | 24 +-- 4 files changed, 390 insertions(+), 442 deletions(-) diff --git a/lib/knex/db.ts b/lib/knex/db.ts index e512a5b..0c4cdb5 100644 --- a/lib/knex/db.ts +++ b/lib/knex/db.ts @@ -2,6 +2,7 @@ import {DeleteQueries, PersistorTransaction} from '../types'; import {LoggerHelpers} from '../LoggerHelpers'; import {Transaction} from './commit/Transaction'; import {MongoQuery} from './mongoQuery/MongoQuery'; +import {Indexes} from './synchronize/Indexes'; module.exports = function (PersistObjectTemplate) { @@ -405,7 +406,7 @@ module.exports = function (PersistObjectTemplate) { return Promise.resolve() .then(buildTable.bind(this)) .then(addComments.bind(this, tableName)) - .then(synchronizeIndexes.bind(this, tableName, template)); + .then(() => Indexes.sync(this, tableName, template)); function buildTable() { return knex.schema.hasTable(tableName).then(function (exists) { @@ -609,226 +610,6 @@ module.exports = function (PersistObjectTemplate) { } } - function synchronizeIndexes(tableName, template) { - - var aliasedTableName = template.__table__; - tableName = this.dealias(aliasedTableName); - - while (template.__parent__) { - template = template.__parent__; - } - - if (!template.__table__) { - throw new Error(template.__name__ + ' is missing a schema entry'); - } - - var knex = this.getDB(this.getDBAlias(template.__table__)).connection; - var schema = this._schema; - - var _dbschema; - var _changes = {}; - var schemaTable = 'index_schema_history'; - var schemaField = 'schema'; - - - var loadSchema = function (tableName) { - - if (!!_dbschema) { - //@ts-ignore - return (_dbschema, tableName); - } - - return knex.schema.hasTable(schemaTable) - .then(function(exists) { - if (!exists) { - return knex.schema.createTable(schemaTable, function(table) { - table.increments('sequence_id').primary(); - table.text(schemaField); - table.timestamps(); - }) - } - }).then(function () { - return knex(schemaTable) - .orderBy('sequence_id', 'desc') - .limit(1); - }).then(function (record) { - var response; - if (!record[0]) { - response = {}; - } - else { - response = JSON.parse(record[0][schemaField]); - } - _dbschema = response; - return [response, template.__name__]; - }) - }; - - var loadTableDef = function(dbschema, tableName) { - if (!dbschema[tableName]) - dbschema[tableName] = {}; - return [dbschema, schema, tableName]; - }; - - var diffTable = function(dbschema, schema, tableName) { - var dbTableDef = dbschema[tableName]; - var memTableDef = schema[tableName]; - var track = {add: [], change: [], delete: []}; - _diff(dbTableDef, memTableDef, 'delete', false, function (_dbIdx, memIdx) { - return !memIdx; - }, _diff(memTableDef, dbTableDef, 'change', false, function (memIdx, dbIdx) { - return memIdx && dbIdx && !_.isEqual(memIdx, dbIdx); - }, _diff(memTableDef, dbTableDef, 'add', true, function (_memIdx, dbIdx) { - return !dbIdx; - }, track))); - _changes[tableName] = _changes[tableName] || {}; - - _.map(_.keys(track), function(key) { - _changes[tableName][key] = _changes[tableName][key] || []; - _changes[tableName][key].push.apply(_changes[tableName][key], track[key]); - }); - - function _diff(masterTblSchema, shadowTblSchema, opr, addMissingTable, addPredicate, diffs) { - - if (!!masterTblSchema && !!masterTblSchema.indexes && masterTblSchema.indexes instanceof Array && !!shadowTblSchema) { - (masterTblSchema.indexes || []).forEach(function (mstIdx) { - var shdIdx = _.findWhere(shadowTblSchema.indexes, {name: mstIdx.name}); - - if (addPredicate(mstIdx, shdIdx)) { - diffs[opr] = diffs[opr] || []; - diffs[opr].push(mstIdx); - } - }); - } else if (addMissingTable && !!masterTblSchema && !!masterTblSchema.indexes) { - diffs[opr] = diffs[opr] || []; - diffs[opr].push.apply(diffs[opr], masterTblSchema.indexes); - } - return diffs; - } - }; - - var generateChanges = function (localtemplate, _value) { - return _.reduce(localtemplate.__children__, function (_curr, o) { - return Promise.resolve() - .then(loadTableDef.bind(this, _dbschema, o.__name__)) - .spread(diffTable) - .then(generateChanges.bind(this, o)); - }, {}); - }; - - var getFilteredTarget = function(src, target) { - return _.filter(target, function(o, _filterkey) { - var currName = _.reduce(o.def.columns, function (name, col) { - return name + '_' + col; - }, 'idx_' + tableName); - return !_.find(src, function(cached) { - var cachedName = _.reduce(cached.def.columns, function (name, col) { - return name + '_' + col; - }, 'idx_' + tableName); - return (cachedName.toLowerCase() === currName.toLowerCase()) - }) - }); - }; - - var mergeChanges = function() { - var dbChanges = {add: [], change: [], delete: []}; - _.map(dbChanges, function(_object, key) { - _.each(_changes, function(change) { - var uniqChanges = _.uniq(change[key], function(o) { - return o.name; - }); - var filtered = getFilteredTarget(dbChanges[key], uniqChanges); - dbChanges[key].push.apply(dbChanges[key], filtered); - }) - }); - - return dbChanges; - }; - - var applyTableChanges = function(dbChanges) { - function syncIndexesForHierarchy (operation, diffs, table) { - _.map(diffs[operation], (function (object, _key) { - var type = object.def.type; - var columns = object.def.columns; - if (type !== 'unique' && type !== 'index') - throw new Error('index type can be only "unique" or "index"'); - - var name = _.reduce(object.def.columns, function (name, col) { - return name + '_' + col; - }, 'idx_' + tableName); - - name = name.toLowerCase(); - if (operation === 'add') { - table[type](columns, name); - } - else if (operation === 'delete') { - type = type.replace(/index/, 'Index'); - type = type.replace(/unique/, 'Unique'); - table['drop' + type]([], name); - } - else - table[type](columns, name); - - })); - } - - - return knex.transaction(function (trx) { - return trx.schema.table(tableName, function (table) { - syncIndexesForHierarchy('delete', dbChanges, table); - syncIndexesForHierarchy('add', dbChanges, table); - syncIndexesForHierarchy('change', dbChanges, table); - }) - }) - }; - - var isSchemaChanged = function(object) { - return (object.add.length || object.change.length || object.delete.length) - }; - - var makeSchemaUpdates = function () { - var chgFound = _.reduce(_changes, function (curr, change) { - return curr || !!isSchemaChanged(change); - }, false); - - if (!chgFound) return; - - return knex(schemaTable) - .orderBy('sequence_id', 'desc') - .limit(1).then(function (record) { - var response = {}, sequence_id; - if (!record[0]) { - sequence_id = 1; - } - else { - response = JSON.parse(record[0][schemaField]); - sequence_id = ++record[0].sequence_id; - } - _.each(_changes, function (_o, chgKey) { - response[chgKey] = schema[chgKey]; - }); - - return knex(schemaTable).insert({ - sequence_id: sequence_id, - schema: JSON.stringify(response) - }); - }) - }; - - return Promise.resolve() - .then(loadSchema.bind(this, tableName)) - .spread(loadTableDef) - .spread(diffTable) - .then(generateChanges.bind(this, template)) - .then(mergeChanges) - .then(applyTableChanges) - .then(makeSchemaUpdates) - .catch(function(e) { - throw e; - }) - } - - function iscompatible(persistortype, pgtype) { switch (persistortype) { @@ -881,7 +662,7 @@ module.exports = function (PersistObjectTemplate) { collection = collection || template.__table__; var tableName = this.dealias(collection); return PersistObjectTemplate._createKnexTable(template, collection) - .then(synchronizeIndexes.bind(this, tableName, template)) + .then(() => Indexes.sync(this, tableName, template)) }; /** diff --git a/lib/knex/synchronize/Indexes.ts b/lib/knex/synchronize/Indexes.ts index 42c1ca0..2952883 100644 --- a/lib/knex/synchronize/Indexes.ts +++ b/lib/knex/synchronize/Indexes.ts @@ -1,9 +1,9 @@ import * as Knex from 'knex'; export namespace Indexes { - export function synchronizeIndexes (persistor, template) { + export async function sync (persistor, tableName, template) { var aliasedTableName = template.__table__; - tableName = this.dealias(aliasedTableName); + tableName = persistor.dealias(aliasedTableName); while (template.__parent__) { template = template.__parent__; @@ -12,30 +12,45 @@ export namespace Indexes { if (!template.__table__) { throw new Error(`${template.__name__} is missing a schema entry`); } - var knex = persistor.getDB(persistor.getDBAlias(template.__table__)).connection; - var schema = this._schema; + const knex = persistor.getDB(persistor.getDBAlias(template.__table__)).connection; + let schema = persistor._schema; - var _dbschema; var _changes = {}; - var schemaTable = 'index_schema_history'; - var schemaField = 'schema'; - - return Promise.resolve() - .then(loadSchema.bind(this, tableName)) - .spread(loadTableDef) - .spread(diffTable) - .then(generateChanges.bind(this, template)) - .then(mergeChanges) - .then(applyTableChanges) - .then(makeSchemaUpdates) - .catch(function(e) { - throw e; - }) + const schemaTable = 'index_schema_history'; + const schemaField = 'schema'; + + try { + // Loading the Schema definition + const loadRes = await loadSchema(tableName, {}, knex, schemaTable, schemaField, template); + let _dbschema = loadRes._dbschema; + tableName = loadRes.name && loadRes.name; + + // Loading Table Definition + let res = loadTableDef(_dbschema, schema, tableName); + _dbschema = res._dbschema; + tableName = res.name; + schema = res.schema; + + diffTable(_dbschema, schema, tableName, _changes); + + generateChanges(template, undefined, tableName, _changes, _dbschema); + + const dbChanges = mergeChanges(_changes, tableName); + + await applyTableChanges(dbChanges, knex, tableName); + + return await makeSchemaUpdates(_changes, knex, schemaTable, schemaField, schema); + } + catch (err) { + throw err; + } } - async function loadSchema (tableName: string, knex: Knex, _dbSchema) { - if (!!_dbSchema) { - return (_dbSchema, tableName); // @TODO: What does this return; + async function loadSchema (tableName: string, _dbschema, knex: Knex, schemaTable: string, schemaField: string, template) { + + if (!!_dbschema) { + //@ts-ignore + return {_dbschema: tableName}; } const exists = await knex.schema.hasTable(schemaTable); @@ -49,5 +64,167 @@ export namespace Indexes { }) } + const record = knex(schemaTable).orderBy('sequence_id', 'desc').limit(1); + + if(!record[0]) { + return {_dbschema: {}, name: template.__name__}; + } + else { + const parsedSchema = JSON.parse(record[0][schemaField]); + return {_dbschema: parsedSchema, name: template.__name__}; + } + } + + // Check to see if Table Definition exists + function loadTableDef(dbschema, schema, tableName) { + if (!dbschema[tableName]) + dbschema[tableName] = {}; + return {_dbschema: dbschema, schema: schema, name: tableName}; + } + + // Wizardry @TODO: ask Ravi + function diffTable (_dbSchema, schema, tableName: string, _changes) { + const dbTableDef = _dbSchema[tableName]; + const memTableDef = schema[tableName]; + const track = {add: [], change: [], delete: []}; + + const firstDiffs = diff(memTableDef, dbTableDef, 'add', true, function (_memIdx, dbIdx) { + return !dbIdx; + }, track); + + const secondDiffs = diff(memTableDef, dbTableDef, 'change', false, function (memIdx, dbIdx) { + return memIdx && dbIdx && !_.isEqual(memIdx, dbIdx); + }, firstDiffs); + + const thirdDiffs = diff(dbTableDef, memTableDef, 'delete', false, function (_dbIdx, memIdx) { + return !memIdx; + }, secondDiffs); + + _changes[tableName] = _changes[tableName] || {}; + + _.map(_.keys(track), function(key) { + _changes[tableName][key] = _changes[tableName][key] || []; + _changes[tableName][key].push.apply(_changes[tableName][key], track[key]); + }); + } + + function generateChanges(localTemplate, _value, tableName, _changes, _dbSchema) { + const children = localTemplate.__children__; + for (let index = 0; index < children.length; index++) { + const child = children[index]; + + const res = loadTableDef(_dbSchema, child, tableName); + diffTable(res._dbschema, res.schema, res.name, _changes); + generateChanges(child, _value, tableName, _changes, _dbSchema); + } + } + + function mergeChanges(_changes, tableName) { + const dbChanges = {add: [], change: [], delete: []}; + _.map(dbChanges, function(_object, key) { + _.each(_changes, function(change) { + var uniqChanges = _.uniq(change[key], (o: any) => o.name); + const filtered = getFilteredTarget(dbChanges[key], uniqChanges, tableName); + dbChanges[key].push.apply(dbChanges[key], filtered); + }) + }); + + return dbChanges; + } + + async function applyTableChanges(dbChanges, knex: Knex, tableName: string) { + return knex.transaction(function (trx) { + return trx.schema.table(tableName, function (table) { + syncIndexesForHierarchy('delete', dbChanges, table, tableName); + syncIndexesForHierarchy('add', dbChanges, table, tableName); + syncIndexesForHierarchy('change', dbChanges, table, tableName); + }) + }) + } + + async function makeSchemaUpdates(_changes, knex: Knex, schemaTable: string, schemaField: string, schema): Promise { + const chgFound = _.reduce(_changes, (curr, change) => curr || !!isSchemaChanged(change), false); + + if (!chgFound) return; + + const record = await knex(schemaTable).orderBy('sequence_id', 'desc').limit(1); + let response = {}, sequence_id; + if (!record[0]) { + sequence_id = 1; + } else { + response = JSON.parse(record[0][schemaField]); + sequence_id = ++record[0].sequence_id; + } + + _.each(_changes, (_o, chgKey) => response[chgKey] = schema[chgKey]); + + return knex(schemaTable).insert({ + sequence_id: sequence_id, + schema: JSON.stringify(response) + }); + } + + + // Helpers + + function diff(masterTblSchema, shadowTblSchema, opr, addMissingTable, addPredicate, diffs) { + + if (!!masterTblSchema && !!masterTblSchema.indexes && masterTblSchema.indexes instanceof Array && !!shadowTblSchema) { + if (masterTblSchema.indexes) { + masterTblSchema.indexes.forEach((mstIdx) => { + var shdIdx = _.findWhere(shadowTblSchema.indexes, {name: mstIdx.name}); + + if (addPredicate(mstIdx, shdIdx)) { + diffs[opr] = diffs[opr] || []; + diffs[opr].push(mstIdx); + } + }); + } + } else if (addMissingTable && !!masterTblSchema && !!masterTblSchema.indexes) { + diffs[opr] = diffs[opr] || []; + diffs[opr].push.apply(diffs[opr], masterTblSchema.indexes); + } + return diffs; + } + + function getFilteredTarget(src, target, tableName) { + return _.filter(target, function iterator(o: any, _filterkey) { + var currName: string = _.reduce(o.def.columns, (name, col) => `${name}_${col}`, `idx_${tableName}`); + + return !_.find(src, function(cached: any) { + var cachedName = _.reduce(cached.def.columns, (name, col) => `${name}_${col}`, `idx_${tableName}`); + return cachedName.toLowerCase() === currName.toLowerCase() + }) + }); + } + + function syncIndexesForHierarchy (operation, diffs, table, tableName) { + _.map(diffs[operation], function (object: any, _key) { + var type = object.def.type; + var columns = object.def.columns; + if (type !== 'unique' && type !== 'index') + throw new Error('index type can be only "unique" or "index"'); + + var name = _.reduce(object.def.columns, function (name, col) { + return `${name}_${col}`; + }, `idx_${tableName}`); + + name = name.toLowerCase(); + if (operation === 'add') { + table[type](columns, name); + } + else if (operation === 'delete') { + type = type.replace(/index/, 'Index'); + type = type.replace(/unique/, 'Unique'); + table[`drop${type}`]([], name); + } + else + table[type](columns, name); + + }); + } + + function isSchemaChanged(object) { + return (object.add.length || object.change.length || object.delete.length); } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d1357be..b754c0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -351,9 +351,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "aws-sdk": { "version": "2.513.0", @@ -378,15 +378,6 @@ } } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -440,11 +431,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -665,6 +651,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, "requires": { "color-name": "^1.1.1" } @@ -672,7 +659,13 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", + "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" }, "commander": { "version": "2.15.1", @@ -681,9 +674,9 @@ "dev": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "concat-map": { "version": "0.0.1", @@ -715,11 +708,6 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -804,11 +792,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -927,7 +910,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escope": { "version": "3.6.0", @@ -1160,11 +1144,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -1216,20 +1195,20 @@ } }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", + "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" } }, "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "requires": { "expand-tilde": "^2.0.2", "is-plain-object": "^2.0.3", @@ -1239,9 +1218,9 @@ } }, "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" }, "flat-cache": { "version": "1.3.0", @@ -1311,6 +1290,11 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, + "getopts": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", + "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -1411,7 +1395,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-value": { "version": "1.0.0", @@ -1449,9 +1434,9 @@ "dev": true }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "requires": { "parse-passwd": "^1.0.0" } @@ -1515,9 +1500,9 @@ } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.0.0.tgz", + "integrity": "sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA==" }, "invariant": { "version": "2.2.4", @@ -1543,6 +1528,16 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-buffer": { @@ -1556,6 +1551,16 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-descriptor": { @@ -1595,11 +1600,11 @@ } }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" } }, "is-my-ip-valid": { @@ -1627,6 +1632,16 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-path-cwd": { @@ -1784,84 +1799,64 @@ "dev": true }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "knex": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/knex/-/knex-0.15.2.tgz", - "integrity": "sha1-YFm4dIlgX0zIdZmm0qnSZXCek0A=", - "requires": { - "babel-runtime": "^6.26.0", - "bluebird": "^3.5.1", - "chalk": "2.3.2", - "commander": "^2.16.0", - "debug": "3.1.0", - "inherits": "~2.0.3", - "interpret": "^1.1.0", - "liftoff": "2.5.0", - "lodash": "^4.17.10", - "minimist": "1.2.0", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.20.3.tgz", + "integrity": "sha512-zzYO34pSCCYVqRTbCp8xL+Z7fvHQl5anif3Oacu6JaHFDubB7mFGWRRJBNSO3N8Ql4g4CxUgBctaPiliwoOsNA==", + "requires": { + "bluebird": "^3.7.1", + "colorette": "1.1.0", + "commander": "^4.0.1", + "debug": "4.1.1", + "getopts": "2.2.5", + "inherits": "~2.0.4", + "interpret": "^2.0.0", + "liftoff": "3.1.0", + "lodash": "^4.17.15", "mkdirp": "^0.5.1", - "pg-connection-string": "2.0.0", - "tarn": "^1.1.4", - "tildify": "1.2.0", - "uuid": "^3.3.2", - "v8flags": "^3.1.1" + "pg-connection-string": "2.1.0", + "tarn": "^2.0.0", + "tildify": "2.0.0", + "uuid": "^3.3.3", + "v8flags": "^3.1.3" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz", + "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==" }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "pg-connection-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.0.0.tgz", - "integrity": "sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I=" + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "^3.0.0" - } + "pg-connection-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.1.0.tgz", + "integrity": "sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg==" } } }, @@ -1876,12 +1871,12 @@ } }, "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "requires": { "extend": "^3.0.0", - "findup-sync": "^2.0.0", + "findup-sync": "^3.0.0", "fined": "^1.0.1", "flagged-respawn": "^1.0.0", "is-plain-object": "^2.0.4", @@ -1893,8 +1888,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lolex": { "version": "1.1.0", @@ -1923,13 +1917,6 @@ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "requires": { "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } } }, "map-cache": { @@ -1963,13 +1950,6 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } } }, "minimatch": { @@ -1984,7 +1964,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, "mixin-deep": { "version": "1.3.2", @@ -2148,13 +2129,6 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } } }, "natural-compare": { @@ -3252,6 +3226,14 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -3347,7 +3329,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "packet-reader": { "version": "0.3.1", @@ -3387,9 +3370,9 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-root": { "version": "0.1.1", @@ -3590,11 +3573,6 @@ "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -3605,9 +3583,9 @@ } }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", @@ -3642,11 +3620,11 @@ } }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-dir": { @@ -3869,11 +3847,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -3883,6 +3856,16 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "source-map": { @@ -4059,9 +4042,9 @@ } }, "tarn": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-1.1.4.tgz", - "integrity": "sha512-j4samMCQCP5+6Il9/cxCqBd3x4vvlLeVdoyGex0KixPKl4F8LpNbDSC6NDhjianZgUngElRr9UI1ryZqJDhwGg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-2.0.0.tgz", + "integrity": "sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==" }, "text-table": { "version": "0.2.0", @@ -4075,12 +4058,9 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "requires": { - "os-homedir": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" }, "to-fast-properties": { "version": "2.0.0", @@ -4094,6 +4074,16 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-regex": { @@ -4346,17 +4336,17 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", "requires": { "homedir-polyfill": "^1.0.1" } }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index 0fe6685..c398f5f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dependencies": { "aws-sdk": "2.x", "bluebird": "x", - "knex": "0.15.2", + "knex": "0.20.3", "mongodb-bluebird": "x", "pg": "7.4.1", "q": "1.x", @@ -22,22 +22,22 @@ }, "devDependencies": { "@havenlife/supertype": "3.x", - "chai": "3.x", - "chai-as-promised": "^5.1.0", - "nyc": "13.0.0", - "mocha": "5.2.0", - "sinon": "1.15.x", - "sinon-chai": "2.8.x", - "mock-fs": "3.6.x", - "eslint": "3.7.x", + "@types/bluebird": "*", "@types/chai": "^3.4.34", "@types/mocha": "^2.2.39", "@types/node": "^7.0.5", "@types/q": "*", "@types/underscore": "*", - "@types/bluebird": "*", - "typescript": "*", - "ts-node": "*" + "chai": "3.x", + "chai-as-promised": "^5.1.0", + "eslint": "3.7.x", + "mocha": "5.2.0", + "mock-fs": "3.6.x", + "nyc": "13.0.0", + "sinon": "1.15.x", + "sinon-chai": "2.8.x", + "ts-node": "*", + "typescript": "*" }, "directories": {}, "engines": { From f057919c0fea91e8304b4812c1a29e4db782f94e Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 15:04:11 -0500 Subject: [PATCH 03/10] pushing package changes --- lib/knex/synchronize/Indexes.ts | 53 ------ package-lock.json | 306 +++++++++++++++++++++----------- package.json | 30 ++-- 3 files changed, 214 insertions(+), 175 deletions(-) delete mode 100644 lib/knex/synchronize/Indexes.ts diff --git a/lib/knex/synchronize/Indexes.ts b/lib/knex/synchronize/Indexes.ts deleted file mode 100644 index 42c1ca0..0000000 --- a/lib/knex/synchronize/Indexes.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as Knex from 'knex'; - -export namespace Indexes { - export function synchronizeIndexes (persistor, template) { - var aliasedTableName = template.__table__; - tableName = this.dealias(aliasedTableName); - - while (template.__parent__) { - template = template.__parent__; - } - - if (!template.__table__) { - throw new Error(`${template.__name__} is missing a schema entry`); - } - var knex = persistor.getDB(persistor.getDBAlias(template.__table__)).connection; - var schema = this._schema; - - var _dbschema; - var _changes = {}; - var schemaTable = 'index_schema_history'; - var schemaField = 'schema'; - - return Promise.resolve() - .then(loadSchema.bind(this, tableName)) - .spread(loadTableDef) - .spread(diffTable) - .then(generateChanges.bind(this, template)) - .then(mergeChanges) - .then(applyTableChanges) - .then(makeSchemaUpdates) - .catch(function(e) { - throw e; - }) - } - - async function loadSchema (tableName: string, knex: Knex, _dbSchema) { - if (!!_dbSchema) { - return (_dbSchema, tableName); // @TODO: What does this return; - } - - const exists = await knex.schema.hasTable(schemaTable); - - // create - if (!exists) { - knex.schema.createTable(schemaTable, (table) => { // Do we do anything with this? - table.increments('sequence_id').primary(); - table.text(schemaField); - table.timestamps(); - }) - } - - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d1357be..b9bf47a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -178,9 +178,9 @@ } }, "@types/bluebird": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz", - "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.29.tgz", + "integrity": "sha512-kmVtnxTuUuhCET669irqQmPAez4KFnFVKvpleVRyfC3g+SHD1hIkFZcWLim9BVcwUBLO59o8VZE4yGCmTif8Yw==", "dev": true }, "@types/chai": { @@ -196,9 +196,9 @@ "dev": true }, "@types/node": { - "version": "7.0.56", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.56.tgz", - "integrity": "sha512-NgjN3xPyqbAXSIpznNAR5Cisx5uKqJWxcS9kefzSFEX/9J7O01/FHyfnvPI7SztBf9p6c8mqOn3olZWJx3ja6g==", + "version": "7.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.9.tgz", + "integrity": "sha512-usSpgoUsRtO5xNV5YEPU8PPnHisFx8u0rokj1BPVn/hDF7zwUDzVLiuKZM38B7z8V2111Fj6kd4rGtQFUZpNOw==", "dev": true }, "@types/q": { @@ -217,9 +217,9 @@ } }, "@types/underscore": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.8.8.tgz", - "integrity": "sha512-EquzRwzAAs04anQ8/6MYXFKvHoD+MIlF+gu87EDda7dN9zrKvQYHsc9VFAPB1xY4tUHQVvBMtjsHrvof2EE1Mg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.9.4.tgz", + "integrity": "sha512-CjHWEMECc2/UxOZh0kpiz3lEyX2Px3rQS9HzD20lxMvx571ivOBQKeLnqEjxUY0BMgp6WJWo/pQLRBwMW5v4WQ==", "dev": true }, "acorn": { @@ -279,6 +279,12 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "arg": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", + "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -356,26 +362,19 @@ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" }, "aws-sdk": { - "version": "2.513.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.513.0.tgz", - "integrity": "sha512-hwI4c0MV7SrN5EOa0pXjiInWpNxBfMQFfPh3XDi9fj+KtPjgRWQUTaKF7pUg6RJ+Su++62kp1yJqT2WWBoNFMA==", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.8", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } + "version": "2.580.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.580.0.tgz", + "integrity": "sha512-YUn/LgaSjWuFDCAIOiOvyXbuRpNEzTPLbwRs3GpEmrP1hJrOChXh0p7GH61sTZdeJZarCSETUOWU5ngjpCOjKA==", + "requires": { + "buffer": "^4.9.1", + "events": "^1.1.1", + "ieee754": "^1.1.13", + "jmespath": "^0.15.0", + "querystring": "^0.2.0", + "sax": "^1.2.1", + "url": "^0.10.3", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" } }, "babel-runtime": { @@ -454,9 +453,9 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "brace-expansion": { "version": "1.1.11", @@ -507,9 +506,9 @@ "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -770,6 +769,14 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -833,9 +840,9 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", "dev": true }, "doctrine": { @@ -848,6 +855,33 @@ "isarray": "^1.0.0" } }, + "es-abstract": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", + "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es5-ext": { "version": "0.10.41", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.41.tgz", @@ -1291,6 +1325,11 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -1399,6 +1438,14 @@ } } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -1413,6 +1460,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1457,9 +1509,9 @@ } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { "version": "3.3.7", @@ -1550,6 +1602,11 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -1558,6 +1615,11 @@ "kind-of": "^3.0.2" } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -1667,6 +1729,14 @@ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -1681,6 +1751,14 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -1912,9 +1990,9 @@ } }, "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, "make-iterator": { @@ -3255,6 +3333,16 @@ } } }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3274,6 +3362,15 @@ "isobject": "^3.0.0" } }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -3733,9 +3830,9 @@ "dev": true }, "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { "version": "5.5.0", @@ -3903,11 +4000,12 @@ } }, "source-map-support": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", - "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { @@ -3976,6 +4074,24 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -4123,50 +4239,16 @@ "dev": true }, "ts-node": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-5.0.1.tgz", - "integrity": "sha512-XK7QmDcNHVmZkVtkiwNDWiERRHPyU8nBqZB1+iv2UhOG0q3RQ9HsZ2CMqISlFbxjrYFGfG2mX7bW4dAyxBVzUw==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.5.4.tgz", + "integrity": "sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw==", "dev": true, "requires": { - "arrify": "^1.0.0", - "chalk": "^2.3.0", - "diff": "^3.1.0", + "arg": "^4.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.3", - "yn": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "source-map-support": "^0.5.6", + "yn": "^3.0.0" } }, "tslib": { @@ -4201,9 +4283,9 @@ "dev": true }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", + "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", "dev": true }, "uglify-js": { @@ -4239,9 +4321,9 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" }, "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" }, "union-value": { "version": "1.0.1", @@ -4340,6 +4422,15 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "uuid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", @@ -4383,18 +4474,19 @@ } }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "xtend": { "version": "4.0.1", @@ -4402,9 +4494,9 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true } } diff --git a/package.json b/package.json index 0fe6685..f2ffce6 100644 --- a/package.json +++ b/package.json @@ -6,15 +6,15 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { - "aws-sdk": "2.x", - "bluebird": "x", + "aws-sdk": "^2.580.0", + "bluebird": "^3.7.2", "knex": "0.15.2", "mongodb-bluebird": "x", "pg": "7.4.1", "q": "1.x", - "tv4": "^1.2.7", - "underscore": "1.x", "tslib": "^1.10.0", + "tv4": "^1.2.7", + "underscore": "^1.9.1", "uuid": "3.3.3" }, "peerDependencies": { @@ -22,22 +22,22 @@ }, "devDependencies": { "@havenlife/supertype": "3.x", + "@types/bluebird": "^3.5.29", + "@types/chai": "^3.4.34", + "@types/mocha": "^2.2.39", + "@types/node": "^7.10.9", + "@types/q": "*", + "@types/underscore": "^1.9.4", "chai": "3.x", "chai-as-promised": "^5.1.0", - "nyc": "13.0.0", + "eslint": "3.7.x", "mocha": "5.2.0", + "mock-fs": "3.6.x", + "nyc": "13.0.0", "sinon": "1.15.x", "sinon-chai": "2.8.x", - "mock-fs": "3.6.x", - "eslint": "3.7.x", - "@types/chai": "^3.4.34", - "@types/mocha": "^2.2.39", - "@types/node": "^7.0.5", - "@types/q": "*", - "@types/underscore": "*", - "@types/bluebird": "*", - "typescript": "*", - "ts-node": "*" + "ts-node": "^8.5.4", + "typescript": "^3.7.2" }, "directories": {}, "engines": { From 1f460d72390e3b6238e90dfc97f947d02bd618d7 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 15:11:36 -0500 Subject: [PATCH 04/10] adding fix --- lib/knex/db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/knex/db.ts b/lib/knex/db.ts index e512a5b..40359dd 100644 --- a/lib/knex/db.ts +++ b/lib/knex/db.ts @@ -248,7 +248,7 @@ module.exports = function (PersistObjectTemplate) { if (typeof(queryOrChains) == 'function') queryOrChains(knex); else if (queryOrChains) - (this.convertMongoQueryToChains)(tableName, knex, queryOrChains); + (MongoQuery.convertMongoQueryToChains)(tableName, knex, queryOrChains); return knex.delete(); }; From 8762278fa8e9f2c2433c6a449690cbb3217f7bf7 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 15:13:31 -0500 Subject: [PATCH 05/10] adding fixed message --- lib/knex/mongoQuery/MongoQuery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/knex/mongoQuery/MongoQuery.ts b/lib/knex/mongoQuery/MongoQuery.ts index 553a8df..ae2fc43 100644 --- a/lib/knex/mongoQuery/MongoQuery.ts +++ b/lib/knex/mongoQuery/MongoQuery.ts @@ -191,7 +191,7 @@ export namespace MongoQuery { if (params[2] && params[2].source) params[2] = params[2].source; } else - throw `Can't handle ${prop}${JSON.stringify(value)}`; + throw `Can't handle ${prop}: ${JSON.stringify(value)}`; } return params; } From a1e77761a20e03b11e2aaec690bd77a3b80d693f Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 15:17:45 -0500 Subject: [PATCH 06/10] adding fixed message --- lib/knex/synchronize/Indexes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/knex/synchronize/Indexes.ts b/lib/knex/synchronize/Indexes.ts index 2952883..17285ff 100644 --- a/lib/knex/synchronize/Indexes.ts +++ b/lib/knex/synchronize/Indexes.ts @@ -1,4 +1,5 @@ import * as Knex from 'knex'; +import * as _ from 'underscore'; export namespace Indexes { export async function sync (persistor, tableName, template) { From e956ea75ac003d5783df1cce37f18bb5a4dd3957 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 15:18:08 -0500 Subject: [PATCH 07/10] adding fixed message --- lib/knex/mongoQuery/MongoQuery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/knex/mongoQuery/MongoQuery.ts b/lib/knex/mongoQuery/MongoQuery.ts index ae2fc43..310d882 100644 --- a/lib/knex/mongoQuery/MongoQuery.ts +++ b/lib/knex/mongoQuery/MongoQuery.ts @@ -191,7 +191,7 @@ export namespace MongoQuery { if (params[2] && params[2].source) params[2] = params[2].source; } else - throw `Can't handle ${prop}: ${JSON.stringify(value)}`; + throw `Can't handle ${prop}:${JSON.stringify(value)}`; } return params; } From 9d41237a60e7220e980847947944f824b5ab166e Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 16:59:36 -0500 Subject: [PATCH 08/10] some fixes --- lib/knex/synchronize/Indexes.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/knex/synchronize/Indexes.ts b/lib/knex/synchronize/Indexes.ts index 17285ff..9fc4474 100644 --- a/lib/knex/synchronize/Indexes.ts +++ b/lib/knex/synchronize/Indexes.ts @@ -22,17 +22,17 @@ export namespace Indexes { try { // Loading the Schema definition - const loadRes = await loadSchema(tableName, {}, knex, schemaTable, schemaField, template); + const loadRes = await loadSchema(tableName, undefined, knex, schemaTable, schemaField, template); let _dbschema = loadRes._dbschema; - tableName = loadRes.name && loadRes.name; + let name = loadRes.name && loadRes.name; // Loading Table Definition - let res = loadTableDef(_dbschema, schema, tableName); + let res = loadTableDef(_dbschema, schema, name); _dbschema = res._dbschema; - tableName = res.name; + name = res.name; schema = res.schema; - diffTable(_dbschema, schema, tableName, _changes); + diffTable(_dbschema, schema, name, _changes); generateChanges(template, undefined, tableName, _changes, _dbschema); @@ -58,7 +58,7 @@ export namespace Indexes { // create if (!exists) { - knex.schema.createTable(schemaTable, (table) => { // Do we do anything with this? + await knex.schema.createTable(schemaTable, (table) => { // @TODO: need to issue a PR to knex for bad type. This is ASYNC table.increments('sequence_id').primary(); table.text(schemaField); table.timestamps(); @@ -134,8 +134,8 @@ export namespace Indexes { } async function applyTableChanges(dbChanges, knex: Knex, tableName: string) { - return knex.transaction(function (trx) { - return trx.schema.table(tableName, function (table) { + return await knex.transaction(async function (trx) { + return await trx.schema.table(tableName, function (table) { syncIndexesForHierarchy('delete', dbChanges, table, tableName); syncIndexesForHierarchy('add', dbChanges, table, tableName); syncIndexesForHierarchy('change', dbChanges, table, tableName); From f111bc1ae9fe1768d3e8e9866fca6086ccb8f644 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 17:11:03 -0500 Subject: [PATCH 09/10] adding Helpers --- lib/knex/Helpers.ts | 30 +++++++++++++++++++++++++++ lib/knex/db.ts | 50 +++++---------------------------------------- package-lock.json | 11 ---------- package.json | 2 +- 4 files changed, 36 insertions(+), 57 deletions(-) create mode 100644 lib/knex/Helpers.ts diff --git a/lib/knex/Helpers.ts b/lib/knex/Helpers.ts new file mode 100644 index 0000000..bfb22b5 --- /dev/null +++ b/lib/knex/Helpers.ts @@ -0,0 +1,30 @@ +export namespace Helpers { + export function iscompatible(persistortype, pgtype) { + switch (persistortype) { + case 'String': + case 'Object': + case 'Array': + return pgtype.indexOf('text') > -1; + case 'Number': + return pgtype.indexOf('double precision') > -1; + case 'Boolean': + return pgtype.indexOf('bool') > -1; + case 'Date': + return pgtype.indexOf('timestamp') > -1; + default: + return pgtype.indexOf('text') > -1; // Typed objects have no name + } + } + + export function getPropsRecursive(template, map?) { + map = map || {}; + _.map(template.getProperties(), function (val, prop) { + map[prop] = val + }); + template = template.__children__; + template.forEach(function (template) { + getPropsRecursive(template, map); + }); + return map; + } +} \ No newline at end of file diff --git a/lib/knex/db.ts b/lib/knex/db.ts index 0377e90..82fdd10 100644 --- a/lib/knex/db.ts +++ b/lib/knex/db.ts @@ -3,6 +3,7 @@ import {LoggerHelpers} from '../LoggerHelpers'; import {Transaction} from './commit/Transaction'; import {MongoQuery} from './mongoQuery/MongoQuery'; import {Indexes} from './synchronize/Indexes'; +import {Helpers} from './Helpers'; module.exports = function (PersistObjectTemplate) { @@ -106,12 +107,12 @@ module.exports = function (PersistObjectTemplate) { template = template.__parent__; asStandard(template, this.dealias(template.__table__)); - _.each(getPropsRecursive(template), function (defineProperties, prop) { + _.each(Helpers.getPropsRecursive(template), function (defineProperties, prop) { as(template, this.dealias(template.__table__), prop, defineProperties) }.bind(this)); _.each(joins, function (join) { asStandard(join.template, join.alias); - _.each(getPropsRecursive(join.template), function (defineProperties, prop) { + _.each(Helpers.getPropsRecursive(join.template), function (defineProperties, prop) { as(join.template, join.alias, prop, defineProperties) }) }.bind(this)); @@ -141,18 +142,6 @@ module.exports = function (PersistObjectTemplate) { } cols.push(prefix + '.' + prop + ' as ' + (prefix ? prefix + '___' : '') + prop); } - - function getPropsRecursive(template, map?) { - map = map || {}; - _.map(template.getProperties(), function (val, prop) { - map[prop] = val - }); - template = template.__children__; - template.forEach(function (template) { - getPropsRecursive(template, map); - }); - return map; - } } }; /** @@ -398,7 +387,7 @@ module.exports = function (PersistObjectTemplate) { throw new Error(template.__name__ + ' is missing a schema entry'); } - var props = getPropsRecursive(template); + var props = Helpers.getPropsRecursive(template); var knex = this.getDB(this.getDBAlias(template.__table__)).connection; var schema = template.__schema__; var _newFields = {}; @@ -575,7 +564,7 @@ module.exports = function (PersistObjectTemplate) { _newFields[prop] = props[prop]; } else { - if (!iscompatible(props[prop].type.name, info[propToColumnName(prop)].type)) { + if (!Helpers.iscompatible(props[prop].type.name, info[propToColumnName(prop)].type)) { throw new Error('Changing the type of ' + prop + ' on ' + table + ', changing types for the fields is not allowed, please use scripts to make these changes'); } @@ -611,35 +600,6 @@ module.exports = function (PersistObjectTemplate) { } - function iscompatible(persistortype, pgtype) { - switch (persistortype) { - case 'String': - case 'Object': - case 'Array': - return pgtype.indexOf('text') > -1; - case 'Number': - return pgtype.indexOf('double precision') > -1; - case 'Boolean': - return pgtype.indexOf('bool') > -1; - case 'Date': - return pgtype.indexOf('timestamp') > -1; - default: - return pgtype.indexOf('text') > -1; // Typed objects have no name - } - } - - function getPropsRecursive(template, map?) { - map = map || {}; - _.map(template.getProperties(), function (val, prop) { - map[prop] = val - }); - template = template.__children__; - template.forEach(function (template) { - getPropsRecursive(template, map); - }); - return map; - } - PersistObjectTemplate.persistTouchKnex = function(obj, txn, logger) { (logger || this.logger).debug({component: 'persistor', module: 'db.persistTouchKnex', activity: 'pre', data: {template: obj.__template__.__name__, table: obj.__template__.__table__}}); diff --git a/package-lock.json b/package-lock.json index 2dc7a7d..d20a9f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1903,11 +1903,6 @@ "v8flags": "^3.1.3" }, "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "commander": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz", @@ -2039,12 +2034,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", diff --git a/package.json b/package.json index 8bf4a04..eba3b76 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dependencies": { "aws-sdk": "^2.580.0", "bluebird": "^3.7.2", - "knex": "0.20.3", + "knex": "^0.20.3", "mongodb-bluebird": "x", "pg": "7.4.1", "q": "1.x", From c2e48c34ff43bde61a7bc32da49339bbf05d2979 Mon Sep 17 00:00:00 2001 From: Shanks Date: Sat, 30 Nov 2019 17:19:59 -0500 Subject: [PATCH 10/10] adding type fixing --- lib/knex/Helpers.ts | 2 ++ lib/knex/synchronize/Tables.ts | 0 2 files changed, 2 insertions(+) create mode 100644 lib/knex/synchronize/Tables.ts diff --git a/lib/knex/Helpers.ts b/lib/knex/Helpers.ts index bfb22b5..0e74420 100644 --- a/lib/knex/Helpers.ts +++ b/lib/knex/Helpers.ts @@ -1,3 +1,5 @@ +import * as _ from 'underscore'; + export namespace Helpers { export function iscompatible(persistortype, pgtype) { switch (persistortype) { diff --git a/lib/knex/synchronize/Tables.ts b/lib/knex/synchronize/Tables.ts new file mode 100644 index 0000000..e69de29