@ftschopp/dynatable-core 1.0.0

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 (197) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +17 -0
  3. package/dist/builders/batch-get/create-batch-get-builder.d.ts +18 -0
  4. package/dist/builders/batch-get/create-batch-get-builder.d.ts.map +1 -0
  5. package/dist/builders/batch-get/create-batch-get-builder.js +71 -0
  6. package/dist/builders/batch-get/index.d.ts +3 -0
  7. package/dist/builders/batch-get/index.d.ts.map +1 -0
  8. package/dist/builders/batch-get/index.js +18 -0
  9. package/dist/builders/batch-get/types.d.ts +25 -0
  10. package/dist/builders/batch-get/types.d.ts.map +1 -0
  11. package/dist/builders/batch-get/types.js +2 -0
  12. package/dist/builders/batch-write/create-batch-write-builder.d.ts +12 -0
  13. package/dist/builders/batch-write/create-batch-write-builder.d.ts.map +1 -0
  14. package/dist/builders/batch-write/create-batch-write-builder.js +35 -0
  15. package/dist/builders/batch-write/index.d.ts +3 -0
  16. package/dist/builders/batch-write/index.d.ts.map +1 -0
  17. package/dist/builders/batch-write/index.js +18 -0
  18. package/dist/builders/batch-write/types.d.ts +30 -0
  19. package/dist/builders/batch-write/types.d.ts.map +1 -0
  20. package/dist/builders/batch-write/types.js +2 -0
  21. package/dist/builders/delete/create-delete-builder.d.ts +9 -0
  22. package/dist/builders/delete/create-delete-builder.d.ts.map +1 -0
  23. package/dist/builders/delete/create-delete-builder.js +72 -0
  24. package/dist/builders/delete/index.d.ts +3 -0
  25. package/dist/builders/delete/index.d.ts.map +1 -0
  26. package/dist/builders/delete/index.js +18 -0
  27. package/dist/builders/delete/types.d.ts +11 -0
  28. package/dist/builders/delete/types.d.ts.map +1 -0
  29. package/dist/builders/delete/types.js +2 -0
  30. package/dist/builders/get/create-get-builder.d.ts +12 -0
  31. package/dist/builders/get/create-get-builder.d.ts.map +1 -0
  32. package/dist/builders/get/create-get-builder.js +95 -0
  33. package/dist/builders/get/index.d.ts +3 -0
  34. package/dist/builders/get/index.d.ts.map +1 -0
  35. package/dist/builders/get/index.js +18 -0
  36. package/dist/builders/get/types.d.ts +28 -0
  37. package/dist/builders/get/types.d.ts.map +1 -0
  38. package/dist/builders/get/types.js +2 -0
  39. package/dist/builders/index.d.ts +12 -0
  40. package/dist/builders/index.d.ts.map +1 -0
  41. package/dist/builders/index.js +29 -0
  42. package/dist/builders/put/create-put-builder.d.ts +9 -0
  43. package/dist/builders/put/create-put-builder.d.ts.map +1 -0
  44. package/dist/builders/put/create-put-builder.js +104 -0
  45. package/dist/builders/put/index.d.ts +3 -0
  46. package/dist/builders/put/index.d.ts.map +1 -0
  47. package/dist/builders/put/index.js +18 -0
  48. package/dist/builders/put/types.d.ts +17 -0
  49. package/dist/builders/put/types.d.ts.map +1 -0
  50. package/dist/builders/put/types.js +2 -0
  51. package/dist/builders/query/create-query-builder.d.ts +9 -0
  52. package/dist/builders/query/create-query-builder.d.ts.map +1 -0
  53. package/dist/builders/query/create-query-builder.js +283 -0
  54. package/dist/builders/query/index.d.ts +3 -0
  55. package/dist/builders/query/index.d.ts.map +1 -0
  56. package/dist/builders/query/index.js +18 -0
  57. package/dist/builders/query/types.d.ts +79 -0
  58. package/dist/builders/query/types.d.ts.map +1 -0
  59. package/dist/builders/query/types.js +2 -0
  60. package/dist/builders/scan/create-scan-builder.d.ts +12 -0
  61. package/dist/builders/scan/create-scan-builder.d.ts.map +1 -0
  62. package/dist/builders/scan/create-scan-builder.js +103 -0
  63. package/dist/builders/scan/index.d.ts +3 -0
  64. package/dist/builders/scan/index.d.ts.map +1 -0
  65. package/dist/builders/scan/index.js +18 -0
  66. package/dist/builders/scan/types.d.ts +43 -0
  67. package/dist/builders/scan/types.d.ts.map +1 -0
  68. package/dist/builders/scan/types.js +2 -0
  69. package/dist/builders/shared/conditions.d.ts +18 -0
  70. package/dist/builders/shared/conditions.d.ts.map +1 -0
  71. package/dist/builders/shared/conditions.js +48 -0
  72. package/dist/builders/shared/index.d.ts +4 -0
  73. package/dist/builders/shared/index.d.ts.map +1 -0
  74. package/dist/builders/shared/index.js +19 -0
  75. package/dist/builders/shared/operators.d.ts +12 -0
  76. package/dist/builders/shared/operators.d.ts.map +1 -0
  77. package/dist/builders/shared/operators.js +197 -0
  78. package/dist/builders/shared/types.d.ts +77 -0
  79. package/dist/builders/shared/types.d.ts.map +1 -0
  80. package/dist/builders/shared/types.js +6 -0
  81. package/dist/builders/transact-get/create-transact-get-builder.d.ts +18 -0
  82. package/dist/builders/transact-get/create-transact-get-builder.d.ts.map +1 -0
  83. package/dist/builders/transact-get/create-transact-get-builder.js +60 -0
  84. package/dist/builders/transact-get/index.d.ts +3 -0
  85. package/dist/builders/transact-get/index.d.ts.map +1 -0
  86. package/dist/builders/transact-get/index.js +18 -0
  87. package/dist/builders/transact-get/types.d.ts +28 -0
  88. package/dist/builders/transact-get/types.d.ts.map +1 -0
  89. package/dist/builders/transact-get/types.js +2 -0
  90. package/dist/builders/transact-write/create-transact-write-builder.d.ts +18 -0
  91. package/dist/builders/transact-write/create-transact-write-builder.d.ts.map +1 -0
  92. package/dist/builders/transact-write/create-transact-write-builder.js +97 -0
  93. package/dist/builders/transact-write/index.d.ts +3 -0
  94. package/dist/builders/transact-write/index.d.ts.map +1 -0
  95. package/dist/builders/transact-write/index.js +18 -0
  96. package/dist/builders/transact-write/types.d.ts +34 -0
  97. package/dist/builders/transact-write/types.d.ts.map +1 -0
  98. package/dist/builders/transact-write/types.js +2 -0
  99. package/dist/builders/update/create-update-builder.d.ts +14 -0
  100. package/dist/builders/update/create-update-builder.d.ts.map +1 -0
  101. package/dist/builders/update/create-update-builder.js +180 -0
  102. package/dist/builders/update/index.d.ts +3 -0
  103. package/dist/builders/update/index.d.ts.map +1 -0
  104. package/dist/builders/update/index.js +18 -0
  105. package/dist/builders/update/types.d.ts +35 -0
  106. package/dist/builders/update/types.d.ts.map +1 -0
  107. package/dist/builders/update/types.js +2 -0
  108. package/dist/core/types.d.ts +224 -0
  109. package/dist/core/types.d.ts.map +1 -0
  110. package/dist/core/types.js +3 -0
  111. package/dist/entity.d.ts +73 -0
  112. package/dist/entity.d.ts.map +1 -0
  113. package/dist/entity.js +161 -0
  114. package/dist/index.d.ts +4 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +20 -0
  117. package/dist/table.d.ts +70 -0
  118. package/dist/table.d.ts.map +1 -0
  119. package/dist/table.js +69 -0
  120. package/dist/utils/dynamodb-logger.d.ts +118 -0
  121. package/dist/utils/dynamodb-logger.d.ts.map +1 -0
  122. package/dist/utils/dynamodb-logger.js +125 -0
  123. package/dist/utils/model-utils.d.ts +24 -0
  124. package/dist/utils/model-utils.d.ts.map +1 -0
  125. package/dist/utils/model-utils.js +88 -0
  126. package/dist/utils/zod-utils.d.ts +13 -0
  127. package/dist/utils/zod-utils.d.ts.map +1 -0
  128. package/dist/utils/zod-utils.js +35 -0
  129. package/eslint.config.mjs +4 -0
  130. package/jest.config.js +11 -0
  131. package/package.json +36 -0
  132. package/src/builders/README.md +272 -0
  133. package/src/builders/batch-get/README.md +98 -0
  134. package/src/builders/batch-get/create-batch-get-builder.test.ts +165 -0
  135. package/src/builders/batch-get/create-batch-get-builder.ts +106 -0
  136. package/src/builders/batch-get/index.ts +2 -0
  137. package/src/builders/batch-get/types.ts +29 -0
  138. package/src/builders/batch-write/README.md +204 -0
  139. package/src/builders/batch-write/create-batch-write-builder.test.ts +173 -0
  140. package/src/builders/batch-write/create-batch-write-builder.ts +49 -0
  141. package/src/builders/batch-write/index.ts +2 -0
  142. package/src/builders/batch-write/types.ts +33 -0
  143. package/src/builders/delete/create-delete-builder.test.ts +294 -0
  144. package/src/builders/delete/create-delete-builder.ts +100 -0
  145. package/src/builders/delete/index.ts +2 -0
  146. package/src/builders/delete/types.ts +11 -0
  147. package/src/builders/get/create-get-builder.test.ts +272 -0
  148. package/src/builders/get/create-get-builder.ts +140 -0
  149. package/src/builders/get/index.ts +2 -0
  150. package/src/builders/get/types.ts +30 -0
  151. package/src/builders/index.ts +14 -0
  152. package/src/builders/put/create-put-builder.test.ts +213 -0
  153. package/src/builders/put/create-put-builder.ts +151 -0
  154. package/src/builders/put/index.ts +2 -0
  155. package/src/builders/put/types.ts +18 -0
  156. package/src/builders/query/create-query-builder.test.ts +230 -0
  157. package/src/builders/query/create-query-builder.ts +353 -0
  158. package/src/builders/query/index.ts +2 -0
  159. package/src/builders/query/types.ts +95 -0
  160. package/src/builders/scan/create-scan-builder.test.ts +260 -0
  161. package/src/builders/scan/create-scan-builder.ts +217 -0
  162. package/src/builders/scan/index.ts +2 -0
  163. package/src/builders/scan/types.ts +49 -0
  164. package/src/builders/shared/conditions.ts +58 -0
  165. package/src/builders/shared/index.ts +3 -0
  166. package/src/builders/shared/operators.test.ts +270 -0
  167. package/src/builders/shared/operators.ts +200 -0
  168. package/src/builders/shared/types.ts +100 -0
  169. package/src/builders/transact-get/README.md +167 -0
  170. package/src/builders/transact-get/create-transact-get-builder.test.ts +239 -0
  171. package/src/builders/transact-get/create-transact-get-builder.ts +67 -0
  172. package/src/builders/transact-get/index.ts +2 -0
  173. package/src/builders/transact-get/types.ts +31 -0
  174. package/src/builders/transact-write/README.md +166 -0
  175. package/src/builders/transact-write/create-transact-write-builder.test.ts +288 -0
  176. package/src/builders/transact-write/create-transact-write-builder.ts +118 -0
  177. package/src/builders/transact-write/index.ts +2 -0
  178. package/src/builders/transact-write/types.ts +33 -0
  179. package/src/builders/update/create-update-builder.test.ts +333 -0
  180. package/src/builders/update/create-update-builder.ts +284 -0
  181. package/src/builders/update/index.ts +2 -0
  182. package/src/builders/update/types.ts +42 -0
  183. package/src/core/types.test.ts +506 -0
  184. package/src/core/types.ts +290 -0
  185. package/src/entity.ts +337 -0
  186. package/src/index.ts +22 -0
  187. package/src/table.ts +109 -0
  188. package/src/utils/dynamodb-logger.test.ts +246 -0
  189. package/src/utils/dynamodb-logger.ts +175 -0
  190. package/src/utils/model-utils.test.ts +232 -0
  191. package/src/utils/model-utils.ts +101 -0
  192. package/src/utils/zod-utils.test.ts +272 -0
  193. package/src/utils/zod-utils.ts +36 -0
  194. package/tests/integration/instagram-clone.integration.test.ts +966 -0
  195. package/tests/integration/pagination-timestamps.integration.test.ts +375 -0
  196. package/tests/integration/transactions.integration.test.ts +529 -0
  197. package/tsconfig.json +12 -0
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTransactGetBuilder = void 0;
4
+ const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
5
+ /**
6
+ * Creates the initial state for a TransactGet builder
7
+ */
8
+ const createInitialState = (client) => ({
9
+ client,
10
+ items: [],
11
+ });
12
+ /**
13
+ * Adds a Get operation to the transaction
14
+ */
15
+ const addGetItem = (state) => (params) => ({
16
+ ...state,
17
+ items: [...state.items, { Get: params }],
18
+ });
19
+ /**
20
+ * Converts the builder state to DynamoDB parameters
21
+ */
22
+ const toDbParams = (state) => ({
23
+ TransactItems: [...state.items],
24
+ });
25
+ /**
26
+ * Executes the transaction and returns the items
27
+ */
28
+ const execute = async (state) => {
29
+ const params = toDbParams(state);
30
+ const command = new lib_dynamodb_1.TransactGetCommand(params);
31
+ const response = await state.client.send(command);
32
+ return response.Responses?.map((r) => r.Item) || [];
33
+ };
34
+ /**
35
+ * Creates a builder from the current state
36
+ */
37
+ const createBuilder = (state) => ({
38
+ addGet: (params) => createBuilder(addGetItem(state)(params)),
39
+ dbParams: () => toDbParams(state),
40
+ execute: () => execute(state),
41
+ });
42
+ /**
43
+ * Creates a new TransactGet builder
44
+ *
45
+ * @param client - DynamoDB client instance
46
+ * @returns A TransactGetBuilder
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const [user, photo] = await createTransactGetBuilder(client)
51
+ * .addGet(getUserParams)
52
+ * .addGet(getPhotoParams)
53
+ * .execute();
54
+ * ```
55
+ */
56
+ const createTransactGetBuilder = (client) => {
57
+ const initialState = createInitialState(client);
58
+ return createBuilder(initialState);
59
+ };
60
+ exports.createTransactGetBuilder = createTransactGetBuilder;
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './create-transact-get-builder';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builders/transact-get/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./create-transact-get-builder"), exports);
@@ -0,0 +1,28 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ /**
3
+ * Represents a single Get operation in a TransactGet
4
+ */
5
+ export type TransactGetItem = {
6
+ Get: {
7
+ TableName: string;
8
+ Key: Record<string, any>;
9
+ ProjectionExpression?: string;
10
+ ExpressionAttributeNames?: Record<string, string>;
11
+ };
12
+ };
13
+ /**
14
+ * State for the TransactGet builder
15
+ */
16
+ export type TransactGetState = {
17
+ readonly client: DynamoDBClient;
18
+ readonly items: readonly TransactGetItem[];
19
+ };
20
+ /**
21
+ * TransactGet builder interface
22
+ */
23
+ export type TransactGetBuilder = {
24
+ readonly addGet: (params: any) => TransactGetBuilder;
25
+ readonly dbParams: () => any;
26
+ readonly execute: () => Promise<any[]>;
27
+ };
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/transact-get/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE;QACH,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnD,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;CAC5C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,kBAAkB,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,18 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ import { TransactWriteBuilder } from './types';
3
+ /**
4
+ * Creates a new TransactWrite builder
5
+ *
6
+ * @param client - DynamoDB client instance
7
+ * @returns A TransactWriteBuilder
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const result = await createTransactWriteBuilder(client)
12
+ * .addPut(putParams)
13
+ * .addUpdate(updateParams)
14
+ * .execute();
15
+ * ```
16
+ */
17
+ export declare const createTransactWriteBuilder: (client: DynamoDBClient) => TransactWriteBuilder;
18
+ //# sourceMappingURL=create-transact-write-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-transact-write-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/transact-write/create-transact-write-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAsB,MAAM,SAAS,CAAC;AAiGnE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,cAAc,KAAG,oBAGnE,CAAC"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTransactWriteBuilder = void 0;
4
+ const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
5
+ /**
6
+ * Creates the initial state for a TransactWrite builder
7
+ */
8
+ const createInitialState = (client) => ({
9
+ client,
10
+ items: [],
11
+ });
12
+ /**
13
+ * Adds a Put operation to the transaction
14
+ */
15
+ const addPutItem = (state) => (params) => ({
16
+ ...state,
17
+ items: [...state.items, { Put: params }],
18
+ });
19
+ /**
20
+ * Adds an Update operation to the transaction
21
+ */
22
+ const addUpdateItem = (state) => (params) => ({
23
+ ...state,
24
+ items: [...state.items, { Update: params }],
25
+ });
26
+ /**
27
+ * Adds a Delete operation to the transaction
28
+ */
29
+ const addDeleteItem = (state) => (params) => ({
30
+ ...state,
31
+ items: [...state.items, { Delete: params }],
32
+ });
33
+ /**
34
+ * Adds a ConditionCheck operation to the transaction
35
+ */
36
+ const addConditionCheckItem = (state) => (params) => ({
37
+ ...state,
38
+ items: [...state.items, { ConditionCheck: params }],
39
+ });
40
+ /**
41
+ * Sets the client request token for idempotency
42
+ */
43
+ const setClientRequestToken = (state) => (token) => ({
44
+ ...state,
45
+ clientRequestToken: token,
46
+ });
47
+ /**
48
+ * Converts the builder state to DynamoDB parameters
49
+ */
50
+ const toDbParams = (state) => {
51
+ const params = {
52
+ TransactItems: state.items,
53
+ };
54
+ if (state.clientRequestToken) {
55
+ params.ClientRequestToken = state.clientRequestToken;
56
+ }
57
+ return params;
58
+ };
59
+ /**
60
+ * Executes the transaction
61
+ */
62
+ const execute = async (state) => {
63
+ const params = toDbParams(state);
64
+ const command = new lib_dynamodb_1.TransactWriteCommand(params);
65
+ return await state.client.send(command);
66
+ };
67
+ /**
68
+ * Creates a builder from the current state
69
+ */
70
+ const createBuilder = (state) => ({
71
+ addPut: (params) => createBuilder(addPutItem(state)(params)),
72
+ addUpdate: (params) => createBuilder(addUpdateItem(state)(params)),
73
+ addDelete: (params) => createBuilder(addDeleteItem(state)(params)),
74
+ addConditionCheck: (params) => createBuilder(addConditionCheckItem(state)(params)),
75
+ withClientRequestToken: (token) => createBuilder(setClientRequestToken(state)(token)),
76
+ dbParams: () => toDbParams(state),
77
+ execute: () => execute(state),
78
+ });
79
+ /**
80
+ * Creates a new TransactWrite builder
81
+ *
82
+ * @param client - DynamoDB client instance
83
+ * @returns A TransactWriteBuilder
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const result = await createTransactWriteBuilder(client)
88
+ * .addPut(putParams)
89
+ * .addUpdate(updateParams)
90
+ * .execute();
91
+ * ```
92
+ */
93
+ const createTransactWriteBuilder = (client) => {
94
+ const initialState = createInitialState(client);
95
+ return createBuilder(initialState);
96
+ };
97
+ exports.createTransactWriteBuilder = createTransactWriteBuilder;
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './create-transact-write-builder';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builders/transact-write/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,iCAAiC,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./create-transact-write-builder"), exports);
@@ -0,0 +1,34 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ /**
3
+ * Represents a single item in a TransactWrite operation
4
+ */
5
+ export type TransactWriteItem = {
6
+ Put: any;
7
+ } | {
8
+ Update: any;
9
+ } | {
10
+ Delete: any;
11
+ } | {
12
+ ConditionCheck: any;
13
+ };
14
+ /**
15
+ * State for the TransactWrite builder
16
+ */
17
+ export type TransactWriteState = {
18
+ readonly client: DynamoDBClient;
19
+ readonly items: readonly TransactWriteItem[];
20
+ readonly clientRequestToken?: string;
21
+ };
22
+ /**
23
+ * TransactWrite builder interface
24
+ */
25
+ export type TransactWriteBuilder = {
26
+ readonly addPut: (params: any) => TransactWriteBuilder;
27
+ readonly addUpdate: (params: any) => TransactWriteBuilder;
28
+ readonly addDelete: (params: any) => TransactWriteBuilder;
29
+ readonly addConditionCheck: (params: any) => TransactWriteBuilder;
30
+ readonly withClientRequestToken: (token: string) => TransactWriteBuilder;
31
+ readonly dbParams: () => any;
32
+ readonly execute: () => Promise<any>;
33
+ };
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/transact-write/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GACZ;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,GACf;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,GACf;IAAE,cAAc,EAAE,GAAG,CAAA;CAAE,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,oBAAoB,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,oBAAoB,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,oBAAoB,CAAC;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,oBAAoB,CAAC;IAClE,QAAQ,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,oBAAoB,CAAC;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;CACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,14 @@
1
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
+ import { Condition } from '../shared';
3
+ import { UpdateBuilder, UpdateAction } from './types';
4
+ import { DynamoDBLogger } from '../../utils/dynamodb-logger';
5
+ /**
6
+ * Creates an UpdateBuilder for an item key and table.
7
+ */
8
+ export declare function createUpdateBuilder<Model>(tableName: string, key: Partial<Model>, client: DynamoDBClient, prevConditions?: Condition[], updateActions?: {
9
+ set: UpdateAction[];
10
+ remove: UpdateAction[];
11
+ add: UpdateAction[];
12
+ delete: UpdateAction[];
13
+ }, returnMode?: 'NONE' | 'ALL_OLD' | 'ALL_NEW' | 'UPDATED_OLD' | 'UPDATED_NEW', valueCounter?: number, enableTimestamps?: boolean, logger?: DynamoDBLogger): UpdateBuilder<Model>;
14
+ //# sourceMappingURL=create-update-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-update-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/update/create-update-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAgC,SAAS,EAA4B,MAAM,WAAW,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EACvC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EACnB,MAAM,EAAE,cAAc,EACtB,cAAc,GAAE,SAAS,EAAO,EAChC,aAAa,GAAE;IACb,GAAG,EAAE,YAAY,EAAE,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,GAAG,EAAE,YAAY,EAAE,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;CACuB,EAChD,UAAU,GAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,aAAsB,EACnF,YAAY,SAAI,EAChB,gBAAgB,UAAQ,EACxB,MAAM,CAAC,EAAE,cAAc,GACtB,aAAa,CAAC,KAAK,CAAC,CAkQtB"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUpdateBuilder = createUpdateBuilder;
4
+ const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
5
+ const shared_1 = require("../shared");
6
+ /**
7
+ * Creates an UpdateBuilder for an item key and table.
8
+ */
9
+ function createUpdateBuilder(tableName, key, client, prevConditions = [], updateActions = { set: [], remove: [], add: [], delete: [] }, returnMode = 'NONE', valueCounter = 0, enableTimestamps = false, logger) {
10
+ const conditions = [...prevConditions];
11
+ const getUniqueValueName = (baseName) => {
12
+ return `${baseName}_${valueCounter++}`;
13
+ };
14
+ const normalizeAttr = (attr) => {
15
+ if (typeof attr === 'string') {
16
+ return attr;
17
+ }
18
+ return attr.name;
19
+ };
20
+ const build = () => ({
21
+ where(fn) {
22
+ const attrs = new Proxy({}, {
23
+ get(_, prop) {
24
+ return { name: prop };
25
+ },
26
+ });
27
+ const opBuilder = (0, shared_1.createOpBuilder)();
28
+ const condition = fn(attrs, opBuilder);
29
+ return createUpdateBuilder(tableName, key, client, [...conditions, condition], updateActions, returnMode, valueCounter, enableTimestamps, logger);
30
+ },
31
+ set(attr, value) {
32
+ const attrName = normalizeAttr(attr);
33
+ const valueName = getUniqueValueName(attrName);
34
+ const action = {
35
+ expression: `#${attrName} = :${valueName}`,
36
+ names: { [`#${attrName}`]: attrName },
37
+ values: { [`:${valueName}`]: value },
38
+ };
39
+ return createUpdateBuilder(tableName, key, client, conditions, { ...updateActions, set: [...updateActions.set, action] }, returnMode, valueCounter, enableTimestamps, logger);
40
+ },
41
+ remove(attr) {
42
+ const attrName = normalizeAttr(attr);
43
+ const action = {
44
+ expression: `#${attrName}`,
45
+ names: { [`#${attrName}`]: attrName },
46
+ };
47
+ return createUpdateBuilder(tableName, key, client, conditions, { ...updateActions, remove: [...updateActions.remove, action] }, returnMode, valueCounter, enableTimestamps, logger);
48
+ },
49
+ add(attr, value) {
50
+ const attrName = normalizeAttr(attr);
51
+ const valueName = getUniqueValueName(attrName);
52
+ const action = {
53
+ expression: `#${attrName} :${valueName}`,
54
+ names: { [`#${attrName}`]: attrName },
55
+ values: { [`:${valueName}`]: value },
56
+ };
57
+ return createUpdateBuilder(tableName, key, client, conditions, { ...updateActions, add: [...updateActions.add, action] }, returnMode, valueCounter, enableTimestamps, logger);
58
+ },
59
+ delete(attr, value) {
60
+ const attrName = normalizeAttr(attr);
61
+ const valueName = getUniqueValueName(attrName);
62
+ const action = {
63
+ expression: `#${attrName} :${valueName}`,
64
+ names: { [`#${attrName}`]: attrName },
65
+ values: { [`:${valueName}`]: value },
66
+ };
67
+ return createUpdateBuilder(tableName, key, client, conditions, { ...updateActions, delete: [...updateActions.delete, action] }, returnMode, valueCounter, enableTimestamps, logger);
68
+ },
69
+ returning(mode) {
70
+ return createUpdateBuilder(tableName, key, client, conditions, updateActions, mode, valueCounter, enableTimestamps, logger);
71
+ },
72
+ dbParams() {
73
+ // Build UpdateExpression from actions
74
+ const updateParts = [];
75
+ const allNames = {};
76
+ const allValues = {};
77
+ // Clone updateActions to avoid mutation
78
+ const actionsToProcess = { ...updateActions };
79
+ // Add updatedAt timestamp if enabled
80
+ if (enableTimestamps) {
81
+ const now = new Date().toISOString();
82
+ const timestampAction = {
83
+ expression: `#updatedAt = :updatedAt_ts`,
84
+ names: { '#updatedAt': 'updatedAt' },
85
+ values: { ':updatedAt_ts': now },
86
+ };
87
+ actionsToProcess.set = [...actionsToProcess.set, timestampAction];
88
+ }
89
+ if (actionsToProcess.set.length > 0) {
90
+ const setExpressions = actionsToProcess.set.map((action) => {
91
+ Object.assign(allNames, action.names || {});
92
+ Object.assign(allValues, action.values || {});
93
+ return action.expression;
94
+ });
95
+ updateParts.push(`SET ${setExpressions.join(', ')}`);
96
+ }
97
+ if (updateActions.remove.length > 0) {
98
+ const removeExpressions = updateActions.remove.map((action) => {
99
+ Object.assign(allNames, action.names || {});
100
+ return action.expression;
101
+ });
102
+ updateParts.push(`REMOVE ${removeExpressions.join(', ')}`);
103
+ }
104
+ if (updateActions.add.length > 0) {
105
+ const addExpressions = updateActions.add.map((action) => {
106
+ Object.assign(allNames, action.names || {});
107
+ Object.assign(allValues, action.values || {});
108
+ return action.expression;
109
+ });
110
+ updateParts.push(`ADD ${addExpressions.join(', ')}`);
111
+ }
112
+ if (updateActions.delete.length > 0) {
113
+ const deleteExpressions = updateActions.delete.map((action) => {
114
+ Object.assign(allNames, action.names || {});
115
+ Object.assign(allValues, action.values || {});
116
+ return action.expression;
117
+ });
118
+ updateParts.push(`DELETE ${deleteExpressions.join(', ')}`);
119
+ }
120
+ const updateExpression = updateParts.join(' ');
121
+ // Build ConditionExpression from conditions
122
+ let conditionExpression = '';
123
+ let conditionNames = {};
124
+ let conditionValues = {};
125
+ if (conditions.length > 0) {
126
+ const combinedCondition = conditions.length === 1 && conditions[0]
127
+ ? conditions[0]
128
+ : {
129
+ expression: '',
130
+ operator: 'AND',
131
+ children: conditions,
132
+ };
133
+ const result = (0, shared_1.buildExpression)(combinedCondition);
134
+ conditionExpression = result.expression;
135
+ conditionNames = result.names;
136
+ conditionValues = result.values;
137
+ }
138
+ // Merge names and values
139
+ const expressionAttributeNames = {
140
+ ...allNames,
141
+ ...conditionNames,
142
+ };
143
+ const expressionAttributeValues = {
144
+ ...allValues,
145
+ ...conditionValues,
146
+ };
147
+ const extra = returnMode !== 'NONE' ? { ReturnValues: returnMode } : {};
148
+ return {
149
+ TableName: tableName,
150
+ Key: key,
151
+ ...(updateExpression && { UpdateExpression: updateExpression }),
152
+ ...(conditionExpression && {
153
+ ConditionExpression: conditionExpression,
154
+ }),
155
+ ...(Object.keys(expressionAttributeNames).length && {
156
+ ExpressionAttributeNames: expressionAttributeNames,
157
+ }),
158
+ ...(Object.keys(expressionAttributeValues).length && {
159
+ ExpressionAttributeValues: expressionAttributeValues,
160
+ }),
161
+ ...extra,
162
+ };
163
+ },
164
+ async execute() {
165
+ const params = build().dbParams();
166
+ const response = await client.send(new lib_dynamodb_1.UpdateCommand(params));
167
+ logger?.log('UpdateCommand', params, response);
168
+ // Return the updated item based on returnMode
169
+ if (returnMode === 'ALL_NEW' && response.Attributes) {
170
+ return response.Attributes;
171
+ }
172
+ if (returnMode === 'UPDATED_NEW' && response.Attributes) {
173
+ return response.Attributes;
174
+ }
175
+ // For other modes, return the key as a fallback
176
+ return key;
177
+ },
178
+ });
179
+ return build();
180
+ }
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './create-update-builder';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builders/update/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./create-update-builder"), exports);
@@ -0,0 +1,35 @@
1
+ import { OperationBuilder, AttrRef } from '../shared';
2
+ /**
3
+ * Update actions that can be performed on attributes
4
+ */
5
+ export type UpdateAction = {
6
+ expression: string;
7
+ names?: Record<string, string>;
8
+ values?: Record<string, any>;
9
+ };
10
+ /**
11
+ * Builder interface for DynamoDB UpdateItem operations
12
+ */
13
+ export interface UpdateBuilder<Model> extends OperationBuilder<Model> {
14
+ /**
15
+ * Sets an attribute to a specific value
16
+ */
17
+ set(attr: keyof Model | AttrRef, value: any): UpdateBuilder<Model>;
18
+ /**
19
+ * Removes an attribute from the item
20
+ */
21
+ remove(attr: keyof Model | AttrRef): UpdateBuilder<Model>;
22
+ /**
23
+ * Adds a value to a number attribute or adds elements to a set
24
+ */
25
+ add(attr: keyof Model | AttrRef, value: any): UpdateBuilder<Model>;
26
+ /**
27
+ * Deletes elements from a set attribute
28
+ */
29
+ delete(attr: keyof Model | AttrRef, value: any): UpdateBuilder<Model>;
30
+ /**
31
+ * Configures what values should be returned after the update operation
32
+ */
33
+ returning(mode: 'NONE' | 'ALL_OLD' | 'ALL_NEW' | 'UPDATED_OLD' | 'UPDATED_NEW'): UpdateBuilder<Model>;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/update/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IACnE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEtE;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,GACnE,aAAa,CAAC,KAAK,CAAC,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });