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/Query.js ADDED
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Query — Pure description of a DynamoDB query.
3
+ *
4
+ * `Query<A>` is a lazy, immutable data type that describes a query. No DynamoDB
5
+ * calls happen until a terminal (`execute`, `collect`, or `paginate`) is called. All
6
+ * combinators return a new Query — the original is unchanged.
7
+ *
8
+ * Implements Pipeable for ergonomic composition.
9
+ */
10
+ import { Effect, Function, Option, Pipeable, Stream } from "effect";
11
+ import { DynamoClient } from "./DynamoClient.js";
12
+ import { compileExpr } from "./internal/Expr.js";
13
+ import { compilePath } from "./internal/PathBuilder.js";
14
+ import { fromAttributeMap, toAttributeValue } from "./Marshaller.js";
15
+ import * as Projection from "./Projection.js";
16
+ // ---------------------------------------------------------------------------
17
+ // Query<A> interface
18
+ // ---------------------------------------------------------------------------
19
+ const QueryTypeId = Symbol.for("effect-dynamodb/Query");
20
+ // ---------------------------------------------------------------------------
21
+ // Internal: Query implementation
22
+ // ---------------------------------------------------------------------------
23
+ class QueryImpl {
24
+ _state;
25
+ [QueryTypeId] = QueryTypeId;
26
+ constructor(_state) {
27
+ this._state = _state;
28
+ }
29
+ pipe() {
30
+ // eslint-disable-next-line prefer-rest-params
31
+ return Pipeable.pipeArguments(this, arguments);
32
+ }
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Constructor (internal — used by Entity and Collection)
36
+ // ---------------------------------------------------------------------------
37
+ export const make = (config) => new QueryImpl({
38
+ tableName: config.tableName,
39
+ indexName: config.indexName,
40
+ pkField: config.pkField,
41
+ pkValue: config.pkValue,
42
+ skField: config.skField,
43
+ skConditions: [],
44
+ exprFilters: [],
45
+ entityTypes: config.entityTypes,
46
+ limitValue: undefined,
47
+ maxPagesValue: undefined,
48
+ scanForward: true,
49
+ consistentRead: false,
50
+ ignoreOwnershipFlag: false,
51
+ exclusiveStartKey: undefined,
52
+ isScan: false,
53
+ projection: undefined,
54
+ projectionPaths: undefined,
55
+ decoder: config.decoder,
56
+ resolveTableName: config.resolveTableName,
57
+ });
58
+ /**
59
+ * Create a scan-mode Query. Shares all combinators and terminals with Query
60
+ * but uses DynamoDB Scan instead of Query at execution time.
61
+ * No key condition — only filter expressions and entity type filter.
62
+ */
63
+ export const makeScan = (config) => new QueryImpl({
64
+ tableName: config.tableName,
65
+ indexName: config.indexName,
66
+ pkField: "",
67
+ pkValue: "",
68
+ skField: undefined,
69
+ skConditions: [],
70
+ exprFilters: [],
71
+ entityTypes: config.entityTypes,
72
+ limitValue: undefined,
73
+ maxPagesValue: undefined,
74
+ scanForward: true,
75
+ consistentRead: false,
76
+ ignoreOwnershipFlag: false,
77
+ exclusiveStartKey: undefined,
78
+ isScan: true,
79
+ projection: undefined,
80
+ projectionPaths: undefined,
81
+ decoder: config.decoder,
82
+ resolveTableName: config.resolveTableName,
83
+ });
84
+ // ---------------------------------------------------------------------------
85
+ // Cursor encoding (internal)
86
+ // ---------------------------------------------------------------------------
87
+ const encodeCursor = (key) => btoa(JSON.stringify(key));
88
+ const decodeCursor = (cursor) => JSON.parse(atob(cursor));
89
+ // ---------------------------------------------------------------------------
90
+ // Combinators (all dual for data-first and data-last)
91
+ // ---------------------------------------------------------------------------
92
+ /**
93
+ * Add a sort key condition to the query.
94
+ * Only one SK condition is supported (last one wins if multiple are added).
95
+ */
96
+ export const where = Function.dual(2, (self, condition) => {
97
+ const state = self._state;
98
+ if (!state.skField)
99
+ return self;
100
+ return new QueryImpl({
101
+ ...state,
102
+ skConditions: [{ field: state.skField, condition }],
103
+ });
104
+ });
105
+ /**
106
+ * Set the maximum number of items per DynamoDB page.
107
+ */
108
+ export const limit = Function.dual(2, (self, n) => new QueryImpl({
109
+ ...self._state,
110
+ limitValue: n,
111
+ }));
112
+ /**
113
+ * Reverse the sort order (sets ScanIndexForward = false).
114
+ */
115
+ export const reverse = (self) => new QueryImpl({
116
+ ...self._state,
117
+ scanForward: false,
118
+ });
119
+ /**
120
+ * Enable consistent reads for this query (or scan).
121
+ */
122
+ export const consistentRead = Function.dual((args) => isQuery(args[0]), (self) => new QueryImpl({
123
+ ...self._state,
124
+ consistentRead: true,
125
+ }));
126
+ /**
127
+ * Set the maximum number of DynamoDB pages to fetch.
128
+ * Pagination stops after this many pages even if `LastEvaluatedKey` is present.
129
+ */
130
+ export const maxPages = Function.dual(2, (self, n) => new QueryImpl({
131
+ ...self._state,
132
+ maxPagesValue: n,
133
+ }));
134
+ /**
135
+ * Skip the `__edd_e__` entity type filter on this query.
136
+ * Useful for cross-entity queries or when you know the partition only contains
137
+ * items of the expected type.
138
+ */
139
+ export const ignoreOwnership = (self) => new QueryImpl({
140
+ ...self._state,
141
+ ignoreOwnershipFlag: true,
142
+ });
143
+ /**
144
+ * Set the starting cursor for pagination. The cursor is an opaque string
145
+ * returned by {@link execute} that encodes the DynamoDB `ExclusiveStartKey`.
146
+ * Pass an empty string to start from the beginning.
147
+ */
148
+ export const startFrom = Function.dual(2, (self, cursor) => cursor === ""
149
+ ? self
150
+ : new QueryImpl({
151
+ ...self._state,
152
+ exclusiveStartKey: decodeCursor(cursor),
153
+ }));
154
+ /**
155
+ * Select specific attributes to return (ProjectionExpression).
156
+ * Reduces read capacity and network transfer. When projection is active,
157
+ * items are returned as raw `Record<string, unknown>` instead of decoded
158
+ * schema instances, since projected items may be partial.
159
+ */
160
+ export const select = Function.dual(2, (self, attributes) => new QueryImpl({
161
+ ...self._state,
162
+ projection: attributes,
163
+ decoder: (raw) => Effect.succeed(raw),
164
+ }));
165
+ /**
166
+ * Add an Expr-based filter expression to the query.
167
+ * Multiple filterExpr calls are ANDed together.
168
+ */
169
+ export const filterExpr = Function.dual(2, (self, expr) => new QueryImpl({
170
+ ...self._state,
171
+ exprFilters: [...self._state.exprFilters, expr],
172
+ }));
173
+ /**
174
+ * Apply path-based projections. Compiles path segments to ProjectionExpression.
175
+ * When projection is active, items are returned as raw `Record<string, unknown>`.
176
+ */
177
+ export const selectPaths = Function.dual(2, (self, paths) => new QueryImpl({
178
+ ...self._state,
179
+ projectionPaths: paths,
180
+ decoder: (raw) => Effect.succeed(raw),
181
+ }));
182
+ // ---------------------------------------------------------------------------
183
+ // Internal: shared filter clause builder (entity type + user filters)
184
+ // ---------------------------------------------------------------------------
185
+ const buildFilterClauses = (state) => {
186
+ const names = {};
187
+ const values = {};
188
+ const filterClauses = [];
189
+ // Entity type filter (skipped when ignoreOwnership is set)
190
+ if (!state.ignoreOwnershipFlag && state.entityTypes.length > 0) {
191
+ const etPlaceholders = state.entityTypes.map((_, i) => `:et${i}`);
192
+ filterClauses.push(`#eddE IN (${etPlaceholders.join(", ")})`);
193
+ names["#eddE"] = "__edd_e__";
194
+ state.entityTypes.forEach((et, i) => {
195
+ values[`:et${i}`] = toAttributeValue(et);
196
+ });
197
+ }
198
+ // Expr-based filters (compiled from Entity.filter() callback/shorthand API)
199
+ for (const expr of state.exprFilters) {
200
+ const compiled = compileExpr(expr);
201
+ filterClauses.push(compiled.expression);
202
+ Object.assign(names, compiled.names);
203
+ Object.assign(values, compiled.values);
204
+ }
205
+ return { filterClauses, names, values };
206
+ };
207
+ // ---------------------------------------------------------------------------
208
+ // Internal: build projection expression from state
209
+ // ---------------------------------------------------------------------------
210
+ const buildProjection = (state, names) => {
211
+ if (state.projectionPaths && state.projectionPaths.length > 0) {
212
+ const counter = { value: 0 };
213
+ const projParts = [];
214
+ for (const segments of state.projectionPaths) {
215
+ projParts.push(compilePath(segments, names, "proj", counter));
216
+ }
217
+ return projParts.join(", ");
218
+ }
219
+ if (state.projection && state.projection.length > 0) {
220
+ const proj = Projection.projection(state.projection);
221
+ Object.assign(names, proj.names);
222
+ return proj.expression;
223
+ }
224
+ return undefined;
225
+ };
226
+ const buildCommandInput = (state) => {
227
+ const fc = buildFilterClauses(state);
228
+ const names = { ...fc.names };
229
+ const values = { ...fc.values };
230
+ let keyCondition;
231
+ // Key condition (query mode only)
232
+ if (!state.isScan) {
233
+ names["#pk"] = state.pkField;
234
+ values[":pk"] = toAttributeValue(state.pkValue);
235
+ keyCondition = "#pk = :pk";
236
+ if (state.skConditions.length > 0) {
237
+ const skCond = state.skConditions[0];
238
+ names["#sk"] = skCond.field;
239
+ const cond = skCond.condition;
240
+ if ("eq" in cond) {
241
+ keyCondition += " AND #sk = :sk";
242
+ values[":sk"] = toAttributeValue(cond.eq);
243
+ }
244
+ else if ("lt" in cond) {
245
+ keyCondition += " AND #sk < :sk";
246
+ values[":sk"] = toAttributeValue(cond.lt);
247
+ }
248
+ else if ("lte" in cond) {
249
+ keyCondition += " AND #sk <= :sk";
250
+ values[":sk"] = toAttributeValue(cond.lte);
251
+ }
252
+ else if ("gt" in cond) {
253
+ keyCondition += " AND #sk > :sk";
254
+ values[":sk"] = toAttributeValue(cond.gt);
255
+ }
256
+ else if ("gte" in cond) {
257
+ keyCondition += " AND #sk >= :sk";
258
+ values[":sk"] = toAttributeValue(cond.gte);
259
+ }
260
+ else if ("between" in cond) {
261
+ keyCondition += " AND #sk BETWEEN :sk1 AND :sk2";
262
+ values[":sk1"] = toAttributeValue(cond.between[0]);
263
+ values[":sk2"] = toAttributeValue(cond.between[1]);
264
+ }
265
+ else if ("beginsWith" in cond) {
266
+ keyCondition += " AND begins_with(#sk, :sk)";
267
+ values[":sk"] = toAttributeValue(cond.beginsWith);
268
+ }
269
+ }
270
+ }
271
+ const projectionExpression = buildProjection(state, names);
272
+ return {
273
+ KeyConditionExpression: keyCondition,
274
+ FilterExpression: fc.filterClauses.length > 0 ? fc.filterClauses.join(" AND ") : undefined,
275
+ ProjectionExpression: projectionExpression,
276
+ ExpressionAttributeNames: Object.keys(names).length > 0 ? names : undefined,
277
+ ExpressionAttributeValues: Object.keys(values).length > 0 ? values : undefined,
278
+ ConsistentRead: state.consistentRead || undefined,
279
+ };
280
+ };
281
+ /**
282
+ * @internal Build the full DynamoDB command parameters from state and table name.
283
+ */
284
+ const buildDynamoCommand = (state, tableName, overrides) => {
285
+ const input = buildCommandInput(state);
286
+ return {
287
+ TableName: tableName,
288
+ IndexName: state.indexName,
289
+ KeyConditionExpression: input.KeyConditionExpression,
290
+ FilterExpression: input.FilterExpression,
291
+ ProjectionExpression: input.ProjectionExpression,
292
+ ExpressionAttributeNames: input.ExpressionAttributeNames,
293
+ ExpressionAttributeValues: input.ExpressionAttributeValues,
294
+ ConsistentRead: input.ConsistentRead,
295
+ Limit: state.limitValue,
296
+ ScanIndexForward: state.isScan ? undefined : state.scanForward,
297
+ ...overrides,
298
+ };
299
+ };
300
+ // ---------------------------------------------------------------------------
301
+ // Terminals
302
+ // ---------------------------------------------------------------------------
303
+ /**
304
+ * Execute the query and collect all pages into a single array.
305
+ */
306
+ export const collect = (self) => Effect.gen(function* () {
307
+ const stream = yield* paginateInternal(self);
308
+ const pages = yield* Stream.runCollect(stream);
309
+ return pages.flat();
310
+ });
311
+ /**
312
+ * Execute a single DynamoDB page and return a {@link Page} with an opaque cursor.
313
+ * Combine with {@link startFrom} to iterate through pages:
314
+ *
315
+ * ```ts
316
+ * const first = yield* query.pipe(Query.limit(25), Query.execute)
317
+ * if (first.cursor) {
318
+ * const second = yield* query.pipe(Query.limit(25), Query.startFrom(first.cursor), Query.execute)
319
+ * }
320
+ * ```
321
+ */
322
+ export const execute = (self) => Effect.gen(function* () {
323
+ const client = yield* DynamoClient;
324
+ const state = self._state;
325
+ const tableName = state.resolveTableName ? yield* state.resolveTableName : state.tableName;
326
+ const cmd = buildDynamoCommand(state, tableName, {
327
+ ExclusiveStartKey: state.exclusiveStartKey,
328
+ });
329
+ const result = state.isScan ? yield* client.scan(cmd) : yield* client.query(cmd);
330
+ const rawItems = (result.Items ?? []).map((item) => fromAttributeMap(item));
331
+ const items = yield* Effect.forEach(rawItems, (raw) => state.decoder(raw));
332
+ const cursor = result.LastEvaluatedKey != null
333
+ ? encodeCursor(result.LastEvaluatedKey)
334
+ : null;
335
+ return { items, cursor };
336
+ });
337
+ /**
338
+ * Execute the query and return a Stream of page arrays.
339
+ */
340
+ export const paginate = (self) => paginateInternal(self);
341
+ const paginateInternal = (self) => Effect.gen(function* () {
342
+ const client = yield* DynamoClient;
343
+ const state = self._state;
344
+ const tableName = state.resolveTableName ? yield* state.resolveTableName : state.tableName;
345
+ let pageCount = 0;
346
+ return Stream.paginate(state.exclusiveStartKey, (exclusiveStartKey) => Effect.gen(function* () {
347
+ pageCount++;
348
+ const cmd = buildDynamoCommand(state, tableName, { ExclusiveStartKey: exclusiveStartKey });
349
+ const result = state.isScan ? yield* client.scan(cmd) : yield* client.query(cmd);
350
+ const rawItems = (result.Items ?? []).map((item) => fromAttributeMap(item));
351
+ const decoded = yield* Effect.forEach(rawItems, (raw) => state.decoder(raw));
352
+ // Stop pagination if maxPages reached or no more pages
353
+ const hasMorePages = result.LastEvaluatedKey != null;
354
+ const maxPagesReached = state.maxPagesValue != null && pageCount >= state.maxPagesValue;
355
+ const nextKey = hasMorePages && !maxPagesReached ? Option.some(result.LastEvaluatedKey) : Option.none();
356
+ return [[decoded], nextKey];
357
+ }));
358
+ });
359
+ /**
360
+ * Execute a count query. Uses `Select: "COUNT"` on DynamoDB — no items are returned.
361
+ * Returns the total count across all pages (respects maxPages).
362
+ */
363
+ export const count = (self) => Effect.gen(function* () {
364
+ const client = yield* DynamoClient;
365
+ const state = self._state;
366
+ const tableName = state.resolveTableName ? yield* state.resolveTableName : state.tableName;
367
+ let total = 0;
368
+ let pageCount = 0;
369
+ let exclusiveStartKey;
370
+ do {
371
+ pageCount++;
372
+ const cmd = buildDynamoCommand(state, tableName, {
373
+ ExclusiveStartKey: exclusiveStartKey,
374
+ Select: "COUNT",
375
+ });
376
+ const result = state.isScan ? yield* client.scan(cmd) : yield* client.query(cmd);
377
+ total += result.Count ?? 0;
378
+ exclusiveStartKey = result.LastEvaluatedKey;
379
+ if (state.maxPagesValue != null && pageCount >= state.maxPagesValue)
380
+ break;
381
+ } while (exclusiveStartKey != null);
382
+ return total;
383
+ });
384
+ /**
385
+ * Return the built DynamoDB command input without executing.
386
+ * Useful for debugging, logging, or passing to DynamoClient directly.
387
+ */
388
+ export const asParams = (self) => Effect.gen(function* () {
389
+ const state = self._state;
390
+ const tableName = state.resolveTableName ? yield* state.resolveTableName : state.tableName;
391
+ return buildDynamoCommand(state, tableName);
392
+ });
393
+ // ---------------------------------------------------------------------------
394
+ // Type guard
395
+ // ---------------------------------------------------------------------------
396
+ export const isQuery = (u) => typeof u === "object" && u !== null && QueryTypeId in u;
397
+ //# sourceMappingURL=Query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Query.js","sourceRoot":"","sources":["../src/Query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
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 type { DescribeTableCommandOutput } from "@aws-sdk/client-dynamodb";
11
+ import { type Config, Context, Effect, Layer } from "effect";
12
+ import type { DynamoClientError } from "./DynamoClient.js";
13
+ import type * as DynamoSchema from "./DynamoSchema.js";
14
+ import type { IndexDefinition } from "./KeyComposer.js";
15
+ /** Runtime table configuration injected via Effect Layer. */
16
+ export interface TableConfig {
17
+ /** Physical DynamoDB table name. */
18
+ readonly name: string;
19
+ }
20
+ /** Minimal entity shape for Table membership (avoids circular import with Entity.ts) */
21
+ interface EntityLike {
22
+ readonly _tag: "Entity";
23
+ readonly indexes: Record<string, IndexDefinition>;
24
+ readonly _configure: (schema: DynamoSchema.DynamoSchema, tableTag: Context.Service<TableConfig, TableConfig>) => void;
25
+ }
26
+ /** Minimal aggregate shape for Table membership (avoids circular import with Aggregate.ts) */
27
+ interface AggregateLike {
28
+ readonly _tag: "Aggregate";
29
+ readonly pkField: string;
30
+ readonly collection: {
31
+ readonly index: string;
32
+ readonly sk: {
33
+ readonly field: string;
34
+ };
35
+ };
36
+ readonly listIndex: {
37
+ readonly index: string;
38
+ readonly pk: {
39
+ readonly field: string;
40
+ };
41
+ readonly sk: {
42
+ readonly field: string;
43
+ };
44
+ } | undefined;
45
+ }
46
+ /**
47
+ * A Table groups entities sharing a physical DynamoDB table and application namespace.
48
+ * Created via {@link make}. The physical table name is provided at runtime via
49
+ * {@link Table.layer} or {@link Table.layerConfig}.
50
+ *
51
+ * @typeParam TEntities - Named entity record (e.g., `{ Users: typeof Users }`)
52
+ * @typeParam TAggregates - Named aggregate record (e.g., `{ Matches: typeof Matches }`)
53
+ */
54
+ export interface Table<TEntities extends Record<string, EntityLike> = Record<string, EntityLike>, TAggregates extends Record<string, AggregateLike> = Record<string, AggregateLike>> {
55
+ readonly _tag: "Table";
56
+ readonly schema: DynamoSchema.DynamoSchema;
57
+ /** Named entity members registered on this table. */
58
+ readonly entities: TEntities;
59
+ /** Named aggregate members registered on this table. */
60
+ readonly aggregates: TAggregates;
61
+ /** Effect Context.Service tag for this table's runtime config */
62
+ readonly Tag: Context.Service<TableConfig, TableConfig>;
63
+ /** Provide the physical table name */
64
+ readonly layer: (config: TableConfig) => Layer.Layer<TableConfig>;
65
+ /** Provide the physical table name from Effect Config */
66
+ readonly layerConfig: (config: {
67
+ readonly name: Config.Config<string>;
68
+ }) => Layer.Layer<TableConfig, Config.ConfigError>;
69
+ }
70
+ /**
71
+ * Create a new Table definition with optional entity and aggregate members.
72
+ *
73
+ * Each call to `make` creates a new unique Context.Service, so different tables
74
+ * produce independent runtime configurations even when sharing the same schema.
75
+ *
76
+ * Entities are automatically configured with the table's schema and tag.
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * const MainTable = Table.make({
81
+ * schema: AppSchema,
82
+ * entities: { Users, Tasks },
83
+ * aggregates: { Matches },
84
+ * })
85
+ *
86
+ * // Provide physical table name at the edge
87
+ * MainTable.layer({ name: "my-prod-table" })
88
+ *
89
+ * // Or from environment variables via Effect Config
90
+ * MainTable.layerConfig({ name: Config.string("TABLE_NAME") })
91
+ * ```
92
+ */
93
+ export declare const make: <const TEntities extends Record<string, EntityLike> = {}, const TAggregates extends Record<string, AggregateLike> = {}>(config: {
94
+ readonly schema: DynamoSchema.DynamoSchema;
95
+ readonly entities?: TEntities;
96
+ readonly aggregates?: TAggregates;
97
+ }) => Table<TEntities, TAggregates>;
98
+ /** A single key schema element for CreateTable input. */
99
+ export interface KeySchemaElement {
100
+ readonly AttributeName: string;
101
+ readonly KeyType: "HASH" | "RANGE";
102
+ }
103
+ /** A single attribute definition for CreateTable input. */
104
+ export interface AttributeDefinition {
105
+ readonly AttributeName: string;
106
+ readonly AttributeType: "S" | "N" | "B";
107
+ }
108
+ /** GSI definition for CreateTable input. */
109
+ export interface GlobalSecondaryIndex {
110
+ readonly IndexName: string;
111
+ readonly KeySchema: Array<KeySchemaElement>;
112
+ readonly Projection: {
113
+ readonly ProjectionType: "ALL";
114
+ };
115
+ }
116
+ /** LSI definition for CreateTable input. */
117
+ export interface LocalSecondaryIndex {
118
+ readonly IndexName: string;
119
+ readonly KeySchema: Array<KeySchemaElement>;
120
+ readonly Projection: {
121
+ readonly ProjectionType: "ALL";
122
+ };
123
+ }
124
+ /**
125
+ * Derived CreateTable input (minus TableName) computed from entity index definitions.
126
+ * Produced by {@link definition}. Mutable arrays for direct compatibility with
127
+ * the AWS SDK's `CreateTableCommandInput`.
128
+ */
129
+ export interface TableDefinition {
130
+ readonly KeySchema: Array<KeySchemaElement>;
131
+ readonly AttributeDefinitions: Array<AttributeDefinition>;
132
+ readonly GlobalSecondaryIndexes?: Array<GlobalSecondaryIndex> | undefined;
133
+ readonly LocalSecondaryIndexes?: Array<LocalSecondaryIndex> | undefined;
134
+ }
135
+ /**
136
+ * Derive CreateTable input from a table's registered members.
137
+ *
138
+ * Scans all entity index definitions and aggregate GSI configs to produce:
139
+ * - KeySchema (from primary index)
140
+ * - AttributeDefinitions (all unique key attributes)
141
+ * - GlobalSecondaryIndexes (from non-primary entity indexes + aggregate list indexes,
142
+ * plus aggregate collection indexes whose PK does not match the base table PK)
143
+ * - LocalSecondaryIndexes (from aggregate collection indexes whose PK equals the base
144
+ * table PK — DynamoDB LSIs by definition share the base table's partition key)
145
+ *
146
+ * The physical table name is omitted — that's deployment config.
147
+ * All key attributes are typed as "S" (String) since generated keys are always strings.
148
+ *
149
+ * LSI auto-detection: an aggregate's `collection` GSI config is emitted as an LSI
150
+ * iff `agg.pkField` equals the table's primary PK field (determined from the first
151
+ * entity's primary index). This matches DynamoDB semantics — any index that shares
152
+ * the base table's partition key IS an LSI — and makes `lsi1`..`lsi5`-style indexes
153
+ * on aggregates work transparently with `db.tables.*.create()`.
154
+ */
155
+ export declare const definition: (table: Table) => TableDefinition;
156
+ /** Options for table creation. */
157
+ export interface CreateTableOptions {
158
+ readonly billingMode?: "PAY_PER_REQUEST" | "PROVISIONED" | undefined;
159
+ }
160
+ /**
161
+ * A bound table with executable operations (`R = never`).
162
+ *
163
+ * @internal Used by `DynamoClient.make()`.
164
+ */
165
+ export interface BoundTable {
166
+ /** Physical table name. */
167
+ readonly name: string;
168
+ /**
169
+ * Create the physical DynamoDB table from the table's registered members.
170
+ */
171
+ readonly create: (options?: CreateTableOptions) => Effect.Effect<void, DynamoClientError>;
172
+ /** Delete the physical DynamoDB table. */
173
+ readonly delete: Effect.Effect<void, DynamoClientError>;
174
+ /** Describe the table (status, stream specification, item count, etc.). */
175
+ readonly describe: Effect.Effect<DescribeTableCommandOutput, DynamoClientError>;
176
+ }
177
+ export {};
178
+ //# sourceMappingURL=Table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../src/Table.ts"],"names":[],"mappings":"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"}