@squiz/db-lib 1.66.3 → 1.68.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +12 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts +12 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +687 -7587
- package/lib/index.js.map +4 -4
- package/package.json +6 -4
- package/src/dynamodb/AbstractDynamoDbRepository.spec.ts +0 -18
- package/src/dynamodb/AbstractDynamoDbRepository.ts +7 -15
- package/src/dynamodb/getDynamoDbOptions.ts +9 -0
- package/src/index.ts +1 -0
- package/tsconfig.tsbuildinfo +1 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@squiz/db-lib",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.68.0",
|
4
4
|
"description": "",
|
5
5
|
"main": "lib/index.js",
|
6
6
|
"private": false,
|
@@ -20,6 +20,8 @@
|
|
20
20
|
"@types/jest": "28.1.8",
|
21
21
|
"@types/node": "20.12.4",
|
22
22
|
"@types/pg": "8.6.6",
|
23
|
+
"aws-sdk-client-mock": "^4.0.0",
|
24
|
+
"aws-sdk-client-mock-jest": "4.0.0",
|
23
25
|
"eslint": "8.33.0",
|
24
26
|
"fs-extra": "11.1.0",
|
25
27
|
"jest": "29.4.1",
|
@@ -27,12 +29,12 @@
|
|
27
29
|
"ts-jest": "29.0.5",
|
28
30
|
"ts-loader": "9.3.1",
|
29
31
|
"ts-node": "10.9.2",
|
30
|
-
"typescript": "4.9.4"
|
31
|
-
"aws-sdk-client-mock": "^4.0.0",
|
32
|
-
"aws-sdk-client-mock-jest": "4.0.0"
|
32
|
+
"typescript": "4.9.4"
|
33
33
|
},
|
34
34
|
"dependencies": {
|
35
|
+
"@aws-sdk/client-dynamodb": "^3.632.0",
|
35
36
|
"@aws-sdk/client-secrets-manager": "3.614.0",
|
37
|
+
"@aws-sdk/lib-dynamodb": "^3.632.0",
|
36
38
|
"@squiz/dx-common-lib": "^1.66.4",
|
37
39
|
"@squiz/dx-logger-lib": "^1.64.0",
|
38
40
|
"dotenv": "16.0.3",
|
@@ -22,7 +22,6 @@ import { MissingKeyValuesError, InvalidDbSchemaError } from '..';
|
|
22
22
|
import { mockClient } from 'aws-sdk-client-mock';
|
23
23
|
import 'aws-sdk-client-mock-jest';
|
24
24
|
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
25
|
-
import { DuplicateItemError } from '../error/DuplicateItemError';
|
26
25
|
import crypto from 'crypto';
|
27
26
|
|
28
27
|
const ddbClientMock = mockClient(DynamoDBDocumentClient);
|
@@ -167,23 +166,6 @@ describe('AbstractRepository', () => {
|
|
167
166
|
await expect(repository.createItem(item)).rejects.toEqual(new Error('Invalid "data"'));
|
168
167
|
});
|
169
168
|
|
170
|
-
it('should throw error if item already exists input', async () => {
|
171
|
-
ddbClientMock.on(PutCommand).rejects(
|
172
|
-
new ConditionalCheckFailedException({
|
173
|
-
$metadata: {},
|
174
|
-
message: 'already exists',
|
175
|
-
}),
|
176
|
-
);
|
177
|
-
|
178
|
-
const item = {
|
179
|
-
name: 'foo',
|
180
|
-
age: 99,
|
181
|
-
country: 'au',
|
182
|
-
data: {},
|
183
|
-
};
|
184
|
-
await expect(repository.createItem(item)).rejects.toEqual(new DuplicateItemError('Item already exists'));
|
185
|
-
});
|
186
|
-
|
187
169
|
it('should throw error if excess column in input', async () => {
|
188
170
|
const item = {
|
189
171
|
name: 'foo',
|
@@ -1,5 +1,3 @@
|
|
1
|
-
import { ConditionalCheckFailedException } from '@aws-sdk/client-dynamodb';
|
2
|
-
|
3
1
|
import {
|
4
2
|
DynamoDBDocument,
|
5
3
|
QueryCommandInput,
|
@@ -8,7 +6,7 @@ import {
|
|
8
6
|
DeleteCommandInput,
|
9
7
|
} from '@aws-sdk/lib-dynamodb';
|
10
8
|
|
11
|
-
import { Transaction, DynamoDbManager, MissingKeyValuesError,
|
9
|
+
import { Transaction, DynamoDbManager, MissingKeyValuesError, InvalidDbSchemaError } from '..';
|
12
10
|
|
13
11
|
interface Reader<T> {
|
14
12
|
queryItems(partialItem: Partial<T>, useSortKey?: boolean, index?: keyof TableIndexes): Promise<T[]>;
|
@@ -214,8 +212,8 @@ export abstract class AbstractDynamoDbRepository<SHAPE extends object, DATA_CLAS
|
|
214
212
|
...updateCommandInput,
|
215
213
|
ReturnValues: 'ALL_NEW',
|
216
214
|
});
|
217
|
-
} catch (e) {
|
218
|
-
if (e
|
215
|
+
} catch (e: any) {
|
216
|
+
if (e && e.name === 'ConditionalCheckFailedException') {
|
219
217
|
return undefined;
|
220
218
|
}
|
221
219
|
throw e;
|
@@ -275,14 +273,8 @@ export abstract class AbstractDynamoDbRepository<SHAPE extends object, DATA_CLAS
|
|
275
273
|
return value;
|
276
274
|
}
|
277
275
|
|
278
|
-
|
279
|
-
|
280
|
-
} catch (e) {
|
281
|
-
if (e instanceof ConditionalCheckFailedException) {
|
282
|
-
throw new DuplicateItemError(`Item already exists`);
|
283
|
-
}
|
284
|
-
throw e;
|
285
|
-
}
|
276
|
+
await this.client.put(putCommandInput);
|
277
|
+
|
286
278
|
return value;
|
287
279
|
}
|
288
280
|
|
@@ -315,8 +307,8 @@ export abstract class AbstractDynamoDbRepository<SHAPE extends object, DATA_CLAS
|
|
315
307
|
|
316
308
|
try {
|
317
309
|
await this.client.delete(deleteCommandInput);
|
318
|
-
} catch (e) {
|
319
|
-
if (e
|
310
|
+
} catch (e: any) {
|
311
|
+
if (e && e.name === 'ConditionalCheckFailedException') {
|
320
312
|
return 0;
|
321
313
|
}
|
322
314
|
throw e;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
export const getDynamoDbOptions = (awsRegion: string, nodeEnv: 'production' | 'development') => {
|
2
|
+
if (nodeEnv === 'production') {
|
3
|
+
return { region: awsRegion };
|
4
|
+
}
|
5
|
+
return {
|
6
|
+
credentials: { accessKeyId: 'key', secretAccessKey: 'key' },
|
7
|
+
endpoint: process.env.CI ? 'http://dynamodb-local:8000' : 'http://localhost:8000',
|
8
|
+
};
|
9
|
+
};
|
package/src/index.ts
CHANGED
@@ -2,6 +2,7 @@ export * from './AbstractRepository';
|
|
2
2
|
export * from './ConnectionManager';
|
3
3
|
export * from './dynamodb/DynamoDbManager';
|
4
4
|
export * from './dynamodb/AbstractDynamoDbRepository';
|
5
|
+
export * from './dynamodb/getDynamoDbOptions';
|
5
6
|
export * from './Migrator';
|
6
7
|
export * from './Repositories';
|
7
8
|
export * from './getConnectionInfo';
|