@aws-amplify/datastore 5.0.32 → 5.0.33-s-auth.30d0cd2.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 (149) hide show
  1. package/dist/cjs/authModeStrategies/multiAuthStrategy.js +1 -1
  2. package/dist/cjs/authModeStrategies/multiAuthStrategy.js.map +1 -1
  3. package/dist/cjs/datastore/datastore.js +46 -41
  4. package/dist/cjs/datastore/datastore.js.map +1 -1
  5. package/dist/cjs/index.js +3 -1
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/predicates/index.js +1 -0
  8. package/dist/cjs/predicates/index.js.map +1 -1
  9. package/dist/cjs/predicates/next.js +13 -12
  10. package/dist/cjs/predicates/next.js.map +1 -1
  11. package/dist/cjs/predicates/sort.js +2 -2
  12. package/dist/cjs/predicates/sort.js.map +1 -1
  13. package/dist/cjs/storage/adapter/AsyncStorageAdapter.js +21 -18
  14. package/dist/cjs/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  15. package/dist/cjs/storage/adapter/AsyncStorageDatabase.js +10 -9
  16. package/dist/cjs/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  17. package/dist/cjs/storage/adapter/InMemoryStore.js +4 -1
  18. package/dist/cjs/storage/adapter/InMemoryStore.js.map +1 -1
  19. package/dist/cjs/storage/adapter/IndexedDBAdapter.js +21 -23
  20. package/dist/cjs/storage/adapter/IndexedDBAdapter.js.map +1 -1
  21. package/dist/cjs/storage/adapter/StorageAdapterBase.js +7 -7
  22. package/dist/cjs/storage/adapter/StorageAdapterBase.js.map +1 -1
  23. package/dist/cjs/storage/adapter/getDefaultAdapter/index.js +4 -1
  24. package/dist/cjs/storage/adapter/getDefaultAdapter/index.js.map +1 -1
  25. package/dist/cjs/storage/adapter/getDefaultAdapter/index.native.js +1 -0
  26. package/dist/cjs/storage/adapter/getDefaultAdapter/index.native.js.map +1 -1
  27. package/dist/cjs/storage/relationship.js +1 -0
  28. package/dist/cjs/storage/relationship.js.map +1 -1
  29. package/dist/cjs/storage/storage.js +14 -14
  30. package/dist/cjs/storage/storage.js.map +1 -1
  31. package/dist/cjs/sync/datastoreConnectivity.js +0 -3
  32. package/dist/cjs/sync/datastoreConnectivity.js.map +1 -1
  33. package/dist/cjs/sync/index.js +47 -43
  34. package/dist/cjs/sync/index.js.map +1 -1
  35. package/dist/cjs/sync/merger.js +1 -1
  36. package/dist/cjs/sync/merger.js.map +1 -1
  37. package/dist/cjs/sync/outbox.js +19 -17
  38. package/dist/cjs/sync/outbox.js.map +1 -1
  39. package/dist/cjs/sync/processors/errorMaps.js.map +1 -1
  40. package/dist/cjs/sync/processors/mutation.js +31 -28
  41. package/dist/cjs/sync/processors/mutation.js.map +1 -1
  42. package/dist/cjs/sync/processors/subscription.js +21 -12
  43. package/dist/cjs/sync/processors/subscription.js.map +1 -1
  44. package/dist/cjs/sync/processors/sync.js +25 -21
  45. package/dist/cjs/sync/processors/sync.js.map +1 -1
  46. package/dist/cjs/sync/utils.js +20 -21
  47. package/dist/cjs/sync/utils.js.map +1 -1
  48. package/dist/cjs/types.js +1 -0
  49. package/dist/cjs/types.js.map +1 -1
  50. package/dist/cjs/util.js +46 -25
  51. package/dist/cjs/util.js.map +1 -1
  52. package/dist/esm/authModeStrategies/multiAuthStrategy.d.ts +1 -1
  53. package/dist/esm/authModeStrategies/multiAuthStrategy.mjs +1 -1
  54. package/dist/esm/authModeStrategies/multiAuthStrategy.mjs.map +1 -1
  55. package/dist/esm/datastore/datastore.d.ts +4 -6
  56. package/dist/esm/datastore/datastore.mjs +42 -34
  57. package/dist/esm/datastore/datastore.mjs.map +1 -1
  58. package/dist/esm/index.d.ts +1 -1
  59. package/dist/esm/index.mjs +2 -2
  60. package/dist/esm/index.mjs.map +1 -1
  61. package/dist/esm/predicates/index.mjs +1 -0
  62. package/dist/esm/predicates/index.mjs.map +1 -1
  63. package/dist/esm/predicates/next.d.ts +7 -7
  64. package/dist/esm/predicates/next.mjs +13 -12
  65. package/dist/esm/predicates/next.mjs.map +1 -1
  66. package/dist/esm/predicates/sort.d.ts +1 -1
  67. package/dist/esm/predicates/sort.mjs +2 -2
  68. package/dist/esm/predicates/sort.mjs.map +1 -1
  69. package/dist/esm/storage/adapter/AsyncStorageAdapter.d.ts +1 -1
  70. package/dist/esm/storage/adapter/AsyncStorageAdapter.mjs +21 -18
  71. package/dist/esm/storage/adapter/AsyncStorageAdapter.mjs.map +1 -1
  72. package/dist/esm/storage/adapter/AsyncStorageDatabase.mjs +10 -9
  73. package/dist/esm/storage/adapter/AsyncStorageDatabase.mjs.map +1 -1
  74. package/dist/esm/storage/adapter/InMemoryStore.mjs +4 -1
  75. package/dist/esm/storage/adapter/InMemoryStore.mjs.map +1 -1
  76. package/dist/esm/storage/adapter/IndexedDBAdapter.mjs +21 -23
  77. package/dist/esm/storage/adapter/IndexedDBAdapter.mjs.map +1 -1
  78. package/dist/esm/storage/adapter/StorageAdapterBase.d.ts +2 -2
  79. package/dist/esm/storage/adapter/StorageAdapterBase.mjs +7 -7
  80. package/dist/esm/storage/adapter/StorageAdapterBase.mjs.map +1 -1
  81. package/dist/esm/storage/adapter/getDefaultAdapter/index.mjs +3 -1
  82. package/dist/esm/storage/adapter/getDefaultAdapter/index.mjs.map +1 -1
  83. package/dist/esm/storage/adapter/getDefaultAdapter/index.native.mjs +1 -0
  84. package/dist/esm/storage/adapter/getDefaultAdapter/index.native.mjs.map +1 -1
  85. package/dist/esm/storage/adapter/index.d.ts +1 -1
  86. package/dist/esm/storage/relationship.mjs +1 -0
  87. package/dist/esm/storage/relationship.mjs.map +1 -1
  88. package/dist/esm/storage/storage.d.ts +11 -11
  89. package/dist/esm/storage/storage.mjs +10 -10
  90. package/dist/esm/storage/storage.mjs.map +1 -1
  91. package/dist/esm/sync/datastoreConnectivity.d.ts +2 -2
  92. package/dist/esm/sync/datastoreConnectivity.mjs +0 -3
  93. package/dist/esm/sync/datastoreConnectivity.mjs.map +1 -1
  94. package/dist/esm/sync/index.d.ts +3 -3
  95. package/dist/esm/sync/index.mjs +47 -43
  96. package/dist/esm/sync/index.mjs.map +1 -1
  97. package/dist/esm/sync/merger.d.ts +1 -1
  98. package/dist/esm/sync/merger.mjs +1 -1
  99. package/dist/esm/sync/merger.mjs.map +1 -1
  100. package/dist/esm/sync/outbox.d.ts +4 -4
  101. package/dist/esm/sync/outbox.mjs +19 -17
  102. package/dist/esm/sync/outbox.mjs.map +1 -1
  103. package/dist/esm/sync/processors/errorMaps.mjs.map +1 -1
  104. package/dist/esm/sync/processors/mutation.d.ts +5 -5
  105. package/dist/esm/sync/processors/mutation.mjs +31 -28
  106. package/dist/esm/sync/processors/mutation.mjs.map +1 -1
  107. package/dist/esm/sync/processors/subscription.d.ts +1 -1
  108. package/dist/esm/sync/processors/subscription.mjs +21 -12
  109. package/dist/esm/sync/processors/subscription.mjs.map +1 -1
  110. package/dist/esm/sync/processors/sync.d.ts +3 -3
  111. package/dist/esm/sync/processors/sync.mjs +13 -9
  112. package/dist/esm/sync/processors/sync.mjs.map +1 -1
  113. package/dist/esm/sync/utils.d.ts +11 -13
  114. package/dist/esm/sync/utils.mjs +20 -21
  115. package/dist/esm/sync/utils.mjs.map +1 -1
  116. package/dist/esm/types.d.ts +121 -131
  117. package/dist/esm/types.mjs +3 -2
  118. package/dist/esm/types.mjs.map +1 -1
  119. package/dist/esm/util.d.ts +5 -5
  120. package/dist/esm/util.mjs +46 -25
  121. package/dist/esm/util.mjs.map +1 -1
  122. package/package.json +74 -73
  123. package/src/authModeStrategies/multiAuthStrategy.ts +8 -4
  124. package/src/datastore/datastore.ts +145 -123
  125. package/src/index.ts +10 -8
  126. package/src/predicates/index.ts +10 -2
  127. package/src/predicates/next.ts +39 -28
  128. package/src/predicates/sort.ts +23 -26
  129. package/src/storage/adapter/AsyncStorageAdapter.ts +43 -25
  130. package/src/storage/adapter/AsyncStorageDatabase.ts +18 -10
  131. package/src/storage/adapter/InMemoryStore.ts +5 -1
  132. package/src/storage/adapter/IndexedDBAdapter.ts +50 -37
  133. package/src/storage/adapter/StorageAdapterBase.ts +24 -18
  134. package/src/storage/adapter/getDefaultAdapter/index.native.ts +1 -0
  135. package/src/storage/adapter/getDefaultAdapter/index.ts +4 -1
  136. package/src/storage/adapter/index.ts +2 -2
  137. package/src/storage/relationship.ts +5 -1
  138. package/src/storage/storage.ts +38 -30
  139. package/src/sync/datastoreConnectivity.ts +4 -6
  140. package/src/sync/index.ts +228 -230
  141. package/src/sync/merger.ts +4 -3
  142. package/src/sync/outbox.ts +26 -24
  143. package/src/sync/processors/errorMaps.ts +5 -0
  144. package/src/sync/processors/mutation.ts +80 -72
  145. package/src/sync/processors/subscription.ts +69 -53
  146. package/src/sync/processors/sync.ts +49 -37
  147. package/src/sync/utils.ts +60 -41
  148. package/src/types.ts +165 -165
  149. package/src/util.ts +89 -53
