effect-dynamodb 0.1.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -0
  3. package/dist/Aggregate.d.ts +210 -0
  4. package/dist/Aggregate.d.ts.map +1 -0
  5. package/dist/Aggregate.js +1169 -0
  6. package/dist/Aggregate.js.map +1 -0
  7. package/dist/Batch.d.ts +62 -0
  8. package/dist/Batch.d.ts.map +1 -0
  9. package/dist/Batch.js +218 -0
  10. package/dist/Batch.js.map +1 -0
  11. package/dist/Collection.d.ts +58 -0
  12. package/dist/Collection.d.ts.map +1 -0
  13. package/dist/Collection.js +195 -0
  14. package/dist/Collection.js.map +1 -0
  15. package/dist/Collections.d.ts +121 -0
  16. package/dist/Collections.d.ts.map +1 -0
  17. package/dist/Collections.js +121 -0
  18. package/dist/Collections.js.map +1 -0
  19. package/dist/DynamoClient.d.ts +317 -0
  20. package/dist/DynamoClient.d.ts.map +1 -0
  21. package/dist/DynamoClient.js +653 -0
  22. package/dist/DynamoClient.js.map +1 -0
  23. package/dist/DynamoModel.d.ts +278 -0
  24. package/dist/DynamoModel.d.ts.map +1 -0
  25. package/dist/DynamoModel.js +453 -0
  26. package/dist/DynamoModel.js.map +1 -0
  27. package/dist/DynamoSchema.d.ts +137 -0
  28. package/dist/DynamoSchema.d.ts.map +1 -0
  29. package/dist/DynamoSchema.js +188 -0
  30. package/dist/DynamoSchema.js.map +1 -0
  31. package/dist/Entity.d.ts +628 -0
  32. package/dist/Entity.d.ts.map +1 -0
  33. package/dist/Entity.js +2371 -0
  34. package/dist/Entity.js.map +1 -0
  35. package/dist/Errors.d.ts +227 -0
  36. package/dist/Errors.d.ts.map +1 -0
  37. package/dist/Errors.js +93 -0
  38. package/dist/Errors.js.map +1 -0
  39. package/dist/EventStore.d.ts +208 -0
  40. package/dist/EventStore.d.ts.map +1 -0
  41. package/dist/EventStore.js +333 -0
  42. package/dist/EventStore.js.map +1 -0
  43. package/dist/Expression.d.ts +50 -0
  44. package/dist/Expression.d.ts.map +1 -0
  45. package/dist/Expression.js +170 -0
  46. package/dist/Expression.js.map +1 -0
  47. package/dist/KeyComposer.d.ts +125 -0
  48. package/dist/KeyComposer.d.ts.map +1 -0
  49. package/dist/KeyComposer.js +257 -0
  50. package/dist/KeyComposer.js.map +1 -0
  51. package/dist/Marshaller.d.ts +30 -0
  52. package/dist/Marshaller.d.ts.map +1 -0
  53. package/dist/Marshaller.js +115 -0
  54. package/dist/Marshaller.js.map +1 -0
  55. package/dist/Projection.d.ts +28 -0
  56. package/dist/Projection.d.ts.map +1 -0
  57. package/dist/Projection.js +39 -0
  58. package/dist/Projection.js.map +1 -0
  59. package/dist/Query.d.ts +214 -0
  60. package/dist/Query.d.ts.map +1 -0
  61. package/dist/Query.js +397 -0
  62. package/dist/Query.js.map +1 -0
  63. package/dist/Table.d.ts +178 -0
  64. package/dist/Table.d.ts.map +1 -0
  65. package/dist/Table.js +211 -0
  66. package/dist/Table.js.map +1 -0
  67. package/dist/Transaction.d.ts +79 -0
  68. package/dist/Transaction.d.ts.map +1 -0
  69. package/dist/Transaction.js +215 -0
  70. package/dist/Transaction.js.map +1 -0
  71. package/dist/_AggregateCursor.d.ts +44 -0
  72. package/dist/_AggregateCursor.d.ts.map +1 -0
  73. package/dist/_AggregateCursor.js +18 -0
  74. package/dist/_AggregateCursor.js.map +1 -0
  75. package/dist/_AggregateEdges.d.ts +77 -0
  76. package/dist/_AggregateEdges.d.ts.map +1 -0
  77. package/dist/_AggregateEdges.js +41 -0
  78. package/dist/_AggregateEdges.js.map +1 -0
  79. package/dist/_AggregateSchemas.d.ts +69 -0
  80. package/dist/_AggregateSchemas.d.ts.map +1 -0
  81. package/dist/_AggregateSchemas.js +194 -0
  82. package/dist/_AggregateSchemas.js.map +1 -0
  83. package/dist/_AggregateTypes.d.ts +94 -0
  84. package/dist/_AggregateTypes.d.ts.map +1 -0
  85. package/dist/_AggregateTypes.js +7 -0
  86. package/dist/_AggregateTypes.js.map +1 -0
  87. package/dist/_EntityCombinators.d.ts +155 -0
  88. package/dist/_EntityCombinators.d.ts.map +1 -0
  89. package/dist/_EntityCombinators.js +158 -0
  90. package/dist/_EntityCombinators.js.map +1 -0
  91. package/dist/_EntityConfig.d.ts +100 -0
  92. package/dist/_EntityConfig.d.ts.map +1 -0
  93. package/dist/_EntityConfig.js +7 -0
  94. package/dist/_EntityConfig.js.map +1 -0
  95. package/dist/_EntityOps.d.ts +205 -0
  96. package/dist/_EntityOps.d.ts.map +1 -0
  97. package/dist/_EntityOps.js +137 -0
  98. package/dist/_EntityOps.js.map +1 -0
  99. package/dist/_EntitySchemas.d.ts +57 -0
  100. package/dist/_EntitySchemas.d.ts.map +1 -0
  101. package/dist/_EntitySchemas.js +298 -0
  102. package/dist/_EntitySchemas.js.map +1 -0
  103. package/dist/_EntityTypes.d.ts +81 -0
  104. package/dist/_EntityTypes.d.ts.map +1 -0
  105. package/dist/_EntityTypes.js +7 -0
  106. package/dist/_EntityTypes.js.map +1 -0
  107. package/dist/_sparse_check.d.ts +2 -0
  108. package/dist/_sparse_check.d.ts.map +1 -0
  109. package/dist/_sparse_check.js +193 -0
  110. package/dist/_sparse_check.js.map +1 -0
  111. package/dist/index.d.ts +35 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +20 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/internal/AggregateCursor.d.ts +44 -0
  116. package/dist/internal/AggregateCursor.d.ts.map +1 -0
  117. package/dist/internal/AggregateCursor.js +18 -0
  118. package/dist/internal/AggregateCursor.js.map +1 -0
  119. package/dist/internal/AggregateEdges.d.ts +77 -0
  120. package/dist/internal/AggregateEdges.d.ts.map +1 -0
  121. package/dist/internal/AggregateEdges.js +41 -0
  122. package/dist/internal/AggregateEdges.js.map +1 -0
  123. package/dist/internal/AggregateSchemas.d.ts +69 -0
  124. package/dist/internal/AggregateSchemas.d.ts.map +1 -0
  125. package/dist/internal/AggregateSchemas.js +193 -0
  126. package/dist/internal/AggregateSchemas.js.map +1 -0
  127. package/dist/internal/AggregateTypes.d.ts +94 -0
  128. package/dist/internal/AggregateTypes.d.ts.map +1 -0
  129. package/dist/internal/AggregateTypes.js +7 -0
  130. package/dist/internal/AggregateTypes.js.map +1 -0
  131. package/dist/internal/BoundQuery.d.ts +107 -0
  132. package/dist/internal/BoundQuery.d.ts.map +1 -0
  133. package/dist/internal/BoundQuery.js +111 -0
  134. package/dist/internal/BoundQuery.js.map +1 -0
  135. package/dist/internal/EntityCombinators.d.ts +173 -0
  136. package/dist/internal/EntityCombinators.d.ts.map +1 -0
  137. package/dist/internal/EntityCombinators.js +183 -0
  138. package/dist/internal/EntityCombinators.js.map +1 -0
  139. package/dist/internal/EntityConfig.d.ts +100 -0
  140. package/dist/internal/EntityConfig.d.ts.map +1 -0
  141. package/dist/internal/EntityConfig.js +7 -0
  142. package/dist/internal/EntityConfig.js.map +1 -0
  143. package/dist/internal/EntityOps.d.ts +268 -0
  144. package/dist/internal/EntityOps.d.ts.map +1 -0
  145. package/dist/internal/EntityOps.js +153 -0
  146. package/dist/internal/EntityOps.js.map +1 -0
  147. package/dist/internal/EntitySchemas.d.ts +57 -0
  148. package/dist/internal/EntitySchemas.d.ts.map +1 -0
  149. package/dist/internal/EntitySchemas.js +299 -0
  150. package/dist/internal/EntitySchemas.js.map +1 -0
  151. package/dist/internal/EntityTypes.d.ts +128 -0
  152. package/dist/internal/EntityTypes.d.ts.map +1 -0
  153. package/dist/internal/EntityTypes.js +7 -0
  154. package/dist/internal/EntityTypes.js.map +1 -0
  155. package/dist/internal/Expr.d.ts +141 -0
  156. package/dist/internal/Expr.d.ts.map +1 -0
  157. package/dist/internal/Expr.js +332 -0
  158. package/dist/internal/Expr.js.map +1 -0
  159. package/dist/internal/PathBuilder.d.ts +88 -0
  160. package/dist/internal/PathBuilder.d.ts.map +1 -0
  161. package/dist/internal/PathBuilder.js +100 -0
  162. package/dist/internal/PathBuilder.js.map +1 -0
  163. package/dist/internal/TransactableOps.d.ts +25 -0
  164. package/dist/internal/TransactableOps.d.ts.map +1 -0
  165. package/dist/internal/TransactableOps.js +58 -0
  166. package/dist/internal/TransactableOps.js.map +1 -0
  167. package/dist/internal/sparse_check.d.ts +2 -0
  168. package/dist/internal/sparse_check.d.ts.map +1 -0
  169. package/dist/internal/sparse_check.js +196 -0
  170. package/dist/internal/sparse_check.js.map +1 -0
  171. package/package.json +71 -0
