@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.
- package/dist/cjs/authModeStrategies/multiAuthStrategy.js +1 -1
- package/dist/cjs/authModeStrategies/multiAuthStrategy.js.map +1 -1
- package/dist/cjs/datastore/datastore.js +46 -41
- package/dist/cjs/datastore/datastore.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/predicates/index.js +1 -0
- package/dist/cjs/predicates/index.js.map +1 -1
- package/dist/cjs/predicates/next.js +13 -12
- package/dist/cjs/predicates/next.js.map +1 -1
- package/dist/cjs/predicates/sort.js +2 -2
- package/dist/cjs/predicates/sort.js.map +1 -1
- package/dist/cjs/storage/adapter/AsyncStorageAdapter.js +21 -18
- package/dist/cjs/storage/adapter/AsyncStorageAdapter.js.map +1 -1
- package/dist/cjs/storage/adapter/AsyncStorageDatabase.js +10 -9
- package/dist/cjs/storage/adapter/AsyncStorageDatabase.js.map +1 -1
- package/dist/cjs/storage/adapter/InMemoryStore.js +4 -1
- package/dist/cjs/storage/adapter/InMemoryStore.js.map +1 -1
- package/dist/cjs/storage/adapter/IndexedDBAdapter.js +21 -23
- package/dist/cjs/storage/adapter/IndexedDBAdapter.js.map +1 -1
- package/dist/cjs/storage/adapter/StorageAdapterBase.js +7 -7
- package/dist/cjs/storage/adapter/StorageAdapterBase.js.map +1 -1
- package/dist/cjs/storage/adapter/getDefaultAdapter/index.js +4 -1
- package/dist/cjs/storage/adapter/getDefaultAdapter/index.js.map +1 -1
- package/dist/cjs/storage/adapter/getDefaultAdapter/index.native.js +1 -0
- package/dist/cjs/storage/adapter/getDefaultAdapter/index.native.js.map +1 -1
- package/dist/cjs/storage/relationship.js +1 -0
- package/dist/cjs/storage/relationship.js.map +1 -1
- package/dist/cjs/storage/storage.js +14 -14
- package/dist/cjs/storage/storage.js.map +1 -1
- package/dist/cjs/sync/datastoreConnectivity.js +0 -3
- package/dist/cjs/sync/datastoreConnectivity.js.map +1 -1
- package/dist/cjs/sync/index.js +47 -43
- package/dist/cjs/sync/index.js.map +1 -1
- package/dist/cjs/sync/merger.js +1 -1
- package/dist/cjs/sync/merger.js.map +1 -1
- package/dist/cjs/sync/outbox.js +19 -17
- package/dist/cjs/sync/outbox.js.map +1 -1
- package/dist/cjs/sync/processors/errorMaps.js.map +1 -1
- package/dist/cjs/sync/processors/mutation.js +31 -28
- package/dist/cjs/sync/processors/mutation.js.map +1 -1
- package/dist/cjs/sync/processors/subscription.js +21 -12
- package/dist/cjs/sync/processors/subscription.js.map +1 -1
- package/dist/cjs/sync/processors/sync.js +25 -21
- package/dist/cjs/sync/processors/sync.js.map +1 -1
- package/dist/cjs/sync/utils.js +20 -21
- package/dist/cjs/sync/utils.js.map +1 -1
- package/dist/cjs/types.js +1 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/util.js +46 -25
- package/dist/cjs/util.js.map +1 -1
- package/dist/esm/authModeStrategies/multiAuthStrategy.d.ts +1 -1
- package/dist/esm/authModeStrategies/multiAuthStrategy.mjs +1 -1
- package/dist/esm/authModeStrategies/multiAuthStrategy.mjs.map +1 -1
- package/dist/esm/datastore/datastore.d.ts +4 -6
- package/dist/esm/datastore/datastore.mjs +42 -34
- package/dist/esm/datastore/datastore.mjs.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/predicates/index.mjs +1 -0
- package/dist/esm/predicates/index.mjs.map +1 -1
- package/dist/esm/predicates/next.d.ts +7 -7
- package/dist/esm/predicates/next.mjs +13 -12
- package/dist/esm/predicates/next.mjs.map +1 -1
- package/dist/esm/predicates/sort.d.ts +1 -1
- package/dist/esm/predicates/sort.mjs +2 -2
- package/dist/esm/predicates/sort.mjs.map +1 -1
- package/dist/esm/storage/adapter/AsyncStorageAdapter.d.ts +1 -1
- package/dist/esm/storage/adapter/AsyncStorageAdapter.mjs +21 -18
- package/dist/esm/storage/adapter/AsyncStorageAdapter.mjs.map +1 -1
- package/dist/esm/storage/adapter/AsyncStorageDatabase.mjs +10 -9
- package/dist/esm/storage/adapter/AsyncStorageDatabase.mjs.map +1 -1
- package/dist/esm/storage/adapter/InMemoryStore.mjs +4 -1
- package/dist/esm/storage/adapter/InMemoryStore.mjs.map +1 -1
- package/dist/esm/storage/adapter/IndexedDBAdapter.mjs +21 -23
- package/dist/esm/storage/adapter/IndexedDBAdapter.mjs.map +1 -1
- package/dist/esm/storage/adapter/StorageAdapterBase.d.ts +2 -2
- package/dist/esm/storage/adapter/StorageAdapterBase.mjs +7 -7
- package/dist/esm/storage/adapter/StorageAdapterBase.mjs.map +1 -1
- package/dist/esm/storage/adapter/getDefaultAdapter/index.mjs +3 -1
- package/dist/esm/storage/adapter/getDefaultAdapter/index.mjs.map +1 -1
- package/dist/esm/storage/adapter/getDefaultAdapter/index.native.mjs +1 -0
- package/dist/esm/storage/adapter/getDefaultAdapter/index.native.mjs.map +1 -1
- package/dist/esm/storage/adapter/index.d.ts +1 -1
- package/dist/esm/storage/relationship.mjs +1 -0
- package/dist/esm/storage/relationship.mjs.map +1 -1
- package/dist/esm/storage/storage.d.ts +11 -11
- package/dist/esm/storage/storage.mjs +10 -10
- package/dist/esm/storage/storage.mjs.map +1 -1
- package/dist/esm/sync/datastoreConnectivity.d.ts +2 -2
- package/dist/esm/sync/datastoreConnectivity.mjs +0 -3
- package/dist/esm/sync/datastoreConnectivity.mjs.map +1 -1
- package/dist/esm/sync/index.d.ts +3 -3
- package/dist/esm/sync/index.mjs +47 -43
- package/dist/esm/sync/index.mjs.map +1 -1
- package/dist/esm/sync/merger.d.ts +1 -1
- package/dist/esm/sync/merger.mjs +1 -1
- package/dist/esm/sync/merger.mjs.map +1 -1
- package/dist/esm/sync/outbox.d.ts +4 -4
- package/dist/esm/sync/outbox.mjs +19 -17
- package/dist/esm/sync/outbox.mjs.map +1 -1
- package/dist/esm/sync/processors/errorMaps.mjs.map +1 -1
- package/dist/esm/sync/processors/mutation.d.ts +5 -5
- package/dist/esm/sync/processors/mutation.mjs +31 -28
- package/dist/esm/sync/processors/mutation.mjs.map +1 -1
- package/dist/esm/sync/processors/subscription.d.ts +1 -1
- package/dist/esm/sync/processors/subscription.mjs +21 -12
- package/dist/esm/sync/processors/subscription.mjs.map +1 -1
- package/dist/esm/sync/processors/sync.d.ts +3 -3
- package/dist/esm/sync/processors/sync.mjs +13 -9
- package/dist/esm/sync/processors/sync.mjs.map +1 -1
- package/dist/esm/sync/utils.d.ts +11 -13
- package/dist/esm/sync/utils.mjs +20 -21
- package/dist/esm/sync/utils.mjs.map +1 -1
- package/dist/esm/types.d.ts +121 -131
- package/dist/esm/types.mjs +3 -2
- package/dist/esm/types.mjs.map +1 -1
- package/dist/esm/util.d.ts +5 -5
- package/dist/esm/util.mjs +46 -25
- package/dist/esm/util.mjs.map +1 -1
- package/package.json +74 -73
- package/src/authModeStrategies/multiAuthStrategy.ts +8 -4
- package/src/datastore/datastore.ts +145 -123
- package/src/index.ts +10 -8
- package/src/predicates/index.ts +10 -2
- package/src/predicates/next.ts +39 -28
- package/src/predicates/sort.ts +23 -26
- package/src/storage/adapter/AsyncStorageAdapter.ts +43 -25
- package/src/storage/adapter/AsyncStorageDatabase.ts +18 -10
- package/src/storage/adapter/InMemoryStore.ts +5 -1
- package/src/storage/adapter/IndexedDBAdapter.ts +50 -37
- package/src/storage/adapter/StorageAdapterBase.ts +24 -18
- package/src/storage/adapter/getDefaultAdapter/index.native.ts +1 -0
- package/src/storage/adapter/getDefaultAdapter/index.ts +4 -1
- package/src/storage/adapter/index.ts +2 -2
- package/src/storage/relationship.ts +5 -1
- package/src/storage/storage.ts +38 -30
- package/src/sync/datastoreConnectivity.ts +4 -6
- package/src/sync/index.ts +228 -230
- package/src/sync/merger.ts +4 -3
- package/src/sync/outbox.ts +26 -24
- package/src/sync/processors/errorMaps.ts +5 -0
- package/src/sync/processors/mutation.ts +80 -72
- package/src/sync/processors/subscription.ts +69 -53
- package/src/sync/processors/sync.ts +49 -37
- package/src/sync/utils.ts +60 -41
- package/src/types.ts +165 -165
- 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,
|
|
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 {
|
|
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
|
-
|
|
34
|
-
isSchemaModelWithAttributes,
|
|
41
|
+
ManagedIdentifier,
|
|
35
42
|
ModelFieldType,
|
|
36
43
|
ModelInit,
|
|
37
44
|
ModelInstanceMetadata,
|
|
38
45
|
ModelPredicate,
|
|
39
|
-
|
|
40
|
-
SortPredicate,
|
|
46
|
+
ModelPredicateExtender,
|
|
41
47
|
MutableModel,
|
|
42
48
|
NamespaceResolver,
|
|
43
49
|
NonModelTypeConstructor,
|
|
44
|
-
|
|
50
|
+
ObserveQueryOptions,
|
|
45
51
|
PaginationInput,
|
|
46
52
|
PersistentModel,
|
|
47
53
|
PersistentModelConstructor,
|
|
48
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
isModelFieldType,
|
|
63
|
-
ObserveQueryOptions,
|
|
64
|
-
ManagedIdentifier,
|
|
65
|
-
PersistentModelMetaData,
|
|
66
|
-
IdentifierFieldOrIdentifierObject,
|
|
66
|
+
TypeConstructorMap,
|
|
67
|
+
isGraphQLScalarType,
|
|
67
68
|
isIdentifierObject,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
80
|
-
establishRelationAndKeys,
|
|
81
|
-
isModelConstructor,
|
|
82
|
-
monotonicUlidFactory,
|
|
76
|
+
DeferredCallbackResolver,
|
|
83
77
|
NAMESPACES,
|
|
84
78
|
STORAGE,
|
|
85
79
|
SYNC,
|
|
86
80
|
USER,
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
(
|
|
361
|
+
(field.type as ModelFieldType).model !== model.name,
|
|
359
362
|
)
|
|
360
363
|
.forEach(field =>
|
|
361
|
-
connectedModels.push((
|
|
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[(
|
|
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]
|
|
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
|
|
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
|
-
|
|
553
|
+
ModelConstructor: PersistentModelConstructor<T>,
|
|
550
554
|
init: Partial<T>,
|
|
551
555
|
): T {
|
|
552
556
|
instancesMetadata.add(init);
|
|
553
557
|
|
|
554
|
-
return new
|
|
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
|
-
(
|
|
626
|
+
(v as []).some(e =>
|
|
622
627
|
isNullOrUndefined(e) ? isRequired : typeof e !== jsType,
|
|
623
628
|
)
|
|
624
629
|
) {
|
|
625
|
-
const elemTypes = (
|
|
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 = (
|
|
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
|
-
|
|
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
|
-
(
|
|
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) (
|
|
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 =
|
|
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
|
-
?
|
|
826
|
-
:
|
|
830
|
+
? (init as unknown as ModelInstanceMetadata)
|
|
831
|
+
: ({} as ModelInstanceMetadata);
|
|
827
832
|
|
|
828
|
-
|
|
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
|
-
(
|
|
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
|
-
(
|
|
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(
|
|
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
|
|
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
|
|
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 (
|
|
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 (!
|
|
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(
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
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:
|
|
1122
|
+
private values: any[] | Promise<any[]>;
|
|
1113
1123
|
|
|
1114
|
-
constructor(values:
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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(
|
|
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!:
|
|
1398
|
-
private initResolve!:
|
|
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((
|
|
1505
|
-
this.initResolve =
|
|
1506
|
-
this.initReject =
|
|
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
|
-
|
|
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(
|
|
1696
|
+
if (isIdentifierObject(identifierOrCriteria as T, modelDefinition)) {
|
|
1679
1697
|
const predicate = ModelPredicateCreator.createForPk<T>(
|
|
1680
1698
|
modelDefinition,
|
|
1681
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1820
|
-
|
|
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
|
-
|
|
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 =
|
|
2061
|
-
const
|
|
2062
|
-
model && (
|
|
2076
|
+
const model = modelOrConstructor as T;
|
|
2077
|
+
const resolvedModelConstructor =
|
|
2078
|
+
model && (Object.getPrototypeOf(model) as object).constructor;
|
|
2063
2079
|
|
|
2064
|
-
if (isValidModelConstructor<T>(
|
|
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(
|
|
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 =>
|
|
2173
|
-
|
|
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
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
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 =
|
|
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(
|
|
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
|
|
2395
|
-
const pagination = this.processPagination(
|
|
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
|
|