@@ -1,110 +1,108 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { InternalAPI } from '@aws-amplify/api/internals';
4
- import { Amplify, Hub, Cache, ConsoleLogger } from '@aws-amplify/core';
5
-
4
+ import { Amplify, Cache, ConsoleLogger, Hub } from '@aws-amplify/core';
6
5
  import {
7
6
  Draft,
7
+ Patch,
8
+ enablePatches,
8
9
  immerable,
9
10
  produce,
10
11
  setAutoFreeze,
11
- enablePatches,
12
- Patch,
13
12
  } from 'immer';
14
- import { amplifyUuid, isBrowser } from '@aws-amplify/core/internals/utils';
13
+ import {
14
+ BackgroundProcessManager,
15
+ amplifyUuid,
16
+ } from '@aws-amplify/core/internals/utils';
15
17
  import { Observable, SubscriptionLike, filter } from 'rxjs';
18
+
16
19
  import { defaultAuthStrategy, multiAuthStrategy } from '../authModeStrategies';
17
20
  import {
18
- isPredicatesAll,
19
21
  ModelPredicateCreator,
20
22
  ModelSortPredicateCreator,
21
23
  PredicateAll,
24
+ isPredicatesAll,
22
25
  } from '../predicates';
23
26
  import { Adapter } from '../storage/adapter';
