jazz-tools 0.18.38 → 0.19.1
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/.svelte-kit/__package__/jazz.class.svelte.d.ts +8 -8
- package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/jazz.class.svelte.js +39 -14
- package/.svelte-kit/__package__/media/image.svelte +6 -5
- package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.d.ts +2 -0
- package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.js +19 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test-d.d.ts +2 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test-d.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test-d.js +16 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test.d.ts +2 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test.js +42 -0
- package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte +23 -0
- package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte.d.ts +12 -0
- package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte.d.ts.map +1 -0
- package/.turbo/turbo-build.log +62 -62
- package/CHANGELOG.md +32 -0
- package/dist/better-auth/database-adapter/index.js +14 -11
- package/dist/better-auth/database-adapter/index.js.map +1 -1
- package/dist/better-auth/database-adapter/repository/generic.d.ts +1 -1
- package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -1
- package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -1
- package/dist/{chunk-OSQ7S47Q.js → chunk-NCNM6UDZ.js} +563 -252
- package/dist/chunk-NCNM6UDZ.js.map +1 -0
- package/dist/index.js +14 -6
- package/dist/index.js.map +1 -1
- package/dist/media/{chunk-K6GCHLQU.js → chunk-3LKBM3G3.js} +23 -15
- package/dist/media/chunk-3LKBM3G3.js.map +1 -0
- package/dist/media/create-image/browser.d.ts +2 -2
- package/dist/media/create-image/react-native.d.ts +2 -2
- package/dist/media/create-image/server.d.ts +2 -2
- package/dist/media/create-image-factory.d.ts +2 -2
- package/dist/media/index.browser.js +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/index.native.js +1 -1
- package/dist/media/index.server.js +1 -1
- package/dist/media/utils.d.ts.map +1 -1
- package/dist/react/hooks.d.ts +1 -1
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +31 -15
- package/dist/react/index.js.map +1 -1
- package/dist/react/media/image.d.ts.map +1 -1
- package/dist/react-core/hooks.d.ts +126 -224
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.js +65 -63
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/subscription-provider.d.ts.map +1 -1
- package/dist/react-core/tests/createCoValueSubscriptionContext.test.d.ts +2 -0
- package/dist/react-core/tests/createCoValueSubscriptionContext.test.d.ts.map +1 -0
- package/dist/react-core/tests/useAccount.selector.test.d.ts +2 -0
- package/dist/react-core/tests/useAccount.selector.test.d.ts.map +1 -0
- package/dist/react-core/tests/useCoState.selector.test.d.ts +2 -0
- package/dist/react-core/tests/useCoState.selector.test.d.ts.map +1 -0
- package/dist/react-native-core/hooks.d.ts +1 -1
- package/dist/react-native-core/hooks.d.ts.map +1 -1
- package/dist/react-native-core/index.js +7 -5
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/media/image.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.d.ts +8 -8
- package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.js +39 -14
- package/dist/svelte/media/image.svelte +6 -5
- package/dist/svelte/media/image.svelte.d.ts.map +1 -1
- package/dist/svelte/tests/AccountCoState.svelte.test-d.d.ts +2 -0
- package/dist/svelte/tests/AccountCoState.svelte.test-d.d.ts.map +1 -0
- package/dist/svelte/tests/AccountCoState.svelte.test-d.js +19 -0
- package/dist/svelte/tests/CoState.svelte.test-d.d.ts +2 -0
- package/dist/svelte/tests/CoState.svelte.test-d.d.ts.map +1 -0
- package/dist/svelte/tests/CoState.svelte.test-d.js +16 -0
- package/dist/svelte/tests/CoState.svelte.test.d.ts +2 -0
- package/dist/svelte/tests/CoState.svelte.test.d.ts.map +1 -0
- package/dist/svelte/tests/CoState.svelte.test.js +42 -0
- package/dist/svelte/tests/TestCoStateWrapper.svelte +23 -0
- package/dist/svelte/tests/TestCoStateWrapper.svelte.d.ts +12 -0
- package/dist/svelte/tests/TestCoStateWrapper.svelte.d.ts.map +1 -0
- package/dist/testing.js +3 -1
- package/dist/testing.js.map +1 -1
- package/dist/tools/coValues/CoValueBase.d.ts +4 -1
- package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
- package/dist/tools/coValues/account.d.ts +6 -6
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/coFeed.d.ts +5 -5
- package/dist/tools/coValues/coFeed.d.ts.map +1 -1
- package/dist/tools/coValues/coList.d.ts +9 -8
- package/dist/tools/coValues/coList.d.ts.map +1 -1
- package/dist/tools/coValues/coMap.d.ts +17 -17
- package/dist/tools/coValues/coMap.d.ts.map +1 -1
- package/dist/tools/coValues/coPlainText.d.ts +3 -3
- package/dist/tools/coValues/coPlainText.d.ts.map +1 -1
- package/dist/tools/coValues/coVector.d.ts +3 -3
- package/dist/tools/coValues/coVector.d.ts.map +1 -1
- package/dist/tools/coValues/deepLoading.d.ts +71 -40
- package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
- package/dist/tools/coValues/extensions/imageDef.d.ts +1 -1
- package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
- package/dist/tools/coValues/group.d.ts +2 -2
- package/dist/tools/coValues/group.d.ts.map +1 -1
- package/dist/tools/coValues/inbox.d.ts.map +1 -1
- package/dist/tools/coValues/interfaces.d.ts +17 -9
- package/dist/tools/coValues/interfaces.d.ts.map +1 -1
- package/dist/tools/coValues/request.d.ts.map +1 -1
- package/dist/tools/coValues/schemaUnion.d.ts +6 -9
- package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
- package/dist/tools/exports.d.ts +3 -3
- package/dist/tools/exports.d.ts.map +1 -1
- package/dist/tools/implementation/refs.d.ts +3 -3
- package/dist/tools/implementation/refs.d.ts.map +1 -1
- package/dist/tools/implementation/schema.d.ts +2 -2
- package/dist/tools/implementation/schema.d.ts.map +1 -1
- package/dist/tools/implementation/schemaUtils.d.ts +8 -0
- package/dist/tools/implementation/schemaUtils.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +33 -18
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +19 -7
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +23 -12
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +29 -18
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +39 -22
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts +1 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +30 -19
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts +5 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts +6 -5
- package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +3 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts +22 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts +4 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.d.ts +9 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts +7 -6
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
- package/dist/tools/internal.d.ts +3 -3
- package/dist/tools/internal.d.ts.map +1 -1
- package/dist/tools/lib/utils.d.ts +14 -0
- package/dist/tools/lib/utils.d.ts.map +1 -0
- package/dist/tools/lib/utils.test.d.ts +2 -0
- package/dist/tools/lib/utils.test.d.ts.map +1 -0
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +3 -2
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
- package/dist/tools/subscribe/JazzError.d.ts +4 -3
- package/dist/tools/subscribe/JazzError.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -5
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/subscribe/index.d.ts.map +1 -1
- package/dist/tools/subscribe/types.d.ts +23 -3
- package/dist/tools/subscribe/types.d.ts.map +1 -1
- package/dist/tools/subscribe/utils.d.ts.map +1 -1
- package/dist/tools/testing.d.ts +3 -2
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/tests/schema.resolved.test.d.ts +2 -0
- package/dist/tools/tests/schema.resolved.test.d.ts.map +1 -0
- package/dist/tools/tests/utils.d.ts +2 -1
- package/dist/tools/tests/utils.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/better-auth/database-adapter/index.ts +2 -2
- package/src/better-auth/database-adapter/repository/account.ts +3 -3
- package/src/better-auth/database-adapter/repository/generic.ts +9 -6
- package/src/better-auth/database-adapter/repository/user.ts +6 -2
- package/src/better-auth/database-adapter/schema.ts +1 -1
- package/src/better-auth/database-adapter/tests/index.test.ts +3 -4
- package/src/inspector/tests/viewer/history-view.test.tsx +6 -2
- package/src/media/utils.test.ts +5 -0
- package/src/media/utils.ts +25 -16
- package/src/react/hooks.tsx +2 -2
- package/src/react/index.ts +2 -2
- package/src/react/media/image.tsx +10 -2
- package/src/react/tests/useAcceptInvite.test.ts +3 -1
- package/src/react-core/hooks.ts +226 -304
- package/src/react-core/subscription-provider.tsx +14 -7
- package/src/react-core/tests/createCoValueSubscriptionContext.test.tsx +233 -0
- package/src/react-core/tests/subscription.bench.tsx +32 -15
- package/src/react-core/tests/{useAccountWithSelector.test.ts → useAccount.selector.test.ts} +72 -24
- package/src/react-core/tests/useAccount.test.ts +92 -106
- package/src/react-core/tests/{useCoStateWithSelector.test.ts → useCoState.selector.test.ts} +23 -8
- package/src/react-core/tests/useCoState.test.ts +173 -49
- package/src/react-core/tests/useInboxSender.test.ts +3 -1
- package/src/react-core/tests/usePassPhraseAuth.test.ts +11 -82
- package/src/react-core/tests/useSubscriptionSelector.test.ts +48 -14
- package/src/react-native-core/hooks.tsx +2 -2
- package/src/react-native-core/media/image.tsx +3 -1
- package/src/svelte/jazz.class.svelte.ts +103 -27
- package/src/svelte/media/image.svelte +6 -5
- package/src/svelte/tests/AccountCoState.svelte.test-d.ts +23 -0
- package/src/svelte/tests/CoState.svelte.test-d.ts +20 -0
- package/src/svelte/tests/CoState.svelte.test.ts +57 -0
- package/src/svelte/tests/TestCoStateWrapper.svelte +23 -0
- package/src/tools/coValues/CoValueBase.ts +12 -0
- package/src/tools/coValues/account.ts +17 -12
- package/src/tools/coValues/coFeed.ts +38 -15
- package/src/tools/coValues/coList.ts +17 -12
- package/src/tools/coValues/coMap.ts +15 -14
- package/src/tools/coValues/coPlainText.ts +6 -3
- package/src/tools/coValues/coVector.ts +6 -5
- package/src/tools/coValues/deepLoading.ts +147 -86
- package/src/tools/coValues/group.ts +3 -2
- package/src/tools/coValues/inbox.ts +11 -10
- package/src/tools/coValues/interfaces.ts +52 -30
- package/src/tools/coValues/request.ts +8 -6
- package/src/tools/coValues/schemaUnion.ts +20 -14
- package/src/tools/exports.ts +11 -1
- package/src/tools/implementation/refs.ts +19 -13
- package/src/tools/implementation/schema.ts +5 -4
- package/src/tools/implementation/schemaUtils.ts +15 -0
- package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +4 -4
- package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +131 -95
- package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +86 -16
- package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +73 -22
- package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +86 -28
- package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +204 -148
- package/src/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.ts +1 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +71 -27
- package/src/tools/implementation/zodSchema/schemaTypes/CoValueSchema.ts +7 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.ts +8 -6
- package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/schemaTypes/GroupSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +3 -0
- package/src/tools/implementation/zodSchema/typeConverters/{InstanceOfSchemaCoValuesNullable.ts → InstanceOfSchemaCoValuesMaybeLoaded.ts} +47 -39
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.ts +4 -0
- package/src/tools/implementation/zodSchema/typeConverters/{InstanceOrPrimitiveOfSchemaCoValuesNullable.ts → InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.ts} +7 -3
- package/src/tools/implementation/zodSchema/unionUtils.ts +35 -4
- package/src/tools/implementation/zodSchema/zodSchema.ts +15 -7
- package/src/tools/internal.ts +3 -3
- package/src/tools/lib/utils.test.ts +56 -0
- package/src/tools/lib/utils.ts +32 -0
- package/src/tools/subscribe/CoValueCoreSubscription.ts +13 -8
- package/src/tools/subscribe/JazzError.ts +8 -2
- package/src/tools/subscribe/SubscriptionScope.ts +57 -57
- package/src/tools/subscribe/index.ts +12 -4
- package/src/tools/subscribe/types.ts +36 -2
- package/src/tools/subscribe/utils.ts +2 -1
- package/src/tools/testing.ts +5 -0
- package/src/tools/tests/CoValueCoreSubscription.test.ts +10 -4
- package/src/tools/tests/ContextManager.test.ts +12 -5
- package/src/tools/tests/account.test.ts +22 -12
- package/src/tools/tests/coDiscriminatedUnion.test.ts +354 -8
- package/src/tools/tests/coFeed.branch.test.ts +48 -32
- package/src/tools/tests/coFeed.test-d.ts +17 -10
- package/src/tools/tests/coFeed.test.ts +52 -30
- package/src/tools/tests/coList.branch.test.ts +21 -21
- package/src/tools/tests/coList.test-d.ts +39 -23
- package/src/tools/tests/coList.test.ts +51 -25
- package/src/tools/tests/coList.unique.test.ts +34 -29
- package/src/tools/tests/coMap.branch.test.ts +20 -21
- package/src/tools/tests/coMap.record.test-d.ts +28 -26
- package/src/tools/tests/coMap.record.test.ts +30 -20
- package/src/tools/tests/coMap.test-d.ts +31 -29
- package/src/tools/tests/coMap.test.ts +67 -40
- package/src/tools/tests/coMap.unique.test.ts +25 -24
- package/src/tools/tests/coVector.test.ts +29 -15
- package/src/tools/tests/createContext.test.ts +5 -3
- package/src/tools/tests/deepLoading.test.ts +369 -176
- package/src/tools/tests/exportImport.test.ts +16 -15
- package/src/tools/tests/groupsAndAccounts.test.ts +39 -16
- package/src/tools/tests/inbox.test.ts +3 -1
- package/src/tools/tests/load.test.ts +29 -23
- package/src/tools/tests/patterns/quest.test.ts +3 -2
- package/src/tools/tests/patterns/requestToJoin.test.ts +17 -17
- package/src/tools/tests/request.test.ts +12 -2
- package/src/tools/tests/schema.resolved.test.ts +792 -0
- package/src/tools/tests/schemaUnion.test.ts +7 -3
- package/src/tools/tests/subscribe.test.ts +39 -21
- package/src/tools/tests/testing.test.ts +3 -2
- package/src/tools/tests/utils.ts +15 -2
- package/dist/chunk-OSQ7S47Q.js.map +0 -1
- package/dist/media/chunk-K6GCHLQU.js.map +0 -1
- package/dist/react-core/tests/useAccountWithSelector.test.d.ts +0 -2
- package/dist/react-core/tests/useAccountWithSelector.test.d.ts.map +0 -1
- package/dist/react-core/tests/useCoStateWithSelector.test.d.ts +0 -2
- package/dist/react-core/tests/useCoStateWithSelector.test.d.ts.map +0 -1
- package/dist/tools/implementation/errors.d.ts +0 -2
- package/dist/tools/implementation/errors.d.ts.map +0 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts +0 -19
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts.map +0 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts +0 -5
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts.map +0 -1
- package/dist/tools/lib/id.d.ts +0 -2
- package/dist/tools/lib/id.d.ts.map +0 -1
- package/src/tools/implementation/errors.ts +0 -1
- package/src/tools/lib/id.ts +0 -3
|
@@ -6,7 +6,8 @@ import {
|
|
|
6
6
|
setActiveAccount,
|
|
7
7
|
setupJazzTestSync,
|
|
8
8
|
} from "../testing.js";
|
|
9
|
-
import { setupTwoNodes } from "./utils.js";
|
|
9
|
+
import { assertLoaded, setupTwoNodes } from "./utils.js";
|
|
10
|
+
import { CoValueLoadingState } from "../internal.js";
|
|
10
11
|
|
|
11
12
|
beforeEach(async () => {
|
|
12
13
|
await setupJazzTestSync();
|
|
@@ -32,7 +33,7 @@ test("waitForAllCoValuesSync should resolve when all the values are synced", asy
|
|
|
32
33
|
|
|
33
34
|
for (const map of maps) {
|
|
34
35
|
const loadedMap = await serverNode.load(map.$jazz.raw.id);
|
|
35
|
-
expect(loadedMap).not.toBe(
|
|
36
|
+
expect(loadedMap).not.toBe(CoValueLoadingState.UNAVAILABLE);
|
|
36
37
|
}
|
|
37
38
|
});
|
|
38
39
|
|
|
@@ -46,7 +47,7 @@ test("waitForSync should resolve when the value is uploaded", async () => {
|
|
|
46
47
|
|
|
47
48
|
const loadedAccount = await serverNode.load(clientAccount.$jazz.raw.id);
|
|
48
49
|
|
|
49
|
-
expect(loadedAccount).not.toBe(
|
|
50
|
+
expect(loadedAccount).not.toBe(CoValueLoadingState.UNAVAILABLE);
|
|
50
51
|
});
|
|
51
52
|
|
|
52
53
|
test("isMe gets updated correctly when switching accounts", async () => {
|
|
@@ -86,11 +87,13 @@ test("Me gets updated correctly when creating a new account as active", async ()
|
|
|
86
87
|
|
|
87
88
|
test("accounts should sync correctly", async () => {
|
|
88
89
|
const account = await createJazzTestAccount({ isCurrentActiveAccount: true });
|
|
89
|
-
account.profile
|
|
90
|
+
assertLoaded(account.profile);
|
|
91
|
+
account.profile.$jazz.set("name", "test 1");
|
|
90
92
|
const otherAccount = await createJazzTestAccount({
|
|
91
93
|
isCurrentActiveAccount: true,
|
|
92
94
|
});
|
|
93
|
-
otherAccount.profile
|
|
95
|
+
assertLoaded(otherAccount.profile);
|
|
96
|
+
otherAccount.profile.$jazz.set("name", "test 2");
|
|
94
97
|
|
|
95
98
|
await linkAccounts(account, otherAccount);
|
|
96
99
|
|
|
@@ -98,8 +101,14 @@ test("accounts should sync correctly", async () => {
|
|
|
98
101
|
|
|
99
102
|
group.addMember(otherAccount, "writer");
|
|
100
103
|
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
const accountMember = group.members[0]?.account;
|
|
105
|
+
assert(accountMember);
|
|
106
|
+
assertLoaded(accountMember.profile);
|
|
107
|
+
expect(accountMember.profile.name).toBe("test 1");
|
|
108
|
+
const otherAccountMember = group.members[1]?.account;
|
|
109
|
+
assert(otherAccountMember);
|
|
110
|
+
assertLoaded(otherAccountMember.profile);
|
|
111
|
+
expect(otherAccountMember.profile.name).toBe("test 2");
|
|
103
112
|
});
|
|
104
113
|
|
|
105
114
|
test("loading accounts should work", async () => {
|
|
@@ -118,7 +127,7 @@ test("loading accounts should work", async () => {
|
|
|
118
127
|
},
|
|
119
128
|
});
|
|
120
129
|
|
|
121
|
-
|
|
130
|
+
assertLoaded(loadedAccount);
|
|
122
131
|
expect(loadedAccount.profile.name).toBe("test 1");
|
|
123
132
|
});
|
|
124
133
|
|
|
@@ -133,8 +142,9 @@ test("loading raw accounts should work", async () => {
|
|
|
133
142
|
loadAs: account,
|
|
134
143
|
});
|
|
135
144
|
|
|
136
|
-
|
|
137
|
-
|
|
145
|
+
assertLoaded(loadedAccount);
|
|
146
|
+
assertLoaded(loadedAccount.profile);
|
|
147
|
+
expect(loadedAccount.profile.name).toBe("test 1");
|
|
138
148
|
});
|
|
139
149
|
|
|
140
150
|
describe("co.profile() schema", () => {
|
|
@@ -221,7 +231,7 @@ test("cannot update account profile properties directly", async () => {
|
|
|
221
231
|
},
|
|
222
232
|
});
|
|
223
233
|
|
|
224
|
-
|
|
234
|
+
assertLoaded(account.profile);
|
|
225
235
|
|
|
226
236
|
// @ts-expect-error - cannot update profile properties directly
|
|
227
237
|
expect(() => (account.profile.name = "test 2")).toThrow(
|
|
@@ -294,7 +304,7 @@ describe("root and profile", () => {
|
|
|
294
304
|
},
|
|
295
305
|
});
|
|
296
306
|
|
|
297
|
-
|
|
307
|
+
assertLoaded(bobAccountLoadedFromAlice);
|
|
298
308
|
|
|
299
309
|
expect(bobAccountLoadedFromAlice.profile.name).toBe("Bob");
|
|
300
310
|
expect(bobAccountLoadedFromAlice.root.name).toBe("Bob");
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
-
import { CoPlainText, Loaded, co, z } from "../exports.js";
|
|
2
|
+
import { CoPlainText, Group, Loaded, co, loadCoValue, z } from "../exports.js";
|
|
3
3
|
import { createJazzTestAccount, setupJazzTestSync } from "../testing.js";
|
|
4
|
-
import { waitFor } from "./utils.js";
|
|
4
|
+
import { assertLoaded, waitFor } from "./utils.js";
|
|
5
|
+
import type { Account } from "jazz-tools";
|
|
5
6
|
|
|
6
7
|
describe("co.discriminatedUnion", () => {
|
|
8
|
+
let account: Account;
|
|
9
|
+
|
|
7
10
|
beforeEach(async () => {
|
|
8
11
|
await setupJazzTestSync();
|
|
9
12
|
|
|
10
|
-
await createJazzTestAccount({
|
|
13
|
+
account = await createJazzTestAccount({
|
|
11
14
|
isCurrentActiveAccount: true,
|
|
12
15
|
creationProps: { name: "Hermes Puggington" },
|
|
13
16
|
});
|
|
@@ -266,7 +269,7 @@ describe("co.discriminatedUnion", () => {
|
|
|
266
269
|
expect(referenceItem.children[0]?.type).toEqual("note");
|
|
267
270
|
});
|
|
268
271
|
|
|
269
|
-
test("load CoValue instances using the DiscriminatedUnion schema", async () => {
|
|
272
|
+
test("load CoValue instances using the DiscriminatedUnion schema without resolve", async () => {
|
|
270
273
|
const Dog = co.map({
|
|
271
274
|
type: z.literal("dog"),
|
|
272
275
|
});
|
|
@@ -277,10 +280,44 @@ describe("co.discriminatedUnion", () => {
|
|
|
277
280
|
|
|
278
281
|
const dog = Dog.create({ type: "dog" });
|
|
279
282
|
const loadedPet = await Pet.load(dog.$jazz.id);
|
|
283
|
+
assertLoaded(loadedPet);
|
|
284
|
+
expect(loadedPet.type).toEqual("dog");
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
test("load CoValue instances using the DiscriminatedUnion schema with deep resolve", async () => {
|
|
288
|
+
const Person = co.map({
|
|
289
|
+
name: z.string(),
|
|
290
|
+
});
|
|
291
|
+
const Dog = co.map({
|
|
292
|
+
type: z.literal("dog"),
|
|
293
|
+
owner: Person,
|
|
294
|
+
});
|
|
295
|
+
const Cat = co.map({
|
|
296
|
+
type: z.literal("cat"),
|
|
297
|
+
owner: Person,
|
|
298
|
+
});
|
|
299
|
+
const Pet = co.discriminatedUnion("type", [Dog, Cat]);
|
|
300
|
+
|
|
301
|
+
const dog = Dog.create({
|
|
302
|
+
type: "dog",
|
|
303
|
+
owner: Person.create({
|
|
304
|
+
name: "John Doe",
|
|
305
|
+
}),
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const loadedPet = await Pet.load(dog.$jazz.id, {
|
|
309
|
+
resolve: {
|
|
310
|
+
owner: true,
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
assertLoaded(loadedPet);
|
|
315
|
+
|
|
280
316
|
expect(loadedPet?.type).toEqual("dog");
|
|
317
|
+
expect(loadedPet?.owner.name).toEqual("John Doe");
|
|
281
318
|
});
|
|
282
319
|
|
|
283
|
-
test("subscribe to CoValue instances using the DiscriminatedUnion schema", async () => {
|
|
320
|
+
test("subscribe to CoValue instances using the DiscriminatedUnion schema without resolve", async () => {
|
|
284
321
|
const Person = co.map({
|
|
285
322
|
name: z.string(),
|
|
286
323
|
});
|
|
@@ -318,7 +355,41 @@ describe("co.discriminatedUnion", () => {
|
|
|
318
355
|
expect(updates[0]?.name).toEqual("Rex");
|
|
319
356
|
});
|
|
320
357
|
|
|
321
|
-
test("
|
|
358
|
+
test("subscribe to CoValue instances using the DiscriminatedUnion schema with deep resolve", async () => {
|
|
359
|
+
const Person = co.map({
|
|
360
|
+
name: z.string(),
|
|
361
|
+
});
|
|
362
|
+
const Dog = co.map({
|
|
363
|
+
type: z.literal("dog"),
|
|
364
|
+
owner: Person,
|
|
365
|
+
});
|
|
366
|
+
const Cat = co.map({
|
|
367
|
+
type: z.literal("cat"),
|
|
368
|
+
owner: Person,
|
|
369
|
+
});
|
|
370
|
+
const Pet = co.discriminatedUnion("type", [Dog, Cat]);
|
|
371
|
+
|
|
372
|
+
const dog = Dog.create({
|
|
373
|
+
type: "dog",
|
|
374
|
+
owner: Person.create({
|
|
375
|
+
name: "John Doe",
|
|
376
|
+
}),
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
const spy = vi.fn();
|
|
380
|
+
Pet.subscribe(dog.$jazz.id, { resolve: { owner: true } }, (pet) => {
|
|
381
|
+
expect(pet.owner.name).toEqual("John Doe");
|
|
382
|
+
spy(pet);
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
expect(spy).not.toHaveBeenCalled();
|
|
386
|
+
|
|
387
|
+
await waitFor(() => expect(spy).toHaveBeenCalled());
|
|
388
|
+
|
|
389
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test("should work when one of the options has a discriminated union field", async () => {
|
|
322
393
|
const Collie = co.map({
|
|
323
394
|
type: z.literal("collie"),
|
|
324
395
|
});
|
|
@@ -343,7 +414,9 @@ describe("co.discriminatedUnion", () => {
|
|
|
343
414
|
|
|
344
415
|
const loadedAnimal = await Animal.load(animal.$jazz.id);
|
|
345
416
|
|
|
346
|
-
|
|
417
|
+
assertLoaded(loadedAnimal);
|
|
418
|
+
assertLoaded(loadedAnimal.breed);
|
|
419
|
+
expect(loadedAnimal.breed.type).toEqual("collie");
|
|
347
420
|
});
|
|
348
421
|
|
|
349
422
|
test("should work with a nested co.discriminatedUnion", async () => {
|
|
@@ -365,6 +438,279 @@ describe("co.discriminatedUnion", () => {
|
|
|
365
438
|
|
|
366
439
|
const loadedAnimal = await Animal.load(animal.$jazz.id);
|
|
367
440
|
|
|
368
|
-
|
|
441
|
+
assertLoaded(loadedAnimal);
|
|
442
|
+
expect(loadedAnimal.type).toEqual("collie");
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test("load co.discriminatedUnion with deep resolve using loadCoValue", async () => {
|
|
446
|
+
const Person = co.map({
|
|
447
|
+
name: z.string(),
|
|
448
|
+
});
|
|
449
|
+
const Dog = co.map({
|
|
450
|
+
type: z.literal("dog"),
|
|
451
|
+
owner: Person,
|
|
452
|
+
});
|
|
453
|
+
const Cat = co.map({
|
|
454
|
+
type: z.literal("cat"),
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
const Pet = co.discriminatedUnion("type", [Dog, Cat]);
|
|
458
|
+
|
|
459
|
+
const dog = Dog.create({
|
|
460
|
+
type: "dog",
|
|
461
|
+
owner: Person.create({ name: "John Doe" }),
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
const loadedPet = await loadCoValue(Pet.getCoValueClass(), dog.$jazz.id, {
|
|
465
|
+
resolve: { owner: true },
|
|
466
|
+
loadAs: account,
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
assertLoaded(loadedPet);
|
|
470
|
+
|
|
471
|
+
if (loadedPet.type === "dog") {
|
|
472
|
+
expect(loadedPet.owner.name).toEqual("John Doe");
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
test("load co.discriminatedUnion with non-matching deep resolve", async () => {
|
|
477
|
+
const Person = co.map({
|
|
478
|
+
name: z.string(),
|
|
479
|
+
});
|
|
480
|
+
const Dog = co.map({
|
|
481
|
+
type: z.literal("dog"),
|
|
482
|
+
owner: Person,
|
|
483
|
+
});
|
|
484
|
+
const Cat = co.map({
|
|
485
|
+
type: z.literal("cat"),
|
|
486
|
+
});
|
|
487
|
+
const Pet = co.discriminatedUnion("type", [Dog, Cat]);
|
|
488
|
+
|
|
489
|
+
const cat = Cat.create({
|
|
490
|
+
type: "cat",
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
const loadedPet = await Pet.load(cat.$jazz.id, {
|
|
494
|
+
resolve: { owner: true },
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
assertLoaded(loadedPet);
|
|
498
|
+
|
|
499
|
+
expect(loadedPet.type).toEqual("cat");
|
|
500
|
+
// @ts-expect-error - no owner on Cat
|
|
501
|
+
expect(loadedPet.owner).toBeUndefined();
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
test("load co.discriminatedUnion list with different schemas on deep resolved fields", async () => {
|
|
505
|
+
// Schema without nested CoValues
|
|
506
|
+
const Bird = co.map({
|
|
507
|
+
type: z.literal("bird"),
|
|
508
|
+
species: z.string(),
|
|
509
|
+
});
|
|
510
|
+
const Person = co.map({
|
|
511
|
+
name: z.string(),
|
|
512
|
+
bird: Bird,
|
|
513
|
+
});
|
|
514
|
+
// Schema with a nested CoValue
|
|
515
|
+
const Dog = co.map({
|
|
516
|
+
type: z.literal("dog"),
|
|
517
|
+
friend: Person,
|
|
518
|
+
});
|
|
519
|
+
// Same attribute (friend) with a completely different schema (list)
|
|
520
|
+
const Cat = co.map({
|
|
521
|
+
type: z.literal("cat"),
|
|
522
|
+
get friend() {
|
|
523
|
+
return co.list(Cat);
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
const Pet = co.discriminatedUnion("type", [Dog, Cat, Bird]);
|
|
527
|
+
const Pets = co.list(Pet);
|
|
528
|
+
|
|
529
|
+
const bird = Bird.create({
|
|
530
|
+
type: "bird",
|
|
531
|
+
species: "Parrot",
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
const dog = Dog.create({
|
|
535
|
+
type: "dog",
|
|
536
|
+
friend: Person.create({ name: "John Doe", bird }),
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
const cat = Cat.create({
|
|
540
|
+
type: "cat",
|
|
541
|
+
friend: [{ type: "cat", friend: [{ type: "cat", friend: [] }] }],
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
const pets = Pets.create([dog, cat, bird]);
|
|
545
|
+
|
|
546
|
+
const loadedPets = await Pets.load(pets.$jazz.id, {
|
|
547
|
+
resolve: { $each: { friend: { $each: { friend: true }, bird: true } } },
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
assertLoaded(loadedPets);
|
|
551
|
+
|
|
552
|
+
for (const pet of loadedPets) {
|
|
553
|
+
if (pet.type === "dog") {
|
|
554
|
+
expect(pet.friend.name).toEqual("John Doe");
|
|
555
|
+
expect(pet.friend.bird.species).toEqual("Parrot");
|
|
556
|
+
// @ts-expect-error - no species on Person
|
|
557
|
+
expect(pet.friend.species).toBeUndefined();
|
|
558
|
+
} else if (pet.type === "cat") {
|
|
559
|
+
expect(pet.friend[0]?.type).toEqual("cat");
|
|
560
|
+
// @ts-expect-error - no name on Bird
|
|
561
|
+
expect(pet.friend.name).toBeUndefined();
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
test("ensureLoaded on co.discriminatedUnion members", async () => {
|
|
567
|
+
const Person = co.map({
|
|
568
|
+
name: z.string(),
|
|
569
|
+
});
|
|
570
|
+
const Dog = co.map({
|
|
571
|
+
type: z.literal("dog"),
|
|
572
|
+
owner: Person,
|
|
573
|
+
});
|
|
574
|
+
const Cat = co.map({
|
|
575
|
+
type: z.literal("cat"),
|
|
576
|
+
friend: Person,
|
|
577
|
+
});
|
|
578
|
+
const Pet = co.discriminatedUnion("type", [Dog, Cat]);
|
|
579
|
+
|
|
580
|
+
const dog = Dog.create({
|
|
581
|
+
type: "dog",
|
|
582
|
+
owner: Person.create({ name: "John Doe" }),
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
const cat = Cat.create({
|
|
586
|
+
type: "cat",
|
|
587
|
+
friend: Person.create({ name: "Jane Doe" }),
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
const pet = await Pet.load(dog.$jazz.id);
|
|
591
|
+
|
|
592
|
+
assertLoaded(pet);
|
|
593
|
+
|
|
594
|
+
// @ts-expect-error - can't use ensureLoaded before narrowing
|
|
595
|
+
pet.$jazz.ensureLoaded({
|
|
596
|
+
resolve: { owner: true },
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
if (pet.type === "dog") {
|
|
600
|
+
const loadedPet = await pet.$jazz.ensureLoaded({
|
|
601
|
+
resolve: { owner: true },
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
expect(loadedPet.owner.name).toEqual("John Doe");
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
describe("Deep loading mutually exclusive nested CoMaps", async () => {
|
|
609
|
+
const Breed = co.map({
|
|
610
|
+
type: z.enum(["collie", "border-collie"]),
|
|
611
|
+
});
|
|
612
|
+
const Dog = co.map({
|
|
613
|
+
type: z.literal("dog"),
|
|
614
|
+
breed: Breed,
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
const Ocean = co.map({
|
|
618
|
+
name: z.enum(["atlantic", "pacific"]),
|
|
619
|
+
});
|
|
620
|
+
const Shark = co.map({
|
|
621
|
+
type: z.literal("shark"),
|
|
622
|
+
ocean: Ocean,
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
const Animal = co.discriminatedUnion("type", [Dog, Shark]);
|
|
626
|
+
const Species = co.list(Animal);
|
|
627
|
+
|
|
628
|
+
let species: Loaded<typeof Species>;
|
|
629
|
+
|
|
630
|
+
beforeEach(async () => {
|
|
631
|
+
const group = Group.create();
|
|
632
|
+
group.makePublic();
|
|
633
|
+
|
|
634
|
+
species = Species.create(
|
|
635
|
+
[
|
|
636
|
+
{
|
|
637
|
+
type: "dog",
|
|
638
|
+
breed: {
|
|
639
|
+
type: "collie",
|
|
640
|
+
},
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
type: "shark",
|
|
644
|
+
ocean: {
|
|
645
|
+
name: "atlantic",
|
|
646
|
+
},
|
|
647
|
+
},
|
|
648
|
+
],
|
|
649
|
+
group,
|
|
650
|
+
);
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
test("co.discriminatedUnion should load with deeply resolved mutually exclusive nested CoMaps", async () => {
|
|
654
|
+
const loadedSpecies = await Species.load(species.$jazz.id, {
|
|
655
|
+
resolve: {
|
|
656
|
+
$each: {
|
|
657
|
+
breed: true,
|
|
658
|
+
ocean: true,
|
|
659
|
+
},
|
|
660
|
+
},
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
assertLoaded(loadedSpecies);
|
|
664
|
+
|
|
665
|
+
// @ts-expect-error - type needs to be narrowed
|
|
666
|
+
expect(loadedSpecies[0]?.breed.type).toEqual("collie");
|
|
667
|
+
// @ts-expect-error - type needs to be narrowed
|
|
668
|
+
expect(loadedSpecies[1]?.ocean.name).toEqual("atlantic");
|
|
669
|
+
|
|
670
|
+
for (const animal of loadedSpecies) {
|
|
671
|
+
if (animal.type === "dog") {
|
|
672
|
+
expect(animal.breed.type).toBeDefined();
|
|
673
|
+
// @ts-expect-error - no ocean property on Dog
|
|
674
|
+
expect(animal.ocean).toBeUndefined();
|
|
675
|
+
} else if (animal.type === "shark") {
|
|
676
|
+
expect(animal.ocean.name).toBeDefined();
|
|
677
|
+
// @ts-expect-error - no breed property on Shark
|
|
678
|
+
expect(animal.breed).toBeUndefined();
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
test("co.discriminatedUnion should load with deeply resolved nested CoMaps with another account as owner", async () => {
|
|
684
|
+
const alice = await createJazzTestAccount({
|
|
685
|
+
creationProps: { name: "Alice" },
|
|
686
|
+
isCurrentActiveAccount: false,
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
const loadedSpecies = await Species.load(species.$jazz.id, {
|
|
690
|
+
loadAs: alice,
|
|
691
|
+
resolve: {
|
|
692
|
+
$each: {
|
|
693
|
+
breed: true,
|
|
694
|
+
ocean: true,
|
|
695
|
+
},
|
|
696
|
+
},
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
console.log(loadedSpecies.$isLoaded);
|
|
700
|
+
|
|
701
|
+
assertLoaded(loadedSpecies);
|
|
702
|
+
|
|
703
|
+
for (const animal of loadedSpecies) {
|
|
704
|
+
if (animal.type === "dog") {
|
|
705
|
+
expect(animal.breed.type).toBeDefined();
|
|
706
|
+
// @ts-expect-error - no ocean on Dog
|
|
707
|
+
expect(animal.ocean).toBeUndefined();
|
|
708
|
+
} else if (animal.type === "shark") {
|
|
709
|
+
expect(animal.ocean.name).toBeDefined();
|
|
710
|
+
// @ts-expect-error - no breed on Shark
|
|
711
|
+
expect(animal.breed).toBeUndefined();
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
});
|
|
369
715
|
});
|
|
370
716
|
});
|