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,301 @@
1
+ /* eslint-disable no-unused-vars */
2
+ import { TransactWriteCommand, UpdateCommand, } from "@aws-sdk/lib-dynamodb";
3
+ import {} from "../betterddb.js";
4
+ import {} from "@aws-sdk/client-dynamodb";
5
+ export class UpdateBuilder {
6
+ parent;
7
+ key;
8
+ actions = {};
9
+ condition;
10
+ // When using transaction mode, we store extra transaction items.
11
+ extraTransactItems = [];
12
+ // Reference to the parent BetterDDB instance and key.
13
+ constructor(parent, key) {
14
+ this.parent = parent;
15
+ this.key = key;
16
+ }
17
+ // Chainable methods:
18
+ set(attrs) {
19
+ // Separate values into sets and removes
20
+ const { toSet, toRemove } = Object.entries(attrs).reduce((acc, [key, value]) => {
21
+ if (value === undefined ||
22
+ (typeof value === "string" &&
23
+ value.trim() === "" &&
24
+ this.parent.getSchema().shape[key]?.isOptional?.())) {
25
+ acc.toRemove.push(key);
26
+ }
27
+ else {
28
+ acc.toSet[key] = value;
29
+ }
30
+ return acc;
31
+ }, { toSet: {}, toRemove: [] });
32
+ // Handle non-empty values with set
33
+ if (Object.keys(toSet).length > 0) {
34
+ const partialSchema = this.parent.getSchema().partial();
35
+ const validated = partialSchema.parse(toSet);
36
+ this.actions.set = { ...this.actions.set, ...validated };
37
+ }
38
+ // Handle empty/undefined values with remove
39
+ if (toRemove.length > 0) {
40
+ this.remove(toRemove);
41
+ }
42
+ return this;
43
+ }
44
+ remove(attrs) {
45
+ this.actions.remove = [...(this.actions.remove ?? []), ...attrs];
46
+ return this;
47
+ }
48
+ add(attrs) {
49
+ const partialSchema = this.parent.getSchema().partial();
50
+ const validated = partialSchema.parse(attrs);
51
+ this.actions.add = { ...this.actions.add, ...validated };
52
+ return this;
53
+ }
54
+ delete(attrs) {
55
+ this.actions.delete = { ...this.actions.delete, ...attrs };
56
+ return this;
57
+ }
58
+ /**
59
+ * Adds a condition expression to the update.
60
+ */
61
+ setCondition(expression, attributeValues, attributeNames) {
62
+ if (this.condition) {
63
+ // Merge conditions with AND.
64
+ this.condition.expression += ` AND ${expression}`;
65
+ Object.assign(this.condition.attributeValues, attributeValues);
66
+ Object.assign(this.condition.attributeNames, attributeNames);
67
+ }
68
+ else {
69
+ this.condition = {
70
+ expression,
71
+ attributeValues,
72
+ attributeNames,
73
+ };
74
+ }
75
+ return this;
76
+ }
77
+ /**
78
+ * Specifies additional transaction items to include when executing this update as a transaction.
79
+ */
80
+ transactWrite(ops) {
81
+ if (Array.isArray(ops)) {
82
+ this.extraTransactItems.push(...ops);
83
+ }
84
+ else {
85
+ this.extraTransactItems.push(ops);
86
+ }
87
+ return this;
88
+ }
89
+ /**
90
+ * Builds the update expression and associated maps.
91
+ */
92
+ buildExpression(newItemForIndexes) {
93
+ const ExpressionAttributeNames = {};
94
+ const ExpressionAttributeValues = {};
95
+ const clauses = [];
96
+ // 1) SET – from actions.set
97
+ const setParts = [];
98
+ if (this.actions.set) {
99
+ for (const [attr, value] of Object.entries(this.actions.set)) {
100
+ const nameKey = `#n_${attr}`;
101
+ const valueKey = `:v_${attr}`;
102
+ ExpressionAttributeNames[nameKey] = attr;
103
+ ExpressionAttributeValues[valueKey] = value;
104
+ setParts.push(`${nameKey} = ${valueKey}`);
105
+ }
106
+ }
107
+ // 2) also SET – from index‐rebuild if requested
108
+ if (newItemForIndexes) {
109
+ const indexAttrs = this.parent.buildIndexes(newItemForIndexes);
110
+ for (const [attr, value] of Object.entries(indexAttrs)) {
111
+ const nameKey = `#n_idx_${attr}`;
112
+ const valueKey = `:v_idx_${attr}`;
113
+ ExpressionAttributeNames[nameKey] = attr;
114
+ ExpressionAttributeValues[valueKey] = value;
115
+ setParts.push(`${nameKey} = ${valueKey}`);
116
+ }
117
+ }
118
+ if (setParts.length > 0) {
119
+ clauses.push(`SET ${setParts.join(", ")}`);
120
+ }
121
+ // 3) REMOVE
122
+ if (this.actions.remove?.length) {
123
+ const removeParts = this.actions.remove.map((attr) => {
124
+ const nameKey = `#n_${String(attr)}`;
125
+ ExpressionAttributeNames[nameKey] = String(attr);
126
+ return nameKey;
127
+ });
128
+ clauses.push(`REMOVE ${removeParts.join(", ")}`);
129
+ }
130
+ // 4) ADD
131
+ if (this.actions.add) {
132
+ const addParts = [];
133
+ for (const [attr, value] of Object.entries(this.actions.add)) {
134
+ const nameKey = `#n_${attr}`;
135
+ const valueKey = `:v_${attr}`;
136
+ ExpressionAttributeNames[nameKey] = attr;
137
+ ExpressionAttributeValues[valueKey] = value;
138
+ addParts.push(`${nameKey} ${valueKey}`);
139
+ }
140
+ if (addParts.length) {
141
+ clauses.push(`ADD ${addParts.join(", ")}`);
142
+ }
143
+ }
144
+ // 5) DELETE
145
+ if (this.actions.delete) {
146
+ const deleteParts = [];
147
+ for (const [attr, value] of Object.entries(this.actions.delete)) {
148
+ const nameKey = `#n_${attr}`;
149
+ const valueKey = `:v_${attr}`;
150
+ ExpressionAttributeNames[nameKey] = attr;
151
+ ExpressionAttributeValues[valueKey] = value;
152
+ deleteParts.push(`${nameKey} ${valueKey}`);
153
+ }
154
+ if (deleteParts.length) {
155
+ clauses.push(`DELETE ${deleteParts.join(", ")}`);
156
+ }
157
+ }
158
+ // 6) merge in condition‐names/values
159
+ if (this.condition) {
160
+ Object.assign(ExpressionAttributeNames, this.condition.attributeNames);
161
+ Object.assign(ExpressionAttributeValues, this.condition.attributeValues);
162
+ }
163
+ // 7) normalize empty values
164
+ const hasValues = Object.keys(ExpressionAttributeValues).length > 0;
165
+ const finalValues = hasValues ? ExpressionAttributeValues : undefined;
166
+ if (clauses.length === 0) {
167
+ throw new Error("No attributes to update – all values were empty or undefined");
168
+ }
169
+ return {
170
+ updateExpression: clauses.join(" "),
171
+ attributeNames: ExpressionAttributeNames,
172
+ attributeValues: finalValues,
173
+ };
174
+ }
175
+ /**
176
+ * Returns a transaction update item that can be included in a transactWrite call.
177
+ */
178
+ async toTransactUpdate(newItemForIndexes) {
179
+ if (!newItemForIndexes) {
180
+ newItemForIndexes = await this.createExpectedNewItem();
181
+ }
182
+ const { updateExpression, attributeNames, attributeValues } = this.buildExpression(newItemForIndexes);
183
+ const updateItem = {
184
+ TableName: this.parent.getTableName(),
185
+ Key: this.parent.buildKey(this.key),
186
+ UpdateExpression: updateExpression,
187
+ ExpressionAttributeNames: attributeNames,
188
+ ExpressionAttributeValues: attributeValues,
189
+ };
190
+ if (this.condition?.expression) {
191
+ updateItem.ConditionExpression = this.condition.expression;
192
+ }
193
+ return { Update: updateItem };
194
+ }
195
+ async createExpectedNewItem() {
196
+ const existingItem = await this.parent.get(this.key).execute();
197
+ if (existingItem === null) {
198
+ throw new Error("Item not found");
199
+ }
200
+ const expectedNewItem = {
201
+ ...existingItem,
202
+ ...this.actions.set,
203
+ };
204
+ if (this.actions.remove) {
205
+ this.actions.remove.forEach((attr) => {
206
+ delete expectedNewItem[String(attr)];
207
+ });
208
+ }
209
+ if (this.actions.add) {
210
+ Object.entries(this.actions.add).forEach(([attr, value]) => {
211
+ const currentValue = expectedNewItem[attr] ?? 0;
212
+ if (typeof value === "number") {
213
+ expectedNewItem[attr] = currentValue + value;
214
+ }
215
+ else if (value instanceof Set) {
216
+ const currentSet = expectedNewItem[attr] instanceof Set
217
+ ? expectedNewItem[attr]
218
+ : new Set();
219
+ expectedNewItem[attr] = new Set([...currentSet, ...value]);
220
+ }
221
+ });
222
+ }
223
+ if (this.actions.delete) {
224
+ Object.entries(this.actions.delete).forEach(([attr, value]) => {
225
+ if (value instanceof Set) {
226
+ const currentSet = expectedNewItem[attr];
227
+ if (currentSet instanceof Set) {
228
+ value.forEach((v) => {
229
+ currentSet.delete(v);
230
+ });
231
+ }
232
+ }
233
+ });
234
+ }
235
+ return this.parent.getSchema().parse(expectedNewItem);
236
+ }
237
+ /**
238
+ * Commits the update immediately by calling the parent's update method.
239
+ */
240
+ async execute() {
241
+ const expectedNewItem = await this.createExpectedNewItem();
242
+ if (this.parent.getTimestamps()) {
243
+ const now = new Date().toISOString();
244
+ if (!this.actions.set) {
245
+ this.actions.set = {};
246
+ }
247
+ this.actions.set = { ...this.actions.set, updatedAt: now };
248
+ }
249
+ if (this.extraTransactItems.length > 0) {
250
+ // For transactions, we must throw if there's nothing to update
251
+ // since we can't safely skip updates in a transaction
252
+ const myTransactItem = await this.toTransactUpdate(expectedNewItem);
253
+ const allItems = [...this.extraTransactItems, myTransactItem];
254
+ await this.parent.getClient().send(new TransactWriteCommand({
255
+ TransactItems: allItems,
256
+ }));
257
+ // After transaction, retrieve the updated item.
258
+ const result = await this.parent.get(this.key).execute();
259
+ if (result === null) {
260
+ throw new Error("Item not found after transaction update");
261
+ }
262
+ return result;
263
+ }
264
+ // For normal updates, handle empty updates gracefully
265
+ try {
266
+ const { updateExpression, attributeNames, attributeValues } = this.buildExpression(expectedNewItem);
267
+ let params = {
268
+ TableName: this.parent.getTableName(),
269
+ Key: this.parent.buildKey(this.key),
270
+ UpdateExpression: updateExpression,
271
+ ExpressionAttributeNames: attributeNames,
272
+ ExpressionAttributeValues: attributeValues,
273
+ ReturnValues: "ALL_NEW",
274
+ };
275
+ if (this.condition?.expression) {
276
+ params.ConditionExpression = this.condition.expression;
277
+ }
278
+ const result = await this.parent
279
+ .getClient()
280
+ .send(new UpdateCommand(params));
281
+ if (!result.Attributes) {
282
+ throw new Error("No attributes returned after update");
283
+ }
284
+ return this.parent.getSchema().parse(result.Attributes);
285
+ }
286
+ catch (error) {
287
+ // If there's nothing to update, just return the existing item
288
+ if (error instanceof Error &&
289
+ error.message ===
290
+ "No attributes to update - all values were empty or undefined") {
291
+ const existingItem = await this.parent.get(this.key).execute();
292
+ if (existingItem === null) {
293
+ throw new Error("Item not found");
294
+ }
295
+ return existingItem;
296
+ }
297
+ throw error;
298
+ }
299
+ }
300
+ }
301
+ //# sourceMappingURL=update-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-builder.js","sourceRoot":"","sources":["../../../src/builders/update-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./betterddb.js";
2
+ export * from "./operator.js";
3
+ export * from "./builders/index.js";
4
+ export * from "./types/index.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
@@ -2,3 +2,4 @@ export * from "./betterddb.js";
2
2
  export * from "./operator.js";