24
27
  import { ExclusiveStorage as Storage } from '../storage/storage';
25
28
  import { ModelRelationship } from '../storage/relationship';
26
29
  import { ControlMessage, SyncEngine } from '../sync';
27
30
  import {
31
+ AmplifyContext,
28
32
  AuthModeStrategy,
33
+ AuthModeStrategyType,
29
34
  ConflictHandler,
30
35
  DataStoreConfig,
36
+ DataStoreSnapshot,
37
+ ErrorHandler,
31
38
  GraphQLScalarType,
39
+ IdentifierFieldOrIdentifierObject,
32
40
  InternalSchema,
33
- isGraphQLScalarType,
34
- isSchemaModelWithAttributes,
41
+ ManagedIdentifier,
35
42
  ModelFieldType,
36
43
  ModelInit,
37
44
  ModelInstanceMetadata,
38
45
  ModelPredicate,
39
- ModelField,
40
- SortPredicate,
46
+ ModelPredicateExtender,
41
47
  MutableModel,
42
48
  NamespaceResolver,
43
49
  NonModelTypeConstructor,
44
- ProducerPaginationInput,
50
+ ObserveQueryOptions,
45
51
  PaginationInput,
46
52
  PersistentModel,
47
53
  PersistentModelConstructor,
48
- ProducerModelPredicate,
54
+ PersistentModelMetaData,
55
+ ProducerPaginationInput,
56
+ RecursiveModelPredicateExtender,
49
57
  Schema,
50
58
  SchemaModel,
51
59
  SchemaNamespace,
52
60
  SchemaNonModel,
61
+ SortPredicate,
53
62
  SubscriptionMessage,
54
- DataStoreSnapshot,
55
63
  SyncConflict,
56
64
  SyncError,
57
- TypeConstructorMap,
58
- ErrorHandler,
59
65
  SyncExpression,
60
- AuthModeStrategyType,
61
- isNonModelFieldType,
62
- isModelFieldType,
63
- ObserveQueryOptions,
64
- ManagedIdentifier,
65
- PersistentModelMetaData,
66
- IdentifierFieldOrIdentifierObject,
66
+ TypeConstructorMap,
67
+ isGraphQLScalarType,
67
68
  isIdentifierObject,
68
- AmplifyContext,
69
- isFieldAssociation,
70
- RecursiveModelPredicateExtender,
71
- ModelPredicateExtender,
69
+ isModelFieldType,
70
+ isNonModelFieldType,
71
+ isSchemaModelWithAttributes,
72
72
  } from '../types';
73
- // tslint:disable:no-duplicate-imports
74
73
  import type { __modelMeta__ } from '../types';
75
- import { isNode } from './utils';
76
-
77
74
  import {
78
75
  DATASTORE,
79
- errorMessages,
80
- establishRelationAndKeys,
81
- isModelConstructor,
82
- monotonicUlidFactory,
76
+ DeferredCallbackResolver,
83
77
  NAMESPACES,
84
78
  STORAGE,
85
79
  SYNC,
86
80
  USER,
87
- isNullOrUndefined,
88
- registerNonModelClass,
89
- sortCompareFunction,
90
- DeferredCallbackResolver,
91
- inMemoryPagination,
81
+ errorMessages,
82
+ establishRelationAndKeys,
92
83
  extractPrimaryKeyFieldNames,
93
84
  extractPrimaryKeysAndValues,
85
+ getTimestampFields,
86
+ inMemoryPagination,
94
87
  isIdManaged,
95
88
  isIdOptionallyManaged,
89
+ isModelConstructor,
90
+ isNullOrUndefined,
96
91
  mergePatches,
97
- getTimestampFields,
92
+ monotonicUlidFactory,
93
+ registerNonModelClass,
94
+ sortCompareFunction,
98
95
  } from '../util';
99
96
  import {
100
- recursivePredicateFor,
101
- predicateFor,
102
97
  GroupCondition,
103
98
  internals,
99
+ predicateFor,
100
+ recursivePredicateFor,
104
101
  } from '../predicates/next';
105
102
  import { getIdentifierValue } from '../sync/utils';
106
103
  import DataStoreConnectivity from '../sync/datastoreConnectivity';
107
- import { BackgroundProcessManager } from '@aws-amplify/core/internals/utils';
104
+
105
+ import { isNode } from './utils';
108
106
 
109
107
  setAutoFreeze(true);
110
108
  enablePatches();
@@ -113,10 +111,10 @@ const logger = new ConsoleLogger('DataStore');
113
111
 
114
112
  const ulid = monotonicUlidFactory(Date.now());
115
113
 
