@ftschopp/dynatable-core 1.2.4 → 1.3.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 (44) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +1 -3
  3. package/dist/builders/batch-get/create-batch-get-builder.d.ts.map +1 -1
  4. package/dist/builders/batch-get/create-batch-get-builder.js +4 -8
  5. package/dist/builders/batch-get/types.d.ts +2 -3
  6. package/dist/builders/batch-get/types.d.ts.map +1 -1
  7. package/dist/builders/query/create-query-builder.d.ts +1 -1
  8. package/dist/builders/query/create-query-builder.d.ts.map +1 -1
  9. package/dist/builders/query/create-query-builder.js +35 -10
  10. package/dist/builders/shared/operators.d.ts.map +1 -1
  11. package/dist/builders/shared/operators.js +8 -0
  12. package/dist/builders/shared/types.d.ts +1 -0
  13. package/dist/builders/shared/types.d.ts.map +1 -1
  14. package/dist/builders/update/create-update-builder.d.ts +8 -2
  15. package/dist/builders/update/create-update-builder.d.ts.map +1 -1
  16. package/dist/builders/update/create-update-builder.js +45 -16
  17. package/dist/builders/update/types.d.ts +13 -0
  18. package/dist/builders/update/types.d.ts.map +1 -1
  19. package/dist/core/types.d.ts +0 -1
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/entity/create-entity-api.d.ts.map +1 -1
  22. package/dist/entity/create-entity-api.js +8 -4
  23. package/dist/utils/model-utils.d.ts +28 -0
  24. package/dist/utils/model-utils.d.ts.map +1 -1
  25. package/dist/utils/model-utils.js +34 -1
  26. package/package.json +1 -1
  27. package/src/builders/batch-get/README.md +9 -64
  28. package/src/builders/batch-get/create-batch-get-builder.ts +5 -10
  29. package/src/builders/batch-get/types.ts +2 -3
  30. package/src/builders/query/create-query-builder.test.ts +204 -0
  31. package/src/builders/query/create-query-builder.ts +51 -10
  32. package/src/builders/shared/operators.ts +8 -0
  33. package/src/builders/shared/types.ts +1 -0
  34. package/src/builders/update/create-update-builder.test.ts +197 -0
  35. package/src/builders/update/create-update-builder.ts +72 -19
  36. package/src/builders/update/types.ts +14 -0
  37. package/src/core/types.test.ts +0 -2
  38. package/src/core/types.ts +0 -1
  39. package/src/entity/create-entity-api.ts +8 -4
  40. package/src/utils/model-utils.test.ts +91 -1
  41. package/src/utils/model-utils.ts +54 -0
  42. package/tests/integration/instagram-clone.integration.test.ts +23 -4
  43. package/tests/integration/pagination-timestamps.integration.test.ts +1 -2
  44. package/tests/integration/transactions.integration.test.ts +0 -1
@@ -98,7 +98,6 @@ const InstagramSchema = {
98
98
  },
99
99
  },
100
100
  params: {
101
- isoDates: true,
102
101
  timestamps: true,
103
102
  },
104
103
  } as const;