3
3
  export * from "./builders/index.js";
4
4
  export * from "./types/index.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type Operator = "==" | "!=" | "<" | "<=" | ">" | ">=" | "begins_with" | "between" | "contains";
2
+ export declare function getOperatorExpression(operator: Operator, nameKey: string, valueKey: string, secondValueKey?: string): string;
3
+ //# sourceMappingURL=operator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../../src/operator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,aAAa,GACb,SAAS,GACT,UAAU,CAAC;AAEf,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CA0BR"}
@@ -0,0 +1,28 @@
1
+ export function getOperatorExpression(operator, nameKey, valueKey, secondValueKey) {
2
+ switch (operator) {
3
+ case "==":
4
+ return `${nameKey} = ${valueKey}`;
5
+ case "!=":
6
+ return `${nameKey} <> ${valueKey}`;
7
+ case "<":
8
+ return `${nameKey} < ${valueKey}`;
9
+ case "<=":
10
+ return `${nameKey} <= ${valueKey}`;
11
+ case ">":
12
+ return `${nameKey} > ${valueKey}`;
13
+ case ">=":
14
+ return `${nameKey} >= ${valueKey}`;
15
+ case "begins_with":
16
+ return `begins_with(${nameKey}, ${valueKey})`;
17
+ case "between":
18
+ if (!secondValueKey) {
19
+ throw new Error("The 'between' operator requires two value keys");
20
+ }
21
+ return `${nameKey} BETWEEN ${valueKey} AND ${secondValueKey}`;
22
+ case "contains":
23
+ return `contains(${nameKey}, ${valueKey})`;
24
+ default:
25
+ throw new Error("Unsupported operator");
26
+ }
27
+ }
28
+ //# sourceMappingURL=operator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/operator.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,qBAAqB,CACnC,QAAkB,EAClB,OAAe,EACf,QAAgB,EAChB,cAAuB;IAEvB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,GAAG,OAAO,MAAM,QAAQ,EAAE,CAAC;QACpC,KAAK,IAAI;YACP,OAAO,GAAG,OAAO,OAAO,QAAQ,EAAE,CAAC;QACrC,KAAK,GAAG;YACN,OAAO,GAAG,OAAO,MAAM,QAAQ,EAAE,CAAC;QACpC,KAAK,IAAI;YACP,OAAO,GAAG,OAAO,OAAO,QAAQ,EAAE,CAAC;QACrC,KAAK,GAAG;YACN,OAAO,GAAG,OAAO,MAAM,QAAQ,EAAE,CAAC;QACpC,KAAK,IAAI;YACP,OAAO,GAAG,OAAO,OAAO,QAAQ,EAAE,CAAC;QACrC,KAAK,aAAa;YAChB,OAAO,eAAe,OAAO,KAAK,QAAQ,GAAG,CAAC;QAChD,KAAK,SAAS;YACZ,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,GAAG,OAAO,YAAY,QAAQ,QAAQ,cAAc,EAAE,CAAC;QAChE,KAAK,UAAU;YACb,OAAO,YAAY,OAAO,KAAK,QAAQ,GAAG,CAAC;QAC7C;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./paginated-result.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -1 +1,2 @@
1
1
  export * from "./paginated-result.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type NativeAttributeValue } from "@aws-sdk/lib-dynamodb";
2
+ export type PaginatedResult<T> = {
3
+ items: T[];
4
+ lastKey: Record<string, NativeAttributeValue> | undefined;
5
+ };
6
+ //# sourceMappingURL=paginated-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginated-result.d.ts","sourceRoot":"","sources":["../../../src/types/paginated-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,SAAS,CAAC;CAC3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import {} from "@aws-sdk/lib-dynamodb";
2
+ //# sourceMappingURL=paginated-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginated-result.js","sourceRoot":"","sources":["../../../src/types/paginated-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,MAAM,uBAAuB,CAAC"}