@aws-amplify/datastore 3.7.3 → 3.7.4-custom-pk.86

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 (137) hide show
  1. package/CHANGELOG.md +144 -17
  2. package/README.md +154 -0
  3. package/dist/aws-amplify-datastore.js +3740 -1599
  4. package/dist/aws-amplify-datastore.js.map +1 -1
  5. package/dist/aws-amplify-datastore.min.js +25 -95
  6. package/dist/aws-amplify-datastore.min.js.map +1 -1
  7. package/lib/authModeStrategies/multiAuthStrategy.d.ts +2 -2
  8. package/lib/authModeStrategies/multiAuthStrategy.js +32 -26
  9. package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
  10. package/lib/datastore/datastore.d.ts +17 -16
  11. package/lib/datastore/datastore.js +291 -83
  12. package/lib/datastore/datastore.js.map +1 -1
  13. package/lib/index.d.ts +3 -19
  14. package/lib/predicates/index.d.ts +3 -2
  15. package/lib/predicates/index.js +12 -2
  16. package/lib/predicates/index.js.map +1 -1
  17. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +6 -2
  18. package/lib/storage/adapter/AsyncStorageAdapter.js +361 -193
  19. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  20. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +4 -4
  21. package/lib/storage/adapter/AsyncStorageDatabase.js +59 -28
  22. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  23. package/lib/storage/adapter/InMemoryStore.js +2 -2
  24. package/lib/storage/adapter/InMemoryStore.js.map +1 -1
  25. package/lib/storage/adapter/IndexedDBAdapter.d.ts +7 -2
  26. package/lib/storage/adapter/IndexedDBAdapter.js +454 -252
  27. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  28. package/lib/storage/adapter/index.d.ts +1 -1
  29. package/lib/storage/storage.d.ts +3 -3
  30. package/lib/storage/storage.js +106 -28
  31. package/lib/storage/storage.js.map +1 -1
  32. package/lib/sync/index.d.ts +23 -7
  33. package/lib/sync/index.js +18 -17
  34. package/lib/sync/index.js.map +1 -1
  35. package/lib/sync/merger.d.ts +3 -3
  36. package/lib/sync/merger.js +8 -6
  37. package/lib/sync/merger.js.map +1 -1
  38. package/lib/sync/outbox.d.ts +2 -2
  39. package/lib/sync/outbox.js +12 -9
  40. package/lib/sync/outbox.js.map +1 -1
  41. package/lib/sync/processors/errorMaps.d.ts +17 -0
  42. package/lib/sync/processors/errorMaps.js +125 -0
  43. package/lib/sync/processors/errorMaps.js.map +1 -0
  44. package/lib/sync/processors/mutation.d.ts +22 -4
  45. package/lib/sync/processors/mutation.js +119 -51
  46. package/lib/sync/processors/mutation.js.map +1 -1
  47. package/lib/sync/processors/subscription.d.ts +4 -2
  48. package/lib/sync/processors/subscription.js +76 -41
  49. package/lib/sync/processors/subscription.js.map +1 -1
  50. package/lib/sync/processors/sync.d.ts +4 -2
  51. package/lib/sync/processors/sync.js +62 -27
  52. package/lib/sync/processors/sync.js.map +1 -1
  53. package/lib/sync/utils.d.ts +3 -2
  54. package/lib/sync/utils.js +58 -7
  55. package/lib/sync/utils.js.map +1 -1
  56. package/lib/types.d.ts +90 -34
  57. package/lib/types.js +31 -2
  58. package/lib/types.js.map +1 -1
  59. package/lib/util.d.ts +48 -33
  60. package/lib/util.js +219 -57
  61. package/lib/util.js.map +1 -1
  62. package/lib-esm/authModeStrategies/multiAuthStrategy.d.ts +2 -2
  63. package/lib-esm/authModeStrategies/multiAuthStrategy.js +32 -26
  64. package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
  65. package/lib-esm/datastore/datastore.d.ts +17 -16
  66. package/lib-esm/datastore/datastore.js +293 -85
  67. package/lib-esm/datastore/datastore.js.map +1 -1
  68. package/lib-esm/index.d.ts +3 -19
  69. package/lib-esm/predicates/index.d.ts +3 -2
  70. package/lib-esm/predicates/index.js +13 -3
  71. package/lib-esm/predicates/index.js.map +1 -1
  72. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +6 -2
  73. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +361 -193
  74. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  75. package/lib-esm/storage/adapter/AsyncStorageDatabase.d.ts +4 -4
  76. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +60 -29
  77. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  78. package/lib-esm/storage/adapter/InMemoryStore.js +2 -2
  79. package/lib-esm/storage/adapter/InMemoryStore.js.map +1 -1
  80. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +7 -2
  81. package/lib-esm/storage/adapter/IndexedDBAdapter.js +454 -252
  82. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  83. package/lib-esm/storage/adapter/index.d.ts +1 -1
  84. package/lib-esm/storage/storage.d.ts +3 -3
  85. package/lib-esm/storage/storage.js +106 -28
  86. package/lib-esm/storage/storage.js.map +1 -1
  87. package/lib-esm/sync/index.d.ts +23 -7
  88. package/lib-esm/sync/index.js +20 -19
  89. package/lib-esm/sync/index.js.map +1 -1
  90. package/lib-esm/sync/merger.d.ts +3 -3
  91. package/lib-esm/sync/merger.js +8 -6
  92. package/lib-esm/sync/merger.js.map +1 -1
  93. package/lib-esm/sync/outbox.d.ts +2 -2
  94. package/lib-esm/sync/outbox.js +13 -10
  95. package/lib-esm/sync/outbox.js.map +1 -1
  96. package/lib-esm/sync/processors/errorMaps.d.ts +17 -0
  97. package/lib-esm/sync/processors/errorMaps.js +119 -0
  98. package/lib-esm/sync/processors/errorMaps.js.map +1 -0
  99. package/lib-esm/sync/processors/mutation.d.ts +22 -4
  100. package/lib-esm/sync/processors/mutation.js +122 -54
  101. package/lib-esm/sync/processors/mutation.js.map +1 -1
  102. package/lib-esm/sync/processors/subscription.d.ts +4 -2
  103. package/lib-esm/sync/processors/subscription.js +77 -42
  104. package/lib-esm/sync/processors/subscription.js.map +1 -1
  105. package/lib-esm/sync/processors/sync.d.ts +4 -2
  106. package/lib-esm/sync/processors/sync.js +62 -27
  107. package/lib-esm/sync/processors/sync.js.map +1 -1
  108. package/lib-esm/sync/utils.d.ts +3 -2
  109. package/lib-esm/sync/utils.js +58 -8
  110. package/lib-esm/sync/utils.js.map +1 -1
  111. package/lib-esm/types.d.ts +90 -34
  112. package/lib-esm/types.js +29 -3
  113. package/lib-esm/types.js.map +1 -1
  114. package/lib-esm/util.d.ts +48 -33
  115. package/lib-esm/util.js +207 -54
  116. package/lib-esm/util.js.map +1 -1
  117. package/package.json +10 -9
  118. package/src/authModeStrategies/multiAuthStrategy.ts +24 -21
  119. package/src/datastore/datastore.ts +448 -148
  120. package/src/predicates/index.ts +32 -10
  121. package/src/storage/adapter/AsyncStorageAdapter.ts +305 -78
  122. package/src/storage/adapter/AsyncStorageDatabase.ts +65 -26
  123. package/src/storage/adapter/InMemoryStore.ts +2 -2
  124. package/src/storage/adapter/IndexedDBAdapter.ts +344 -101
  125. package/src/storage/adapter/index.ts +1 -1
  126. package/src/storage/storage.ts +85 -24
  127. package/src/sync/index.ts +74 -58
  128. package/src/sync/merger.ts +16 -4
  129. package/src/sync/outbox.ts +22 -8
  130. package/src/sync/processors/errorMaps.ts +93 -0
  131. package/src/sync/processors/mutation.ts +143 -84
  132. package/src/sync/processors/subscription.ts +67 -36
  133. package/src/sync/processors/sync.ts +37 -12
  134. package/src/sync/utils.ts +67 -16
  135. package/src/types.ts +252 -50
  136. package/src/util.ts +256 -42
  137. package/ssr/package.json +1 -1
