betterddb 0.8.0 → 0.8.2
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/src/betterddb.d.ts +137 -0
- package/dist/src/betterddb.d.ts.map +1 -0
- package/dist/src/betterddb.js +165 -0
- package/dist/src/betterddb.js.map +1 -0
- package/dist/src/builders/batch-get-builder.d.ts +16 -0
- package/dist/src/builders/batch-get-builder.d.ts.map +1 -0
- package/dist/src/builders/batch-get-builder.js +54 -0
- package/dist/src/builders/batch-get-builder.js.map +1 -0
- package/dist/src/builders/create-builder.d.ts +12 -0
- package/dist/src/builders/create-builder.d.ts.map +1 -0
- package/dist/src/builders/create-builder.js +84 -0
- package/dist/src/builders/create-builder.js.map +1 -0
- package/dist/src/builders/delete-builder.d.ts +18 -0
- package/dist/src/builders/delete-builder.d.ts.map +1 -0
- package/dist/src/builders/delete-builder.js +75 -0
- package/dist/src/builders/delete-builder.js.map +1 -0
- package/dist/src/builders/get-builder.d.ts +18 -0
- package/dist/src/builders/get-builder.d.ts.map +1 -0
- package/dist/src/builders/get-builder.js +76 -0
- package/dist/src/builders/get-builder.js.map +1 -0
- package/dist/src/builders/index.d.ts +8 -0
- package/dist/src/builders/index.d.ts.map +1 -0
- package/{src/builders/index.ts → dist/src/builders/index.js} +1 -0
- package/dist/src/builders/index.js.map +1 -0
- package/dist/src/builders/query-builder.d.ts +29 -0
- package/dist/src/builders/query-builder.d.ts.map +1 -0
- package/dist/src/builders/query-builder.js +171 -0
- package/dist/src/builders/query-builder.js.map +1 -0
- package/dist/src/builders/scan-builder.d.ts +21 -0
- package/dist/src/builders/scan-builder.d.ts.map +1 -0
- package/dist/src/builders/scan-builder.js +76 -0
- package/dist/src/builders/scan-builder.js.map +1 -0
- package/dist/src/builders/update-builder.d.ts +37 -0
- package/dist/src/builders/update-builder.d.ts.map +1 -0
- package/dist/src/builders/update-builder.js +301 -0
- package/dist/src/builders/update-builder.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{src/index.ts → dist/src/index.js} +1 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/operator.d.ts +3 -0
- package/dist/src/operator.d.ts.map +1 -0
- package/dist/src/operator.js +28 -0
- package/dist/src/operator.js.map +1 -0
- package/dist/src/types/index.d.ts +2 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/{src/types/index.ts → dist/src/types/index.js} +1 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/paginated-result.d.ts +6 -0
- package/dist/src/types/paginated-result.d.ts.map +1 -0
- package/dist/src/types/paginated-result.js +2 -0
- package/dist/src/types/paginated-result.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +9 -8
- package/.github/workflows/npm-publish.yml +0 -33
- package/.github/workflows/test.yml +0 -42
- package/CONTRIBUTING.md +0 -225
- package/LICENCSE +0 -21
- package/babel.config.cjs +0 -6
- package/docker-compose.yml +0 -16
- package/eslint.config.mjs +0 -29
- package/jest.config.cjs +0 -17
- package/prettier.config.js +0 -6
- package/src/betterddb.ts +0 -267
- package/src/builders/batch-get-builder.ts +0 -56
- package/src/builders/create-builder.ts +0 -97
- package/src/builders/delete-builder.ts +0 -87
- package/src/builders/get-builder.ts +0 -78
- package/src/builders/query-builder.ts +0 -242
- package/src/builders/scan-builder.ts +0 -98
- package/src/builders/update-builder.ts +0 -363
- package/src/operator.ts +0 -43
- package/src/types/paginated-result.ts +0 -6
- package/test/batch-get.test.ts +0 -122
- package/test/create.test.ts +0 -121
- package/test/delete.test.ts +0 -93
- package/test/get.test.ts +0 -98
- package/test/query.test.ts +0 -206
- package/test/scan.test.ts +0 -130
- package/test/update.test.ts +0 -355
- package/test/utils/table-setup.ts +0 -62
- package/tsconfig.json +0 -23
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
import {} from "../betterddb.js";
|
|
3
|
+
import { TransactGetCommand, GetCommand } from "@aws-sdk/lib-dynamodb";
|
|
4
|
+
import {} from "@aws-sdk/client-dynamodb";
|
|
5
|
+
export class GetBuilder {
|
|
6
|
+
parent;
|
|
7
|
+
key;
|
|
8
|
+
projectionExpression;
|
|
9
|
+
expressionAttributeNames = {};
|
|
10
|
+
extraTransactItems = [];
|
|
11
|
+
constructor(parent, key) {
|
|
12
|
+
this.parent = parent;
|
|
13
|
+
this.key = key;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Specify a projection by providing an array of attribute names.
|
|
17
|
+
*/
|
|
18
|
+
withProjection(attributes) {
|
|
19
|
+
this.projectionExpression = attributes
|
|
20
|
+
.map((attr) => `#${String(attr)}`)
|
|
21
|
+
.join(", ");
|
|
22
|
+
for (const attr of attributes) {
|
|
23
|
+
this.expressionAttributeNames[`#${String(attr)}`] = String(attr);
|
|
24
|
+
}
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
async execute() {
|
|
28
|
+
if (this.extraTransactItems.length > 0) {
|
|
29
|
+
// Build our update transaction item.
|
|
30
|
+
const myTransactItem = this.toTransactGet();
|
|
31
|
+
// Combine with extra transaction items.
|
|
32
|
+
const allItems = [...this.extraTransactItems, myTransactItem];
|
|
33
|
+
await this.parent.getClient().send(new TransactGetCommand({
|
|
34
|
+
TransactItems: allItems,
|
|
35
|
+
}));
|
|
36
|
+
// After transaction, retrieve the updated item.
|
|
37
|
+
const result = await this.parent.get(this.key).execute();
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const params = {
|
|
42
|
+
TableName: this.parent.getTableName(),
|
|
43
|
+
Key: this.parent.buildKey(this.key),
|
|
44
|
+
};
|
|
45
|
+
if (this.projectionExpression) {
|
|
46
|
+
params.ProjectionExpression = this.projectionExpression;
|
|
47
|
+
params.ExpressionAttributeNames = this.expressionAttributeNames;
|
|
48
|
+
}
|
|
49
|
+
const result = await this.parent.getClient().send(new GetCommand(params));
|
|
50
|
+
if (!result.Item)
|
|
51
|
+
return null;
|
|
52
|
+
return this.parent.getSchema().parse(result.Item);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
transactGet(ops) {
|
|
56
|
+
if (Array.isArray(ops)) {
|
|
57
|
+
this.extraTransactItems.push(...ops);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.extraTransactItems.push(ops);
|
|
61
|
+
}
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
toTransactGet() {
|
|
65
|
+
const getItem = {
|
|
66
|
+
TableName: this.parent.getTableName(),
|
|
67
|
+
Key: this.parent.buildKey(this.key),
|
|
68
|
+
};
|
|
69
|
+
if (this.projectionExpression) {
|
|
70
|
+
getItem.ProjectionExpression = this.projectionExpression;
|
|
71
|
+
getItem.ExpressionAttributeNames = this.expressionAttributeNames;
|
|
72
|
+
}
|
|
73
|
+
return { Get: getItem };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=get-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-builder.js","sourceRoot":"","sources":["../../../src/builders/get-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./batch-get-builder.js";
|
|
2
|
+
export * from "./create-builder.js";
|
|
3
|
+
export * from "./delete-builder.js";
|
|
4
|
+
export * from "./get-builder.js";
|
|
5
|
+
export * from "./query-builder.js";
|
|
6
|
+
export * from "./scan-builder.js";
|
|
7
|
+
export * from "./update-builder.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builders/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/builders/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type NativeAttributeValue } from "@aws-sdk/lib-dynamodb";
|
|
2
|
+
import { type BetterDDB } from "../betterddb.js";
|
|
3
|
+
import { type Operator } from "../operator.js";
|
|
4
|
+
import { type PaginatedResult } from "../types/paginated-result.js";
|
|
5
|
+
export declare class QueryBuilder<T> {
|
|
6
|
+
private parent;
|
|
7
|
+
private key;
|
|
8
|
+
private keyConditions;
|
|
9
|
+
private filterConditions;
|
|
10
|
+
private expressionAttributeNames;
|
|
11
|
+
private expressionAttributeValues;
|
|
12
|
+
private index?;
|
|
13
|
+
private limit?;
|
|
14
|
+
private lastKey?;
|
|
15
|
+
private ascending;
|
|
16
|
+
constructor(parent: BetterDDB<T>, key: Partial<T>);
|
|
17
|
+
usingIndex(indexName: string): this;
|
|
18
|
+
sortAscending(): this;
|
|
19
|
+
sortDescending(): this;
|
|
20
|
+
where(operator: Operator, values: Partial<T> | [Partial<T>, Partial<T>]): this;
|
|
21
|
+
filter(attribute: keyof T, operator: Operator, values: unknown): this;
|
|
22
|
+
limitResults(limit: number): this;
|
|
23
|
+
startFrom(lastKey: Record<string, NativeAttributeValue>): this;
|
|
24
|
+
/**
|
|
25
|
+
* Executes the query and returns a Promise that resolves with an array of items.
|
|
26
|
+
*/
|
|
27
|
+
execute(): Promise<PaginatedResult<T>>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=query-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/query-builder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,qBAAa,YAAY,CAAC,CAAC;IAWvB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAXb,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,wBAAwB,CAA8B;IAC9D,OAAO,CAAC,yBAAyB,CAAuC;IACxE,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAuC;IACvD,OAAO,CAAC,SAAS,CAAQ;gBAGf,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAclB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAyBnC,aAAa,IAAI,IAAI;IAKrB,cAAc,IAAI,IAAI;IAKtB,KAAK,CACV,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAC5C,IAAI;IA2EA,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAgDrE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAKrE;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAgCpD"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
import { QueryCommand, } from "@aws-sdk/lib-dynamodb";
|
|
3
|
+
import {} from "../betterddb.js";
|
|
4
|
+
import { getOperatorExpression } from "../operator.js";
|
|
5
|
+
import {} from "../types/paginated-result.js";
|
|
6
|
+
export class QueryBuilder {
|
|
7
|
+
parent;
|
|
8
|
+
key;
|
|
9
|
+
keyConditions = [];
|
|
10
|
+
filterConditions = [];
|
|
11
|
+
expressionAttributeNames = {};
|
|
12
|
+
expressionAttributeValues;
|
|
13
|
+
index;
|
|
14
|
+
limit;
|
|
15
|
+
lastKey;
|
|
16
|
+
ascending = true;
|
|
17
|
+
constructor(parent, key) {
|
|
18
|
+
this.parent = parent;
|
|
19
|
+
this.key = key;
|
|
20
|
+
const keys = this.parent.getKeys();
|
|
21
|
+
const pkName = keys.primary.name;
|
|
22
|
+
const builtKey = this.parent.buildKey(this.key);
|
|
23
|
+
this.expressionAttributeNames = {
|
|
24
|
+
"#pk": pkName,
|
|
25
|
+
};
|
|
26
|
+
this.expressionAttributeValues = {
|
|
27
|
+
":pk_value": builtKey[pkName],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
usingIndex(indexName) {
|
|
31
|
+
if (!this.parent.getKeys().gsis) {
|
|
32
|
+
throw new Error("No global secondary indexes defined for this table");
|
|
33
|
+
}
|
|
34
|
+
if (!(indexName in this.parent.getKeys().gsis)) {
|
|
35
|
+
throw new Error("index does not exist");
|
|
36
|
+
}
|
|
37
|
+
this.index = this.parent.getKeys().gsis[indexName];
|
|
38
|
+
if (!this.index) {
|
|
39
|
+
throw new Error("Failed to get index configuration");
|
|
40
|
+
}
|
|
41
|
+
const pkName = this.index.primary.name;
|
|
42
|
+
const builtKey = this.parent.buildIndexes(this.key);
|
|
43
|
+
this.expressionAttributeNames["#pk"] = pkName;
|
|
44
|
+
this.expressionAttributeValues[":pk_value"] = builtKey[pkName];
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
sortAscending() {
|
|
48
|
+
this.ascending = true;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
sortDescending() {
|
|
52
|
+
this.ascending = false;
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
where(operator, values) {
|
|
56
|
+
const keys = this.parent.getKeys();
|
|
57
|
+
// Determine the sort key name from either the index or the primary keys.
|
|
58
|
+
const sortKeyName = this.index ? this.index.sort?.name : keys.sort?.name;
|
|
59
|
+
if (!sortKeyName) {
|
|
60
|
+
throw new Error("Sort key is not defined for this table/index.");
|
|
61
|
+
}
|
|
62
|
+
const nameKey = "#sk";
|
|
63
|
+
this.expressionAttributeNames[nameKey] = sortKeyName;
|
|
64
|
+
// Enforce that a complex sort key requires an object input.
|
|
65
|
+
if (typeof values !== "object" || values === null) {
|
|
66
|
+
throw new Error(`For complex sort keys, please provide an object with all necessary properties.`);
|
|
67
|
+
}
|
|
68
|
+
if (operator === "between") {
|
|
69
|
+
if (!Array.isArray(values) || values.length !== 2) {
|
|
70
|
+
throw new Error(`For 'between' operator, values must be a tuple of two objects`);
|
|
71
|
+
}
|
|
72
|
+
const valueKeyStart = ":sk_start";
|
|
73
|
+
const valueKeyEnd = ":sk_end";
|
|
74
|
+
// Use the key definition's build function to build the key from the full object.
|
|
75
|
+
this.expressionAttributeValues[valueKeyStart] = this.index
|
|
76
|
+
? this.parent.buildIndexes(values[0])[sortKeyName]
|
|
77
|
+
: this.parent.buildKey(values[0])[sortKeyName];
|
|
78
|
+
this.expressionAttributeValues[valueKeyEnd] = this.index
|
|
79
|
+
? this.parent.buildIndexes(values[1])[sortKeyName]
|
|
80
|
+
: this.parent.buildKey(values[1])[sortKeyName];
|
|
81
|
+
this.keyConditions.push(`${nameKey} BETWEEN ${valueKeyStart} AND ${valueKeyEnd}`);
|
|
82
|
+
}
|
|
83
|
+
else if (operator === "begins_with") {
|
|
84
|
+
const valueKey = ":sk_value";
|
|
85
|
+
this.expressionAttributeValues[valueKey] = this.index
|
|
86
|
+
? this.parent.buildIndexes(values)[sortKeyName]
|
|
87
|
+
: this.parent.buildKey(values)[sortKeyName];
|
|
88
|
+
this.keyConditions.push(`begins_with(${nameKey}, ${valueKey})`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// For eq, lt, lte, gt, gte:
|
|
92
|
+
const valueKey = ":sk_value";
|
|
93
|
+
this.expressionAttributeValues[valueKey] = this.index
|
|
94
|
+
? this.parent.buildIndexes(values)[sortKeyName]
|
|
95
|
+
: this.parent.buildKey(values)[sortKeyName];
|
|
96
|
+
const condition = getOperatorExpression(operator, nameKey, valueKey);
|
|
97
|
+
this.keyConditions.push(condition);
|
|
98
|
+
}
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
filter(attribute, operator, values) {
|
|
102
|
+
const attrStr = String(attribute);
|
|
103
|
+
const randomString = Math.random().toString(36).substring(2, 15);
|
|
104
|
+
const placeholderName = `#attr_${attrStr}_${randomString}`;
|
|
105
|
+
this.expressionAttributeNames[placeholderName] = attrStr;
|
|
106
|
+
if (operator === "between") {
|
|
107
|
+
if (!Array.isArray(values) || values.length !== 2) {
|
|
108
|
+
throw new Error("For 'between' operator, values must be a tuple of two items");
|
|
109
|
+
}
|
|
110
|
+
const placeholderValueStart = `:val_start_${attrStr}_${randomString}`;
|
|
111
|
+
const placeholderValueEnd = `:val_end_${attrStr}_${randomString}`;
|
|
112
|
+
this.expressionAttributeValues[placeholderValueStart] =
|
|
113
|
+
values[0];
|
|
114
|
+
this.expressionAttributeValues[placeholderValueEnd] = values[1];
|
|
115
|
+
this.filterConditions.push(`${placeholderName} BETWEEN ${placeholderValueStart} AND ${placeholderValueEnd}`);
|
|
116
|
+
}
|
|
117
|
+
else if (operator === "begins_with" || operator === "contains") {
|
|
118
|
+
const placeholderValue = `:val_${attrStr}_${randomString}`;
|
|
119
|
+
this.expressionAttributeValues[placeholderValue] = values;
|
|
120
|
+
this.filterConditions.push(`${operator}(${placeholderName}, ${placeholderValue})`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const placeholderValue = `:val_${attrStr}_${randomString}`;
|
|
124
|
+
this.expressionAttributeValues[placeholderValue] = values;
|
|
125
|
+
const condition = getOperatorExpression(operator, placeholderName, placeholderValue);
|
|
126
|
+
this.filterConditions.push(condition);
|
|
127
|
+
}
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
limitResults(limit) {
|
|
131
|
+
this.limit = limit;
|
|
132
|
+
return this;
|
|
133
|
+
}
|
|
134
|
+
startFrom(lastKey) {
|
|
135
|
+
this.lastKey = lastKey;
|
|
136
|
+
return this;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Executes the query and returns a Promise that resolves with an array of items.
|
|
140
|
+
*/
|
|
141
|
+
async execute() {
|
|
142
|
+
this.keyConditions.unshift(`#pk = :pk_value`);
|
|
143
|
+
const keyConditionExpression = this.keyConditions.join(" AND ");
|
|
144
|
+
const params = {
|
|
145
|
+
TableName: this.parent.getTableName(),
|
|
146
|
+
KeyConditionExpression: keyConditionExpression,
|
|
147
|
+
ExpressionAttributeNames: this.expressionAttributeNames,
|
|
148
|
+
ExpressionAttributeValues: this.expressionAttributeValues,
|
|
149
|
+
ScanIndexForward: this.ascending,
|
|
150
|
+
Limit: this.limit,
|
|
151
|
+
ExclusiveStartKey: this.lastKey,
|
|
152
|
+
IndexName: this.index?.name ?? undefined,
|
|
153
|
+
};
|
|
154
|
+
if (this.parent.getEntityType()) {
|
|
155
|
+
this.filterConditions.push(`#entity = :entity_value`);
|
|
156
|
+
this.expressionAttributeNames["#entity"] = "entityType";
|
|
157
|
+
this.expressionAttributeValues[":entity_value"] =
|
|
158
|
+
this.parent.getEntityType();
|
|
159
|
+
}
|
|
160
|
+
params.FilterExpression =
|
|
161
|
+
this.filterConditions.length > 0
|
|
162
|
+
? this.filterConditions.join(" AND ")
|
|
163
|
+
: undefined;
|
|
164
|
+
const result = await this.parent.getClient().send(new QueryCommand(params));
|
|
165
|
+
return {
|
|
166
|
+
items: this.parent.getSchema().array().parse(result.Items),
|
|
167
|
+
lastKey: result.LastEvaluatedKey ?? undefined,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../../src/builders/query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type NativeAttributeValue } from "@aws-sdk/lib-dynamodb";
|
|
2
|
+
import { type BetterDDB } from "../betterddb.js";
|
|
3
|
+
import { type Operator } from "../operator.js";
|
|
4
|
+
import { type PaginatedResult } from "../types/paginated-result.js";
|
|
5
|
+
export declare class ScanBuilder<T> {
|
|
6
|
+
private parent;
|
|
7
|
+
private filters;
|
|
8
|
+
private expressionAttributeNames;
|
|
9
|
+
private expressionAttributeValues;
|
|
10
|
+
private limit?;
|
|
11
|
+
private lastKey?;
|
|
12
|
+
constructor(parent: BetterDDB<T>);
|
|
13
|
+
where(attribute: keyof T, operator: Operator, values: unknown): this;
|
|
14
|
+
limitResults(limit: number): this;
|
|
15
|
+
startFrom(lastKey: Record<string, NativeAttributeValue>): this;
|
|
16
|
+
/**
|
|
17
|
+
* Executes the scan and returns a Promise that resolves with an array of items.
|
|
18
|
+
*/
|
|
19
|
+
execute(): Promise<PaginatedResult<T>>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=scan-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/scan-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,qBAAa,WAAW,CAAC,CAAC;IAOZ,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,wBAAwB,CAA8B;IAC9D,OAAO,CAAC,yBAAyB,CAA4C;IAC7E,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAuC;gBAEnC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IA0CpE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAKrE;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAwBpD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
import { ScanCommand, } from "@aws-sdk/lib-dynamodb";
|
|
3
|
+
import {} from "../betterddb.js";
|
|
4
|
+
import { getOperatorExpression } from "../operator.js";
|
|
5
|
+
import {} from "../types/paginated-result.js";
|
|
6
|
+
export class ScanBuilder {
|
|
7
|
+
parent;
|
|
8
|
+
filters = [];
|
|
9
|
+
expressionAttributeNames = {};
|
|
10
|
+
expressionAttributeValues = {};
|
|
11
|
+
limit;
|
|
12
|
+
lastKey;
|
|
13
|
+
constructor(parent) {
|
|
14
|
+
this.parent = parent;
|
|
15
|
+
}
|
|
16
|
+
where(attribute, operator, values) {
|
|
17
|
+
const attrStr = String(attribute);
|
|
18
|
+
const nameKey = `#attr_${attrStr}`;
|
|
19
|
+
this.expressionAttributeNames[nameKey] = attrStr;
|
|
20
|
+
if (operator === "between") {
|
|
21
|
+
if (!Array.isArray(values) || values.length !== 2) {
|
|
22
|
+
throw new Error(`For 'between' operator, values must be a tuple of two items`);
|
|
23
|
+
}
|
|
24
|
+
const valueKeyStart = `:val_start_${attrStr}`;
|
|
25
|
+
const valueKeyEnd = `:val_end_${attrStr}`;
|
|
26
|
+
this.expressionAttributeValues[valueKeyStart] = values[0];
|
|
27
|
+
this.expressionAttributeValues[valueKeyEnd] = values[1];
|
|
28
|
+
this.filters.push(`${nameKey} BETWEEN ${valueKeyStart} AND ${valueKeyEnd}`);
|
|
29
|
+
}
|
|
30
|
+
else if (operator === "begins_with" || operator === "contains") {
|
|
31
|
+
const valueKey = `:val_${attrStr}`;
|
|
32
|
+
this.expressionAttributeValues[valueKey] = values;
|
|
33
|
+
this.filters.push(`${operator}(${nameKey}, ${valueKey})`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const valueKey = `:val_${attrStr}`;
|
|
37
|
+
this.expressionAttributeValues[valueKey] = values;
|
|
38
|
+
const condition = getOperatorExpression(operator, nameKey, valueKey);
|
|
39
|
+
this.filters.push(condition);
|
|
40
|
+
}
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
limitResults(limit) {
|
|
44
|
+
this.limit = limit;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
startFrom(lastKey) {
|
|
48
|
+
this.lastKey = lastKey;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Executes the scan and returns a Promise that resolves with an array of items.
|
|
53
|
+
*/
|
|
54
|
+
async execute() {
|
|
55
|
+
const params = {
|
|
56
|
+
TableName: this.parent.getTableName(),
|
|
57
|
+
ExpressionAttributeNames: this.expressionAttributeNames,
|
|
58
|
+
ExpressionAttributeValues: this.expressionAttributeValues,
|
|
59
|
+
Limit: this.limit,
|
|
60
|
+
ExclusiveStartKey: this.lastKey,
|
|
61
|
+
};
|
|
62
|
+
if (this.parent.getEntityType()) {
|
|
63
|
+
this.filters.push(`#entity = :entity_value`);
|
|
64
|
+
this.expressionAttributeNames["#entity"] = "entityType";
|
|
65
|
+
this.expressionAttributeValues[":entity_value"] =
|
|
66
|
+
this.parent.getEntityType();
|
|
67
|
+
}
|
|
68
|
+
params.FilterExpression = this.filters.join(" AND ");
|
|
69
|
+
const result = await this.parent.getClient().send(new ScanCommand(params));
|
|
70
|
+
return {
|
|
71
|
+
items: this.parent.getSchema().array().parse(result.Items),
|
|
72
|
+
lastKey: result.LastEvaluatedKey ?? undefined,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=scan-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-builder.js","sourceRoot":"","sources":["../../../src/builders/scan-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type NativeAttributeValue } from "@aws-sdk/lib-dynamodb";
|
|
2
|
+
import { type BetterDDB } from "../betterddb.js";
|
|
3
|
+
import { type TransactWriteItem } from "@aws-sdk/client-dynamodb";
|
|
4
|
+
export declare class UpdateBuilder<T> {
|
|
5
|
+
private parent;
|
|
6
|
+
private key;
|
|
7
|
+
private actions;
|
|
8
|
+
private condition?;
|
|
9
|
+
private extraTransactItems;
|
|
10
|
+
constructor(parent: BetterDDB<T>, key: Partial<T>);
|
|
11
|
+
set(attrs: Partial<T>): this;
|
|
12
|
+
remove(attrs: (keyof T)[]): this;
|
|
13
|
+
add(attrs: Partial<Record<keyof T, number | Set<NativeAttributeValue>>>): this;
|
|
14
|
+
delete(attrs: Partial<Record<keyof T, Set<NativeAttributeValue>>>): this;
|
|
15
|
+
/**
|
|
16
|
+
* Adds a condition expression to the update.
|
|
17
|
+
*/
|
|
18
|
+
setCondition(expression: string, attributeValues: Record<string, NativeAttributeValue>, attributeNames: Record<string, string>): this;
|
|
19
|
+
/**
|
|
20
|
+
* Specifies additional transaction items to include when executing this update as a transaction.
|
|
21
|
+
*/
|
|
22
|
+
transactWrite(ops: TransactWriteItem[] | TransactWriteItem): this;
|
|
23
|
+
/**
|
|
24
|
+
* Builds the update expression and associated maps.
|
|
25
|
+
*/
|
|
26
|
+
private buildExpression;
|
|
27
|
+
/**
|
|
28
|
+
* Returns a transaction update item that can be included in a transactWrite call.
|
|
29
|
+
*/
|
|
30
|
+
toTransactUpdate(newItemForIndexes?: T): Promise<TransactWriteItem>;
|
|
31
|
+
private createExpectedNewItem;
|
|
32
|
+
/**
|
|
33
|
+
* Commits the update immediately by calling the parent's update method.
|
|
34
|
+
*/
|
|
35
|
+
execute(): Promise<T>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=update-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/update-builder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,0BAA0B,CAAC;AASlC,qBAAa,aAAa,CAAC,CAAC;IAYxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAZb,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,SAAS,CAAC,CAIhB;IAEF,OAAO,CAAC,kBAAkB,CAA2B;gBAI3C,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAIlB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAkC5B,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI;IAKhC,GAAG,CACR,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAClE,IAAI;IAQA,MAAM,CACX,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,GACzD,IAAI;IAKP;;OAEG;IACI,YAAY,CACjB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACrD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,IAAI;IAgBP;;OAEG;IACI,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,GAAG,IAAI;IASxE;;OAEG;IACH,OAAO,CAAC,eAAe;IAmGvB;;OAEG;IACU,gBAAgB,CAC3B,iBAAiB,CAAC,EAAE,CAAC,GACpB,OAAO,CAAC,iBAAiB,CAAC;YAmBf,qBAAqB;IA2CnC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;CAqEnC"}
|