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.
Files changed (82) hide show
  1. package/dist/src/betterddb.d.ts +137 -0
  2. package/dist/src/betterddb.d.ts.map +1 -0
  3. package/dist/src/betterddb.js +165 -0
  4. package/dist/src/betterddb.js.map +1 -0
  5. package/dist/src/builders/batch-get-builder.d.ts +16 -0
  6. package/dist/src/builders/batch-get-builder.d.ts.map +1 -0
  7. package/dist/src/builders/batch-get-builder.js +54 -0
  8. package/dist/src/builders/batch-get-builder.js.map +1 -0
  9. package/dist/src/builders/create-builder.d.ts +12 -0
  10. package/dist/src/builders/create-builder.d.ts.map +1 -0
  11. package/dist/src/builders/create-builder.js +84 -0
  12. package/dist/src/builders/create-builder.js.map +1 -0
  13. package/dist/src/builders/delete-builder.d.ts +18 -0
  14. package/dist/src/builders/delete-builder.d.ts.map +1 -0
  15. package/dist/src/builders/delete-builder.js +75 -0
  16. package/dist/src/builders/delete-builder.js.map +1 -0
  17. package/dist/src/builders/get-builder.d.ts +18 -0
  18. package/dist/src/builders/get-builder.d.ts.map +1 -0
  19. package/dist/src/builders/get-builder.js +76 -0
  20. package/dist/src/builders/get-builder.js.map +1 -0
  21. package/dist/src/builders/index.d.ts +8 -0
  22. package/dist/src/builders/index.d.ts.map +1 -0
  23. package/{src/builders/index.ts → dist/src/builders/index.js} +1 -0
  24. package/dist/src/builders/index.js.map +1 -0
  25. package/dist/src/builders/query-builder.d.ts +29 -0
  26. package/dist/src/builders/query-builder.d.ts.map +1 -0
  27. package/dist/src/builders/query-builder.js +171 -0
  28. package/dist/src/builders/query-builder.js.map +1 -0
  29. package/dist/src/builders/scan-builder.d.ts +21 -0
  30. package/dist/src/builders/scan-builder.d.ts.map +1 -0
  31. package/dist/src/builders/scan-builder.js +76 -0
  32. package/dist/src/builders/scan-builder.js.map +1 -0
  33. package/dist/src/builders/update-builder.d.ts +37 -0
  34. package/dist/src/builders/update-builder.d.ts.map +1 -0
  35. package/dist/src/builders/update-builder.js +301 -0
  36. package/dist/src/builders/update-builder.js.map +1 -0
  37. package/dist/src/index.d.ts +5 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/{src/index.ts → dist/src/index.js} +1 -0
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/operator.d.ts +3 -0
  42. package/dist/src/operator.d.ts.map +1 -0
  43. package/dist/src/operator.js +28 -0
  44. package/dist/src/operator.js.map +1 -0
  45. package/dist/src/types/index.d.ts +2 -0
  46. package/dist/src/types/index.d.ts.map +1 -0
  47. package/{src/types/index.ts → dist/src/types/index.js} +1 -0
  48. package/dist/src/types/index.js.map +1 -0
  49. package/dist/src/types/paginated-result.d.ts +6 -0
  50. package/dist/src/types/paginated-result.d.ts.map +1 -0
  51. package/dist/src/types/paginated-result.js +2 -0
  52. package/dist/src/types/paginated-result.js.map +1 -0
  53. package/dist/tsconfig.tsbuildinfo +1 -0
  54. package/package.json +9 -8
  55. package/.github/workflows/npm-publish.yml +0 -33
  56. package/.github/workflows/test.yml +0 -42
  57. package/CONTRIBUTING.md +0 -225
  58. package/LICENCSE +0 -21
  59. package/babel.config.cjs +0 -6
  60. package/docker-compose.yml +0 -16
  61. package/eslint.config.mjs +0 -29
  62. package/jest.config.cjs +0 -17
  63. package/prettier.config.js +0 -6
  64. package/src/betterddb.ts +0 -267
  65. package/src/builders/batch-get-builder.ts +0 -56
  66. package/src/builders/create-builder.ts +0 -97
  67. package/src/builders/delete-builder.ts +0 -87
  68. package/src/builders/get-builder.ts +0 -78
  69. package/src/builders/query-builder.ts +0 -242
  70. package/src/builders/scan-builder.ts +0 -98
  71. package/src/builders/update-builder.ts +0 -363
  72. package/src/operator.ts +0 -43
  73. package/src/types/paginated-result.ts +0 -6
  74. package/test/batch-get.test.ts +0 -122
  75. package/test/create.test.ts +0 -121
  76. package/test/delete.test.ts +0 -93
  77. package/test/get.test.ts +0 -98
  78. package/test/query.test.ts +0 -206
  79. package/test/scan.test.ts +0 -130
  80. package/test/update.test.ts +0 -355
  81. package/test/utils/table-setup.ts +0 -62
  82. 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"}
@@ -5,3 +5,4 @@ export * from "./get-builder.js";
5
5
  export * from "./query-builder.js";
6
6
  export * from "./scan-builder.js";
7
7
  export * from "./update-builder.js";
8
+ //# sourceMappingURL=index.js.map
@@ -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"}