@cumulus/db 10.0.1 → 10.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.d.ts CHANGED
@@ -8,6 +8,7 @@ export declare const localStackConnectionEnv: {
8
8
  PG_DATABASE: string;
9
9
  PG_PORT: string;
10
10
  };
11
+ export declare const isKnexDebugEnabled: (env?: NodeJS.ProcessEnv) => boolean;
11
12
  export declare const getSecretConnectionConfig: (SecretId: string, secretsManager: AWS.SecretsManager) => Promise<Knex.PgConnectionConfig>;
12
13
  export declare const getConnectionConfigEnv: (env: NodeJS.ProcessEnv) => Knex.PgConnectionConfig;
13
14
  /**
package/dist/config.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getKnexConfig = exports.getConnectionConfig = exports.getConnectionConfigEnv = exports.getSecretConnectionConfig = exports.localStackConnectionEnv = void 0;
6
+ exports.getKnexConfig = exports.getConnectionConfig = exports.getConnectionConfigEnv = exports.getSecretConnectionConfig = exports.isKnexDebugEnabled = exports.localStackConnectionEnv = void 0;
7
7
  const aws_sdk_1 = __importDefault(require("aws-sdk"));
8
8
  const common_1 = require("@cumulus/common");
9
9
  exports.localStackConnectionEnv = {
@@ -13,6 +13,8 @@ exports.localStackConnectionEnv = {
13
13
  PG_DATABASE: 'postgres',
14
14
  PG_PORT: '5432',
15
15
  };
16
+ const isKnexDebugEnabled = (env = {}) => env.KNEX_DEBUG === 'true';
17
+ exports.isKnexDebugEnabled = isKnexDebugEnabled;
16
18
  const getSecretConnectionConfig = async (SecretId, secretsManager) => {
17
19
  var _a;
18
20
  const response = await secretsManager.getSecretValue({ SecretId }).promise();
@@ -110,7 +112,7 @@ const getKnexConfig = async ({ env = process.env, secretsManager = new aws_sdk_1
110
112
  const knexConfig = {
111
113
  client: 'pg',
112
114
  connection: await (0, exports.getConnectionConfig)({ env, secretsManager }),
113
- debug: env.KNEX_DEBUG === 'true',
115
+ debug: (0, exports.isKnexDebugEnabled)(env),
114
116
  asyncStackTraces: env.KNEX_ASYNC_STACK_TRACES === 'true',
115
117
  pool: {
116
118
  min: 0,
@@ -44,16 +44,37 @@ const log = new logger_1.default({ sender: '@cumulus/db/connection' });
44
44
  * @returns {Promise<Knex>} a Knex configuration object that has returned at least one query
45
45
  */
46
46
  const getKnexClient = async ({ env = process.env, secretsManager = new aws_sdk_1.default.SecretsManager(), knexLogger = log, } = {}) => {
47
+ if ((0, config_1.isKnexDebugEnabled)(env)) {
48
+ knexLogger.info('Initializing connection pool...');
49
+ }
47
50
  const knexConfig = await (0, config_1.getKnexConfig)({ env, secretsManager });
48
51
  const knexClient = (0, knex_1.knex)(knexConfig);
49
- //@ts-ignore
50
- // context is an internal object that isn't typed
51
- // this is needed to force tarn to log per-retry failures
52
- // and allow propagateCreateError to be set `false`
53
- knexClient.context.client.pool.on('createFail', (_, error) => {
54
- knexLogger.warn('knex failed on attempted connection', error);
55
- throw error;
56
- });
52
+ if ((0, config_1.isKnexDebugEnabled)(env)) {
53
+ //@ts-ignore
54
+ // context is an internal object that isn't typed
55
+ // this is needed to force tarn to log per-retry failures
56
+ // and allow propagateCreateError to be set `false`
57
+ knexClient.context.client.pool.on('createFail', (_, error) => {
58
+ knexLogger.warn('knex failed on attempted connection', error);
59
+ throw error;
60
+ });
61
+ //@ts-ignore
62
+ knexClient.context.client.pool.on('createSuccess', (_, resource) => {
63
+ knexLogger.info(`added connection to pool: ${JSON.stringify(resource)}`);
64
+ });
65
+ //@ts-ignore
66
+ knexClient.context.client.pool.on('acquireSuccess', (_, resource) => {
67
+ knexLogger.info(`acquired connection from pool: ${JSON.stringify(resource)}`);
68
+ });
69
+ //@ts-ignore
70
+ knexClient.context.client.pool.on('release', (resource) => {
71
+ knexLogger.info(`released connection from pool: ${JSON.stringify(resource)}`);
72
+ });
73
+ //@ts-ignore
74
+ knexClient.context.client.pool.on('poolDestroySuccess', () => {
75
+ knexLogger.info('pool is destroyed');
76
+ });
77
+ }
57
78
  return knexClient;
58
79
  };
