@squiz/db-lib 1.71.2 → 1.71.3
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/CHANGELOG.md +8 -0
- package/lib/AbstractRepository.d.ts +2 -0
- package/lib/AbstractRepository.d.ts.map +1 -0
- package/lib/AbstractRepository.integration.spec.d.ts +1 -0
- package/lib/AbstractRepository.integration.spec.d.ts.map +1 -0
- package/lib/AbstractRepository.integration.spec.js +118 -0
- package/lib/AbstractRepository.integration.spec.js.map +1 -0
- package/lib/AbstractRepository.js +187 -0
- package/lib/AbstractRepository.js.map +1 -0
- package/lib/ConnectionManager.d.ts +1 -0
- package/lib/ConnectionManager.d.ts.map +1 -0
- package/lib/ConnectionManager.js +58 -0
- package/lib/ConnectionManager.js.map +1 -0
- package/lib/Migrator.d.ts +1 -0
- package/lib/Migrator.d.ts.map +1 -0
- package/lib/Migrator.js +160 -0
- package/lib/Migrator.js.map +1 -0
- package/lib/PostgresErrorCodes.d.ts +1 -0
- package/lib/PostgresErrorCodes.d.ts.map +1 -0
- package/lib/PostgresErrorCodes.js +274 -0
- package/lib/PostgresErrorCodes.js.map +1 -0
- package/lib/Repositories.d.ts +1 -0
- package/lib/Repositories.d.ts.map +1 -0
- package/lib/Repositories.js +3 -0
- package/lib/Repositories.js.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.js +367 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.js.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js +698 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js.map +1 -0
- package/lib/dynamodb/DynamoDbManager.d.ts +1 -0
- package/lib/dynamodb/DynamoDbManager.d.ts.map +1 -0
- package/lib/dynamodb/DynamoDbManager.js +66 -0
- package/lib/dynamodb/DynamoDbManager.js.map +1 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts +1 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts.map +1 -0
- package/lib/dynamodb/getDynamoDbOptions.js +15 -0
- package/lib/dynamodb/getDynamoDbOptions.js.map +1 -0
- package/lib/error/DuplicateItemError.d.ts +1 -0
- package/lib/error/DuplicateItemError.d.ts.map +1 -0
- package/lib/error/DuplicateItemError.js +12 -0
- package/lib/error/DuplicateItemError.js.map +1 -0
- package/lib/error/InvalidDataFormatError.d.ts +1 -0
- package/lib/error/InvalidDataFormatError.d.ts.map +1 -0
- package/lib/error/InvalidDataFormatError.js +12 -0
- package/lib/error/InvalidDataFormatError.js.map +1 -0
- package/lib/error/InvalidDbSchemaError.d.ts +1 -0
- package/lib/error/InvalidDbSchemaError.d.ts.map +1 -0
- package/lib/error/InvalidDbSchemaError.js +12 -0
- package/lib/error/InvalidDbSchemaError.js.map +1 -0
- package/lib/error/MissingKeyValuesError.d.ts +1 -0
- package/lib/error/MissingKeyValuesError.d.ts.map +1 -0
- package/lib/error/MissingKeyValuesError.js +12 -0
- package/lib/error/MissingKeyValuesError.js.map +1 -0
- package/lib/error/TransactionError.d.ts +1 -0
- package/lib/error/TransactionError.d.ts.map +1 -0
- package/lib/error/TransactionError.js +12 -0
- package/lib/error/TransactionError.js.map +1 -0
- package/lib/getConnectionInfo.d.ts +1 -0
- package/lib/getConnectionInfo.d.ts.map +1 -0
- package/lib/getConnectionInfo.js +30 -0
- package/lib/getConnectionInfo.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +33 -70416
- package/lib/index.js.map +1 -7
- package/package.json +5 -5
- package/src/AbstractRepository.ts +26 -20
- package/src/dynamodb/AbstractDynamoDbRepository.ts +1 -1
- package/src/dynamodb/getDynamoDbOptions.ts +1 -1
- package/tsconfig.json +5 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/build.js +0 -31
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@squiz/db-lib",
|
3
|
-
"version": "1.71.
|
3
|
+
"version": "1.71.3",
|
4
4
|
"description": "",
|
5
5
|
"main": "lib/index.js",
|
6
6
|
"private": false,
|
@@ -8,7 +8,7 @@
|
|
8
8
|
"access": "public"
|
9
9
|
},
|
10
10
|
"scripts": {
|
11
|
-
"compile": "
|
11
|
+
"compile": "tsc -b",
|
12
12
|
"test": "jest -c jest.config.ts --testMatch=\"**/*.spec.ts\" --testMatch=\"!**/*.integration.spec.ts\" --passWithNoTests",
|
13
13
|
"test:integration": "jest --testMatch=\"**/*.integration.spec.ts\"",
|
14
14
|
"test:update-snapshots": "jest -c jest.config.ts --updateSnapshot",
|
@@ -19,7 +19,7 @@
|
|
19
19
|
"devDependencies": {
|
20
20
|
"@types/jest": "28.1.8",
|
21
21
|
"@types/node": "20.12.4",
|
22
|
-
"@types/pg": "8.
|
22
|
+
"@types/pg": "^8.11.8",
|
23
23
|
"aws-sdk-client-mock": "^4.0.0",
|
24
24
|
"aws-sdk-client-mock-jest": "4.0.0",
|
25
25
|
"eslint": "8.33.0",
|
@@ -36,9 +36,9 @@
|
|
36
36
|
"@aws-sdk/client-secrets-manager": "3.651.1",
|
37
37
|
"@aws-sdk/lib-dynamodb": "^3.651.1",
|
38
38
|
"@opentelemetry/api": "^1.6.0",
|
39
|
-
"@squiz/dx-common-lib": "^1.
|
39
|
+
"@squiz/dx-common-lib": "^1.68.3",
|
40
40
|
"@squiz/dx-logger-lib": "^1.64.0",
|
41
41
|
"dotenv": "16.0.3",
|
42
|
-
"pg": "8.
|
42
|
+
"pg": "^8.12.0"
|
43
43
|
}
|
44
44
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { PoolClient, Pool } from 'pg';
|
1
|
+
import { PoolClient, Pool, escapeIdentifier } from 'pg';
|
2
2
|
import { Repositories } from './Repositories';
|
3
3
|
import { InvalidUpdateValueError } from '@squiz/dx-common-lib';
|
4
4
|
|
@@ -56,19 +56,29 @@ export abstract class AbstractRepository<SHAPE extends object, DATA_CLASS extend
|
|
56
56
|
return await this.pool.connect();
|
57
57
|
}
|
58
58
|
|
59
|
+
private sanitiseValue(value: Partial<SHAPE>) {
|
60
|
+
const sanitisedValue = Object.entries(value)
|
61
|
+
.map(([key, value]) => [this.modelPropertyToSqlColumn[key as keyof SHAPE], value] as const)
|
62
|
+
.filter(([column, _v]) => !!column);
|
63
|
+
|
64
|
+
const columns = sanitisedValue.map(([column]) => escapeIdentifier(column));
|
65
|
+
const bindingParams = sanitisedValue.map((_, index) => `$${index + 1}`);
|
66
|
+
const values = sanitisedValue.map(([_column, value]) => value);
|
67
|
+
|
68
|
+
return {
|
69
|
+
columns,
|
70
|
+
bindingParams,
|
71
|
+
values,
|
72
|
+
};
|
73
|
+
}
|
74
|
+
|
59
75
|
async create(value: SHAPE, transactionClient: PoolClient | null = null): Promise<SHAPE> {
|
60
76
|
const valueAsClass = new this.classRef(value as Record<string, unknown>);
|
61
|
-
const columns =
|
62
|
-
.map((a) => `"${this.modelPropertyToSqlColumn[a as keyof SHAPE]}"`)
|
63
|
-
.join(', ');
|
64
|
-
|
65
|
-
const values = Object.values(valueAsClass)
|
66
|
-
.map((a, index) => `$${index + 1}`)
|
67
|
-
.join(', ');
|
77
|
+
const { columns, bindingParams, values } = this.sanitiseValue(valueAsClass);
|
68
78
|
|
69
79
|
const result = await this.executeQuery(
|
70
|
-
`INSERT INTO ${this.tableName} (${columns}) VALUES (${
|
71
|
-
|
80
|
+
`INSERT INTO ${this.tableName} (${columns.join(', ')}) VALUES (${bindingParams.join(', ')}) RETURNING *`,
|
81
|
+
values,
|
72
82
|
transactionClient,
|
73
83
|
);
|
74
84
|
|
@@ -84,20 +94,16 @@ export abstract class AbstractRepository<SHAPE extends object, DATA_CLASS extend
|
|
84
94
|
throw new InvalidUpdateValueError('Failed updating the repository, update values cannot be empty');
|
85
95
|
}
|
86
96
|
const whereValues = Object.values(where);
|
87
|
-
const newValues =
|
88
|
-
|
89
|
-
const
|
90
|
-
.map((a, index) => `"${this.modelPropertyToSqlColumn[a as keyof SHAPE]}" = $${index + 1}`)
|
91
|
-
.join(', ');
|
92
|
-
|
93
|
-
const whereString = this.createWhereStringFromPartialModel(where, newValues.length);
|
97
|
+
const newValues = this.sanitiseValue(newValue);
|
98
|
+
const setValues = newValues.columns.map((c, i) => `${c} = ${newValues.bindingParams[i]}`);
|
99
|
+
const whereString = this.createWhereStringFromPartialModel(where, setValues.length);
|
94
100
|
|
95
101
|
const result = await this.executeQuery(
|
96
102
|
`UPDATE ${this.tableName}
|
97
|
-
SET ${
|
103
|
+
SET ${setValues.join(', ')}
|
98
104
|
WHERE ${whereString}
|
99
105
|
RETURNING *`,
|
100
|
-
[...
|
106
|
+
[...newValues.values, ...whereValues],
|
101
107
|
transactionClient,
|
102
108
|
);
|
103
109
|
|
@@ -112,7 +118,7 @@ export abstract class AbstractRepository<SHAPE extends object, DATA_CLASS extend
|
|
112
118
|
|
113
119
|
const result = await client.query(`DELETE FROM ${this.tableName} WHERE ${whereString}`, Object.values(where));
|
114
120
|
|
115
|
-
return result.rowCount;
|
121
|
+
return result.rowCount ?? 0;
|
116
122
|
} finally {
|
117
123
|
if (client && !transactionClient) {
|
118
124
|
client.release();
|
@@ -191,7 +191,7 @@ export abstract class AbstractDynamoDbRepository<SHAPE extends object, DATA_CLAS
|
|
191
191
|
updateExpression.push(`${propName} = ${propValue}`);
|
192
192
|
expressionAttributeNames[propName] = modelProperty;
|
193
193
|
|
194
|
-
expressionAttributeValues[propValue] = newValue[modelProperty as keyof SHAPE];
|
194
|
+
expressionAttributeValues[propValue] = newValue[modelProperty as keyof SHAPE] ?? null;
|
195
195
|
}
|
196
196
|
|
197
197
|
const updateCommandInput = {
|
@@ -4,6 +4,6 @@ export const getDynamoDbOptions = (awsRegion: string, nodeEnv: 'production' | 'd
|
|
4
4
|
}
|
5
5
|
return {
|
6
6
|
credentials: { accessKeyId: 'key', secretAccessKey: 'key' },
|
7
|
-
endpoint: process.env.CI ? 'http://dynamodb-local:8000' : 'http://localhost:8000',
|
7
|
+
endpoint: process.env.CI ? 'http://dynamodb-local:8000' : process.env.DYNAMO_DB_HOST ?? 'http://localhost:8000',
|
8
8
|
};
|
9
9
|
};
|
package/tsconfig.json
CHANGED
@@ -3,9 +3,12 @@
|
|
3
3
|
"compilerOptions": {
|
4
4
|
"outDir": "lib/",
|
5
5
|
"resolveJsonModule": false,
|
6
|
+
"module": "Node16",
|
7
|
+
"moduleResolution": "Node16",
|
6
8
|
"composite": true,
|
7
|
-
"
|
8
|
-
"
|
9
|
+
"rootDir": "./src",
|
10
|
+
"declaration": true,
|
11
|
+
"declarationMap": true
|
9
12
|
},
|
10
13
|
"references": [
|
11
14
|
{
|