package/src/types.ts CHANGED
@@ -10,9 +10,13 @@ import {
10
10
  isAWSURL,
11
11
  isAWSPhone,
12
12
  isAWSIPAddress,
13
+ extractPrimaryKeyFieldNames,
13
14
  } from './util';
14
15
  import { PredicateAll } from './predicates';
15
16
  import { GRAPHQL_AUTH_MODE } from '@aws-amplify/api-graphql';
17
+ import { Auth } from '@aws-amplify/auth';
18
+ import { API } from '@aws-amplify/api';
19
+ import Cache from '@aws-amplify/cache';
16
20
  import { Adapter } from './storage/adapter';
17
21
 
18
22
  //#region Schema types
@@ -60,25 +64,29 @@ type SchemaEnum = {
60
64
  export type ModelAssociation = AssociatedWith | TargetNameAssociation;
61
65
  type AssociatedWith = {
62
66
  connectionType: 'HAS_MANY' | 'HAS_ONE';
63
- associatedWith: string;
67
+ associatedWith: string | string[];
64
68
  targetName?: string;
69
+ targetNames?: string[];
65
70
  };
71
+
66
72
  export function isAssociatedWith(obj: any): obj is AssociatedWith {
67
73
  return obj && obj.associatedWith;
68
74
  }
69
75
 
70
76
  type TargetNameAssociation = {
71
77
  connectionType: 'BELONGS_TO';
72
- targetName: string;
78
+ targetName?: string;
79
+ targetNames?: string[];
73
80
  };
81
+
74
82
  export function isTargetNameAssociation(
75
83
  obj: any
76
84
  ): obj is TargetNameAssociation {
77
- return obj && obj.targetName;
85
+ return obj?.targetName || obj?.targetNames;
78
86
  }
79
87
 
80
88
  export type ModelAttributes = ModelAttribute[];
81
- type ModelAttribute = { type: string; properties?: Record<string, any> };
89
+ export type ModelAttribute = { type: string; properties?: Record<string, any> };
82
90
 
83
91
  export type ModelAuthRule = {
84
92
  allow: string;
@@ -120,6 +128,7 @@ type ModelAttributeKey = {
120
128
  type ModelAttributePrimaryKey = {
121
129
  type: 'key';
122
130
  properties: {
131
+ name: never;
123
132
  fields: string[];
124
133
  };
125
134
  };
@@ -333,33 +342,134 @@ export type NonModelTypeConstructor<T> = {
333
342
  };
334
343
 
335
344
  // Class for model
336
- export type PersistentModelConstructor<
337
- T extends PersistentModel,
338
- K extends PersistentModelMetaData = {
339
- readOnlyFields: 'createdAt' | 'updatedAt';
340
- }
341
- > = {
342
- new (init: ModelInit<T, K>): T;
343
- copyOf(src: T, mutator: (draft: MutableModel<T, K>) => void): T;
345
+ export type PersistentModelConstructor<T extends PersistentModel> = {
346
+ new (init: ModelInit<T, PersistentModelMetaData<T>>): T;
347
+ copyOf(
348
+ src: T,
349
+ mutator: (draft: MutableModel<T, PersistentModelMetaData<T>>) => void
350
+ ): T;
344
351
  };
345
352
 
346
353
  export type TypeConstructorMap = Record<
347
354
  string,
348
- PersistentModelConstructor<any> | NonModelTypeConstructor<any>
355
+ PersistentModelConstructor<any> | NonModelTypeConstructor<unknown>
356
+ >;
357
+
358
+ export declare const __identifierBrand__: unique symbol;
359
+ export type IdentifierBrand<T, K> = T & { [__identifierBrand__]: K };
360
+
361
+ // datastore generates a uuid for you
362
+ export type ManagedIdentifier<T, F extends keyof T> = IdentifierBrand<
363
+ { field: F extends string ? F : never; type: T },
364
+ 'ManagedIdentifier'
365
+ >;
366
+
367
+ // you can provide a value, if not, datastore generates a uuid for you
368
+ export type OptionallyManagedIdentifier<T, F extends keyof T> = IdentifierBrand<
369
+ { field: F extends string ? F : never; type: T },
370
+ 'OptionallyManagedIdentifier'
371
+ >;
372
+
373
+ // You provide the values
374
+ export type CompositeIdentifier<T, K extends Array<keyof T>> = IdentifierBrand<
375
+ { fields: K; type: T },
376
+ 'CompositeIdentifier'
349
377
  >;
350
378
 
379
+ // You provide the value
380
+ export type CustomIdentifier<T, K extends keyof T> = CompositeIdentifier<
381
+ T,
382
+ [K]
383
+ >;
384
+
385
+ export type Identifier<T> =
386
+ | ManagedIdentifier<T, any>
387
+ | OptionallyManagedIdentifier<T, any>
388
+ | CompositeIdentifier<T, any>
389
+ | CustomIdentifier<T, any>;
390
+
391
+ export type IdentifierFields<
392
+ T extends PersistentModel,
393
+ M extends PersistentModelMetaData<T> = never
394
+ > = (MetadataOrDefault<T, M>['identifier'] extends
395
+ | ManagedIdentifier<any, any>
396
+ | OptionallyManagedIdentifier<any, any>
397
+ ? MetadataOrDefault<T, M>['identifier']['field']
398
+ : MetadataOrDefault<T, M>['identifier'] extends CompositeIdentifier<
399
+ T,
400
+ infer B
401
+ >
402
+ ? B[number] // B[number]
403
+ : MetadataOrDefault<T, M>['identifier']['field']) &
404
+ string;
405
+
406
+ export type IdentifierFieldsForInit<
407
+ T extends PersistentModel,
408
+ M extends PersistentModelMetaData<T>
409
+ > = MetadataOrDefault<T, M>['identifier'] extends
410
+ | DefaultPersistentModelMetaData
411
+ | ManagedIdentifier<T, any>
412
+ ? never
413
+ : MetadataOrDefault<T, M>['identifier'] extends OptionallyManagedIdentifier<
414
+ T,
415
+ any
416
+ >
417
+ ? IdentifierFields<T, M>
418
+ : MetadataOrDefault<T, M>['identifier'] extends CompositeIdentifier<T, any>
419
+ ? IdentifierFields<T, M>
420
+ : never;
421
+
351
422
  // Instance of model
352
- export type PersistentModelMetaData = {
353
- readOnlyFields: string;
423
+ export declare const __modelMeta__: unique symbol;
424
+
425
+ export type PersistentModelMetaData<T> = {
426
+ identifier?: Identifier<T>;
427
+ readOnlyFields?: string;
428
+ };
429
+
430
+ export type DefaultPersistentModelMetaData = {
431
+ identifier: ManagedIdentifier<{ id: string }, 'id'>;
432
+ readOnlyFields: never;
354
433
  };
355
434
 
356
- export type PersistentModel = Readonly<{ id: string } & Record<string, any>>;
435
+ export type MetadataOrDefault<
436
+ T extends PersistentModel,
437
+ _ extends PersistentModelMetaData<T> = never
438
+ > = T extends {
439
+ [__modelMeta__]: PersistentModelMetaData<T>;
440
+ }
441
+ ? T[typeof __modelMeta__]
442
+ : DefaultPersistentModelMetaData;
443
+
444
+ export type PersistentModel = Readonly<Record<string, any>>;
445
+
446
+ export type MetadataReadOnlyFields<
447
+ T extends PersistentModel,
448
+ M extends PersistentModelMetaData<T>
449
+ > = Extract<
450
+ MetadataOrDefault<T, M>['readOnlyFields'] | M['readOnlyFields'],
451
+ keyof T
452
+ >;
453
+
454
+ // This type omits the metadata field in the constructor init object
455
+ // This type omits identifier fields in the constructor init object
456
+ // This type omits readOnlyFields in the constructor init object
457
+ // This type requires some identifiers in the constructor init object (e.g. CustomIdentifier)
458
+ // This type makes optional some identifiers in the constructor init object (e.g. OptionallyManagedIdentifier)
357
459
  export type ModelInit<
460
+ T extends PersistentModel,
461
+ M extends PersistentModelMetaData<T> = {}
462
+ > = Omit<
358
463
  T,
359
- K extends PersistentModelMetaData = {
360
- readOnlyFields: 'createdAt' | 'updatedAt';
361
- }
362
- > = Omit<T, 'id' | K['readOnlyFields']>;
464
+ typeof __modelMeta__ | IdentifierFields<T, M> | MetadataReadOnlyFields<T, M>
465
+ > &
466
+ (MetadataOrDefault<T, M>['identifier'] extends OptionallyManagedIdentifier<
467
+ T,
468
+ any
469
+ >
470
+ ? Partial<Pick<T, IdentifierFieldsForInit<T, M>>>
471
+ : Required<Pick<T, IdentifierFieldsForInit<T, M>>>);
472
+
363
473
  type DeepWritable<T> = {
364
474
  -readonly [P in keyof T]: T[P] extends TypeName<T[P]>
365
475
  ? T[P]
@@ -367,22 +477,76 @@ type DeepWritable<T> = {
367
477
  };
368
478
 
369
479
  export type MutableModel<
370
- T extends Record<string, any>,
371
- K extends PersistentModelMetaData = {
372
- readOnlyFields: 'createdAt' | 'updatedAt';
373
- }
480
+ T extends PersistentModel,
481
+ M extends PersistentModelMetaData<T> = {}
374
482
  // This provides Intellisense with ALL of the properties, regardless of read-only
375
483
  // but will throw a linting error if trying to overwrite a read-only property
376
- > = DeepWritable<Omit<T, 'id' | K['readOnlyFields']>> &
377
- Readonly<Pick<T, 'id' | K['readOnlyFields']>>;
484
+ > = DeepWritable<
485
+ Omit<T, IdentifierFields<T, M> | MetadataReadOnlyFields<T, M>>
486
+ > &
487
+ Readonly<Pick<T, IdentifierFields<T, M> | MetadataReadOnlyFields<T, M>>>;
378
488
 
379
489
  export type ModelInstanceMetadata = {
380
- id: string;
381
490
  _version: number;
382
491
  _lastChangedAt: number;
383
492
  _deleted: boolean;
384
493
  };
385
494
 
495
+ export type IdentifierFieldValue<
496
+ T extends PersistentModel,
497
+ M extends PersistentModelMetaData<T>
498
+ > = MetadataOrDefault<T, M>['identifier'] extends CompositeIdentifier<T, any>
499
+ ? MetadataOrDefault<T, M>['identifier']['fields'] extends [any]
500
+ ? T[MetadataOrDefault<T, M>['identifier']['fields'][0]]
501
+ : never
502
+ : T[MetadataOrDefault<T, M>['identifier']['field']];
503
+
504
+ export type IdentifierFieldOrIdentifierObject<
505
+ T extends PersistentModel,
506
+ M extends PersistentModelMetaData<T>
507
+ > = Pick<T, IdentifierFields<T, M>> | IdentifierFieldValue<T, M>;
508
+
509
+ export function isIdentifierFieldValue<T extends PersistentModel>(
510
+ obj: any,
511
+ modelDefinition: SchemaModel
512
+ ): obj is IdentifierFieldValue<T extends PersistentModel ? T : never, any> {
513
+ const keys = extractPrimaryKeyFieldNames(modelDefinition);
514
+
515
+ if (keys.length === 1) {
516
+ const { type } = modelDefinition?.fields[keys[0]] ?? {};
517
+
518
+ if (isGraphQLScalarType(type)) {
519
+ const jsType = GraphQLScalarType.getJSType(type);
520
+
521
+ return typeof obj === jsType;
522
+ }
523
+
524
+ return false;
525
+ }
526
+
527
+ return false;
528
+ }
529
+
530
+ export function isIdentifierFieldOrObject<T extends PersistentModel>(
531
+ obj: any,
532
+ modelDefinition: SchemaModel
533
+ ): obj is IdentifierFieldOrIdentifierObject<T, any> {
534
+ return (
535
+ isIdentifierFieldValue<T>(obj, modelDefinition) ||
536
+ isIdentifierObject<T>(obj, modelDefinition)
537
+ );
538
+ }
539
+
540
+ export function isIdentifierObject<T extends PersistentModel>(
541
+ obj: any,
542
+ modelDefinition: SchemaModel
543
+ ): obj is IdentifierFields<T extends PersistentModel ? T : never, any> {
544
+ const keys = extractPrimaryKeyFieldNames(modelDefinition);
545
+
546
+ return (
547
+ typeof obj === 'object' && obj && keys.every(k => obj[k] !== undefined)
548
+ );
549
+ }
386
550
  //#endregion
387
551
 
388
552
  //#region Subscription messages
@@ -392,11 +556,17 @@ export enum OpType {
392
556
  DELETE = 'DELETE',
393
557
  }
394
558
 
395
- export type SubscriptionMessage<T extends PersistentModel> = {
559
+ export type SubscriptionMessage<T extends PersistentModel> = Pick<
560
+ InternalSubscriptionMessage<T>,
561
+ 'opType' | 'element' | 'model' | 'condition'
562
+ >;
563
+
564
+ export type InternalSubscriptionMessage<T extends PersistentModel> = {
396
565
  opType: OpType;
397
566
  element: T;
398
567
  model: PersistentModelConstructor<T>;
399
568
  condition: PredicatesGroup<T> | null;
569
+ savedElement?: T;
400
570
  };
401
571
 
402
572
  export type DataStoreSnapshot<T extends PersistentModel> = {
@@ -407,15 +577,14 @@ export type DataStoreSnapshot<T extends PersistentModel> = {
407
577
 
408
578
  //#region Predicates
409
579
 
410
- export type PredicateExpression<M extends PersistentModel, FT> = TypeName<
580
+ export type PredicateExpression<
581
+ M extends PersistentModel,
411
582
  FT
412
- > extends keyof MapTypeToOperands<FT>
583
+ > = TypeName<FT> extends keyof MapTypeToOperands<FT>
413
584
  ? (
414
585
  operator: keyof MapTypeToOperands<FT>[TypeName<FT>],
415
586
  // make the operand type match the type they're trying to filter on
416
- operand: MapTypeToOperands<FT>[TypeName<FT>][keyof MapTypeToOperands<
417
- FT
418
- >[TypeName<FT>]]
587
+ operand: MapTypeToOperands<FT>[TypeName<FT>][keyof MapTypeToOperands<FT>[TypeName<FT>]]
419
588
  ) => ModelPredicate<M>
420
589
  : never;
421
590
 
@@ -483,8 +652,7 @@ export type PredicateGroups<T extends PersistentModel> = {
483
652
 
484
653
  export type ModelPredicate<M extends PersistentModel> = {
485
654
  [K in keyof M]-?: PredicateExpression<M, NonNullable<M[K]>>;
486
- } &
487
- PredicateGroups<M>;
655
+ } & PredicateGroups<M>;
488
656
 
489
657
  export type ProducerModelPredicate<M extends PersistentModel> = (
490
658
  condition: ModelPredicate<M>
@@ -574,9 +742,10 @@ export type SortPredicate<T extends PersistentModel> = {
574
742
  [K in keyof T]-?: SortPredicateExpression<T, NonNullable<T[K]>>;
575
743
  };
576
744
 
577
- export type SortPredicateExpression<M extends PersistentModel, FT> = TypeName<
745
+ export type SortPredicateExpression<
746
+ M extends PersistentModel,
578
747
  FT
579
- > extends keyof MapTypeToOperands<FT>
748
+ > = TypeName<FT> extends keyof MapTypeToOperands<FT>
580
749
  ? (sortDirection: keyof typeof SortDirection) => SortPredicate<M>
581
750
  : never;
582
751
 
@@ -585,9 +754,8 @@ export enum SortDirection {
585
754
  DESCENDING = 'DESCENDING',
586
755
  }
587
756
 
588
- export type SortPredicatesGroup<
589
- T extends PersistentModel
590
- > = SortPredicateObject<T>[];
757
+ export type SortPredicatesGroup<T extends PersistentModel> =
758
+ SortPredicateObject<T>[];
591
759
 
592
760
  export type SortPredicateObject<T extends PersistentModel> = {
593
761
  field: keyof T;
@@ -628,11 +796,21 @@ export type RelationType = {
628
796
  modelName: string;
629
797
  relationType: 'HAS_ONE' | 'HAS_MANY' | 'BELONGS_TO';
630
798
  targetName?: string;
631
- associatedWith?: string;
799
+ targetNames?: string[];
800
+ associatedWith?: string | string[];
801
+ };
802
+
803
+ type IndexOptions = {
804
+ unique?: boolean;
632
805
  };
633
806
 
807
+ export type IndexesType = Array<[string, string[], IndexOptions?]>;
808
+
634
809
  export type RelationshipType = {
635
- [modelName: string]: { indexes: string[]; relationTypes: RelationType[] };
810
+ [modelName: string]: {
811
+ indexes: IndexesType;
812
+ relationTypes: RelationType[];
813
+ };
636
814
  };
637
815
 
638
816
  //#endregion
@@ -654,7 +832,7 @@ export type DataStoreConfig = {
654
832
  DataStore?: {
655
833
  authModeStrategyType?: AuthModeStrategyType;
656
834
  conflictHandler?: ConflictHandler; // default : retry until client wins up to x times
657
- errorHandler?: (error: SyncError) => void; // default : logger.warn
835
+ errorHandler?: (error: SyncError<PersistentModel>) => void; // default : logger.warn
658
836
  maxRecordsToSync?: number; // merge
659
837
  syncPageSize?: number;
660
838
  fullSyncInterval?: number;
@@ -664,7 +842,7 @@ export type DataStoreConfig = {
664
842
  };
665
843
  authModeStrategyType?: AuthModeStrategyType;
666
844
  conflictHandler?: ConflictHandler; // default : retry until client wins up to x times
667
- errorHandler?: (error: SyncError) => void; // default : logger.warn
845
+ errorHandler?: (error: SyncError<PersistentModel>) => void; // default : logger.warn
668
846
  maxRecordsToSync?: number; // merge
669
847
  syncPageSize?: number;
670
848
  fullSyncInterval?: number;
@@ -771,15 +949,33 @@ export type SyncConflict = {
771
949
  attempts: number;
772
950
  };
773
951
 
774
- export type SyncError = {
952
+ export type SyncError<T extends PersistentModel> = {
775
953
  message: string;
776
- errorType: string;
777
- errorInfo: string;
778
- localModel: PersistentModel;
779
- remoteModel: PersistentModel;
954
+ errorType: ErrorType;
955
+ errorInfo?: string;
956
+ recoverySuggestion?: string;
957
+ model?: string;
958
+ localModel: T;
959
+ remoteModel: T;
960
+ process: ProcessName;
780
961
  operation: string;
962
+ cause?: Error;
781
963
  };
782
964
 
965
+ export type ErrorType =
966
+ | 'ConfigError'
967
+ | 'BadModel'
968
+ | 'BadRecord'
969
+ | 'Unauthorized'
970
+ | 'Transient'
971
+ | 'Unknown';
972
+
973
+ export enum ProcessName {
974
+ 'sync' = 'sync',
975
+ 'mutate' = 'mutate',
976
+ 'subscribe' = 'subscribe',
977
+ }
978
+
783
979
  export const DISCARD = Symbol('DISCARD');
784
980
 
785
981
  export type ConflictHandler = (
@@ -788,7 +984,7 @@ export type ConflictHandler = (
788
984
  | Promise<PersistentModel | typeof DISCARD>
789
985
  | PersistentModel
790
986
  | typeof DISCARD;
791
- export type ErrorHandler = (error: SyncError) => void;
987
+ export type ErrorHandler = (error: SyncError<PersistentModel>) => void;
792
988
 
793
989
  export type DeferredCallbackResolverOptions = {
794
990
  callback: () => void;
@@ -801,3 +997,9 @@ export enum LimitTimerRaceResolvedValues {
801
997
  TIMER = 'TIMER',
802
998
  }
803
999
  //#endregion
1000
+
1001
+ export type AmplifyContext = {
1002
+ Auth: typeof Auth;
1003
+ API: typeof API;
1004
+ Cache: typeof Cache;
1005
+ };