59
80
  exports.getKnexClient = getKnexClient;
package/dist/index.d.ts CHANGED
@@ -18,7 +18,7 @@ export { translateApiAsyncOperationToPostgresAsyncOperation } from './translate/
18
18
  export { translateApiFiletoPostgresFile, translatePostgresFileToApiFile, } from './translate/file';
19
19
  export { translateApiCollectionToPostgresCollection } from './translate/collections';
20
20
  export { translateApiProviderToPostgresProvider, } from './translate/providers';
21
- export { translateApiRuleToPostgresRule } from './translate/rules';
21
+ export { translateApiRuleToPostgresRule, translateApiRuleToPostgresRuleRaw, } from './translate/rules';
22
22
  export { translateApiExecutionToPostgresExecution, translatePostgresExecutionToApiExecution, } from './translate/executions';
23
23
  export { translateApiGranuleToPostgresGranule, translatePostgresGranuleToApiGranule, } from './translate/granules';
24
24
  export { translateApiPdrToPostgresPdr } from './translate/pdrs';
package/dist/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -19,8 +23,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
19
23
  return result;
20
24
  };
21
25
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.ProviderPgModel = exports.PdrPgModel = exports.GranulesExecutionsPgModel = exports.GranulePgModel = exports.FilePgModel = exports.ExecutionPgModel = exports.CollectionPgModel = exports.BasePgModel = exports.AsyncOperationPgModel = exports.upsertGranuleWithExecutionJoinRecord = exports.getApiGranuleExecutionCumulusIds = exports.getApiGranuleCumulusIds = exports.getExecutionArnsByGranuleCumulusId = exports.getApiGranuleExecutionCumulusIdsByExecution = exports.getApiExecutionCumulusIds = exports.getWorkflowNameIntersectFromGranuleIds = exports.newestExecutionArnFromGranuleIdWorkflowName = exports.executionArnsFromGranuleIdsAndWorkflowNames = exports.translateApiPdrToPostgresPdr = exports.translatePostgresGranuleToApiGranule = exports.translateApiGranuleToPostgresGranule = exports.translatePostgresExecutionToApiExecution = exports.translateApiExecutionToPostgresExecution = exports.translateApiRuleToPostgresRule = exports.translateApiProviderToPostgresProvider = exports.translateApiCollectionToPostgresCollection = exports.translatePostgresFileToApiFile = exports.translateApiFiletoPostgresFile = exports.translateApiAsyncOperationToPostgresAsyncOperation = exports.nullifyUndefinedProviderValues = exports.validateProviderHost = exports.migrationDir = exports.TableNames = exports.createRejectableTransaction = exports.localStackConnectionEnv = exports.getKnexConfig = exports.getKnexClient = exports.generateLocalTestDb = exports.fakeRuleRecordFactory = exports.fakeProviderRecordFactory = exports.fakePdrRecordFactory = exports.fakeGranuleRecordFactory = exports.fakeFileRecordFactory = exports.fakeExecutionRecordFactory = exports.fakeCollectionRecordFactory = exports.fakeAsyncOperationRecordFactory = exports.destroyLocalTestDb = exports.deleteTestDatabase = exports.createTestDatabase = exports.Knex = void 0;
23
- exports.RulePgModel = void 0;
26
+ exports.PdrPgModel = exports.GranulesExecutionsPgModel = exports.GranulePgModel = exports.FilePgModel = exports.ExecutionPgModel = exports.CollectionPgModel = exports.BasePgModel = exports.AsyncOperationPgModel = exports.upsertGranuleWithExecutionJoinRecord = exports.getApiGranuleExecutionCumulusIds = exports.getApiGranuleCumulusIds = exports.getExecutionArnsByGranuleCumulusId = exports.getApiGranuleExecutionCumulusIdsByExecution = exports.getApiExecutionCumulusIds = exports.getWorkflowNameIntersectFromGranuleIds = exports.newestExecutionArnFromGranuleIdWorkflowName = exports.executionArnsFromGranuleIdsAndWorkflowNames = exports.translateApiPdrToPostgresPdr = exports.translatePostgresGranuleToApiGranule = exports.translateApiGranuleToPostgresGranule = exports.translatePostgresExecutionToApiExecution = exports.translateApiExecutionToPostgresExecution = exports.translateApiRuleToPostgresRuleRaw = exports.translateApiRuleToPostgresRule = exports.translateApiProviderToPostgresProvider = exports.translateApiCollectionToPostgresCollection = exports.translatePostgresFileToApiFile = exports.translateApiFiletoPostgresFile = exports.translateApiAsyncOperationToPostgresAsyncOperation = exports.nullifyUndefinedProviderValues = exports.validateProviderHost = exports.migrationDir = exports.TableNames = exports.createRejectableTransaction = exports.localStackConnectionEnv = exports.getKnexConfig = exports.getKnexClient = exports.generateLocalTestDb = exports.fakeRuleRecordFactory = exports.fakeProviderRecordFactory = exports.fakePdrRecordFactory = exports.fakeGranuleRecordFactory = exports.fakeFileRecordFactory = exports.fakeExecutionRecordFactory = exports.fakeCollectionRecordFactory = exports.fakeAsyncOperationRecordFactory = exports.destroyLocalTestDb = exports.deleteTestDatabase = exports.createTestDatabase = exports.Knex = void 0;
27
+ exports.RulePgModel = exports.ProviderPgModel = void 0;
24
28
  const path = __importStar(require("path"));