@@ -251,15 +250,20 @@ describe('Should test dbParams function builder', () => {
251
250
  .where((attr, op) => op.eq(attr.username, 'juanca'))
252
251
  .dbParams();
253
252
 
254
- // After query builder fix: username -> pk, and value gets template applied
253
+ // After query builder fix: username -> pk, and value gets template applied.
254
+ // Entity API auto-injects a `_type = <modelName>` filter so that queries on
255
+ // shared partition keys don't return items of other entities.
255
256
  expect(params).toEqual({
256
257
  TableName: 'InstagramClone',
257
258
  KeyConditionExpression: '#PK = :username_0',
259
+ FilterExpression: '#_type = :_type',
258
260
  ExpressionAttributeNames: {
259
261
  '#PK': 'PK',
262
+ '#_type': '_type',
260
263
  },
261
264
  ExpressionAttributeValues: {
262
265
  ':username_0': 'UP#juanca', // Template applied: UP#${username}
266
+ ':_type': 'Photo',
263
267
  },
264
268
  });
265
269
 
@@ -267,6 +271,7 @@ describe('Should test dbParams function builder', () => {
267
271
  expect(params.KeyConditionExpression).toMatch(/#PK = :username_\d+/);
268
272
  expect(params.ExpressionAttributeNames).toEqual({
269
273
  '#PK': 'PK',
274
+ '#_type': '_type',
270
275
  });
271
276
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain('UP#juanca');
272
277
  });
@@ -279,23 +284,27 @@ describe('Should test dbParams function builder', () => {
279
284
  expect(params).toEqual({
280
285
  TableName: 'InstagramClone',
281
286
  KeyConditionExpression: '#PK = :username_0',
282
- FilterExpression: '#likesCount > :likesCount_1',
287
+ FilterExpression: '(#likesCount > :likesCount_1) AND (#_type = :_type)',
283
288
  ExpressionAttributeNames: {
284
289
  '#likesCount': 'likesCount',
285
290
  '#PK': 'PK',
291
+ '#_type': '_type',
286
292
  },
287
293
  ExpressionAttributeValues: {
288
294
  ':likesCount_1': 0,
289
295
  ':username_0': 'UP#juanca',
296
+ ':_type': 'Photo',
290
297
  },
291
298
  });
292
299
 
293
300
  expect(params.TableName).toBe('InstagramClone');
294
301
  expect(params.KeyConditionExpression).toMatch(/#PK = :username_\d+/);
295
302
  expect(params.FilterExpression).toMatch(/#likesCount > :likesCount_\d+/);
303
+ expect(params.FilterExpression).toMatch(/#_type = :_type/);
296
304
  expect(params.ExpressionAttributeNames).toEqual({
297
305
  '#PK': 'PK',
298
306
  '#likesCount': 'likesCount',
307
+ '#_type': '_type',
299
308
  });
300
309
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain('UP#juanca');
301
310
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain(0);
@@ -311,11 +320,14 @@ describe('Should test dbParams function builder', () => {
311
320
  expect(params).toEqual({
312
321
  TableName: 'InstagramClone',
313
322
  KeyConditionExpression: '#PK = :username_0',
323
+ FilterExpression: '#_type = :_type',
314
324
  ExpressionAttributeNames: {
315
325
  '#PK': 'PK',
326
+ '#_type': '_type',
316
327
  },
317
328
  ExpressionAttributeValues: {
318
329
  ':username_0': 'UP#juanca',
330
+ ':_type': 'Photo',
319
331
  },
320
332
  Limit: 10,
321
333
  ScanIndexForward: false,
@@ -345,16 +357,19 @@ describe('Should test dbParams function builder', () => {
345
357
  expect(params).toEqual({
346
358
  TableName: 'InstagramClone',
347
359
  KeyConditionExpression: '#PK = :photoId_0',
360
+ FilterExpression: '#_type = :_type',
348
361
  ExpressionAttributeNames: {
349
362
  '#PK': 'PK',
363
+ '#_type': '_type',
350
364
  },
351
365
  ExpressionAttributeValues: {
352
366
  ':photoId_0': 'PL#photo123', // Template applied: PL#${photoId}
367
+ ':_type': 'Like',
353
368
  },
354
369
  });
355
370
  expect(params.TableName).toBe('InstagramClone');
356
371
  expect(params.KeyConditionExpression).toMatch(/#PK = :photoId_\d+/);
357
- expect(params.ExpressionAttributeNames).toEqual({ '#PK': 'PK' });
372
+ expect(params.ExpressionAttributeNames).toEqual({ '#PK': 'PK', '#_type': '_type' });
358
373
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain('PL#photo123');
359
374
  });
360
375
 
@@ -373,10 +388,12 @@ describe('Should test dbParams function builder', () => {
373
388
  expect(params.FilterExpression).toMatch(
374
389
  /\(#likesCount > :likesCount_\d+\) OR \(#commentCount > :commentCount_\d+\)/
375
390
  );
391
+ expect(params.FilterExpression).toMatch(/#_type = :_type/);
376
392
  expect(params.ExpressionAttributeNames).toEqual({
377
393
  '#PK': 'PK',
378
394
  '#likesCount': 'likesCount',
379
395
  '#commentCount': 'commentCount',
396
+ '#_type': '_type',
380
397
  });
381
398
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain('UP#juanca');
382
399
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain(100);
@@ -402,10 +419,12 @@ describe('Should test dbParams function builder', () => {
402
419
  /\(#likesCount > :likesCount_\d+\) AND \(#commentCount < :commentCount_\d+\)/
403
420
  );
404
421
  expect(params.FilterExpression).toMatch(/OR/);
422
+ expect(params.FilterExpression).toMatch(/#_type = :_type/);
405
423
  expect(params.ExpressionAttributeNames).toEqual({
406
424
  '#PK': 'PK',
407
425
  '#likesCount': 'likesCount',
408
426
  '#commentCount': 'commentCount',
427
+ '#_type': '_type',
409
428
  });
410
429
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain('UP#juanca');
411
430
  expect(Object.values(params.ExpressionAttributeValues || {})).toContain(100);
@@ -42,8 +42,7 @@ describe('Pagination and Timestamps Integration Tests', () => {
42
42
  },
43
43
  },
44
44
  params: {
45
- isoDates: true,
46
- timestamps: true, // Enable automatic timestamps
45
+ timestamps: true, // Enable automatic timestamps (stored as ISO strings)
47
46
  },
48
47
  } as const;
49
48
 
@@ -84,7 +84,6 @@ const InstagramSchema = {
84
84
  },
85
85
  },
86
86
  params: {
87
- isoDates: true,
88
87
  timestamps: true,
89
88
  },
90
89
  } as const;