@ftschopp/dynatable-core 1.2.3 → 1.2.5
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.
- package/CHANGELOG.md +14 -0
- package/README.md +38 -57
- package/dist/builders/batch-get/create-batch-get-builder.d.ts.map +1 -1
- package/dist/builders/batch-get/create-batch-get-builder.js +4 -8
- package/dist/builders/batch-get/types.d.ts +2 -3
- package/dist/builders/batch-get/types.d.ts.map +1 -1
- package/dist/builders/get/types.d.ts.map +1 -1
- package/dist/builders/put/create-put-builder.d.ts.map +1 -1
- package/dist/builders/query/create-query-builder.d.ts.map +1 -1
- package/dist/builders/query/create-query-builder.js +3 -24
- package/dist/core/types.d.ts +0 -1
- package/dist/core/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/builders/batch-get/README.md +9 -64
- package/src/builders/batch-get/create-batch-get-builder.ts +5 -10
- package/src/builders/batch-get/types.ts +2 -3
- package/src/builders/get/types.ts +4 -1
- package/src/builders/put/create-put-builder.ts +10 -1
- package/src/builders/query/create-query-builder.ts +8 -27
- package/src/core/types.test.ts +0 -2
- package/src/core/types.ts +0 -1
- package/src/utils/zod-utils.test.ts +2 -6
- package/tests/integration/instagram-clone.integration.test.ts +0 -1
- package/tests/integration/pagination-timestamps.integration.test.ts +1 -2
- package/tests/integration/transactions.integration.test.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## @ftschopp/dynatable-core [1.2.5](https://github.com/ftschopp/dynatable/compare/@ftschopp/dynatable-core@1.2.4...@ftschopp/dynatable-core@1.2.5) (2026-05-05)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* remove unused isoDates ([63c3064](https://github.com/ftschopp/dynatable/commit/63c30649c5fd88c63596bff22542acd2d3ec828b))
|
|
7
|
+
|
|
8
|
+
## @ftschopp/dynatable-core [1.2.4](https://github.com/ftschopp/dynatable/compare/@ftschopp/dynatable-core@1.2.3...@ftschopp/dynatable-core@1.2.4) (2026-04-29)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* get keyname for attribute index ([5bd47c3](https://github.com/ftschopp/dynatable/commit/5bd47c38585c78153ff51f5e457777e928d6e667))
|
|
14
|
+
|
|
1
15
|
## @ftschopp/dynatable-core [1.2.3](https://github.com/ftschopp/dynatable/compare/@ftschopp/dynatable-core@1.2.2...@ftschopp/dynatable-core@1.2.3) (2026-04-27)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -54,7 +54,6 @@ const schema = {
|
|
|
54
54
|
},
|
|
55
55
|
params: {
|
|
56
56
|
timestamps: true,
|
|
57
|
-
isoDates: true,
|
|
58
57
|
},
|
|
59
58
|
} as const;
|
|
60
59
|
|
|
@@ -84,9 +83,7 @@ async function example() {
|
|
|
84
83
|
}).execute();
|
|
85
84
|
|
|
86
85
|
// Update
|
|
87
|
-
await table.entities.User.update({ username: 'alice' })
|
|
88
|
-
.set('name', 'Alice Johnson')
|
|
89
|
-
.execute();
|
|
86
|
+
await table.entities.User.update({ username: 'alice' }).set('name', 'Alice Johnson').execute();
|
|
90
87
|
|
|
91
88
|
// Query
|
|
92
89
|
const users = await table.entities.User.query()
|
|
@@ -150,8 +147,7 @@ const schema = {
|
|
|
150
147
|
},
|
|
151
148
|
|
|
152
149
|
params: {
|
|
153
|
-
timestamps: true,
|
|
154
|
-
isoDates: true, // Use ISO 8601 dates
|
|
150
|
+
timestamps: true, // Auto createdAt/updatedAt as ISO 8601 strings
|
|
155
151
|
cleanInternalKeys: false, // Hide PK/SK from results
|
|
156
152
|
},
|
|
157
153
|
} as const;
|
|
@@ -276,12 +272,7 @@ await table.entities.User.delete({ username: 'alice' })
|
|
|
276
272
|
|
|
277
273
|
// QUERY - Query with conditions
|
|
278
274
|
const photos = await table.entities.Photo.query()
|
|
279
|
-
.where((attr, op) =>
|
|
280
|
-
op.and(
|
|
281
|
-
op.eq(attr.username, 'alice'),
|
|
282
|
-
op.gt(attr.likesCount, 10)
|
|
283
|
-
)
|
|
284
|
-
)
|
|
275
|
+
.where((attr, op) => op.and(op.eq(attr.username, 'alice'), op.gt(attr.likesCount, 10)))
|
|
285
276
|
.limit(20)
|
|
286
277
|
.scanIndexForward(false)
|
|
287
278
|
.execute();
|
|
@@ -312,7 +303,8 @@ Atomic operations across multiple items:
|
|
|
312
303
|
|
|
313
304
|
```typescript
|
|
314
305
|
// TransactWrite - Atomic writes
|
|
315
|
-
await table
|
|
306
|
+
await table
|
|
307
|
+
.transactWrite()
|
|
316
308
|
.addPut(
|
|
317
309
|
table.entities.Like.put({
|
|
318
310
|
photoId: 'photo1',
|
|
@@ -321,15 +313,12 @@ await table.transactWrite()
|
|
|
321
313
|
.ifNotExists()
|
|
322
314
|
.dbParams()
|
|
323
315
|
)
|
|
324
|
-
.addUpdate(
|
|
325
|
-
table.entities.Photo.update({ photoId: 'photo1' })
|
|
326
|
-
.add('likesCount', 1)
|
|
327
|
-
.dbParams()
|
|
328
|
-
)
|
|
316
|
+
.addUpdate(table.entities.Photo.update({ photoId: 'photo1' }).add('likesCount', 1).dbParams())
|
|
329
317
|
.execute();
|
|
330
318
|
|
|
331
319
|
// TransactGet - Atomic reads
|
|
332
|
-
const result = await table
|
|
320
|
+
const result = await table
|
|
321
|
+
.transactGet()
|
|
333
322
|
.addGet(table.entities.User.get({ username: 'alice' }).dbParams())
|
|
334
323
|
.addGet(table.entities.Photo.get({ photoId: 'photo1' }).dbParams())
|
|
335
324
|
.execute();
|
|
@@ -342,6 +331,7 @@ const [user, photo] = result.items;
|
|
|
342
331
|
Build complex conditions with type-safe operators:
|
|
343
332
|
|
|
344
333
|
### Comparison
|
|
334
|
+
|
|
345
335
|
- `eq(attr, value)` - Equals
|
|
346
336
|
- `ne(attr, value)` - Not equals
|
|
347
337
|
- `lt(attr, value)` - Less than
|
|
@@ -351,19 +341,23 @@ Build complex conditions with type-safe operators:
|
|
|
351
341
|
- `between(attr, low, high)` - Between values
|
|
352
342
|
|
|
353
343
|
### String
|
|
344
|
+
|
|
354
345
|
- `beginsWith(attr, prefix)` - Begins with prefix
|
|
355
346
|
- `contains(attr, value)` - Contains value (strings, sets, lists)
|
|
356
347
|
|
|
357
348
|
### Existence
|
|
349
|
+
|
|
358
350
|
- `exists(attr)` - Attribute exists
|
|
359
351
|
- `notExists(attr)` - Attribute doesn't exist
|
|
360
352
|
|
|
361
353
|
### Advanced
|
|
354
|
+
|
|
362
355
|
- `attributeType(attr, type)` - Check attribute type ('S', 'N', 'M', 'L', etc.)
|
|
363
356
|
- `in(attr, values[])` - Value in array
|
|
364
357
|
- `size(attr)` - Get size, returns object with `.eq()`, `.gt()`, etc.
|
|
365
358
|
|
|
366
359
|
### Logical
|
|
360
|
+
|
|
367
361
|
- `and(...conditions)` - Combine with AND
|
|
368
362
|
- `or(...conditions)` - Combine with OR
|
|
369
363
|
- `not(condition)` - Negate condition
|
|
@@ -379,12 +373,7 @@ await table.entities.User.update({ username: 'alice' })
|
|
|
379
373
|
|
|
380
374
|
// Contains
|
|
381
375
|
const users = await table.entities.User.query()
|
|
382
|
-
.where((attr, op) =>
|
|
383
|
-
op.and(
|
|
384
|
-
op.eq(attr.username, 'alice'),
|
|
385
|
-
op.contains(attr.tags, 'premium')
|
|
386
|
-
)
|
|
387
|
-
)
|
|
376
|
+
.where((attr, op) => op.and(op.eq(attr.username, 'alice'), op.contains(attr.tags, 'premium')))
|
|
388
377
|
.execute();
|
|
389
378
|
|
|
390
379
|
// IN operator
|
|
@@ -394,12 +383,7 @@ const activeUsers = await table.entities.User.scan()
|
|
|
394
383
|
|
|
395
384
|
// Size function
|
|
396
385
|
const posts = await table.entities.Post.query()
|
|
397
|
-
.where((attr, op) =>
|
|
398
|
-
op.and(
|
|
399
|
-
op.eq(attr.userId, 'alice'),
|
|
400
|
-
op.size(attr.tags).gte(3)
|
|
401
|
-
)
|
|
402
|
-
)
|
|
386
|
+
.where((attr, op) => op.and(op.eq(attr.userId, 'alice'), op.size(attr.tags).gte(3)))
|
|
403
387
|
.execute();
|
|
404
388
|
|
|
405
389
|
// Complex nested conditions
|
|
@@ -409,10 +393,7 @@ await table.entities.Photo.query()
|
|
|
409
393
|
op.eq(attr.username, 'alice'),
|
|
410
394
|
op.or(
|
|
411
395
|
op.gt(attr.likesCount, 100),
|
|
412
|
-
op.and(
|
|
413
|
-
op.gt(attr.commentCount, 50),
|
|
414
|
-
op.exists(attr.featured)
|
|
415
|
-
)
|
|
396
|
+
op.and(op.gt(attr.commentCount, 50), op.exists(attr.featured))
|
|
416
397
|
)
|
|
417
398
|
)
|
|
418
399
|
)
|
|
@@ -469,28 +450,28 @@ if (page1.lastEvaluatedKey) {
|
|
|
469
450
|
|
|
470
451
|
```typescript
|
|
471
452
|
export {
|
|
472
|
-
Table,
|
|
473
|
-
type SchemaDefinition,
|
|
474
|
-
type ModelDefinition,
|
|
475
|
-
type AttributeDefinition,
|
|
476
|
-
type ScalarAttributeDefinition,
|
|
477
|
-
type ObjectAttributeDefinition,
|
|
478
|
-
type ArrayAttributeDefinition,
|
|
479
|
-
type PrimaryKeyDefinition,
|
|
480
|
-
type KeyDefinition,
|
|
481
|
-
type IndexDefinition,
|
|
482
|
-
type IndexesDefinition,
|
|
483
|
-
type SchemaParams,
|
|
484
|
-
type InferModel,
|
|
485
|
-
type InferInput,
|
|
486
|
-
type InferKeyInput,
|
|
487
|
-
type InferModelFromSchema,
|
|
488
|
-
type InferInputFromSchema,
|
|
489
|
-
type TimestampFields,
|
|
490
|
-
type ArrayItem,
|
|
491
|
-
createDynamoDBLogger,
|
|
492
|
-
type DynamoDBLogger,
|
|
493
|
-
type DynamoDBLoggerConfig,
|
|
453
|
+
Table, // Main Table class
|
|
454
|
+
type SchemaDefinition, // Schema type
|
|
455
|
+
type ModelDefinition, // Model type
|
|
456
|
+
type AttributeDefinition, // Union of all attribute types
|
|
457
|
+
type ScalarAttributeDefinition, // String/Number/Boolean/Date attribute
|
|
458
|
+
type ObjectAttributeDefinition, // Nested object attribute with schema
|
|
459
|
+
type ArrayAttributeDefinition, // Typed array attribute with items
|
|
460
|
+
type PrimaryKeyDefinition, // PK + SK key definition
|
|
461
|
+
type KeyDefinition, // Single key definition
|
|
462
|
+
type IndexDefinition, // Index (hash + optional sort)
|
|
463
|
+
type IndexesDefinition, // All table indexes
|
|
464
|
+
type SchemaParams, // Global schema params
|
|
465
|
+
type InferModel, // Infer model type (deprecated)
|
|
466
|
+
type InferInput, // Infer input type (deprecated)
|
|
467
|
+
type InferKeyInput, // Infer key type
|
|
468
|
+
type InferModelFromSchema, // Infer from full schema (preferred)
|
|
469
|
+
type InferInputFromSchema, // Infer input from full schema (preferred)
|
|
470
|
+
type TimestampFields, // createdAt/updatedAt fields type
|
|
471
|
+
type ArrayItem, // Extract item type from array attribute
|
|
472
|
+
createDynamoDBLogger, // Logger factory
|
|
473
|
+
type DynamoDBLogger, // Logger type
|
|
474
|
+
type DynamoDBLoggerConfig, // Logger config
|
|
494
475
|
};
|
|
495
476
|
```
|
|
496
477
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-batch-get-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/batch-get/create-batch-get-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM1D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EACzC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAAC,EAC7C,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"create-batch-get-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/batch-get/create-batch-get-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM1D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EACzC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAAC,EAC7C,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,CAAC,KAAK,CAAC,CA0ExB"}
|
|
@@ -52,20 +52,16 @@ function createBatchGetBuilder(requestItems, client, options, logger) {
|
|
|
52
52
|
};
|
|
53
53
|
},
|
|
54
54
|
/**
|
|
55
|
-
* Execute the BatchGetItem command and return the items.
|
|
55
|
+
* Execute the BatchGetItem command and return the items as a flat array.
|
|
56
56
|
*/
|
|
57
57
|
async execute() {
|
|
58
58
|
const params = this.dbParams();
|
|
59
59
|
const result = await client.send(new lib_dynamodb_1.BatchGetCommand(params));
|
|
60
60
|
logger?.log('BatchGetCommand', params, result);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (result.Responses) {
|
|
64
|
-
for (const [tableName, items] of Object.entries(result.Responses)) {
|
|
65
|
-
responses[tableName] = items;
|
|
66
|
-
}
|
|
61
|
+
if (!result.Responses) {
|
|
62
|
+
return [];
|
|
67
63
|
}
|
|
68
|
-
return
|
|
64
|
+
return Object.values(result.Responses).flat();
|
|
69
65
|
},
|
|
70
66
|
};
|
|
71
67
|
}
|
|
@@ -17,9 +17,8 @@ export type BatchGetBuilder<Model> = {
|
|
|
17
17
|
*/
|
|
18
18
|
dbParams(): BatchGetItemCommandInput;
|
|
19
19
|
/**
|
|
20
|
-
* Execute the BatchGetItem command and return the items.
|
|
21
|
-
* Returns an object mapping table names to arrays of items.
|
|
20
|
+
* Execute the BatchGetItem command and return the items as a flat array.
|
|
22
21
|
*/
|
|
23
|
-
execute(): Promise<
|
|
22
|
+
execute(): Promise<Model[]>;
|
|
24
23
|
};
|
|
25
24
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/batch-get/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,KAAK,IAAI;IACnC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvD;;OAEG;IACH,cAAc,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAEzC;;OAEG;IACH,QAAQ,IAAI,wBAAwB,CAAC;IAErC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/batch-get/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,KAAK,IAAI;IACnC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvD;;OAEG;IACH,cAAc,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAEzC;;OAEG;IACH,QAAQ,IAAI,wBAAwB,CAAC;IAErC;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;CAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/get/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAE,SAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/builders/get/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAE,SAAQ,IAAI,CACvD,iBAAiB,CAAC,KAAK,GAAG,SAAS,CAAC,EACpC,UAAU,CACX;IACC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE5D;;;OAGG;IACH,cAAc,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE9C;;;;;;;;OAQG;IACH,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAExF;;OAEG;IACH,QAAQ,IAAI,eAAe,CAAC;CAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-put-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/put/create-put-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAgC,SAAS,EAAmB,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAgB7D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,EACX,MAAM,EAAE,cAAc,EACtB,cAAc,GAAE,SAAS,EAAO,EAChC,oBAAoB,UAAQ,EAC5B,UAAU,GAAE,MAAM,GAAG,SAAkB,EACvC,gBAAgB,UAAQ,EACxB,MAAM,CAAC,EAAE,cAAc,GACtB,UAAU,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"create-put-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/put/create-put-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAgC,SAAS,EAAmB,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAgB7D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,EACX,MAAM,EAAE,cAAc,EACtB,cAAc,GAAE,SAAS,EAAO,EAChC,oBAAoB,UAAQ,EAC5B,UAAU,GAAE,MAAM,GAAG,SAAkB,EACvC,gBAAgB,UAAQ,EACxB,MAAM,CAAC,EAAE,cAAc,GACtB,UAAU,CAAC,KAAK,CAAC,CA8HnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-query-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/query/create-query-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK1D,OAAO,EAAE,YAAY,EAA8B,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"create-query-builder.d.ts","sourceRoot":"","sources":["../../../src/builders/query/create-query-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK1D,OAAO,EAAE,YAAY,EAA8B,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAoT7D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,cAAc,GACtB,YAAY,CAAC,KAAK,CAAC,CA4BrB"}
|
|
@@ -5,30 +5,6 @@ const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
|
5
5
|
const operators_1 = require("../shared/operators");
|
|
6
6
|
const conditions_1 = require("../shared/conditions");
|
|
7
7
|
const model_utils_1 = require("../../utils/model-utils");
|
|
8
|
-
/**
|
|
9
|
-
* Determines if a field is a key field (used in pk/sk or index key templates)
|
|
10
|
-
*/
|
|
11
|
-
function isKeyField(fieldName, model, indexName) {
|
|
12
|
-
if (!model?.key)
|
|
13
|
-
return false;
|
|
14
|
-
// When an index is specified, also check model.index for key templates
|
|
15
|
-
if (indexName && model.index) {
|
|
16
|
-
for (const [, keyDef] of Object.entries(model.index)) {
|
|
17
|
-
const templateVars = (0, model_utils_1.extractTemplateVars)(keyDef.value);
|
|
18
|
-
if (templateVars.includes(fieldName)) {
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
const keyEntries = Object.entries(model.key);
|
|
24
|
-
for (const [, keyDef] of keyEntries) {
|
|
25
|
-
const templateVars = (0, model_utils_1.extractTemplateVars)(keyDef.value);
|
|
26
|
-
if (templateVars.includes(fieldName)) {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
8
|
/**
|
|
33
9
|
* Maps a model attribute name to its corresponding DynamoDB key name (PK/SK)
|
|
34
10
|
* Also returns the key template for value transformation
|
|
@@ -39,6 +15,9 @@ function getKeyNameForAttribute(fieldName, model, indexName) {
|
|
|
39
15
|
// When an index is specified, check model.index first for key templates
|
|
40
16
|
if (indexName && model.index) {
|
|
41
17
|
for (const [keyName, keyDef] of Object.entries(model.index)) {
|
|
18
|
+
if (!keyName.startsWith(indexName)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
42
21
|
const templateVars = (0, model_utils_1.extractTemplateVars)(keyDef.value);
|
|
43
22
|
if (templateVars.includes(fieldName)) {
|
|
44
23
|
return { keyName, template: keyDef.value };
|
package/dist/core/types.d.ts
CHANGED
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,eAAe,CAAC;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,yBAAyB,GACzB,yBAAyB,GACzB,wBAAwB,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,aAAa,CAAC;IAClB,EAAE,EAAE,aAAa,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;CACtC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,57 +1,29 @@
|
|
|
1
1
|
# BatchGet Builder
|
|
2
2
|
|
|
3
|
-
The `BatchGetBuilder`
|
|
3
|
+
The `BatchGetBuilder` retrieves multiple items by key in a single DynamoDB `BatchGetItem` request. It is consumed via the entity API (`table.entities.<Entity>.batchGet([...])`), and `execute()` returns a flat `Model[]`.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- Retrieve multiple items by their keys
|
|
8
8
|
- Supports attribute projection (select only specific fields)
|
|
9
9
|
- Supports consistent read
|
|
10
|
-
- Can retrieve items from multiple tables in a single request
|
|
11
10
|
|
|
12
11
|
## Basic Usage
|
|
13
12
|
|
|
14
13
|
```typescript
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const users = await table.entities.User.batchGet([
|
|
15
|
+
{ username: 'alice' },
|
|
16
|
+
{ username: 'bob' },
|
|
17
|
+
{ username: 'charlie' },
|
|
18
|
+
]).execute();
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// Retrieve multiple users
|
|
21
|
-
const result = await createBatchGetBuilder(
|
|
22
|
-
{
|
|
23
|
-
Users: {
|
|
24
|
-
Keys: [
|
|
25
|
-
{ pk: 'USER#alice', sk: 'USER#alice' },
|
|
26
|
-
{ pk: 'USER#bob', sk: 'USER#bob' },
|
|
27
|
-
{ pk: 'USER#charlie', sk: 'USER#charlie' },
|
|
28
|
-
],
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
client
|
|
32
|
-
).execute();
|
|
20
|
+
users.forEach((user) => console.log(user.username));
|
|
33
21
|
```
|
|
34
22
|
|
|
35
23
|
## With Attribute Projection
|
|
36
24
|
|
|
37
25
|
```typescript
|
|
38
|
-
|
|
39
|
-
username: string;
|
|
40
|
-
name: string;
|
|
41
|
-
followerCount: number;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const result = await createBatchGetBuilder<User>(
|
|
45
|
-
{
|
|
46
|
-
Users: {
|
|
47
|
-
Keys: [
|
|
48
|
-
{ pk: 'USER#alice', sk: 'USER#alice' },
|
|
49
|
-
{ pk: 'USER#bob', sk: 'USER#bob' },
|
|
50
|
-
],
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
client
|
|
54
|
-
)
|
|
26
|
+
const users = await table.entities.User.batchGet([{ username: 'alice' }, { username: 'bob' }])
|
|
55
27
|
.select(['username', 'name', 'followerCount'])
|
|
56
28
|
.execute();
|
|
57
29
|
```
|
|
@@ -59,38 +31,11 @@ const result = await createBatchGetBuilder<User>(
|
|
|
59
31
|
## With Consistent Read
|
|
60
32
|
|
|
61
33
|
```typescript
|
|
62
|
-
const
|
|
63
|
-
{
|
|
64
|
-
Users: {
|
|
65
|
-
Keys: [
|
|
66
|
-
{ pk: 'USER#alice', sk: 'USER#alice' },
|
|
67
|
-
{ pk: 'USER#bob', sk: 'USER#bob' },
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
client
|
|
72
|
-
)
|
|
34
|
+
const users = await table.entities.User.batchGet([{ username: 'alice' }, { username: 'bob' }])
|
|
73
35
|
.consistentRead()
|
|
74
36
|
.execute();
|
|
75
37
|
```
|
|
76
38
|
|
|
77
|
-
## Using the Table Class
|
|
78
|
-
|
|
79
|
-
```typescript
|
|
80
|
-
// Retrieve multiple users using the Table class
|
|
81
|
-
const result = await table
|
|
82
|
-
.batchGet({
|
|
83
|
-
InstagramClone: {
|
|
84
|
-
Keys: [
|
|
85
|
-
{ pk: 'USER#alice', sk: 'USER#alice' },
|
|
86
|
-
{ pk: 'USER#bob', sk: 'USER#bob' },
|
|
87
|
-
],
|
|
88
|
-
},
|
|
89
|
-
})
|
|
90
|
-
.select(['username', 'name'])
|
|
91
|
-
.execute();
|
|
92
|
-
```
|
|
93
|
-
|
|
94
39
|
## DynamoDB Limitations
|
|
95
40
|
|
|
96
41
|
- Maximum 100 items per request
|
|
@@ -84,23 +84,18 @@ export function createBatchGetBuilder<Model>(
|
|
|
84
84
|
},
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
|
-
* Execute the BatchGetItem command and return the items.
|
|
87
|
+
* Execute the BatchGetItem command and return the items as a flat array.
|
|
88
88
|
*/
|
|
89
|
-
async execute(): Promise<
|
|
89
|
+
async execute(): Promise<Model[]> {
|
|
90
90
|
const params = this.dbParams();
|
|
91
91
|
const result: BatchGetCommandOutput = await client.send(new BatchGetCommand(params));
|
|
92
92
|
logger?.log('BatchGetCommand', params, result);
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (result.Responses) {
|
|
98
|
-
for (const [tableName, items] of Object.entries(result.Responses)) {
|
|
99
|
-
responses[tableName] = items as unknown as Model[];
|
|
100
|
-
}
|
|
94
|
+
if (!result.Responses) {
|
|
95
|
+
return [];
|
|
101
96
|
}
|
|
102
97
|
|
|
103
|
-
return
|
|
98
|
+
return Object.values(result.Responses).flat() as unknown as Model[];
|
|
104
99
|
},
|
|
105
100
|
};
|
|
106
101
|
}
|
|
@@ -22,8 +22,7 @@ export type BatchGetBuilder<Model> = {
|
|
|
22
22
|
dbParams(): BatchGetItemCommandInput;
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Execute the BatchGetItem command and return the items.
|
|
26
|
-
* Returns an object mapping table names to arrays of items.
|
|
25
|
+
* Execute the BatchGetItem command and return the items as a flat array.
|
|
27
26
|
*/
|
|
28
|
-
execute(): Promise<
|
|
27
|
+
execute(): Promise<Model[]>;
|
|
29
28
|
};
|
|
@@ -5,7 +5,10 @@ import { ExecutableBuilder } from '../shared';
|
|
|
5
5
|
* Builder for DynamoDB GetItem operations.
|
|
6
6
|
* Supports projection, consistent read, and inspection of the final parameters.
|
|
7
7
|
*/
|
|
8
|
-
export interface GetBuilder<KeyInput, Model> extends Omit<
|
|
8
|
+
export interface GetBuilder<KeyInput, Model> extends Omit<
|
|
9
|
+
ExecutableBuilder<Model | undefined>,
|
|
10
|
+
'dbParams'
|
|
11
|
+
> {
|
|
9
12
|
/**
|
|
10
13
|
* Adds a projection expression to only return specific attributes.
|
|
11
14
|
* Returns a new immutable builder.
|
|
@@ -57,7 +57,16 @@ export function createPutBuilder<Model>(
|
|
|
57
57
|
},
|
|
58
58
|
|
|
59
59
|
ifNotExists() {
|
|
60
|
-
return createPutBuilder(
|
|
60
|
+
return createPutBuilder(
|
|
61
|
+
tableName,
|
|
62
|
+
item,
|
|
63
|
+
client,
|
|
64
|
+
conditions,
|
|
65
|
+
true,
|
|
66
|
+
returnMode,
|
|
67
|
+
enableTimestamps,
|
|
68
|
+
logger
|
|
69
|
+
);
|
|
61
70
|
},
|
|
62
71
|
|
|
63
72
|
returning(mode) {
|
|
@@ -26,32 +26,6 @@ type QueryState<Model> = {
|
|
|
26
26
|
logger?: DynamoDBLogger;
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
/**
|
|
30
|
-
* Determines if a field is a key field (used in pk/sk or index key templates)
|
|
31
|
-
*/
|
|
32
|
-
function isKeyField(fieldName: string, model?: ModelDefinition, indexName?: string): boolean {
|
|
33
|
-
if (!model?.key) return false;
|
|
34
|
-
|
|
35
|
-
// When an index is specified, also check model.index for key templates
|
|
36
|
-
if (indexName && model.index) {
|
|
37
|
-
for (const [, keyDef] of Object.entries(model.index)) {
|
|
38
|
-
const templateVars = extractTemplateVars(keyDef.value);
|
|
39
|
-
if (templateVars.includes(fieldName)) {
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const keyEntries = Object.entries(model.key);
|
|
46
|
-
for (const [, keyDef] of keyEntries) {
|
|
47
|
-
const templateVars = extractTemplateVars(keyDef.value);
|
|
48
|
-
if (templateVars.includes(fieldName)) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
29
|
/**
|
|
56
30
|
* Maps a model attribute name to its corresponding DynamoDB key name (PK/SK)
|
|
57
31
|
* Also returns the key template for value transformation
|
|
@@ -66,6 +40,9 @@ function getKeyNameForAttribute(
|
|
|
66
40
|
// When an index is specified, check model.index first for key templates
|
|
67
41
|
if (indexName && model.index) {
|
|
68
42
|
for (const [keyName, keyDef] of Object.entries(model.index)) {
|
|
43
|
+
if (!keyName.startsWith(indexName)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
69
46
|
const templateVars = extractTemplateVars(keyDef.value);
|
|
70
47
|
if (templateVars.includes(fieldName)) {
|
|
71
48
|
return { keyName, template: keyDef.value };
|
|
@@ -253,7 +230,11 @@ function createQueryExecutor<Model>(state: QueryState<Model>): QueryExecutor<Mod
|
|
|
253
230
|
}
|
|
254
231
|
|
|
255
232
|
// Separate key conditions from filter conditions
|
|
256
|
-
const { keyConditions, filterConditions } = separateConditions(
|
|
233
|
+
const { keyConditions, filterConditions } = separateConditions(
|
|
234
|
+
state.condition,
|
|
235
|
+
state.model,
|
|
236
|
+
state.indexName
|
|
237
|
+
);
|
|
257
238
|
|
|
258
239
|
// Build KeyConditionExpression (simple AND)
|
|
259
240
|
const keyExpr = buildSimpleAndExpression(keyConditions);
|
package/src/core/types.test.ts
CHANGED
|
@@ -287,12 +287,10 @@ describe('Schema Definition Validation', () => {
|
|
|
287
287
|
},
|
|
288
288
|
},
|
|
289
289
|
params: {
|
|
290
|
-
isoDates: true,
|
|
291
290
|
timestamps: true,
|
|
292
291
|
},
|
|
293
292
|
} as const satisfies SchemaDefinition;
|
|
294
293
|
|
|
295
|
-
expect(schemaWithParams.params?.isoDates).toBe(true);
|
|
296
294
|
expect(schemaWithParams.params?.timestamps).toBe(true);
|
|
297
295
|
});
|
|
298
296
|
|
package/src/core/types.ts
CHANGED
|
@@ -138,9 +138,7 @@ describe('zod-utils', () => {
|
|
|
138
138
|
const zodType = typeToZod(attr);
|
|
139
139
|
|
|
140
140
|
expect(() => zodType.parse([{ status: 'PENDING' }])).not.toThrow();
|
|
141
|
-
expect(() =>
|
|
142
|
-
zodType.parse([{ date: '2024-01-01', status: 'DONE' }])
|
|
143
|
-
).not.toThrow();
|
|
141
|
+
expect(() => zodType.parse([{ date: '2024-01-01', status: 'DONE' }])).not.toThrow();
|
|
144
142
|
expect(() => zodType.parse([{ date: '2024-01-01' }])).toThrow(); // missing status
|
|
145
143
|
});
|
|
146
144
|
|
|
@@ -172,9 +170,7 @@ describe('zod-utils', () => {
|
|
|
172
170
|
};
|
|
173
171
|
const zodType = typeToZod(attr);
|
|
174
172
|
|
|
175
|
-
expect(() =>
|
|
176
|
-
zodType.parse({ value: 100, breakdown: { base: 90, fees: 10 } })
|
|
177
|
-
).not.toThrow();
|
|
173
|
+
expect(() => zodType.parse({ value: 100, breakdown: { base: 90, fees: 10 } })).not.toThrow();
|
|
178
174
|
expect(() => zodType.parse({ value: 100 })).not.toThrow(); // breakdown optional
|
|
179
175
|
expect(() => zodType.parse({})).toThrow(); // value required
|
|
180
176
|
});
|
|
@@ -42,8 +42,7 @@ describe('Pagination and Timestamps Integration Tests', () => {
|
|
|
42
42
|
},
|
|
43
43
|
},
|
|
44
44
|
params: {
|
|
45
|
-
|
|
46
|
-
timestamps: true, // Enable automatic timestamps
|
|
45
|
+
timestamps: true, // Enable automatic timestamps (stored as ISO strings)
|
|
47
46
|
},
|
|
48
47
|
} as const;
|
|
49
48
|
|