25
29
  var knex_1 = require("knex");
26
30
  Object.defineProperty(exports, "Knex", { enumerable: true, get: function () { return knex_1.Knex; } });
@@ -61,6 +65,7 @@ var providers_1 = require("./translate/providers");
61
65
  Object.defineProperty(exports, "translateApiProviderToPostgresProvider", { enumerable: true, get: function () { return providers_1.translateApiProviderToPostgresProvider; } });
62
66
  var rules_1 = require("./translate/rules");
63
67
  Object.defineProperty(exports, "translateApiRuleToPostgresRule", { enumerable: true, get: function () { return rules_1.translateApiRuleToPostgresRule; } });
68
+ Object.defineProperty(exports, "translateApiRuleToPostgresRuleRaw", { enumerable: true, get: function () { return rules_1.translateApiRuleToPostgresRuleRaw; } });
64
69
  var executions_1 = require("./translate/executions");
65
70
  Object.defineProperty(exports, "translateApiExecutionToPostgresExecution", { enumerable: true, get: function () { return executions_1.translateApiExecutionToPostgresExecution; } });
66
71
  Object.defineProperty(exports, "translatePostgresExecutionToApiExecution", { enumerable: true, get: function () { return executions_1.translatePostgresExecutionToApiExecution; } });
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare const up: (knex: Knex) => Promise<void>;
3
+ export declare const down: (knex: Knex) => Promise<void>;
4
+ //# sourceMappingURL=20220126172008_files_granule_id_index.d.ts.map
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ const up = async (knex) => {
5
+ await knex.schema.table('files', (table) => {
6
+ table.index('granule_cumulus_id');
7
+ });
8
+ };
9
+ exports.up = up;
10
+ const down = async (knex) => {
11
+ await knex.schema.table('files', (table) => {
12
+ table.dropIndex('granule_cumulus_id');
13
+ });
14
+ };
15
+ exports.down = down;
16
+ //# sourceMappingURL=20220126172008_files_granule_id_index.js.map
@@ -22,7 +22,7 @@ declare class BasePgModel<ItemType, RecordType extends {
22
22
  * Fetches multiple items from Postgres
23
23
  *
24
24
  * @param {Knex | Knex.Transaction} knexOrTransaction - DB client or transaction
25
- * @param {Partial<RecordType>} params - An object or any portion of an object of type RecordType
25
+ * @param {Object} params - An object or any portion of an object of type RecordType
26
26
  * @returns {Promise<RecordType[]>} List of returned records
27
27
  */
28
28
  search(knexOrTransaction: Knex | Knex.Transaction, params: Partial<RecordType>): Promise<RecordType[]>;
@@ -41,7 +41,7 @@ declare class BasePgModel<ItemType, RecordType extends {
41
41
  *
42
42
  * @param {Knex | Knex.Transaction} knexOrTransaction -
43
43
  * DB client or transaction
44
- * @param {Array<keyof RecordType>} columnNames - column names for whereIn query
44
+ * @param {Array<string>} columnNames - column names for whereIn query
45
45
  * @param {Array<string>} values - record values for whereIn query
46
46
  * @returns {Promise<Array<number>>} An array of cumulus_ids for the returned records
47
47
  */
@@ -59,9 +59,11 @@ declare class BasePgModel<ItemType, RecordType extends {
59
59
  *
60
60
  * @param {Knex | Knex.Transaction} knexOrTransaction - DB client or transaction
61
61
  * @param {ItemType} item - A record to insert into the DB
62
+ * @param {string | Array<string>} returningFields - A string or array of strings
63
+ * of columns to return. Defaults to 'cumulus_id'.
62
64
  * @returns {Promise<number[]>} List of IDs of the inserted records
63
65
  */
64
- create(knexOrTransaction: Knex | Knex.Transaction, item: ItemType): Promise<number[]>;
66
+ create(knexOrTransaction: Knex | Knex.Transaction, item: ItemType, returningFields?: string | string[]): Promise<number[]>;
65
67
  /**
66
68
  * Deletes the item from Postgres
67
69
  *
@@ -40,7 +40,7 @@ class BasePgModel {
40
40
  * Fetches multiple items from Postgres
41
41
  *
42
42
  * @param {Knex | Knex.Transaction} knexOrTransaction - DB client or transaction
43
- * @param {Partial<RecordType>} params - An object or any portion of an object of type RecordType
43
+ * @param {Object} params - An object or any portion of an object of type RecordType
44
44
  * @returns {Promise<RecordType[]>} List of returned records
45
45
  */
46
46
  async search(knexOrTransaction, params) {
@@ -72,7 +72,7 @@ class BasePgModel {
72
72
  *
73
73
  * @param {Knex | Knex.Transaction} knexOrTransaction -
74
74
  * DB client or transaction
75
- * @param {Array<keyof RecordType>} columnNames - column names for whereIn query
75
+ * @param {Array<string>} columnNames - column names for whereIn query
76
76
  * @param {Array<string>} values - record values for whereIn query
77
77
  * @returns {Promise<Array<number>>} An array of cumulus_ids for the returned records
78
78
  */
@@ -106,12 +106,14 @@ class BasePgModel {
106
106
  *
107
107
  * @param {Knex | Knex.Transaction} knexOrTransaction - DB client or transaction
108
108
  * @param {ItemType} item - A record to insert into the DB
109
+ * @param {string | Array<string>} returningFields - A string or array of strings
110
+ * of columns to return. Defaults to 'cumulus_id'.
109
111
  * @returns {Promise<number[]>} List of IDs of the inserted records
110
112
  */
111
- async create(knexOrTransaction, item) {
113
+ async create(knexOrTransaction, item, returningFields = 'cumulus_id') {
112
114
  return await knexOrTransaction(this.tableName)
113
115
  .insert(item)
114
- .returning('cumulus_id');
116
+ .returning(returningFields);
115
117
  }
116
118
  /**
117
119
  * Deletes the item from Postgres
@@ -95,8 +95,8 @@ const translateApiExecutionToPostgresExecution = async (dynamoRecord, knex, coll
95
95
  updated_at: dynamoRecord.updatedAt ? new Date(dynamoRecord.updatedAt) : undefined,
96
96
  };
97
97
  if (dynamoRecord.collectionId !== undefined) {
98
- const collectionNameVersionArray = dynamoRecord.collectionId.split('___');
99
- translatedRecord.collection_cumulus_id = await collectionPgModel.getRecordCumulusId(knex, { name: collectionNameVersionArray[0], version: collectionNameVersionArray[1] });
98
+ const { name, version } = (0, Collections_1.deconstructCollectionId)(dynamoRecord.collectionId);
99
+ translatedRecord.collection_cumulus_id = await collectionPgModel.getRecordCumulusId(knex, { name, version });
100
100
  }
101
101
  // If we have a parentArn, try a lookup in Postgres. If there's a match, set the parent_cumulus_id
102
102
  if (dynamoRecord.parentArn !== undefined) {
@@ -12,5 +12,15 @@ import { PostgresRule } from '../types/rule';
12
12
  * @param {Object} providerPgModel - Instance of the provider database model
13
13
  * @returns {Object} A rule record
14
14
  */
15
+ export declare const translateApiRuleToPostgresRuleRaw: (record: RuleRecord, dbClient: Knex, collectionPgModel?: CollectionPgModel, providerPgModel?: ProviderPgModel) => Promise<PostgresRule>;
16
+ /**
17
+ * Generate a Postgres rule record from a DynamoDB record and remove nil properties.
18
+ *
19
+ * @param {Object} record - A rule
20
+ * @param {Object} dbClient - Knex client for reading from RDS database
21
+ * @param {Object} collectionPgModel - Instance of the collection database model
22
+ * @param {Object} providerPgModel - Instance of the provider database model
23
+ * @returns {Object} A rule record
24
+ */
15
25
  export declare const translateApiRuleToPostgresRule: (record: RuleRecord, dbClient: Knex, collectionPgModel?: CollectionPgModel, providerPgModel?: ProviderPgModel) => Promise<PostgresRule>;
16
26
  //# sourceMappingURL=rules.d.ts.map
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.translateApiRuleToPostgresRule = void 0;
3
+ exports.translateApiRuleToPostgresRule = exports.translateApiRuleToPostgresRuleRaw = void 0;
4
+ const util_1 = require("@cumulus/common/util");
4
5
  const collection_1 = require("../models/collection");
5
6
  const provider_1 = require("../models/provider");
6
7
  /**
@@ -12,26 +13,37 @@ const provider_1 = require("../models/provider");
12
13
  * @param {Object} providerPgModel - Instance of the provider database model
13
14
  * @returns {Object} A rule record
14
15
  */
16
+ const translateApiRuleToPostgresRuleRaw = async (record, dbClient, collectionPgModel = new collection_1.CollectionPgModel(), providerPgModel = new provider_1.ProviderPgModel()) => ({
17
+ name: record.name,
18
+ workflow: record.workflow,
19
+ provider_cumulus_id: record.provider ? await providerPgModel.getRecordCumulusId(dbClient, { name: record.provider }) : undefined,
20
+ collection_cumulus_id: record.collection ? await collectionPgModel.getRecordCumulusId(dbClient, { name: record.collection.name, version: record.collection.version }) : undefined,
21
+ meta: record.meta,
22
+ payload: record.payload,
23
+ queue_url: record.queueUrl,
24
+ arn: record.rule.arn,
25
+ type: record.rule.type,
26
+ value: record.rule.value,
27
+ log_event_arn: record.rule.logEventArn,
28
+ enabled: (record.state === undefined) || (record.state === 'ENABLED'),
29
+ tags: (record.tags ? JSON.stringify(record.tags) : undefined),
30
+ execution_name_prefix: record.executionNamePrefix,
31
+ created_at: (record.createdAt ? new Date(record.createdAt) : undefined),
32
+ updated_at: (record.updatedAt ? new Date(record.updatedAt) : undefined),
33
+ });
34
+ exports.translateApiRuleToPostgresRuleRaw = translateApiRuleToPostgresRuleRaw;
35
+ /**
36
+ * Generate a Postgres rule record from a DynamoDB record and remove nil properties.
37
+ *
38
+ * @param {Object} record - A rule
39
+ * @param {Object} dbClient - Knex client for reading from RDS database
40
+ * @param {Object} collectionPgModel - Instance of the collection database model
41
+ * @param {Object} providerPgModel - Instance of the provider database model
42
+ * @returns {Object} A rule record
43
+ */
15
44
  const translateApiRuleToPostgresRule = async (record, dbClient, collectionPgModel = new collection_1.CollectionPgModel(), providerPgModel = new provider_1.ProviderPgModel()) => {
16
- const ruleRecord = {
17
- name: record.name,
18
- workflow: record.workflow,
19
- provider_cumulus_id: record.provider ? await providerPgModel.getRecordCumulusId(dbClient, { name: record.provider }) : undefined,
20
- collection_cumulus_id: record.collection ? await collectionPgModel.getRecordCumulusId(dbClient, { name: record.collection.name, version: record.collection.version }) : undefined,
21
- meta: record.meta,
22
- payload: record.payload,
23
- queue_url: record.queueUrl,
24
- arn: record.rule.arn,
25
- type: record.rule.type,
26
- value: record.rule.value,
27
- log_event_arn: record.rule.logEventArn,
28
- enabled: (record.state === undefined) || (record.state === 'ENABLED'),
29
- tags: (record.tags ? JSON.stringify(record.tags) : undefined),
30
- execution_name_prefix: record.executionNamePrefix,
31
- created_at: (record.createdAt ? new Date(record.createdAt) : undefined),
32
- updated_at: (record.updatedAt ? new Date(record.updatedAt) : undefined),
33
- };
34
- return ruleRecord;
45
+ const ruleRecord = await (0, exports.translateApiRuleToPostgresRuleRaw)(record, dbClient, collectionPgModel, providerPgModel);
46
+ return (0, util_1.removeNilProperties)(ruleRecord);
35
47
  };
36
48
  exports.translateApiRuleToPostgresRule = translateApiRuleToPostgresRule;
37
49
  //# sourceMappingURL=rules.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cumulus/db",
3
- "version": "10.0.1",
3
+ "version": "10.1.1",
4
4
  "description": "Utilities for working with the Cumulus DB",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./dist/index.js",
@@ -29,16 +29,16 @@
29
29
  "node": ">=12.18.0"
30
30
  },
31
31
  "dependencies": {
32
- "@cumulus/aws-client": "10.0.1",
33
- "@cumulus/common": "10.0.1",
34
- "@cumulus/errors": "10.0.1",
35
- "@cumulus/logger": "10.0.1",
36
- "@cumulus/message": "10.0.1",
37
- "@cumulus/types": "10.0.1",
32
+ "@cumulus/aws-client": "10.1.1",
33
+ "@cumulus/common": "10.1.1",
34
+ "@cumulus/errors": "10.1.1",
35
+ "@cumulus/logger": "10.1.1",
36
+ "@cumulus/message": "10.1.1",
37
+ "@cumulus/types": "10.1.1",
38
38
  "crypto-random-string": "^3.2.0",
39
39
  "is-valid-hostname": "0.0.1",
40
40
  "knex": "0.95.15",
41
- "lodash": "^4.17.20",
41
+ "lodash": "^4.17.21",
42
42
  "pg": "^8.3.0",
43
43
  "snake-camel": "^1.0.6",
44
44
  "uuid": "8.3.2"
@@ -46,5 +46,5 @@
46
46
  "devDependencies": {
47
47
  "@types/uuid": "^8.0.0"
48
48
  },
49
- "gitHead": "49c3c88336838184f22f35fbce298c71cd269138"
49
+ "gitHead": "b34bda5035263c74c8341b25abfb033226a27387"
50
50
  }