116
- type SettingMetaData = {
114
+ interface SettingMetaData {
117
115
  identifier: ManagedIdentifier<Setting, 'id'>;
118
116
  readOnlyFields: never;
119
- };
117
+ }
120
118
  declare class Setting {
121
119
  public readonly [__modelMeta__]: SettingMetaData;
122
120
  constructor(init: ModelInit<Setting, SettingMetaData>);
@@ -124,6 +122,7 @@ declare class Setting {
124
122
  src: Setting,
125
123
  mutator: (draft: MutableModel<Setting, SettingMetaData>) => void | Setting,
126
124
  ): Setting;
125
+
127
126
  public readonly id: string;
128
127
  public readonly key: string;
129
128
  public readonly value: string;
@@ -178,6 +177,7 @@ const namespaceResolver: NamespaceResolver = modelConstructor => {
178
177
  `Namespace Resolver for '${modelConstructor.name}' not found! This is probably a bug in '@amplify-js/datastore'.`,
179
178
  );
180
179
  }
180
+
181
181
  return resolver;
182
182
  };
183
183
 
@@ -221,6 +221,8 @@ const buildSeedPredicate = <T extends PersistentModel>(
221
221
  };
222
222
 
223
223
  // exporting syncClasses for testing outbox.test.ts
224
+ // TODO(eslint): refactor not to export non-constant
225
+ // eslint-disable-next-line import/no-mutable-exports
224
226
  export let syncClasses: TypeConstructorMap;
225
227
  let userClasses: TypeConstructorMap;
226
228
  let dataStoreClasses: TypeConstructorMap;
@@ -282,6 +284,7 @@ export function attached<T extends PersistentModel | PersistentModel[]>(
282
284
  } else {
283
285
  result && attachedModelInstances.set(result, attachment);
284
286
  }
287
+
285
288
  return result;
286
289
  }
287
290
 
@@ -355,10 +358,10 @@ const initSchema = (userSchema: Schema) => {
355
358
  field =>
356
359
  field.association &&
357
360
  field.association.connectionType === 'BELONGS_TO' &&
358
- (<ModelFieldType>field.type).model !== model.name,
361
+ (field.type as ModelFieldType).model !== model.name,
359
362
  )
360
363
  .forEach(field =>
361
- connectedModels.push((<ModelFieldType>field.type).model),
364
+ connectedModels.push((field.type as ModelFieldType).model),
362
365
  );
363
366
 
364
367
  modelAssociations.set(model.name, connectedModels);