package/dist/Table.js ADDED
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Table — Groups entities sharing a physical DynamoDB table and application namespace.
3
+ *
4
+ * The Table holds a DynamoSchema reference for key prefix generation and
5
+ * a record of named entities (and optionally aggregates).
6
+ * The physical table name is provided at runtime via Effect Layers.
7
+ *
8
+ * Use `DynamoClient.make()` to get a typed client with bound entity operations.
9
+ */
10
+ import { Context, Effect, Layer } from "effect";
11
+ /**
12
+ * Counter for generating unique Tag identifiers.
13
+ * Each `make()` call increments this to ensure distinct Context.Service tags.
14
+ */
15
+ let tableCounter = 0;
16
+ /**
17
+ * Create a new Table definition with optional entity and aggregate members.
18
+ *
19
+ * Each call to `make` creates a new unique Context.Service, so different tables
20
+ * produce independent runtime configurations even when sharing the same schema.
21
+ *
22
+ * Entities are automatically configured with the table's schema and tag.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const MainTable = Table.make({
27
+ * schema: AppSchema,
28
+ * entities: { Users, Tasks },
29
+ * aggregates: { Matches },
30
+ * })
31
+ *
32
+ * // Provide physical table name at the edge
33
+ * MainTable.layer({ name: "my-prod-table" })
34
+ *
35
+ * // Or from environment variables via Effect Config
36
+ * MainTable.layerConfig({ name: Config.string("TABLE_NAME") })
37
+ * ```
38
+ */
39
+ export const make = (config) => {
40
+ const id = tableCounter++;
41
+ const Tag = Context.Service(`@effect-dynamodb/Table/${config.schema.name}/${id}`);
42
+ const entities = (config.entities ?? {});
43
+ const aggregates = (config.aggregates ?? {});
44
+ // Configure all entities with this table's schema and tag
45
+ for (const entity of Object.values(entities)) {
46
+ if (typeof entity._configure === "function") {
47
+ entity._configure(config.schema, Tag);
48
+ }
49
+ }
50
+ return {
51
+ _tag: "Table",
52
+ schema: config.schema,
53
+ entities,
54
+ aggregates,
55
+ Tag,
56
+ layer: (tableConfig) => Layer.succeed(Tag, tableConfig),
57
+ layerConfig: (configDef) => Layer.effect(Tag, Effect.gen(function* () {
58
+ const tableName = yield* configDef.name;
59
+ return { name: tableName };
60
+ })),
61
+ };
62
+ };
63
+ /**
64
+ * Derive CreateTable input from a table's registered members.
65
+ *
66
+ * Scans all entity index definitions and aggregate GSI configs to produce:
67
+ * - KeySchema (from primary index)
68
+ * - AttributeDefinitions (all unique key attributes)
69
+ * - GlobalSecondaryIndexes (from non-primary entity indexes + aggregate list indexes,
70
+ * plus aggregate collection indexes whose PK does not match the base table PK)
71
+ * - LocalSecondaryIndexes (from aggregate collection indexes whose PK equals the base
72
+ * table PK — DynamoDB LSIs by definition share the base table's partition key)
73
+ *
74
+ * The physical table name is omitted — that's deployment config.
75
+ * All key attributes are typed as "S" (String) since generated keys are always strings.
76
+ *
77
+ * LSI auto-detection: an aggregate's `collection` GSI config is emitted as an LSI
78
+ * iff `agg.pkField` equals the table's primary PK field (determined from the first
79
+ * entity's primary index). This matches DynamoDB semantics — any index that shares
80
+ * the base table's partition key IS an LSI — and makes `lsi1`..`lsi5`-style indexes
81
+ * on aggregates work transparently with `db.tables.*.create()`.
82
+ */
83
+ export const definition = (table) => {
84
+ const members = [
85
+ ...Object.values(table.entities),
86
+ ...Object.values(table.aggregates),
87
+ ];
88
+ if (members.length === 0) {
89
+ throw new Error("Table.definition requires at least one entity or aggregate");
90
+ }
91
+ // Pass 1: determine the table's primary PK/SK from the first entity's primary index.
92
+ // This is needed before we can classify aggregate collection indexes as LSI vs GSI.
93
+ let primaryPk;
94
+ let primarySk;
95
+ for (const member of members) {
96
+ if ("_tag" in member && member._tag === "Aggregate")
97
+ continue;
98
+ const entity = member;
99
+ const primary = entity.indexes.primary;
100
+ if (primary) {
101
+ primaryPk = primary.pk.field;
102
+ primarySk = primary.sk.field;
103
+ break;
104
+ }
105
+ }
106
+ if (primaryPk === undefined) {
107
+ throw new Error("No primary index found on any entity");
108
+ }
109
+ // Pass 2: collect attribute names and classify indexes (GSI vs LSI).
110
+ const attributeNames = new Set();
111
+ const gsiMap = new Map();
112
+ const lsiMap = new Map();
113
+ // Always include the primary key fields in attribute definitions.
114
+ attributeNames.add(primaryPk);
115
+ if (primarySk !== undefined && primarySk !== primaryPk) {
116
+ attributeNames.add(primarySk);
117
+ }
118
+ for (const member of members) {
119
+ if ("_tag" in member && member._tag === "Aggregate") {
120
+ // Aggregate — extract collection and list index configs
121
+ const agg = member;
122
+ // Collection index: PK = aggregate's pkField, SK = collection sk field.
123
+ // If pkField matches the table's primary PK, emit as an LSI (DynamoDB requires
124
+ // LSIs to share the base table's HASH key). Otherwise fall back to GSI — this
125
+ // preserves behaviour for any user whose collection uses a distinct PK attribute.
126
+ const collectionIndex = agg.collection.index;
127
+ attributeNames.add(agg.pkField);
128
+ attributeNames.add(agg.collection.sk.field);
129
+ if (agg.pkField === primaryPk) {
130
+ if (!lsiMap.has(collectionIndex) && !gsiMap.has(collectionIndex)) {
131
+ lsiMap.set(collectionIndex, { pk: agg.pkField, sk: agg.collection.sk.field });
132
+ }
133
+ }
134
+ else {
135
+ if (!gsiMap.has(collectionIndex) && !lsiMap.has(collectionIndex)) {
136
+ gsiMap.set(collectionIndex, { pk: agg.pkField, sk: agg.collection.sk.field });
137
+ }
138
+ }
139
+ // List GSI (if configured) — always a GSI; has its own PK attribute.
140
+ if (agg.listIndex) {
141
+ attributeNames.add(agg.listIndex.pk.field);
142
+ attributeNames.add(agg.listIndex.sk.field);
143
+ if (!gsiMap.has(agg.listIndex.index) && !lsiMap.has(agg.listIndex.index)) {
144
+ gsiMap.set(agg.listIndex.index, {
145
+ pk: agg.listIndex.pk.field,
146
+ sk: agg.listIndex.sk.field,
147
+ });
148
+ }
149
+ }
150
+ }
151
+ else {
152
+ // Entity — scan index definitions
153
+ const entity = member;
154
+ for (const [indexName, index] of Object.entries(entity.indexes)) {
155
+ if (!index)
156
+ continue;
157
+ attributeNames.add(index.pk.field);
158
+ attributeNames.add(index.sk.field);
159
+ if (indexName === "primary") {
160
+ // Primary key already captured in pass 1.
161
+ continue;
162
+ }
163
+ if (index.index) {
164
+ // Entity-declared secondary index — always a GSI. Entity index definitions
165
+ // don't carry LSI semantics; LSIs are only introduced via aggregate collections.
166
+ if (!gsiMap.has(index.index) && !lsiMap.has(index.index)) {
167
+ gsiMap.set(index.index, { pk: index.pk.field, sk: index.sk.field });
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ const KeySchema = [{ AttributeName: primaryPk, KeyType: "HASH" }];
174
+ if (primarySk !== undefined && primarySk !== primaryPk) {
175
+ KeySchema.push({ AttributeName: primarySk, KeyType: "RANGE" });
176
+ }
177
+ const AttributeDefinitions = Array.from(attributeNames)
178
+ .sort()
179
+ .map((name) => ({ AttributeName: name, AttributeType: "S" }));
180
+ const GlobalSecondaryIndexes = gsiMap.size > 0
181
+ ? Array.from(gsiMap.entries())
182
+ .sort(([a], [b]) => a.localeCompare(b))
183
+ .map(([indexName, keys]) => ({
184
+ IndexName: indexName,
185
+ KeySchema: [
186
+ { AttributeName: keys.pk, KeyType: "HASH" },
187
+ { AttributeName: keys.sk, KeyType: "RANGE" },
188
+ ],
189
+ Projection: { ProjectionType: "ALL" },
190
+ }))
191
+ : undefined;
192
+ const LocalSecondaryIndexes = lsiMap.size > 0
193
+ ? Array.from(lsiMap.entries())
194
+ .sort(([a], [b]) => a.localeCompare(b))
195
+ .map(([indexName, keys]) => ({
196
+ IndexName: indexName,
197
+ KeySchema: [
198
+ { AttributeName: keys.pk, KeyType: "HASH" },
199
+ { AttributeName: keys.sk, KeyType: "RANGE" },
200
+ ],
201
+ Projection: { ProjectionType: "ALL" },
202
+ }))
203
+ : undefined;
204
+ const result = { KeySchema, AttributeDefinitions };
205
+ if (GlobalSecondaryIndexes)
206
+ result.GlobalSecondaryIndexes = GlobalSecondaryIndexes;
207
+ if (LocalSecondaryIndexes)
208
+ result.LocalSecondaryIndexes = LocalSecondaryIndexes;
209
+ return result;
210
+ };
211
+ //# sourceMappingURL=Table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.js","sourceRoot":"","sources":["../src/Table.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAe,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAW5D;;;GAGG;AACH,IAAI,YAAY,GAAG,CAAC,CAAA;AAyDpB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAGlB,MAID,EAAiC,EAAE;IAClC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAA;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAc,0BAA0B,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;IAE9F,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAc,CAAA;IACrD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAgB,CAAA;IAE3D,0DAA0D;IAC1D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAgB;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ;QACR,UAAU;QACV,GAAG;QACH,KAAK,EAAE,CAAC,WAAwB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC;QACpE,WAAW,EAAE,CAAC,SAAmD,EAAE,EAAE,CACnE,KAAK,CAAC,MAAM,CACV,GAAG,EACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAA;YACvC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC5B,CAAC,CAAC,CACH;KACJ,CAAA;AACH,CAAC,CAAA;AA4CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAY,EAAmB,EAAE;IAC1D,MAAM,OAAO,GAA8C;QACzD,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;KACnC,CAAA;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC/E,CAAC;IAED,qFAAqF;IACrF,oFAAoF;IACpF,IAAI,SAA6B,CAAA;IACjC,IAAI,SAA6B,CAAA;IACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;YAAE,SAAQ;QAC7D,MAAM,MAAM,GAAG,MAAoB,CAAA;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAA;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAA;YAC5B,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAA;YAC5B,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IAED,qEAAqE;IACrE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsC,CAAA;IAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsC,CAAA;IAE5D,kEAAkE;IAClE,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC7B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACvD,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpD,wDAAwD;YACxD,MAAM,GAAG,GAAG,MAAuB,CAAA;YAEnC,wEAAwE;YACxE,+EAA+E;YAC/E,8EAA8E;YAC9E,kFAAkF;YAClF,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAA;YAC5C,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC/B,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;YAC3C,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC;YAED,qEAAqE;YACrE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;gBAC1C,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;gBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE;wBAC9B,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK;wBAC1B,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK;qBAC3B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,MAAM,MAAM,GAAG,MAAoB,CAAA;YACnC,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,KAAK;oBAAE,SAAQ;gBAEpB,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;gBAClC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;gBAElC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,0CAA0C;oBAC1C,SAAQ;gBACV,CAAC;gBACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,2EAA2E;oBAC3E,iFAAiF;oBACjF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;oBACrE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAA4B,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1F,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACvD,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,oBAAoB,GAA+B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;SAChF,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAY,EAAE,CAAC,CAAC,CAAA;IAExE,MAAM,sBAAsB,GAC1B,MAAM,CAAC,IAAI,GAAG,CAAC;QACb,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE;gBACT,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAe,EAAE;gBACpD,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAgB,EAAE;aACtD;YACD,UAAU,EAAE,EAAE,cAAc,EAAE,KAAc,EAAE;SAC/C,CAAC,CAAC;QACP,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,qBAAqB,GACzB,MAAM,CAAC,IAAI,GAAG,CAAC;QACb,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE;gBACT,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAe,EAAE;gBACpD,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAgB,EAAE;aACtD;YACD,UAAU,EAAE,EAAE,cAAc,EAAE,KAAc,EAAE;SAC/C,CAAC,CAAC;QACP,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,MAAM,GAKR,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAA;IACvC,IAAI,sBAAsB;QAAE,MAAM,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;IAClF,IAAI,qBAAqB;QAAE,MAAM,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;IAC/E,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Transaction — TransactGetItems and TransactWriteItems for atomic multi-item operations.
3
+ *
4
+ * DynamoDB transactions support up to 100 items. TransactWriteItems costs 2x WCU.
5
+ * Each item can appear only once per transaction.
6
+ *
7
+ * v2 API: accepts Entity operation intermediates directly (EntityGet, EntityPut,
8
+ * EntityDelete) instead of manual { entity, key/item } objects.
9
+ * transactGet returns a typed tuple inferred per-position.
10
+ */
11
+ import { Effect } from "effect";
12
+ import { DynamoClient, type DynamoClientError } from "./DynamoClient.js";
13
+ import type { Entity, EntityDelete, EntityGet, EntityPut } from "./Entity.js";
14
+ import { TransactionCancelled, type ValidationError } from "./Errors.js";
15
+ import type { ExpressionResult } from "./Expression.js";
16
+ import type { TableConfig } from "./Table.js";
17
+ /** @internal */
18
+ export declare const ConditionCheckTypeId: unique symbol;
19
+ export type ConditionCheckTypeId = typeof ConditionCheckTypeId;
20
+ /**
21
+ * A condition-check operation for use inside {@link transactWrite}.
22
+ * Created via {@link check} from an EntityGet intermediate + a condition expression.
23
+ * The EntityGet is never executed — used purely as a typed key resolver.
24
+ */
25
+ export interface ConditionCheckOp {
26
+ readonly [ConditionCheckTypeId]: ConditionCheckTypeId;
27
+ readonly _entity: Entity;
28
+ readonly _key: Record<string, unknown>;
29
+ readonly _condition: ExpressionResult;
30
+ }
31
+ /**
32
+ * Create a conditionCheck operation from an EntityGet intermediate and a condition.
33
+ * The EntityGet is never executed — used purely as a typed key resolver.
34
+ *
35
+ * Works in pipe: `Users.get(key).pipe(Transaction.check(expr))`
36
+ * Or data-first: `Transaction.check(Users.get(key), expr)`
37
+ */
38
+ export declare const check: {
39
+ (condition: ExpressionResult): <A, Rec, E, R>(self: EntityGet<A, Rec, E, R>) => ConditionCheckOp;
40
+ <A, Rec, E, R>(self: EntityGet<A, Rec, E, R>, condition: ExpressionResult): ConditionCheckOp;
41
+ };
42
+ /**
43
+ * Map a tuple of EntityGet operations to a tuple of (A | undefined) results.
44
+ * Each position extracts the model type A from EntityGet<A, ...>.
45
+ */
46
+ type TransactGetResult<T extends ReadonlyArray<EntityGet<any, any, any, any>>> = {
47
+ -readonly [K in keyof T]: T[K] extends EntityGet<infer A, any, any, any> ? A | undefined : never;
48
+ };
49
+ /**
50
+ * Atomically get up to 100 items across entities/tables.
51
+ * Accepts EntityGet intermediates directly. Returns a typed tuple
52
+ * where each position is `ModelType | undefined`.
53
+ *
54
+ * ```typescript
55
+ * const [user, post] = yield* Transaction.transactGet([
56
+ * Users.get({ userId: "u-1" }),
57
+ * Posts.get({ postId: "p-1" }),
58
+ * ])
59
+ * // user: User | undefined, post: Post | undefined
60
+ * ```
61
+ */
62
+ export declare const transactGet: <const T extends ReadonlyArray<EntityGet<any, any, any, any>>>(items: T) => Effect.Effect<TransactGetResult<T>, DynamoClientError | ValidationError | TransactionCancelled, DynamoClient | TableConfig>;
63
+ /** Union of operations accepted by transactWrite */
64
+ type TransactWriteOp = EntityPut<any, any, any, any> | EntityDelete<any, any> | ConditionCheckOp;
65
+ /**
66
+ * Atomically write up to 100 items across entities/tables.
67
+ * Accepts EntityPut, EntityDelete, and ConditionCheckOp (via Transaction.check).
68
+ *
69
+ * ```typescript
70
+ * yield* Transaction.transactWrite([
71
+ * Users.put({ userId: "u-1", ... }),
72
+ * Posts.delete({ postId: "p-3" }),
73
+ * Users.get({ userId: "u-1" }).pipe(Transaction.check(expr)),
74
+ * ])
75
+ * ```
76
+ */
77
+ export declare const transactWrite: (operations: ReadonlyArray<TransactWriteOp>) => Effect.Effect<void, DynamoClientError | ValidationError | TransactionCancelled, DynamoClient | TableConfig>;
78
+ export {};
79
+ //# sourceMappingURL=Transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transaction.d.ts","sourceRoot":"","sources":["../src/Transaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE7E,OAAO,EAGL,oBAAoB,EACpB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM7C,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,EAAE,OAAO,MAAqD,CAAA;AAC/F,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,EAAE;IAClB,CAAC,SAAS,EAAE,gBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,gBAAgB,CAAA;IAChG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,CAAA;CAe7F,CAAA;AAMD;;;GAGG;AACH,KAAK,iBAAiB,CAAC,CAAC,SAAS,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI;IAC/E,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK;CACjG,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,CAAC,CAAC,SAAS,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACtF,OAAO,CAAC,KACP,MAAM,CAAC,MAAM,CACd,iBAAiB,CAAC,CAAC,CAAC,EACpB,iBAAiB,GAAG,eAAe,GAAG,oBAAoB,EAC1D,YAAY,GAAG,WAAW,CAuExB,CAAA;AAMJ,oDAAoD;AACpD,KAAK,eAAe,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAAA;AAEhG;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,aAAa,CAAC,eAAe,CAAC,KACzC,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,iBAAiB,GAAG,eAAe,GAAG,oBAAoB,EAC1D,YAAY,GAAG,WAAW,CAkHxB,CAAA"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Transaction — TransactGetItems and TransactWriteItems for atomic multi-item operations.
3
+ *
4
+ * DynamoDB transactions support up to 100 items. TransactWriteItems costs 2x WCU.
5
+ * Each item can appear only once per transaction.
6
+ *
7
+ * v2 API: accepts Entity operation intermediates directly (EntityGet, EntityPut,
8
+ * EntityDelete) instead of manual { entity, key/item } objects.
9
+ * transactGet returns a typed tuple inferred per-position.
10
+ */
11
+ import { Effect, Function as Fn } from "effect";
12
+ import { DynamoClient } from "./DynamoClient.js";
13
+ import { extractTransactable } from "./Entity.js";
14
+ import { DynamoError, isAwsTransactionCancelled, TransactionCancelled, } from "./Errors.js";
15
+ import { composePrimaryKey, resolveTableNames, validateAndBuildPutItem, } from "./internal/TransactableOps.js";
16
+ import { fromAttributeMap, toAttributeMap } from "./Marshaller.js";
17
+ // ---------------------------------------------------------------------------
18
+ // ConditionCheck — composable from EntityGet + condition expression
19
+ // ---------------------------------------------------------------------------
20
+ /** @internal */
21
+ export const ConditionCheckTypeId = Symbol.for("effect-dynamodb/ConditionCheck");
22
+ /**
23
+ * Create a conditionCheck operation from an EntityGet intermediate and a condition.
24
+ * The EntityGet is never executed — used purely as a typed key resolver.
25
+ *
26
+ * Works in pipe: `Users.get(key).pipe(Transaction.check(expr))`
27
+ * Or data-first: `Transaction.check(Users.get(key), expr)`
28
+ */
29
+ export const check = Fn.dual(2, (self, condition) => {
30
+ const info = extractTransactable(self);
31
+ if (!info || info.opType !== "get") {
32
+ throw new Error("Transaction.check requires an EntityGet intermediate");
33
+ }
34
+ return {
35
+ [ConditionCheckTypeId]: ConditionCheckTypeId,
36
+ _entity: info.entity,
37
+ _key: info.key,
38
+ _condition: condition,
39
+ };
40
+ });
41
+ /**
42
+ * Atomically get up to 100 items across entities/tables.
43
+ * Accepts EntityGet intermediates directly. Returns a typed tuple
44
+ * where each position is `ModelType | undefined`.
45
+ *
46
+ * ```typescript
47
+ * const [user, post] = yield* Transaction.transactGet([
48
+ * Users.get({ userId: "u-1" }),
49
+ * Posts.get({ postId: "p-1" }),
50
+ * ])
51
+ * // user: User | undefined, post: Post | undefined
52
+ * ```
53
+ */
54
+ export const transactGet = (items) => Effect.gen(function* () {
55
+ // Cast rationale: same as Batch.get — empty array satisfies any mapped tuple type
56
+ if (items.length === 0)
57
+ return [];
58
+ if (items.length > 100) {
59
+ return yield* Effect.fail(new DynamoError({
60
+ operation: "TransactGetItems",
61
+ cause: new Error("TransactGetItems supports a maximum of 100 items"),
62
+ }));
63
+ }
64
+ const client = yield* DynamoClient;
65
+ // Extract entity info from each EntityGet intermediate
66
+ const infos = items.map((item) => {
67
+ const info = extractTransactable(item);
68
+ if (!info || info.opType !== "get") {
69
+ throw new Error("transactGet requires EntityGet intermediates");
70
+ }
71
+ return info;
72
+ });
73
+ const tableNames = yield* resolveTableNames(infos);
74
+ const transactItems = infos.map((info) => ({
75
+ Get: {
76
+ TableName: tableNames.get(info.entity),
77
+ Key: toAttributeMap(composePrimaryKey(info.entity, info.key)),
78
+ },
79
+ }));
80
+ const result = yield* client.transactGetItems({ TransactItems: transactItems }).pipe(Effect.mapError((error) => {
81
+ if (isAwsTransactionCancelled(error.cause)) {
82
+ return new TransactionCancelled({
83
+ operation: "TransactGetItems",
84
+ reasons: (error.cause.CancellationReasons ?? []).map((r) => ({
85
+ code: r?.Code,
86
+ message: r?.Message,
87
+ })),
88
+ cause: error.cause,
89
+ });
90
+ }
91
+ return error;
92
+ }));
93
+ const responses = result.Responses ?? [];
94
+ const decoded = [];
95
+ for (let i = 0; i < infos.length; i++) {
96
+ const response = responses[i];
97
+ const entity = infos[i].entity;
98
+ const raw = response?.Item ? fromAttributeMap(response.Item) : undefined;
99
+ if (raw === undefined) {
100
+ decoded.push(undefined);
101
+ continue;
102
+ }
103
+ const item = yield* entity._decodeRecord(raw);
104
+ decoded.push(item);
105
+ }
106
+ // Cast rationale: decoded is built as Array<A | undefined> by iterating
107
+ // Responses in order. The mapped tuple type captures per-position entity types
108
+ // which the runtime array construction preserves but TypeScript cannot verify.
109
+ return decoded;
110
+ });
111
+ /**
112
+ * Atomically write up to 100 items across entities/tables.
113
+ * Accepts EntityPut, EntityDelete, and ConditionCheckOp (via Transaction.check).
114
+ *
115
+ * ```typescript
116
+ * yield* Transaction.transactWrite([
117
+ * Users.put({ userId: "u-1", ... }),
118
+ * Posts.delete({ postId: "p-3" }),
119
+ * Users.get({ userId: "u-1" }).pipe(Transaction.check(expr)),
120
+ * ])
121
+ * ```
122
+ */
123
+ export const transactWrite = (operations) => Effect.gen(function* () {
124
+ if (operations.length === 0)
125
+ return;
126
+ if (operations.length > 100) {
127
+ return yield* Effect.fail(new DynamoError({
128
+ operation: "TransactWriteItems",
129
+ cause: new Error("TransactWriteItems supports a maximum of 100 items"),
130
+ }));
131
+ }
132
+ const client = yield* DynamoClient;
133
+ // Build info for each operation
134
+ const opInfos = [];
135
+ for (const op of operations) {
136
+ // Check for ConditionCheckOp first (has its own TypeId)
137
+ if (ConditionCheckTypeId in op) {
138
+ const checkOp = op;
139
+ opInfos.push({
140
+ type: "conditionCheck",
141
+ entity: checkOp._entity,
142
+ key: checkOp._key,
143
+ condition: checkOp._condition,
144
+ });
145
+ continue;
146
+ }
147
+ const info = extractTransactable(op);
148
+ if (!info) {
149
+ throw new Error("transactWrite: unrecognized operation type");
150
+ }
151
+ if (info.opType === "put") {
152
+ opInfos.push({
153
+ type: "put",
154
+ entity: info.entity,
155
+ input: info.input,
156
+ });
157
+ }
158
+ else if (info.opType === "delete") {
159
+ opInfos.push({
160
+ type: "delete",
161
+ entity: info.entity,
162
+ key: info.key,
163
+ });
164
+ }
165
+ else {
166
+ throw new Error(`transactWrite: unsupported operation type "${info.opType}". Use EntityPut, EntityDelete, or Transaction.check().`);
167
+ }
168
+ }
169
+ const tableNames = yield* resolveTableNames(opInfos);
170
+ const transactItems = [];
171
+ for (const op of opInfos) {
172
+ const tableName = tableNames.get(op.entity);
173
+ if (op.type === "put") {
174
+ const marshalledItem = yield* validateAndBuildPutItem(op.entity, op.input, "transactWrite.put");
175
+ transactItems.push({
176
+ Put: { TableName: tableName, Item: marshalledItem },
177
+ });
178
+ }
179
+ else if (op.type === "delete") {
180
+ transactItems.push({
181
+ Delete: {
182
+ TableName: tableName,
183
+ Key: toAttributeMap(composePrimaryKey(op.entity, op.key)),
184
+ },
185
+ });
186
+ }
187
+ else {
188
+ // conditionCheck
189
+ const marshalledKey = toAttributeMap(composePrimaryKey(op.entity, op.key));
190
+ transactItems.push({
191
+ ConditionCheck: {
192
+ TableName: tableName,
193
+ Key: marshalledKey,
194
+ ConditionExpression: op.condition.expression,
195
+ ExpressionAttributeNames: op.condition.names,
196
+ ExpressionAttributeValues: op.condition.values,
197
+ },
198
+ });
199
+ }
200
+ }
201
+ yield* client.transactWriteItems({ TransactItems: transactItems }).pipe(Effect.mapError((error) => {
202
+ if (isAwsTransactionCancelled(error.cause)) {
203
+ return new TransactionCancelled({
204
+ operation: "TransactWriteItems",
205
+ reasons: (error.cause.CancellationReasons ?? []).map((r) => ({
206
+ code: r?.Code,
207
+ message: r?.Message,
208
+ })),
209
+ cause: error.cause,
210
+ });
211
+ }
212
+ return error;
213
+ }));
214
+ });
215
+ //# sourceMappingURL=Transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transaction.js","sourceRoot":"","sources":["../src/Transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @internal Aggregate cursor and update context types.
3
+ *
4
+ * Extracted from Aggregate.ts for decomposition. Not part of the public API.
5
+ */
6
+ import type { Optic } from "effect";
7
+ /**
8
+ * A pre-bound optic rooted at the current aggregate state.
9
+ * Navigate with `.key()`, `.optionalKey()`, or `.at()`, then apply terminals
10
+ * `.get()`, `.replace()`, or `.modify()` — no need to pass the source explicitly.
11
+ * For composing externally-defined optics, use `optic` + `state`.
12
+ */
13
+ export interface Cursor<S, A = S> {
14
+ /** Focus on a required key */
15
+ readonly key: <K extends keyof A & string>(k: K) => Cursor<S, A[K]>;
16
+ /** Focus on an optional key (narrows away `undefined`) */
17
+ readonly optionalKey: <K extends keyof A & string>(k: K) => Cursor<S, NonNullable<A[K]>>;
18
+ /** Focus on an array element by index (available when focused on an array) */
19
+ readonly at: A extends ReadonlyArray<infer E> ? (index: number) => Cursor<S, E> : never;
20
+ /** Read the focused value (returns `undefined` for absent optional/indexed focuses) */
21
+ readonly get: () => A;
22
+ /** Replace the focused value, returning the full updated state */
23
+ readonly replace: (value: A) => S;
24
+ /** Modify the focused value with a function, returning the full updated state */
25
+ readonly modify: (f: (a: A) => A) => S;
26
+ }
27
+ /** @internal Build a cursor by binding a source value into an optic */
28
+ export declare const makeCursor: <S>(source: S, optic: Optic.Iso<S, S>) => Cursor<S, S>;
29
+ /** Context provided to the aggregate update mutation function */
30
+ export interface UpdateContext<TIso, TClass = unknown> {
31
+ /** The current aggregate state as a plain object */
32
+ readonly state: TIso;
33
+ /** Pre-bound cursor — navigate with `.key()`, then `.get()` / `.replace()` / `.modify()` */
34
+ readonly cursor: Cursor<TIso>;
35
+ /** Composable optic rooted at the plain type — use with externally-defined lenses and `state` */
36
+ readonly optic: Optic.Iso<TIso, TIso>;
37
+ /** The current state as a Schema.Class instance (rarely needed) */
38
+ readonly current: TClass;
39
+ }
40
+ /** Discriminator config for binding a sub-aggregate */
41
+ export interface DiscriminatorConfig {
42
+ readonly discriminator: Record<string, unknown>;
43
+ }
44
+ //# sourceMappingURL=_AggregateCursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_AggregateCursor.d.ts","sourceRoot":"","sources":["../src/_AggregateCursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAMnC;;;;;GAKG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxF,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAA;IACvF,uFAAuF;IACvF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;IACjC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;CACvC;AAED,uEAAuE;AACvE,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAU5E,CAAA;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IACnD,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;IACpB,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @internal Aggregate cursor and update context types.
3
+ *
4
+ * Extracted from Aggregate.ts for decomposition. Not part of the public API.
5
+ */
6
+ /** @internal Build a cursor by binding a source value into an optic */
7
+ export const makeCursor = (source, optic) => {
8
+ const build = (op) => ({
9
+ key: (k) => build(op.key(k)),
10
+ optionalKey: (k) => build(op.optionalKey(k)),
11
+ at: ((index) => build(op.at(index))),
12
+ get: () => (op.get ? op.get(source) : op.getResult(source)?.value),
13
+ replace: (value) => op.replace(value, source),
14
+ modify: (f) => op.modify(f)(source),
15
+ });
16
+ return build(optic);
17
+ };
18
+ //# sourceMappingURL=_AggregateCursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_AggregateCursor.js","sourceRoot":"","sources":["../src/_AggregateCursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH,uEAAuE;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,MAAS,EAAE,KAAsB,EAAgB,EAAE;IAC/E,MAAM,KAAK,GAAG,CAAI,EAAO,EAAgB,EAAE,CAAC,CAAC;QAC3C,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5C,EAAE,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAQ;QACnD,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;QAClE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;QAC7C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;KACpC,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC,CAAA"}