@@ -367,7 +370,7 @@ const initSchema = (userSchema: Schema) => {
367
370
  // (such as predicate builders) don't have to reach back into "DataStore" space
368
371
  // to go looking for it.
369
372
  Object.values(model.fields).forEach(field => {
370
- const relatedModel = userClasses[(<ModelFieldType>field.type).model];
373
+ const relatedModel = userClasses[(field.type as ModelFieldType).model];
371
374
  if (isModelConstructor(relatedModel)) {
372
375
  Object.defineProperty(field.type, 'modelConstructor', {
373
376
  get: () => {
@@ -376,6 +379,7 @@ const initSchema = (userSchema: Schema) => {
376
379
  throw new Error(
377
380
  `Could not find model definition for ${relatedModel.name}`,
378
381
  );
382
+
379
383
  return {
380
384
  builder: relatedModel,
381
385
  schema: relatedModelDefinition,
@@ -390,8 +394,8 @@ const initSchema = (userSchema: Schema) => {
390
394
  // index fields into the model definition.
391
395
  // definition.cloudFields = { ...definition.fields };
392
396
 
393
- const indexes =
394
- schema.namespaces[namespace].relationships![model.name].indexes;
397
+ const { indexes } =
398
+ schema.namespaces[namespace].relationships![model.name];
395
399
 
396
400
  const indexFields = new Set<string>();
397
401
  for (const index of indexes) {
@@ -488,7 +492,7 @@ const checkSchemaCodegenVersion = (codegenVersion: string) => {
488
492
  let isValid = false;
489
493
  try {
490
494
  const versionParts = codegenVersion.split('.');
491
- const [major, minor, patch, patchrevision] = versionParts;
495
+ const [major, minor] = versionParts;
492
496
  isValid = Number(major) === majorVersion && Number(minor) >= minorVersion;
493
497
  } catch (err) {
494
498
  console.log(`Error parsing codegen version: ${codegenVersion}\n${err}`);
@@ -546,12 +550,12 @@ export declare type ModelInstanceCreator = typeof modelInstanceCreator;
546
550
  const instancesMetadata = new WeakSet<ModelInit<any, any>>();
547
551
 
548
552
  function modelInstanceCreator<T extends PersistentModel>(
549
- modelConstructor: PersistentModelConstructor<T>,
553
+ ModelConstructor: PersistentModelConstructor<T>,
550
554
  init: Partial<T>,
551
555
  ): T {
552
556
  instancesMetadata.add(init);
553
557
 
554
- return new modelConstructor(<ModelInit<T, PersistentModelMetaData<T>>>init);
558
+ return new ModelConstructor(init as ModelInit<T, PersistentModelMetaData<T>>);
555
559
  }
556
560
 
557
561
  const validateModelFields =
@@ -597,6 +601,7 @@ const validateModelFields =
597
601
  if (typeof v === 'string') {
598
602
  try {
599
603
  JSON.parse(v);
604
+
600
605
  return;
601
606
  } catch (error) {
602
607
  throw new Error(`Field ${name} is an invalid JSON object. ${v}`);
@@ -618,11 +623,11 @@ const validateModelFields =
618
623
 
619
624
  if (
620
625
  !isNullOrUndefined(v) &&
621
- (<[]>v).some(e =>
626
+ (v as []).some(e =>
622
627
  isNullOrUndefined(e) ? isRequired : typeof e !== jsType,
623
628
  )
624
629
  ) {
625
- const elemTypes = (<[]>v)
630
+ const elemTypes = (v as [])
626
631
  .map(e => (e === null ? 'null' : typeof e))
627
632
  .join(',');
628
633
 
@@ -632,7 +637,7 @@ const validateModelFields =
632
637
  }
633
638
 
634
639
  if (validateScalar && !isNullOrUndefined(v)) {
635
- const validationStatus = (<[]>v).map(e => {
640
+ const validationStatus = (v as []).map(e => {
636
641
  if (!isNullOrUndefined(e)) {
637
642
  return validateScalar(e);
638
643
  } else if (isNullOrUndefined(e) && !isRequired) {
@@ -649,7 +654,7 @@ const validateModelFields =
649
654
  }
650
655
  }
651
656
  } else if (!isRequired && v === undefined) {
652
- return;
657
+ // no-op for this branch but still to filter this branch out
653
658
  } else if (typeof v !== jsType && v !== null) {
654
659
  throw new Error(
655
660
  `Field ${name} should be of type ${jsType}, ${typeof v} received. ${v}`,
@@ -771,7 +776,7 @@ const initializeInstance = <T extends PersistentModel>(
771
776
  const parsedValue = castInstanceType(modelDefinition, k, v);
772
777
 
773
778
  modelValidator(k, parsedValue);
774
- (<any>draft)[k] = parsedValue;
779
+ (draft as any)[k] = parsedValue;
775
780
  });
776
781
  };
777
782
 
@@ -799,14 +804,14 @@ const normalize = <T extends PersistentModel>(
799
804
  draft: Draft<T>,
800
805
  ) => {
801
806
  for (const k of Object.keys(modelDefinition.fields)) {
802
- if (draft[k] === undefined) (<any>draft)[k] = null;
807
+ if (draft[k] === undefined) (draft as any)[k] = null;
803
808
  }
804
809
  };
805
810
 
806
811
  const createModelClass = <T extends PersistentModel>(
807
812
  modelDefinition: SchemaModel,
808
813
  ) => {
809
- const clazz = <PersistentModelConstructor<T>>(<unknown>class Model {
814
+ const clazz = class Model {
810
815
  constructor(init: ModelInit<T>) {
811
816
  // we create a base instance first so we can distinguish which fields were explicitly
812
817
  // set by customer code versus those set by normalization. only those fields
@@ -822,10 +827,12 @@ const createModelClass = <T extends PersistentModel>(
822
827
 
823
828
  const modelInstanceMetadata: ModelInstanceMetadata =
824
829
  isInternallyInitialized
825
- ? <ModelInstanceMetadata>(<unknown>init)
826
- : <ModelInstanceMetadata>{};
830
+ ? (init as unknown as ModelInstanceMetadata)
831
+ : ({} as ModelInstanceMetadata);
827
832
 
828
- type ModelWithIDIdentifier = { id: string };
833
+ interface ModelWithIDIdentifier {
834
+ id: string;
835
+ }
829
836
 
830
837
  const { id: _id } =
831
838
  modelInstanceMetadata as unknown as ModelWithIDIdentifier;
@@ -839,10 +846,10 @@ const createModelClass = <T extends PersistentModel>(
839
846
  ? amplifyUuid()
840
847
  : ulid();
841
848
 
842
- (<ModelWithIDIdentifier>(<unknown>draft)).id = id;
849
+ (draft as unknown as ModelWithIDIdentifier).id = id;
843
850
  } else if (isIdOptionallyManaged(modelDefinition)) {
844
851
  // only auto-populate if the id was not provided
845
- (<ModelWithIDIdentifier>(<unknown>draft)).id =
852
+ (draft as unknown as ModelWithIDIdentifier).id =
846
853
  draft.id || amplifyUuid();
847
854
  }
848
855
 
@@ -868,8 +875,9 @@ const createModelClass = <T extends PersistentModel>(
868
875
  // "cloud managed" fields, like createdAt and updatedAt.)
869
876
  const normalized = produce(
870
877
  baseInstance,
871
- (draft: Draft<T & ModelInstanceMetadata>) =>
872
- normalize(modelDefinition, draft),
878
+ (draft: Draft<T & ModelInstanceMetadata>) => {
879
+ normalize(modelDefinition, draft);
880
+ },
873
881
  );
874
882
 
875
883
  initPatches.set(normalized, patches);
@@ -889,7 +897,7 @@ const createModelClass = <T extends PersistentModel>(
889
897
  const model = produce(
890
898
  source,
891
899
  draft => {
892
- fn(<MutableModel<T>>draft);
900
+ fn(draft as MutableModel<T>);
893
901
 
894
902
  const keyNames = extractPrimaryKeyFieldNames(modelDefinition);
895
903
  // Keys are immutable
@@ -900,7 +908,7 @@ const createModelClass = <T extends PersistentModel>(
900
908
  { source },
901
909
  );
902
910
  }
903
- (draft as Object)[key] = source[key];
911
+ (draft as object)[key] = source[key];
904
912
  });
905
913
 
906
914
  const modelValidator = validateModelFields(modelDefinition);
@@ -962,7 +970,7 @@ const createModelClass = <T extends PersistentModel>(
962
970
 
963
971
  return attached(instance, ModelAttachment.DataStore);
964
972
  }
965
- });
973
+ } as unknown as PersistentModelConstructor<T>;
966
974
 
967
975
  clazz[immerable] = true;
968
976
 
@@ -977,7 +985,7 @@ const createModelClass = <T extends PersistentModel>(
977
985
  pkField: extractPrimaryKeyFieldNames(modelDefinition),
978
986
  });
979
987
  for (const relationship of allModelRelationships) {
980
- const field = relationship.field;
988
+ const { field } = relationship;
981
989
 
982
990
  Object.defineProperty(clazz.prototype, modelDefinition.fields[field].name, {
983
991
  set(model: T | undefined | null) {
@@ -989,7 +997,7 @@ const createModelClass = <T extends PersistentModel>(
989
997
  // Avoid validation error when processing AppSync response with nested
990
998
  // selection set. Nested entitites lack version field and can not be validated
991
999
  // TODO: explore a more reliable method to solve this
992
- if (model.hasOwnProperty('_version')) {
1000
+ if (Object.prototype.hasOwnProperty.call(model, '_version')) {
993
1001
  const modelConstructor = Object.getPrototypeOf(model || {})
994
1002
  .constructor as PersistentModelConstructor<T>;
995
1003
 
@@ -1035,7 +1043,7 @@ const createModelClass = <T extends PersistentModel>(
1035
1043
  // if the memos already has a result for this field, we'll use it.
1036
1044
  // there is no "cache" invalidation of any kind; memos are permanent to
1037
1045
  // keep an immutable perception of the instance.
1038
- if (!instanceMemos.hasOwnProperty(field)) {
1046
+ if (!Object.prototype.hasOwnProperty.call(instanceMemos, field)) {
1039
1047
  // before we populate the memo, we need to know where to look for relatives.
1040
1048
  // today, this only supports DataStore. Models aren't managed elsewhere in Amplify.
1041
1049
  if (getAttachment(this) === ModelAttachment.DataStore) {
@@ -1047,12 +1055,14 @@ const createModelClass = <T extends PersistentModel>(
1047
1055
  relationship.remoteModelConstructor as PersistentModelConstructor<T>,
1048
1056
  base =>
1049
1057
  base.and(q => {
1050
- return relationship.remoteJoinFields.map((field, index) => {
1051
- // TODO: anything we can use instead of `any` here?
1052
- return (q[field] as T[typeof field]).eq(
1053
- this[relationship.localJoinFields[index]],
1054
- );
1055
- });
1058
+ return relationship.remoteJoinFields.map(
1059
+ (joinField, index) => {
1060
+ // TODO: anything we can use instead of `any` here?
1061
+ return (q[joinField] as T[typeof joinField]).eq(
1062
+ this[relationship.localJoinFields[index]],
1063
+ );
1064
+ },
1065
+ );
1056
1066
  }),
1057
1067
  );
1058
1068
 
@@ -1109,9 +1119,9 @@ export class AsyncItem<T> extends Promise<T> {}
1109
1119
  * This collection can be async-iterated or turned directly into an array using `toArray()`.
1110
1120
  */
1111
1121
  export class AsyncCollection<T> implements AsyncIterable<T> {
1112
- private values: Array<any> | Promise<Array<any>>;
1122
+ private values: any[] | Promise<any[]>;
1113
1123
 
1114
- constructor(values: Array<any> | Promise<Array<any>>) {
1124
+ constructor(values: any[] | Promise<any[]>) {
1115
1125
  this.values = values;
1116
1126
  }
1117
1127
 
@@ -1129,6 +1139,7 @@ export class AsyncCollection<T> implements AsyncIterable<T> {
1129
1139
  [Symbol.asyncIterator](): AsyncIterator<T> {
1130
1140
  let values;
1131
1141
  let index = 0;
1142
+
1132
1143
  return {
1133
1144
  next: async () => {
1134
1145
  if (!values) values = await this.values;
@@ -1138,8 +1149,10 @@ export class AsyncCollection<T> implements AsyncIterable<T> {
1138
1149
  done: false,
1139
1150
  };
1140
1151
  index++;
1152
+
1141
1153
  return result;
1142
1154
  }
1155
+
1143
1156
  return {
1144
1157
  value: null,
1145
1158
  done: true,
@@ -1169,6 +1182,7 @@ export class AsyncCollection<T> implements AsyncIterable<T> {
1169
1182
  break;
1170
1183
  }
1171
1184
  }
1185
+
1172
1186
  return output;
1173
1187
  }
1174
1188
  }
@@ -1206,7 +1220,7 @@ const checkReadOnlyPropertyOnUpdate = (
1206
1220
  const createNonModelClass = <T extends PersistentModel>(
1207
1221
  typeDefinition: SchemaNonModel,
1208
1222
  ) => {
1209
- const clazz = <NonModelTypeConstructor<T>>(<unknown>class Model {
1223
+ const clazz = class Model {
1210
1224
  constructor(init: ModelInit<T>) {
1211
1225
  const instance = produce(
1212
1226
  this,
@@ -1217,7 +1231,7 @@ const createNonModelClass = <T extends PersistentModel>(
1217
1231
 
1218
1232
  return instance;
1219
1233
  }
1220
- });
1234
+ } as unknown as NonModelTypeConstructor<T>;
1221
1235
 
1222
1236
  clazz[immerable] = true;
1223
1237
 
@@ -1235,6 +1249,7 @@ function isQueryOne(obj: any): obj is string {
1235
1249
  function defaultConflictHandler(conflictData: SyncConflict): PersistentModel {
1236
1250
  const { localModel, modelConstructor, remoteModel } = conflictData;
1237
1251
  const { _version } = remoteModel;
1252
+
1238
1253
  return modelInstanceCreator(modelConstructor, { ...localModel, _version });
1239
1254
  }
1240
1255
 
@@ -1291,14 +1306,14 @@ async function checkSchemaVersion(
1291
1306
  storage: Storage,
1292
1307
  version: string,
1293
1308
  ): Promise<void> {
1294
- const Setting =
1309
+ const SettingCtor =
1295
1310
  dataStoreClasses.Setting as PersistentModelConstructor<Setting>;
1296
1311
 
1297
1312
  const modelDefinition = schema.namespaces[DATASTORE].models.Setting;
1298
1313
 
1299
1314
  await storage.runExclusive(async s => {
1300
1315
  const [schemaVersionSetting] = await s.query(
1301
- Setting,
1316
+ SettingCtor,
1302
1317
  ModelPredicateCreator.createFromAST(modelDefinition, {
1303
1318
  and: { key: { eq: SETTING_SCHEMA_VERSION } },
1304
1319
  }),
@@ -1316,7 +1331,7 @@ async function checkSchemaVersion(
1316
1331
  }
1317
1332
  } else {
1318
1333
  await s.save(
1319
- modelInstanceCreator(Setting, {
1334
+ modelInstanceCreator(SettingCtor, {
1320
1335
  key: SETTING_SCHEMA_VERSION,
1321
1336
  value: JSON.stringify(version),
1322
1337
  }),
@@ -1394,8 +1409,8 @@ class DataStore {
1394
1409
  private errorHandler!: (error: SyncError<PersistentModel>) => void;
1395
1410
  private fullSyncInterval!: number;
1396
1411
  private initialized?: Promise<void>;
1397
- private initReject!: Function;
1398
- private initResolve!: Function;
1412
+ private initReject!: () => void;
1413
+ private initResolve!: () => void;
1399
1414
  private maxRecordsToSync!: number;
1400
1415
  private storage?: Storage;
1401
1416
  private sync?: SyncEngine;
@@ -1403,12 +1418,14 @@ class DataStore {
1403
1418
  private syncExpressions!: SyncExpression[];
1404
1419
  private syncPredicates: WeakMap<SchemaModel, ModelPredicate<any> | null> =
1405
1420
  new WeakMap<SchemaModel, ModelPredicate<any>>();
1421
+
1406
1422
  private sessionId?: string;
1407
1423
  private storageAdapter!: Adapter;
1408
1424
  // object that gets passed to descendent classes. Allows us to pass these down by reference
1409
1425
  private amplifyContext: AmplifyContext = {
1410
1426
  InternalAPI: this.InternalAPI,
1411
1427
  };
1428
+
1412
1429
  private connectivityMonitor?: DataStoreConnectivity;
1413
1430
 
1414
1431
  /**
@@ -1501,12 +1518,13 @@ class DataStore {
1501
1518
  this.state = DataStoreState.Starting;
1502
1519
  if (this.initialized === undefined) {
1503
1520
  logger.debug('Starting DataStore');
1504
- this.initialized = new Promise((res, rej) => {
1505
- this.initResolve = res;
1506
- this.initReject = rej;
1521
+ this.initialized = new Promise((resolve, reject) => {
1522
+ this.initResolve = resolve;
1523
+ this.initReject = reject;
1507
1524
  });
1508
1525
  } else {
1509
1526
  await this.initialized;
1527
+
1510
1528
  return;
1511
1529
  }
1512
1530
 
@@ -1629,7 +1647,7 @@ class DataStore {
1629
1647
  throw new Error('No storage to query');
1630
1648
  }
1631
1649
 
1632
- //#region Input validation
1650
+ // #region Input validation
1633
1651
 
1634
1652
  if (!isValidModelConstructor(modelConstructor)) {
1635
1653
  const msg = 'Constructor is not for a valid model';
@@ -1675,10 +1693,10 @@ class DataStore {
1675
1693
  );
1676
1694
  } else {
1677
1695
  // Object is being queried using object literal syntax
1678
- if (isIdentifierObject(<T>identifierOrCriteria, modelDefinition)) {
1696
+ if (isIdentifierObject(identifierOrCriteria as T, modelDefinition)) {
1679
1697
  const predicate = ModelPredicateCreator.createForPk<T>(
1680
1698
  modelDefinition,
1681
- <T>identifierOrCriteria,
1699
+ identifierOrCriteria as T,
1682
1700
  );
1683
1701
  result = await this.storage.query<T>(
1684
1702
  modelConstructor,
@@ -1710,7 +1728,7 @@ class DataStore {
1710
1728
  }
1711
1729
  }
1712
1730
 
1713
- //#endregion
1731
+ // #endregion
1714
1732
 
1715
1733
  const returnOne =
1716
1734
  isQueryOne(identifierOrCriteria) ||
@@ -1757,7 +1775,9 @@ class DataStore {
1757
1775
  | undefined = updatedPatchesTuple || initPatchesTuple;
1758
1776
 
1759
1777
  const modelConstructor: PersistentModelConstructor<T> | undefined =
1760
- model ? <PersistentModelConstructor<T>>model.constructor : undefined;
1778
+ model
1779
+ ? (model.constructor as PersistentModelConstructor<T>)
1780
+ : undefined;
1761
1781
 
1762
1782
  if (!isValidModelConstructor(modelConstructor)) {
1763
1783
  const msg = 'Object is not an instance of a valid model';
@@ -1816,12 +1836,8 @@ class DataStore {
1816
1836
  : undefined;
1817
1837
 
1818
1838
  const [savedModel] = await this.storage.runExclusive(async s => {
1819
- const saved = await s.save(
1820
- model,
1821
- producedCondition,
1822
- undefined,
1823
- patchesTuple,
1824
- );
1839
+ await s.save(model, producedCondition, undefined, patchesTuple);
1840
+
1825
1841
  return s.query<T>(
1826
1842
  modelConstructor,
1827
1843
  ModelPredicateCreator.createForPk(modelDefinition, model),
@@ -1942,7 +1958,7 @@ class DataStore {
1942
1958
  if (isIdentifierObject(identifierOrCriteria, modelDefinition)) {
1943
1959
  condition = ModelPredicateCreator.createForPk<T>(
1944
1960
  modelDefinition,
1945
- <T>identifierOrCriteria,
1961
+ identifierOrCriteria as T,
1946
1962
  );
1947
1963
  } else {
1948
1964
  condition = internals(
@@ -2057,11 +2073,11 @@ class DataStore {
2057
2073
  : undefined;
2058
2074
 
2059
2075
  if (modelOrConstructor && modelConstructor === undefined) {
2060
- const model = <T>modelOrConstructor;
2061
- const modelConstructor =
2062
- model && (<Object>Object.getPrototypeOf(model)).constructor;
2076
+ const model = modelOrConstructor as T;
2077
+ const resolvedModelConstructor =
2078
+ model && (Object.getPrototypeOf(model) as object).constructor;
2063
2079
 
2064
- if (isValidModelConstructor<T>(modelConstructor)) {
2080
+ if (isValidModelConstructor<T>(resolvedModelConstructor)) {
2065
2081
  if (identifierOrCriteria) {
2066
2082
  logger.warn('idOrCriteria is ignored when using a model instance', {
2067
2083
  model,
@@ -2069,7 +2085,7 @@ class DataStore {
2069
2085
  });
2070
2086
  }
2071
2087
 
2072
- return this.observe(modelConstructor, model.id);
2088
+ return this.observe(resolvedModelConstructor, model.id);
2073
2089
  } else {
2074
2090
  const msg =
2075
2091
  'The model is not an instance of a PersistentModelConstructor';
@@ -2169,8 +2185,12 @@ class DataStore {
2169
2185
  observer.next(message as SubscriptionMessage<T>);
2170
2186
  }
2171
2187
  }, 'datastore observe message handler'),
2172
- error: err => observer.error(err),
2173
- complete: () => observer.complete(),
2188
+ error: err => {
2189
+ observer.error(err);
2190
+ },
2191
+ complete: () => {
2192
+ observer.complete();
2193
+ },
2174
2194
  });
2175
2195
  }, 'datastore observe observable initialization')
2176
2196
  .catch(this.handleAddProcError('DataStore.observe()'))
@@ -2189,13 +2209,11 @@ class DataStore {
2189
2209
  });
2190
2210
  };
2191
2211
 
2192
- observeQuery: {
2193
- <T extends PersistentModel>(
2194
- modelConstructor: PersistentModelConstructor<T>,
2195
- criteria?: RecursiveModelPredicateExtender<T> | typeof PredicateAll,
2196
- paginationProducer?: ObserveQueryOptions<T>,
2197
- ): Observable<DataStoreSnapshot<T>>;
2198
- } = <T extends PersistentModel>(
2212
+ observeQuery: <T extends PersistentModel>(
2213
+ modelConstructor: PersistentModelConstructor<T>,
2214
+ criteria?: RecursiveModelPredicateExtender<T> | typeof PredicateAll,
2215
+ paginationProducer?: ObserveQueryOptions<T>,
2216
+ ) => Observable<DataStoreSnapshot<T>> = <T extends PersistentModel>(
2199
2217
  model: PersistentModelConstructor<T>,
2200
2218
  criteria?: RecursiveModelPredicateExtender<T> | typeof PredicateAll,
2201
2219
  options?: ObserveQueryOptions<T>,
@@ -2264,10 +2282,11 @@ class DataStore {
2264
2282
  // to have visibility into items that move from in-set to out-of-set.
2265
2283
  // We need to explicitly remove those items from the existing snapshot.
2266
2284
  handle = this.observe(model).subscribe(
2267
- ({ element, model, opType }) =>
2285
+ ({ element, model: observedModel, opType }) =>
2268
2286
  this.runningProcesses.isOpen &&
2269
2287
  this.runningProcesses.add(async () => {
2270
- const itemModelDefinition = getModelDefinition(model)!;
2288
+ const itemModelDefinition =
2289
+ getModelDefinition(observedModel)!;
2271
2290
  const idOrPk = getIdentifierValue(
2272
2291
  itemModelDefinition,
2273
2292
  element,
@@ -2302,7 +2321,7 @@ class DataStore {
2302
2321
  }
2303
2322
 
2304
2323
  const isSynced =
2305
- this.sync?.getModelSyncedStatus(model) ?? false;
2324
+ this.sync?.getModelSyncedStatus(observedModel) ?? false;
2306
2325
 
2307
2326
  const limit =
2308
2327
  itemsChanged.size - deletedItemIds.length >=
@@ -2391,8 +2410,11 @@ class DataStore {
2391
2410
  * @param itemsToSort A array of model type.
2392
2411
  */
2393
2412
  const sortItems = (itemsToSort: T[]): void => {
2394
- const modelDefinition = getModelDefinition(model);
2395
- const pagination = this.processPagination(modelDefinition!, options);
2413
+ const sortingModelDefinition = getModelDefinition(model);
2414
+ const pagination = this.processPagination(
2415
+ sortingModelDefinition!,
2416
+ options,
2417
+ );
2396
2418
 
2397
2419
  const sortPredicates = ModelSortPredicateCreator.getPredicates(
2398
2420
  pagination!.sort!,
@@ -2438,8 +2460,6 @@ class DataStore {
2438
2460
  const {
2439
2461
  DataStore: configDataStore,
2440
2462
  authModeStrategyType: configAuthModeStrategyType,
2441
- conflictHandler: configConflictHandler,
2442
- errorHandler: configErrorHandler,
2443
2463
  maxRecordsToSync: configMaxRecordsToSync,
2444
2464
  syncPageSize: configSyncPageSize,
2445
2465
  fullSyncInterval: configFullSyncInterval,
@@ -2700,6 +2720,7 @@ class DataStore {
2700
2720
  ): Promise<ModelPredicateExtender<T>> {
2701
2721
  try {
2702
2722
  const condition = await conditionProducer();
2723
+
2703
2724
  return condition || conditionProducer;
2704
2725
  } catch (error) {
2705
2726
  if (error instanceof TypeError) {
@@ -2719,6 +2740,7 @@ class DataStore {
2719
2740
  `You can only utilize one Sync Expression per model.
2720
2741
  Subsequent sync expressions for the ${name} model will be ignored.`,
2721
2742
  );
2743
+
2722
2744
  return map;
2723
2745
  }
2724
2746