jazz-tools 0.15.15 → 0.16.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/.svelte-kit/__package__/jazz.class.svelte.d.ts +2 -2
- package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/jazz.class.svelte.js +5 -5
- package/.svelte-kit/__package__/jazz.svelte.d.ts +2 -2
- package/.svelte-kit/__package__/jazz.svelte.d.ts.map +1 -1
- package/.turbo/turbo-build.log +46 -50
- package/CHANGELOG.md +35 -0
- package/dist/browser/index.d.ts +2 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser-media-images/index.d.ts +3 -1
- package/dist/browser-media-images/index.d.ts.map +1 -1
- package/dist/browser-media-images/index.js.map +1 -1
- package/dist/{chunk-4CFNXQE7.js → chunk-MLCNE3TL.js} +791 -698
- package/dist/chunk-MLCNE3TL.js.map +1 -0
- package/dist/index.js +363 -11
- package/dist/index.js.map +1 -1
- package/dist/react/hooks.d.ts +2 -2
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/testing.js +3 -1
- package/dist/react/testing.js.map +1 -1
- package/dist/react-core/hooks.d.ts +2 -2
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.js +3 -3
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-native-core/hooks.d.ts +2 -2
- package/dist/react-native-core/hooks.d.ts.map +1 -1
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/svelte/jazz.class.svelte.d.ts +2 -2
- package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.js +5 -5
- package/dist/svelte/jazz.svelte.d.ts +2 -2
- package/dist/svelte/jazz.svelte.d.ts.map +1 -1
- package/dist/testing.js +3 -3
- package/dist/testing.js.map +1 -1
- package/dist/tools/coValues/CoValueBase.d.ts +3 -13
- package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
- package/dist/tools/coValues/account.d.ts +2 -2
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/coFeed.d.ts.map +1 -1
- package/dist/tools/coValues/coList.d.ts.map +1 -1
- package/dist/tools/coValues/coMap.d.ts +5 -18
- package/dist/tools/coValues/coMap.d.ts.map +1 -1
- package/dist/tools/coValues/deepLoading.d.ts +4 -1
- package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
- package/dist/tools/coValues/extensions/imageDef.d.ts +4 -7
- package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
- package/dist/tools/coValues/group.d.ts +1 -0
- package/dist/tools/coValues/group.d.ts.map +1 -1
- package/dist/tools/coValues/inbox.d.ts +2 -2
- package/dist/tools/coValues/inbox.d.ts.map +1 -1
- package/dist/tools/coValues/interfaces.d.ts +58 -17
- package/dist/tools/coValues/interfaces.d.ts.map +1 -1
- package/dist/tools/coValues/request.d.ts +82 -0
- package/dist/tools/coValues/request.d.ts.map +1 -0
- package/dist/tools/coValues/schemaUnion.d.ts +5 -1
- package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
- package/dist/tools/exports.d.ts +4 -3
- package/dist/tools/exports.d.ts.map +1 -1
- package/dist/tools/implementation/createContext.d.ts +4 -4
- package/dist/tools/implementation/createContext.d.ts.map +1 -1
- package/dist/tools/implementation/invites.d.ts +2 -2
- package/dist/tools/implementation/invites.d.ts.map +1 -1
- package/dist/tools/implementation/schemaUtils.d.ts +8 -0
- package/dist/tools/implementation/schemaUtils.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/coExport.d.ts +11 -1
- package/dist/tools/implementation/zodSchema/coExport.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts +22 -0
- package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts +10 -0
- package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +11 -11
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +34 -24
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +16 -14
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +23 -17
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +24 -16
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts +20 -9
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +18 -12
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts +18 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +14 -9
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +14 -9
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +14 -9
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +15 -13
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts +12 -15
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts +17 -20
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts +17 -20
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/unionUtils.d.ts +3 -5
- package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodCo.d.ts +10 -8
- package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodReExport.d.ts +4 -8
- package/dist/tools/implementation/zodSchema/zodReExport.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts +21 -30
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
- package/dist/tools/internal.d.ts +3 -2
- package/dist/tools/internal.d.ts.map +1 -1
- package/dist/tools/lib/id.d.ts +2 -0
- package/dist/tools/lib/id.d.ts.map +1 -0
- package/dist/tools/lib/utilityTypes.d.ts +10 -0
- package/dist/tools/lib/utilityTypes.d.ts.map +1 -0
- package/dist/tools/subscribe/SubscriptionScope.d.ts +3 -2
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/subscribe/utils.d.ts.map +1 -1
- package/dist/tools/testing.d.ts +2 -2
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/tests/exportImport.test.d.ts +2 -0
- package/dist/tools/tests/exportImport.test.d.ts.map +1 -0
- package/dist/tools/tests/request.test.d.ts +2 -0
- package/dist/tools/tests/request.test.d.ts.map +1 -0
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +2 -2
- package/dist/worker/index.js.map +1 -1
- package/package.json +7 -6
- package/src/browser/index.ts +2 -4
- package/src/browser-media-images/index.ts +1 -1
- package/src/react/hooks.tsx +2 -2
- package/src/react-core/hooks.ts +6 -6
- package/src/react-core/tests/useAccount.test.ts +2 -2
- package/src/react-core/tests/useCoState.test.ts +3 -2
- package/src/react-native-core/hooks.tsx +2 -2
- package/src/svelte/jazz.class.svelte.ts +10 -7
- package/src/svelte/jazz.svelte.ts +2 -2
- package/src/tools/coValues/CoValueBase.ts +8 -20
- package/src/tools/coValues/account.ts +18 -14
- package/src/tools/coValues/coFeed.ts +0 -4
- package/src/tools/coValues/coList.ts +7 -9
- package/src/tools/coValues/coMap.ts +1 -6
- package/src/tools/coValues/coPlainText.ts +4 -4
- package/src/tools/coValues/deepLoading.ts +4 -1
- package/src/tools/coValues/extensions/imageDef.ts +3 -3
- package/src/tools/coValues/group.ts +1 -0
- package/src/tools/coValues/inbox.ts +8 -7
- package/src/tools/coValues/interfaces.ts +177 -69
- package/src/tools/coValues/request.ts +633 -0
- package/src/tools/coValues/schemaUnion.ts +8 -4
- package/src/tools/exports.ts +11 -14
- package/src/tools/implementation/createContext.ts +9 -9
- package/src/tools/implementation/invites.ts +2 -2
- package/src/tools/implementation/schemaUtils.ts +18 -0
- package/src/tools/implementation/zodSchema/coExport.ts +14 -0
- package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +156 -0
- package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +133 -0
- package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +36 -17
- package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +101 -52
- package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +54 -50
- package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +54 -46
- package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +187 -137
- package/src/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.ts +29 -27
- package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +28 -18
- package/src/tools/implementation/zodSchema/schemaTypes/CoValueSchema.ts +18 -0
- package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +45 -36
- package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +47 -35
- package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +43 -30
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +28 -23
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.ts +28 -25
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.ts +86 -78
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.ts +91 -82
- package/src/tools/implementation/zodSchema/unionUtils.ts +47 -51
- package/src/tools/implementation/zodSchema/zodCo.ts +42 -75
- package/src/tools/implementation/zodSchema/zodReExport.ts +44 -24
- package/src/tools/implementation/zodSchema/zodSchema.ts +64 -102
- package/src/tools/internal.ts +3 -2
- package/src/tools/lib/id.ts +3 -0
- package/src/tools/lib/utilityTypes.ts +7 -0
- package/src/tools/subscribe/SubscriptionScope.ts +10 -1
- package/src/tools/subscribe/utils.ts +4 -2
- package/src/tools/testing.ts +4 -4
- package/src/tools/tests/ContextManager.test.ts +8 -9
- package/src/tools/tests/account.test.ts +65 -3
- package/src/tools/tests/coDiscriminatedUnion.test-d.ts +38 -0
- package/src/tools/tests/coDiscriminatedUnion.test.ts +219 -1
- package/src/tools/tests/coFeed.test-d.ts +4 -3
- package/src/tools/tests/coList.test-d.ts +32 -3
- package/src/tools/tests/coList.test.ts +20 -2
- package/src/tools/tests/coMap.record.test-d.ts +31 -3
- package/src/tools/tests/coMap.record.test.ts +9 -9
- package/src/tools/tests/coMap.test-d.ts +8 -8
- package/src/tools/tests/coMap.test.ts +19 -5
- package/src/tools/tests/coOptional.test.ts +63 -1
- package/src/tools/tests/createContext.test.ts +7 -9
- package/src/tools/tests/deepLoading.test.ts +4 -10
- package/src/tools/tests/exportImport.test.ts +526 -0
- package/src/tools/tests/groupsAndAccounts.test.ts +5 -4
- package/src/tools/tests/inbox.test.ts +3 -2
- package/src/tools/tests/load.test.ts +3 -29
- package/src/tools/tests/request.test.ts +951 -0
- package/src/tools/tests/schemaUnion.test.ts +2 -2
- package/src/tools/tests/subscribe.test.ts +22 -114
- package/src/tools/tests/testing.test.ts +6 -6
- package/src/tools/tests/zod.test-d.ts +27 -0
- package/src/tools/tests/zod.test.ts +50 -45
- package/src/worker/index.ts +0 -1
- package/tsup.config.ts +0 -2
- package/dist/chunk-4CFNXQE7.js.map +0 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/zodFieldToCoFieldDef.d.ts +0 -12
- package/dist/tools/implementation/zodSchema/runtimeConverters/zodFieldToCoFieldDef.d.ts.map +0 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/zodSchemaToCoSchema.d.ts +0 -9
- package/dist/tools/implementation/zodSchema/runtimeConverters/zodSchemaToCoSchema.d.ts.map +0 -1
- package/src/tools/implementation/zodSchema/runtimeConverters/zodFieldToCoFieldDef.ts +0 -172
- package/src/tools/implementation/zodSchema/runtimeConverters/zodSchemaToCoSchema.ts +0 -218
@@ -1,5 +1,5 @@
|
|
1
|
-
import type { Account, AccountClass, AnyAccountSchema,
|
2
|
-
export declare class CoState<V extends
|
1
|
+
import type { Account, AccountClass, AnyAccountSchema, CoValueClassOrSchema, CoValueFromRaw, InstanceOfSchema, Loaded, ResolveQuery, ResolveQueryStrict } from "jazz-tools";
|
2
|
+
export declare class CoState<V extends CoValueClassOrSchema, R extends ResolveQuery<V> = true> {
|
3
3
|
#private;
|
4
4
|
constructor(Schema: V, id: string | undefined | null | (() => string | undefined | null), options?: {
|
5
5
|
resolve?: ResolveQueryStrict<V, R>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"jazz.class.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.class.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,
|
1
|
+
{"version":3,"file":"jazz.class.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.class.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAUpB,qBAAa,OAAO,CAClB,CAAC,SAAS,oBAAoB,EAC9B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAS9B,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EACjE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;KAAE;IA6ClD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,IAAI,OAAO,oCAGV;CACF;AAED,qBAAa,cAAc,CACzB,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAOpB,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;KAAE;IA0CvE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,MAAM,aAEJ;IAEF,IAAI,OAAO,oCAIV;IAED,IAAI,KAAK,kEAQR;IAID,IAAI,eAAe,YAElB;CACF"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { coValueClassFromCoValueClassOrSchema, subscribeToCoValue, } from "jazz-tools";
|
2
2
|
import { untrack } from "svelte";
|
3
3
|
import { createSubscriber } from "svelte/reactivity";
|
4
4
|
import { useIsAuthenticated } from "./auth/useIsAuthenticated.svelte.js";
|
@@ -22,8 +22,8 @@ export class CoState {
|
|
22
22
|
return this.update(undefined);
|
23
23
|
}
|
24
24
|
const agent = "me" in ctx ? ctx.me : ctx.guest;
|
25
|
-
const unsubscribe = subscribeToCoValue(
|
26
|
-
// @ts-expect-error The resolve query type isn't compatible with the
|
25
|
+
const unsubscribe = subscribeToCoValue(coValueClassFromCoValueClassOrSchema(Schema), id, {
|
26
|
+
// @ts-expect-error The resolve query type isn't compatible with the coValueClassFromCoValueClassOrSchema conversion
|
27
27
|
resolve: options?.resolve,
|
28
28
|
loadAs: agent,
|
29
29
|
onUnavailable: () => {
|
@@ -69,8 +69,8 @@ export class AccountCoState {
|
|
69
69
|
return this.update(undefined);
|
70
70
|
}
|
71
71
|
const me = ctx.me;
|
72
|
-
const unsubscribe = subscribeToCoValue(
|
73
|
-
// @ts-expect-error The resolve query type isn't compatible with the
|
72
|
+
const unsubscribe = subscribeToCoValue(coValueClassFromCoValueClassOrSchema(Schema), me.id, {
|
73
|
+
// @ts-expect-error The resolve query type isn't compatible with the coValueClassFromCoValueClassOrSchema conversion
|
74
74
|
resolve: options?.resolve,
|
75
75
|
loadAs: me,
|
76
76
|
onUnavailable: () => {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { AuthSecretStorage,
|
1
|
+
import type { AuthSecretStorage, CoValueClassOrSchema, ID, JazzContextType } from "jazz-tools";
|
2
2
|
import { Account } from "jazz-tools";
|
3
3
|
import Provider from "./Provider.svelte";
|
4
4
|
export { Provider as JazzSvelteProvider };
|
@@ -29,7 +29,7 @@ export declare function getAuthSecretStorage(): AuthSecretStorage;
|
|
29
29
|
* @param forValueHint - Hint for the value.
|
30
30
|
* @returns The accept invite hook.
|
31
31
|
*/
|
32
|
-
export declare class InviteListener<V extends
|
32
|
+
export declare class InviteListener<V extends CoValueClassOrSchema> {
|
33
33
|
constructor({ invitedObjectSchema, onAccept, forValueHint, }: {
|
34
34
|
invitedObjectSchema: V;
|
35
35
|
onAccept: (projectID: ID<V>) => void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"jazz.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,
|
1
|
+
{"version":3,"file":"jazz.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,oBAAoB,EACpB,EAAE,EAEF,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,QAAQ,IAAK,CAAC;AAC3B,eAAO,MAAM,aAAa,IAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,OAAO,IAAI;IAC7C,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,OAAO,KAW9B;IAChB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC/B,CACF;AAED,wBAAgB,oBAAoB,sBAUnC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,oBAAoB;gBAC5C,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,GACb,EAAE;QACD,mBAAmB,EAAE,CAAC,CAAC;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CA+BF"}
|
package/.turbo/turbo-build.log
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
> jazz-tools@0.
|
2
|
+
> jazz-tools@0.16.0 build /home/runner/_work/jazz/jazz/packages/jazz-tools
|
3
3
|
> tsup && pnpm types && pnpm build:svelte
|
4
4
|
|
5
5
|
[34mCLI[39m Building entry: {"index":"src/index.ts","testing":"src/testing.ts"}
|
@@ -16,7 +16,7 @@
|
|
16
16
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
17
17
|
[34mCLI[39m Building entry: {"index":"src/prosemirror/index.ts"}
|
18
18
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
19
|
-
[34mCLI[39m Building entry: {"
|
19
|
+
[34mCLI[39m Building entry: {"ssr":"src/react/ssr.ts"}
|
20
20
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
21
21
|
[34mCLI[39m Building entry: {"index":"src/react/index.ts","testing":"src/react/testing.tsx"}
|
22
22
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
@@ -108,84 +108,80 @@
|
|
108
108
|
[34mCLI[39m Cleaning output folder
|
109
109
|
[34mESM[39m Build start
|
110
110
|
[32mESM[39m [1mdist/browser-media-images/index.js [22m[32m2.55 KB[39m
|
111
|
-
[32mESM[39m [1mdist/browser-media-images/index.js.map [22m[32m5.
|
112
|
-
[32mESM[39m ⚡️ Build success in
|
111
|
+
[32mESM[39m [1mdist/browser-media-images/index.js.map [22m[32m5.46 KB[39m
|
112
|
+
[32mESM[39m ⚡️ Build success in 26ms
|
113
|
+
[32mESM[39m [1mdist/worker/index.js [22m[32m2.31 KB[39m
|
114
|
+
[32mESM[39m [1mdist/worker/index.js.map [22m[32m4.77 KB[39m
|
115
|
+
[32mESM[39m ⚡️ Build success in 20ms
|
113
116
|
[32mESM[39m [1mdist/tiptap/index.js [22m[32m564.00 B[39m
|
114
117
|
[32mESM[39m [1mdist/tiptap/index.js.map [22m[32m1.21 KB[39m
|
115
|
-
[32mESM[39m ⚡️ Build success in
|
116
|
-
[32mESM[39m [1mdist/worker/index.js [22m[32m2.34 KB[39m
|
117
|
-
[32mESM[39m [1mdist/worker/index.js.map [22m[32m4.82 KB[39m
|
118
|
-
[32mESM[39m ⚡️ Build success in 14ms
|
118
|
+
[32mESM[39m ⚡️ Build success in 21ms
|
119
119
|
[32mESM[39m [1mdist/react-native-media-images/index.js [22m[32m6.19 KB[39m
|
120
120
|
[32mESM[39m [1mdist/react-native-media-images/index.js.map [22m[32m10.96 KB[39m
|
121
|
-
[32mESM[39m ⚡️ Build success in
|
122
|
-
[32mESM[39m [1mdist/react
|
123
|
-
[32mESM[39m [1mdist/react
|
121
|
+
[32mESM[39m ⚡️ Build success in 22ms
|
122
|
+
[32mESM[39m [1mdist/react/ssr.js [22m[32m688.00 B[39m
|
123
|
+
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.12 KB[39m
|
124
|
+
[32mESM[39m ⚡️ Build success in 25ms
|
125
|
+
[32mESM[39m [1mdist/react-core/index.js [22m[32m8.42 KB[39m
|
124
126
|
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js [22m[32m279.00 B[39m
|
125
|
-
[32mESM[39m [1mdist/react-core/
|
126
|
-
[32mESM[39m [1mdist/react-core/testing.js.map [22m[32m1.82 KB[39m
|
127
|
+
[32mESM[39m [1mdist/react-core/testing.js [22m[32m1.17 KB[39m
|
127
128
|
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js.map [22m[32m533.00 B[39m
|
128
|
-
[32mESM[39m
|
129
|
+
[32mESM[39m [1mdist/react-core/index.js.map [22m[32m16.44 KB[39m
|
130
|
+
[32mESM[39m [1mdist/react-core/testing.js.map [22m[32m1.82 KB[39m
|
131
|
+
[32mESM[39m ⚡️ Build success in 25ms
|
129
132
|
[32mESM[39m [1mdist/browser/index.js [22m[32m13.43 KB[39m
|
130
|
-
[32mESM[39m [1mdist/browser/index.js.map [22m[32m28.
|
131
|
-
[32mESM[39m ⚡️ Build success in
|
133
|
+
[32mESM[39m [1mdist/browser/index.js.map [22m[32m28.65 KB[39m
|
134
|
+
[32mESM[39m ⚡️ Build success in 38ms
|
132
135
|
[32mESM[39m [1mdist/react-native/index.js [22m[32m2.53 KB[39m
|
133
|
-
[32mESM[39m [1mdist/react-native/testing.js [22m[32m120.00 B[39m
|
134
136
|
[32mESM[39m [1mdist/react-native/crypto.js [22m[32m117.00 B[39m
|
137
|
+
[32mESM[39m [1mdist/react-native/testing.js [22m[32m120.00 B[39m
|
135
138
|
[32mESM[39m [1mdist/react-native/index.js.map [22m[32m5.68 KB[39m
|
136
|
-
[32mESM[39m [1mdist/react-native/testing.js.map [22m[32m176.00 B[39m
|
137
139
|
[32mESM[39m [1mdist/react-native/crypto.js.map [22m[32m174.00 B[39m
|
138
|
-
[32mESM[39m
|
140
|
+
[32mESM[39m [1mdist/react-native/testing.js.map [22m[32m176.00 B[39m
|
141
|
+
[32mESM[39m ⚡️ Build success in 34ms
|
139
142
|
[32mESM[39m [1mdist/expo/index.js [22m[32m4.65 KB[39m
|
140
143
|
[32mESM[39m [1mdist/expo/testing.js [22m[32m112.00 B[39m
|
141
144
|
[32mESM[39m [1mdist/expo/crypto.js [22m[32m109.00 B[39m
|
142
145
|
[32mESM[39m [1mdist/expo/index.js.map [22m[32m10.17 KB[39m
|
143
|
-
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
144
146
|
[32mESM[39m [1mdist/expo/crypto.js.map [22m[32m166.00 B[39m
|
145
|
-
[32mESM[39m
|
146
|
-
[32mESM[39m
|
147
|
-
[32mESM[39m [1mdist/prosemirror/index.js.map [22m[32m305.53 KB[39m
|
148
|
-
[32mESM[39m ⚡️ Build success in 46ms
|
149
|
-
[32mESM[39m [1mdist/react/index.js [22m[32m20.70 KB[39m
|
150
|
-
[32mESM[39m [1mdist/react/testing.js [22m[32m122.00 B[39m
|
151
|
-
[32mESM[39m [1mdist/react/index.js.map [22m[32m34.13 KB[39m
|
152
|
-
[32mESM[39m [1mdist/react/testing.js.map [22m[32m165.00 B[39m
|
153
|
-
[32mESM[39m ⚡️ Build success in 45ms
|
154
|
-
[32mESM[39m [1mdist/react/testing.js [22m[32m107.00 B[39m
|
155
|
-
[32mESM[39m [1mdist/react/ssr.js [22m[32m688.00 B[39m
|
156
|
-
[32mESM[39m [1mdist/react/index.js [22m[32m20.68 KB[39m
|
157
|
-
[32mESM[39m [1mdist/react/testing.js.map [22m[32m163.00 B[39m
|
158
|
-
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.12 KB[39m
|
159
|
-
[32mESM[39m [1mdist/react/index.js.map [22m[32m34.13 KB[39m
|
160
|
-
[32mESM[39m ⚡️ Build success in 45ms
|
161
|
-
[32mESM[39m [1mdist/react-native-core/index.js [22m[32m16.95 KB[39m
|
147
|
+
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
148
|
+
[32mESM[39m ⚡️ Build success in 38ms
|
162
149
|
[32mESM[39m [1mdist/react-native-core/testing.js [22m[32m119.00 B[39m
|
150
|
+
[32mESM[39m [1mdist/react-native-core/index.js [22m[32m16.95 KB[39m
|
163
151
|
[32mESM[39m [1mdist/react-native-core/crypto.js [22m[32m2.10 KB[39m
|
164
|
-
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m33.57 KB[39m
|
165
152
|
[32mESM[39m [1mdist/react-native-core/testing.js.map [22m[32m175.00 B[39m
|
153
|
+
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m33.57 KB[39m
|
166
154
|
[32mESM[39m [1mdist/react-native-core/crypto.js.map [22m[32m4.25 KB[39m
|
167
|
-
[32mESM[39m ⚡️ Build success in
|
155
|
+
[32mESM[39m ⚡️ Build success in 52ms
|
156
|
+
[32mESM[39m [1mdist/react/index.js [22m[32m20.70 KB[39m
|
157
|
+
[32mESM[39m [1mdist/react/testing.js [22m[32m122.00 B[39m
|
158
|
+
[32mESM[39m [1mdist/react/testing.js.map [22m[32m165.00 B[39m
|
159
|
+
[32mESM[39m [1mdist/react/index.js.map [22m[32m34.14 KB[39m
|
160
|
+
[32mESM[39m ⚡️ Build success in 53ms
|
161
|
+
[32mESM[39m [1mdist/prosemirror/index.js [22m[32m76.90 KB[39m
|
162
|
+
[32mESM[39m [1mdist/prosemirror/index.js.map [22m[32m305.53 KB[39m
|
163
|
+
[32mESM[39m ⚡️ Build success in 55ms
|
168
164
|
[32mESM[39m [1mdist/inspector/index.js [22m[32m60.37 KB[39m
|
169
165
|
[32mESM[39m [1mdist/inspector/index.js.map [22m[32m107.85 KB[39m
|
170
|
-
[32mESM[39m ⚡️ Build success in
|
171
|
-
[32mESM[39m [1mdist/
|
172
|
-
[32mESM[39m [1mdist/
|
173
|
-
[32mESM[39m [1mdist/
|
174
|
-
[32mESM[39m [1mdist/testing.js.map [22m[32m13.
|
175
|
-
[32mESM[39m [1mdist/index.js.map [22m[
|
176
|
-
[32mESM[39m [1mdist/chunk-
|
177
|
-
[32mESM[39m ⚡️ Build success in
|
166
|
+
[32mESM[39m ⚡️ Build success in 73ms
|
167
|
+
[32mESM[39m [1mdist/index.js [22m[32m26.00 KB[39m
|
168
|
+
[32mESM[39m [1mdist/chunk-MLCNE3TL.js [22m[32m148.76 KB[39m
|
169
|
+
[32mESM[39m [1mdist/testing.js [22m[32m6.76 KB[39m
|
170
|
+
[32mESM[39m [1mdist/testing.js.map [22m[32m13.06 KB[39m
|
171
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m52.65 KB[39m
|
172
|
+
[32mESM[39m [1mdist/chunk-MLCNE3TL.js.map [22m[32m356.72 KB[39m
|
173
|
+
[32mESM[39m ⚡️ Build success in 89ms
|
178
174
|
[32mESM[39m [1mdist/inspector/register-custom-element.js [22m[32m218.00 B[39m
|
179
175
|
[32mESM[39m [1mdist/inspector/register-custom-element.js.map [22m[32m314.00 B[39m
|
180
176
|
[32mESM[39m [1mdist/inspector/custom-element-TUXKXSZU.js [22m[32m1.53 MB[39m
|
181
177
|
[32mESM[39m [1mdist/inspector/custom-element-TUXKXSZU.js.map [22m[32m2.35 MB[39m
|
182
|
-
[32mESM[39m ⚡️ Build success in
|
178
|
+
[32mESM[39m ⚡️ Build success in 137ms
|
183
179
|
|
184
|
-
> jazz-tools@0.
|
180
|
+
> jazz-tools@0.16.0 types /home/runner/_work/jazz/jazz/packages/jazz-tools
|
185
181
|
> tsc --outDir dist
|
186
182
|
|
187
183
|
|
188
|
-
> jazz-tools@0.
|
184
|
+
> jazz-tools@0.16.0 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
|
189
185
|
> rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
|
190
186
|
|
191
187
|
src/svelte -> dist/svelte
|
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,40 @@
|
|
1
1
|
# jazz-tools
|
2
2
|
|
3
|
+
## 0.16.0
|
4
|
+
|
5
|
+
### Minor Changes
|
6
|
+
|
7
|
+
- c09dcdf: Change the root attribute to be public on Account. The root content will still follow the visiblity rules specified in their group.
|
8
|
+
|
9
|
+
Existing accounts will be gradually migrated as they are loaded.
|
10
|
+
|
11
|
+
- 2bbb07b: Introduce a cleaner separation between Zod and CoValue schemas:
|
12
|
+
- Zod schemas and CoValue schemas are fully separated. Zod schemas can only be composed with other Zod schemas. CoValue schemas can be composed with either Zod or other CoValue schemas.
|
13
|
+
- `z.optional()` and `z.discriminatedUnion()` no longer work with CoValue schemas. Use `co.optional()` and `co.discriminatedUnion()` instead.
|
14
|
+
- Internal schema access is now simpler. You no longer need to use Zod’s `.def` to access internals. Use properties like `CoMapSchema.shape`, `CoListSchema.element`, and `CoOptionalSchema.innerType` directly.
|
15
|
+
- CoValue schema types are now namespaced under `co.`. Non-namespaced exports have been removed
|
16
|
+
- CoMap schemas no longer incorrectly inherit from Zod. Previously, methods like `.extend()` and `.partial()` appeared available but could cause unexpected behavior. These methods are now disabled. In their place, `.optional()` has been added, and more Zod-like methods will be introduced in future releases.
|
17
|
+
- Upgraded Zod from `3.25.28` to `3.25.76`.
|
18
|
+
- Removed deprecated `withHelpers` method from CoValue schemas
|
19
|
+
- Removed deprecated `createCoValueObservable` function
|
20
|
+
|
21
|
+
### Patch Changes
|
22
|
+
|
23
|
+
- Updated dependencies [c09dcdf]
|
24
|
+
- cojson@0.16.0
|
25
|
+
- cojson-storage-indexeddb@0.16.0
|
26
|
+
- cojson-transport-ws@0.16.0
|
27
|
+
|
28
|
+
## 0.15.16
|
29
|
+
|
30
|
+
### Patch Changes
|
31
|
+
|
32
|
+
- 9633d01: Introduced a new HTTP based API to talk with Server Workers
|
33
|
+
- 4beafb7: Fix property update when assigning an optional reference on CoMap
|
34
|
+
- cojson@0.15.16
|
35
|
+
- cojson-storage-indexeddb@0.15.16
|
36
|
+
- cojson-transport-ws@0.15.16
|
37
|
+
|
3
38
|
## 0.15.15
|
4
39
|
|
5
40
|
### Patch Changes
|
package/dist/browser/index.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Account, CoValue,
|
1
|
+
import { Account, CoValue, CoValueClassOrSchema, InviteSecret } from "jazz-tools";
|
2
2
|
export { BrowserPasskeyAuth } from "./auth/PasskeyAuth.js";
|
3
3
|
export * from "./createBrowserContext.js";
|
4
4
|
export * from "./BrowserContextManager.js";
|
@@ -11,7 +11,7 @@ export declare function createInviteLink<C extends CoValue>(value: C, role: "rea
|
|
11
11
|
/** @category Invite Links */
|
12
12
|
export { parseInviteLink } from "jazz-tools";
|
13
13
|
/** @category Invite Links */
|
14
|
-
export declare function consumeInviteLinkFromWindowLocation<S extends
|
14
|
+
export declare function consumeInviteLinkFromWindowLocation<S extends CoValueClassOrSchema>({ as, forValueHint, invitedObjectSchema, }: {
|
15
15
|
as?: Account;
|
16
16
|
forValueHint?: string;
|
17
17
|
invitedObjectSchema: S;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,OAAO,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,OAAO,EACP,oBAAoB,EACpB,YAAY,EAGb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAI3D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,EAEjD,EACE,OAAkD,EAClD,SAAS,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,MAAM,CAER;AAED,6BAA6B;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,6BAA6B;AAC7B,wBAAsB,mCAAmC,CACvD,CAAC,SAAS,oBAAoB,EAC9B,EACA,EAAE,EACF,YAAY,EACZ,mBAAmB,GACpB,EAAE;IACD,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,CAAC,CAAC;CACxB,GAAG,OAAO,CACP;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B,GACD,SAAS,CACZ,CAiBA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/browser/index.ts","../../src/browser/utils/export-account-inspector.ts","../../src/browser/auth/PasskeyAuth.ts","../../src/browser/createBrowserContext.ts","../../src/browser/storageOptions.ts","../../src/browser/BrowserContextManager.ts","../../src/browser/auth/LocalStorageKVStore.ts"],"sourcesContent":["import {\n Account,\n CoValue,\n CoValueClass,\n CoValueOrZodSchema,\n ID,\n InviteSecret,\n createInviteLink as baseCreateInviteLink,\n consumeInviteLink,\n} from \"jazz-tools\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\nexport { BrowserPasskeyAuth } from \"./auth/PasskeyAuth.js\";\n\nsetupInspector();\n\nexport * from \"./createBrowserContext.js\";\nexport * from \"./BrowserContextManager.js\";\n\nexport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL, valueHint);\n}\n\n/** @category Invite Links */\nexport { parseInviteLink } from \"jazz-tools\";\n\n/** @category Invite Links */\nexport async function consumeInviteLinkFromWindowLocation<\n S extends CoValueOrZodSchema,\n>({\n as,\n forValueHint,\n invitedObjectSchema,\n}: {\n as?: Account;\n forValueHint?: string;\n invitedObjectSchema: S;\n}): Promise<\n | {\n valueID: string;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined\n> {\n const result = await consumeInviteLink({\n inviteURL: window.location.href,\n as,\n forValueHint,\n invitedObjectSchema,\n });\n\n if (result) {\n window.history.replaceState(\n {},\n \"\",\n window.location.href.replace(/#.*$/, \"\"),\n );\n }\n\n return result;\n}\n","import { AuthSecretStorage } from \"jazz-tools\";\n\nasync function exportAccountToInspector() {\n const authSecretStorage = new AuthSecretStorage();\n const localStorageData = await authSecretStorage.get();\n\n if (!localStorageData) {\n console.error(\"No account data found in localStorage\");\n return;\n }\n\n const encodedAccountSecret = btoa(localStorageData.accountSecret);\n window.open(\n new URL(\n `#/import/${localStorageData?.accountID}/${encodedAccountSecret}`,\n \"https://inspector.jazz.tools\",\n ).toString(),\n \"_blank\",\n );\n}\n\nfunction listenForCmdJ() {\n if (typeof window === \"undefined\") return;\n\n const cb = (e: any) => {\n if (e.metaKey && e.key === \"j\") {\n if (\n confirm(\n \"Are you sure you want to inspect your account using inspector.jazz.tools? This lets anyone with the secret inspector URL read your data and impersonate you.\",\n )\n ) {\n exportAccountToInspector();\n }\n }\n };\n\n window.addEventListener(\"keydown\", cb);\n\n return () => {\n window.removeEventListener(\"keydown\", cb);\n };\n}\n\n/**\n * Automatically sets up the Cmd+J listener if 'allowJazzInspector' is present in the URL\n * @returns A cleanup function if the listener was set up, undefined otherwise\n */\nexport function setupInspector() {\n if (typeof window === \"undefined\") return;\n\n const url = new URL(window.location.href);\n if (\n url.hash.includes(\"allowJazzInspector\") ||\n process.env.NODE_ENV === \"development\"\n ) {\n return listenForCmdJ();\n }\n}\n","import { CryptoProvider, RawAccountID, cojsonInternals } from \"cojson\";\nimport {\n Account,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n ID,\n} from \"jazz-tools\";\n\n/**\n * `BrowserPasskeyAuth` provides a `JazzAuth` object for passkey authentication.\n *\n * ```ts\n * import { BrowserPasskeyAuth } from \"jazz-tools/browser\";\n *\n * const auth = new BrowserPasskeyAuth(driver, appName);\n * ```\n *\n * @category Auth Providers\n */\nexport class BrowserPasskeyAuth {\n constructor(\n protected crypto: CryptoProvider,\n protected authenticate: AuthenticateAccountFunction,\n protected authSecretStorage: AuthSecretStorage,\n public appName: string,\n public appHostname: string = window.location.hostname,\n ) {}\n\n static readonly id = \"passkey\";\n\n logIn = async () => {\n const { crypto, authenticate } = this;\n\n const webAuthNCredential = await this.getPasskeyCredentials();\n\n if (!webAuthNCredential) {\n return;\n }\n\n const webAuthNCredentialPayload = new Uint8Array(\n webAuthNCredential.response.userHandle,\n );\n const accountSecretSeed = webAuthNCredentialPayload.slice(\n 0,\n cojsonInternals.secretSeedLength,\n );\n\n const secret = crypto.agentSecretFromSecretSeed(accountSecretSeed);\n\n const accountID = cojsonInternals.rawCoIDfromBytes(\n webAuthNCredentialPayload.slice(\n cojsonInternals.secretSeedLength,\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n ),\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret: secret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed: accountSecretSeed,\n accountSecret: secret,\n provider: \"passkey\",\n });\n };\n\n signUp = async (username: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials?.secretSeed) {\n throw new Error(\n \"Not enough credentials to register the account with passkey\",\n );\n }\n\n await this.createPasskeyCredentials({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n username,\n });\n\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.name = username;\n }\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passkey\",\n });\n };\n\n private async createPasskeyCredentials({\n accountID,\n secretSeed,\n username,\n }: {\n accountID: ID<Account>;\n secretSeed: Uint8Array;\n username: string;\n }) {\n const webAuthNCredentialPayload = new Uint8Array(\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n );\n\n webAuthNCredentialPayload.set(secretSeed);\n webAuthNCredentialPayload.set(\n cojsonInternals.rawCoIDtoBytes(accountID as unknown as RawAccountID),\n cojsonInternals.secretSeedLength,\n );\n\n try {\n await navigator.credentials.create({\n publicKey: {\n challenge: this.crypto.randomBytes(20),\n rp: {\n name: this.appName,\n id: this.appHostname,\n },\n user: {\n id: webAuthNCredentialPayload,\n name: username + ` (${new Date().toLocaleString()})`,\n displayName: username,\n },\n pubKeyCredParams: [\n { alg: -7, type: \"public-key\" },\n { alg: -8, type: \"public-key\" },\n { alg: -37, type: \"public-key\" },\n { alg: -257, type: \"public-key\" },\n ],\n authenticatorSelection: {\n requireResidentKey: true,\n residentKey: \"required\",\n userVerification: \"preferred\",\n },\n timeout: 60000,\n attestation: \"direct\",\n },\n });\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n\n private async getPasskeyCredentials() {\n try {\n const value = await navigator.credentials.get({\n publicKey: {\n challenge: Uint8Array.from([0, 1, 2]),\n rpId: this.appHostname,\n allowCredentials: [],\n timeout: 60000,\n userVerification: \"preferred\",\n },\n mediation: \"optional\",\n });\n\n return value as\n | (Credential & { response: { userHandle: ArrayBuffer } })\n | null;\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n}\n","import { LocalNode, Peer, RawAccountID } from \"cojson\";\nimport { getIndexedDBStorage } from \"cojson-storage-indexeddb\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport {\n Account,\n AccountClass,\n AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n InviteSecret,\n NewAccountProps,\n SessionID,\n SyncConfig,\n cojsonInternals,\n createAnonymousJazzContext,\n} from \"jazz-tools\";\nimport { createJazzContext } from \"jazz-tools\";\nimport { StorageConfig, getStorageOptions } from \"./storageOptions.js\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\n\nsetupInspector();\n\nexport type BaseBrowserContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: StorageConfig;\n crypto?: CryptoProvider;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass BrowserWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n const handler = () => callback(navigator.onLine);\n window.addEventListener(\"online\", handler);\n window.addEventListener(\"offline\", handler);\n\n return () => {\n window.removeEventListener(\"online\", handler);\n window.removeEventListener(\"offline\", handler);\n };\n }\n}\n\nasync function setupPeers(options: BaseBrowserContextOptions) {\n const crypto = options.crypto || (await WasmCrypto.create());\n let node: LocalNode | undefined = undefined;\n\n const { useIndexedDB } = getStorageOptions(options.storage);\n\n const peersToLoadFrom: Peer[] = [];\n\n const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n peersToLoadFrom,\n storage,\n setNode: () => {},\n crypto,\n };\n }\n\n const wsPeer = new BrowserWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n peersToLoadFrom,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\n storage,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n}\n\nexport type BrowserContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseBrowserContextOptions;\n\nexport async function createJazzBrowserContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: BrowserContextOptions<S>) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.getIsAuthenticated(credentials));\n }\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peersToLoadFrom,\n storage,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideBrowserLockSession,\n authSecretStorage: options.authSecretStorage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport function provideBrowserLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n let sessionDone!: () => void;\n const donePromise = new Promise<void>((resolve) => {\n sessionDone = resolve;\n });\n\n let resolveSession: (sessionID: SessionID) => void;\n const sessionPromise = new Promise<SessionID>((resolve) => {\n resolveSession = resolve;\n });\n\n void (async function () {\n for (let idx = 0; idx < 100; idx++) {\n // To work better around StrictMode\n for (let retry = 0; retry < 2; retry++) {\n // console.debug(\"Trying to get lock\", accountID + \"_\" + idx);\n const sessionFinishedOrNoLock = await navigator.locks.request(\n accountID + \"_\" + idx,\n { ifAvailable: true },\n async (lock) => {\n if (!lock) return \"noLock\";\n\n const sessionID =\n localStorage.getItem(accountID + \"_\" + idx) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n localStorage.setItem(accountID + \"_\" + idx, sessionID);\n\n resolveSession(sessionID as SessionID);\n\n await donePromise;\n console.log(\"Done with lock\", accountID + \"_\" + idx, sessionID);\n return \"sessionFinished\";\n },\n );\n\n if (sessionFinishedOrNoLock === \"sessionFinished\") {\n return;\n }\n }\n }\n throw new Error(\"Couldn't get lock on session after 100x2 tries\");\n })();\n\n return sessionPromise.then((sessionID) => ({\n sessionID,\n sessionDone,\n }));\n}\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n const coValueCore = value._raw.core;\n let currentCoValue = coValueCore;\n\n while (currentCoValue.verified.header.ruleset.type === \"ownedByGroup\") {\n currentCoValue = currentCoValue.getGroup().core;\n }\n\n const { ruleset, meta } = currentCoValue.verified.header;\n\n if (ruleset.type !== \"group\" || meta?.type === \"account\") {\n throw new Error(\"Can't create invite link for object without group\");\n }\n\n const group = cojsonInternals.expectGroup(currentCoValue.getCurrentContent());\n const inviteSecret = group.createInvite(role);\n\n return `${baseURL}#/invite/${valueHint ? valueHint + \"/\" : \"\"}${\n value.id\n }/${inviteSecret}`;\n}\n\n/** @category Invite Links */\nexport function parseInviteLink<C extends CoValue>(\n inviteURL: string,\n):\n | {\n valueID: ID<C>;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined {\n const url = new URL(inviteURL);\n const parts = url.hash.split(\"/\");\n\n let valueHint: string | undefined;\n let valueID: ID<C> | undefined;\n let inviteSecret: InviteSecret | undefined;\n\n if (parts[0] === \"#\" && parts[1] === \"invite\") {\n if (parts.length === 5) {\n valueHint = parts[2];\n valueID = parts[3] as ID<C>;\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2] as ID<C>;\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n","type StorageOption = \"indexedDB\";\ntype CombinedStorageOption = [\"indexedDB\"];\nexport type StorageConfig =\n | StorageOption\n | CombinedStorageOption\n | [StorageOption];\n\nexport function getStorageOptions(storage?: StorageConfig): {\n useIndexedDB: boolean;\n} {\n const useIndexedDB =\n !storage ||\n (Array.isArray(storage) && storage.includes(\"indexedDB\")) ||\n storage === \"indexedDB\";\n\n return { useIndexedDB };\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InMemoryKVStore,\n InstanceOfSchema,\n JazzContextManager,\n SyncConfig,\n} from \"jazz-tools\";\nimport { JazzContextManagerAuthProps } from \"jazz-tools\";\nimport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\nimport {\n BaseBrowserContextOptions,\n createJazzBrowserContext,\n createJazzBrowserGuestContext,\n} from \"./createBrowserContext.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n storage?: BaseBrowserContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n};\n\nexport class JazzBrowserContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n // TODO: When the storage changes, if the user is changed, update the context\n getKvStore() {\n if (typeof window === \"undefined\") {\n // To handle running in SSR\n return new InMemoryKVStore();\n } else {\n return new LocalStorageKVStore();\n }\n }\n\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzBrowserGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n });\n } else {\n return createJazzBrowserContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n });\n }\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import { KvStore } from \"jazz-tools\";\n\nexport class LocalStorageKVStore implements KvStore {\n constructor() {}\n\n async get(key: string) {\n return localStorage.getItem(key);\n }\n\n async set(key: string, value: string) {\n localStorage.setItem(key, value);\n }\n\n async delete(key: string) {\n localStorage.removeItem(key);\n }\n\n async clearAll() {\n localStorage.clear();\n }\n}\n"],"mappings":"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","names":["cojsonInternals","handleAuthUpdate"]}
|
1
|
+
{"version":3,"sources":["../../src/browser/index.ts","../../src/browser/utils/export-account-inspector.ts","../../src/browser/auth/PasskeyAuth.ts","../../src/browser/createBrowserContext.ts","../../src/browser/storageOptions.ts","../../src/browser/BrowserContextManager.ts","../../src/browser/auth/LocalStorageKVStore.ts"],"sourcesContent":["import {\n Account,\n CoValue,\n CoValueClassOrSchema,\n InviteSecret,\n createInviteLink as baseCreateInviteLink,\n consumeInviteLink,\n} from \"jazz-tools\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\nexport { BrowserPasskeyAuth } from \"./auth/PasskeyAuth.js\";\n\nsetupInspector();\n\nexport * from \"./createBrowserContext.js\";\nexport * from \"./BrowserContextManager.js\";\n\nexport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL, valueHint);\n}\n\n/** @category Invite Links */\nexport { parseInviteLink } from \"jazz-tools\";\n\n/** @category Invite Links */\nexport async function consumeInviteLinkFromWindowLocation<\n S extends CoValueClassOrSchema,\n>({\n as,\n forValueHint,\n invitedObjectSchema,\n}: {\n as?: Account;\n forValueHint?: string;\n invitedObjectSchema: S;\n}): Promise<\n | {\n valueID: string;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined\n> {\n const result = await consumeInviteLink({\n inviteURL: window.location.href,\n as,\n forValueHint,\n invitedObjectSchema,\n });\n\n if (result) {\n window.history.replaceState(\n {},\n \"\",\n window.location.href.replace(/#.*$/, \"\"),\n );\n }\n\n return result;\n}\n","import { AuthSecretStorage } from \"jazz-tools\";\n\nasync function exportAccountToInspector() {\n const authSecretStorage = new AuthSecretStorage();\n const localStorageData = await authSecretStorage.get();\n\n if (!localStorageData) {\n console.error(\"No account data found in localStorage\");\n return;\n }\n\n const encodedAccountSecret = btoa(localStorageData.accountSecret);\n window.open(\n new URL(\n `#/import/${localStorageData?.accountID}/${encodedAccountSecret}`,\n \"https://inspector.jazz.tools\",\n ).toString(),\n \"_blank\",\n );\n}\n\nfunction listenForCmdJ() {\n if (typeof window === \"undefined\") return;\n\n const cb = (e: any) => {\n if (e.metaKey && e.key === \"j\") {\n if (\n confirm(\n \"Are you sure you want to inspect your account using inspector.jazz.tools? This lets anyone with the secret inspector URL read your data and impersonate you.\",\n )\n ) {\n exportAccountToInspector();\n }\n }\n };\n\n window.addEventListener(\"keydown\", cb);\n\n return () => {\n window.removeEventListener(\"keydown\", cb);\n };\n}\n\n/**\n * Automatically sets up the Cmd+J listener if 'allowJazzInspector' is present in the URL\n * @returns A cleanup function if the listener was set up, undefined otherwise\n */\nexport function setupInspector() {\n if (typeof window === \"undefined\") return;\n\n const url = new URL(window.location.href);\n if (\n url.hash.includes(\"allowJazzInspector\") ||\n process.env.NODE_ENV === \"development\"\n ) {\n return listenForCmdJ();\n }\n}\n","import { CryptoProvider, RawAccountID, cojsonInternals } from \"cojson\";\nimport {\n Account,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n ID,\n} from \"jazz-tools\";\n\n/**\n * `BrowserPasskeyAuth` provides a `JazzAuth` object for passkey authentication.\n *\n * ```ts\n * import { BrowserPasskeyAuth } from \"jazz-tools/browser\";\n *\n * const auth = new BrowserPasskeyAuth(driver, appName);\n * ```\n *\n * @category Auth Providers\n */\nexport class BrowserPasskeyAuth {\n constructor(\n protected crypto: CryptoProvider,\n protected authenticate: AuthenticateAccountFunction,\n protected authSecretStorage: AuthSecretStorage,\n public appName: string,\n public appHostname: string = window.location.hostname,\n ) {}\n\n static readonly id = \"passkey\";\n\n logIn = async () => {\n const { crypto, authenticate } = this;\n\n const webAuthNCredential = await this.getPasskeyCredentials();\n\n if (!webAuthNCredential) {\n return;\n }\n\n const webAuthNCredentialPayload = new Uint8Array(\n webAuthNCredential.response.userHandle,\n );\n const accountSecretSeed = webAuthNCredentialPayload.slice(\n 0,\n cojsonInternals.secretSeedLength,\n );\n\n const secret = crypto.agentSecretFromSecretSeed(accountSecretSeed);\n\n const accountID = cojsonInternals.rawCoIDfromBytes(\n webAuthNCredentialPayload.slice(\n cojsonInternals.secretSeedLength,\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n ),\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret: secret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed: accountSecretSeed,\n accountSecret: secret,\n provider: \"passkey\",\n });\n };\n\n signUp = async (username: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials?.secretSeed) {\n throw new Error(\n \"Not enough credentials to register the account with passkey\",\n );\n }\n\n await this.createPasskeyCredentials({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n username,\n });\n\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.name = username;\n }\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passkey\",\n });\n };\n\n private async createPasskeyCredentials({\n accountID,\n secretSeed,\n username,\n }: {\n accountID: ID<Account>;\n secretSeed: Uint8Array;\n username: string;\n }) {\n const webAuthNCredentialPayload = new Uint8Array(\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n );\n\n webAuthNCredentialPayload.set(secretSeed);\n webAuthNCredentialPayload.set(\n cojsonInternals.rawCoIDtoBytes(accountID as unknown as RawAccountID),\n cojsonInternals.secretSeedLength,\n );\n\n try {\n await navigator.credentials.create({\n publicKey: {\n challenge: this.crypto.randomBytes(20),\n rp: {\n name: this.appName,\n id: this.appHostname,\n },\n user: {\n id: webAuthNCredentialPayload,\n name: username + ` (${new Date().toLocaleString()})`,\n displayName: username,\n },\n pubKeyCredParams: [\n { alg: -7, type: \"public-key\" },\n { alg: -8, type: \"public-key\" },\n { alg: -37, type: \"public-key\" },\n { alg: -257, type: \"public-key\" },\n ],\n authenticatorSelection: {\n requireResidentKey: true,\n residentKey: \"required\",\n userVerification: \"preferred\",\n },\n timeout: 60000,\n attestation: \"direct\",\n },\n });\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n\n private async getPasskeyCredentials() {\n try {\n const value = await navigator.credentials.get({\n publicKey: {\n challenge: Uint8Array.from([0, 1, 2]),\n rpId: this.appHostname,\n allowCredentials: [],\n timeout: 60000,\n userVerification: \"preferred\",\n },\n mediation: \"optional\",\n });\n\n return value as\n | (Credential & { response: { userHandle: ArrayBuffer } })\n | null;\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n}\n","import { LocalNode, Peer, RawAccountID } from \"cojson\";\nimport { getIndexedDBStorage } from \"cojson-storage-indexeddb\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport {\n Account,\n AccountClass,\n AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n InviteSecret,\n NewAccountProps,\n SessionID,\n SyncConfig,\n cojsonInternals,\n createAnonymousJazzContext,\n} from \"jazz-tools\";\nimport { createJazzContext } from \"jazz-tools\";\nimport { StorageConfig, getStorageOptions } from \"./storageOptions.js\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\n\nsetupInspector();\n\nexport type BaseBrowserContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: StorageConfig;\n crypto?: CryptoProvider;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass BrowserWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n const handler = () => callback(navigator.onLine);\n window.addEventListener(\"online\", handler);\n window.addEventListener(\"offline\", handler);\n\n return () => {\n window.removeEventListener(\"online\", handler);\n window.removeEventListener(\"offline\", handler);\n };\n }\n}\n\nasync function setupPeers(options: BaseBrowserContextOptions) {\n const crypto = options.crypto || (await WasmCrypto.create());\n let node: LocalNode | undefined = undefined;\n\n const { useIndexedDB } = getStorageOptions(options.storage);\n\n const peersToLoadFrom: Peer[] = [];\n\n const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n peersToLoadFrom,\n storage,\n setNode: () => {},\n crypto,\n };\n }\n\n const wsPeer = new BrowserWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n peersToLoadFrom,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\n storage,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n}\n\nexport type BrowserContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseBrowserContextOptions;\n\nexport async function createJazzBrowserContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: BrowserContextOptions<S>) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.getIsAuthenticated(credentials));\n }\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peersToLoadFrom,\n storage,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideBrowserLockSession,\n authSecretStorage: options.authSecretStorage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport function provideBrowserLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n let sessionDone!: () => void;\n const donePromise = new Promise<void>((resolve) => {\n sessionDone = resolve;\n });\n\n let resolveSession: (sessionID: SessionID) => void;\n const sessionPromise = new Promise<SessionID>((resolve) => {\n resolveSession = resolve;\n });\n\n void (async function () {\n for (let idx = 0; idx < 100; idx++) {\n // To work better around StrictMode\n for (let retry = 0; retry < 2; retry++) {\n // console.debug(\"Trying to get lock\", accountID + \"_\" + idx);\n const sessionFinishedOrNoLock = await navigator.locks.request(\n accountID + \"_\" + idx,\n { ifAvailable: true },\n async (lock) => {\n if (!lock) return \"noLock\";\n\n const sessionID =\n localStorage.getItem(accountID + \"_\" + idx) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n localStorage.setItem(accountID + \"_\" + idx, sessionID);\n\n resolveSession(sessionID as SessionID);\n\n await donePromise;\n console.log(\"Done with lock\", accountID + \"_\" + idx, sessionID);\n return \"sessionFinished\";\n },\n );\n\n if (sessionFinishedOrNoLock === \"sessionFinished\") {\n return;\n }\n }\n }\n throw new Error(\"Couldn't get lock on session after 100x2 tries\");\n })();\n\n return sessionPromise.then((sessionID) => ({\n sessionID,\n sessionDone,\n }));\n}\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n const coValueCore = value._raw.core;\n let currentCoValue = coValueCore;\n\n while (currentCoValue.verified.header.ruleset.type === \"ownedByGroup\") {\n currentCoValue = currentCoValue.getGroup().core;\n }\n\n const { ruleset, meta } = currentCoValue.verified.header;\n\n if (ruleset.type !== \"group\" || meta?.type === \"account\") {\n throw new Error(\"Can't create invite link for object without group\");\n }\n\n const group = cojsonInternals.expectGroup(currentCoValue.getCurrentContent());\n const inviteSecret = group.createInvite(role);\n\n return `${baseURL}#/invite/${valueHint ? valueHint + \"/\" : \"\"}${\n value.id\n }/${inviteSecret}`;\n}\n\n/** @category Invite Links */\nexport function parseInviteLink<C extends CoValue>(\n inviteURL: string,\n):\n | {\n valueID: ID<C>;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined {\n const url = new URL(inviteURL);\n const parts = url.hash.split(\"/\");\n\n let valueHint: string | undefined;\n let valueID: ID<C> | undefined;\n let inviteSecret: InviteSecret | undefined;\n\n if (parts[0] === \"#\" && parts[1] === \"invite\") {\n if (parts.length === 5) {\n valueHint = parts[2];\n valueID = parts[3] as ID<C>;\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2] as ID<C>;\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n","type StorageOption = \"indexedDB\";\ntype CombinedStorageOption = [\"indexedDB\"];\nexport type StorageConfig =\n | StorageOption\n | CombinedStorageOption\n | [StorageOption];\n\nexport function getStorageOptions(storage?: StorageConfig): {\n useIndexedDB: boolean;\n} {\n const useIndexedDB =\n !storage ||\n (Array.isArray(storage) && storage.includes(\"indexedDB\")) ||\n storage === \"indexedDB\";\n\n return { useIndexedDB };\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InMemoryKVStore,\n InstanceOfSchema,\n JazzContextManager,\n SyncConfig,\n} from \"jazz-tools\";\nimport { JazzContextManagerAuthProps } from \"jazz-tools\";\nimport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\nimport {\n BaseBrowserContextOptions,\n createJazzBrowserContext,\n createJazzBrowserGuestContext,\n} from \"./createBrowserContext.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n storage?: BaseBrowserContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n};\n\nexport class JazzBrowserContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n // TODO: When the storage changes, if the user is changed, update the context\n getKvStore() {\n if (typeof window === \"undefined\") {\n // To handle running in SSR\n return new InMemoryKVStore();\n } else {\n return new LocalStorageKVStore();\n }\n }\n\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzBrowserGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n });\n } else {\n return createJazzBrowserContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n });\n }\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import { KvStore } from \"jazz-tools\";\n\nexport class LocalStorageKVStore implements KvStore {\n constructor() {}\n\n async get(key: string) {\n return localStorage.getItem(key);\n }\n\n async set(key: string, value: string) {\n localStorage.setItem(key, value);\n }\n\n async delete(key: string) {\n localStorage.removeItem(key);\n }\n\n async clearAll() {\n localStorage.clear();\n }\n}\n"],"mappings":"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","names":["cojsonInternals","handleAuthUpdate"]}
|
@@ -3,5 +3,7 @@ import { Account, Group, ImageDefinition, Loaded } from "jazz-tools";
|
|
3
3
|
export declare function createImage(imageBlobOrFile: Blob | File, options?: {
|
4
4
|
owner?: Group | Account;
|
5
5
|
maxSize?: 256 | 1024 | 2048;
|
6
|
-
}): Promise<Loaded<typeof ImageDefinition
|
6
|
+
}): Promise<Loaded<typeof ImageDefinition, {
|
7
|
+
$each: true;
|
8
|
+
}>>;
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-media-images/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EAEP,KAAK,EACL,eAAe,EACf,MAAM,EACP,MAAM,YAAY,CAAC;AAKpB,+BAA+B;AAC/B,wBAAsB,WAAW,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,EAC5B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;CAC7B,GACA,OAAO,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-media-images/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EAEP,KAAK,EACL,eAAe,EACf,MAAM,EACP,MAAM,YAAY,CAAC;AAKpB,+BAA+B;AAC/B,wBAAsB,WAAW,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,EAC5B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;CAC7B,GACA,OAAO,CAAC,MAAM,CAAC,OAAO,eAAe,EAAE;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,CA8C1D"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/browser-media-images/index.ts"],"sourcesContent":["import ImageBlobReduce from \"image-blob-reduce\";\nimport {\n Account,\n FileStream,\n Group,\n ImageDefinition,\n Loaded,\n} from \"jazz-tools\";\nimport Pica from \"pica\";\n\nlet reducer: ImageBlobReduce.ImageBlobReduce | undefined;\n\n/** @category Image creation */\nexport async function createImage(\n imageBlobOrFile: Blob | File,\n options?: {\n owner?: Group | Account;\n maxSize?: 256 | 1024 | 2048;\n },\n): Promise<Loaded<typeof ImageDefinition>> {\n // Get the original size of the image\n const { width: originalWidth, height: originalHeight } =\n await getImageSize(imageBlobOrFile);\n\n const highestDimension = Math.max(originalWidth, originalHeight);\n\n // Calculate the sizes to resize the image to\n const resizes = [256, 1024, 2048, highestDimension]\n .filter((s) => s <= (options?.maxSize ?? highestDimension))\n .toSorted((a, b) => a - b);\n\n // Get the highest resolution to use as final original size\n // In case of options.maxSize, it's not the originalWidth/Height\n const { width: finalWidth, height: finalHeight } = getNewDimensions(\n originalWidth,\n originalHeight,\n resizes.at(-1)!,\n );\n\n const imageDefinition = ImageDefinition.create(\n { originalSize: [finalWidth, finalHeight] },\n options?.owner,\n );\n const owner = imageDefinition._owner;\n\n // Placeholder 8x8\n imageDefinition.placeholderDataURL =\n await getPlaceholderBase64(imageBlobOrFile);\n\n // Resizes for progressive loading\n for (let size of resizes) {\n // Calculate width and height respecting the aspect ratio\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n size,\n );\n\n const image = await resize(imageBlobOrFile, width, height);\n\n const binaryStream = await FileStream.createFromBlob(image, owner);\n imageDefinition[`${width}x${height}`] = binaryStream;\n }\n\n return imageDefinition;\n}\n\nasync function getImageSize(\n imageBlobOrFile: Blob | File,\n): Promise<{ width: number; height: number }> {\n const { width, height } = await new Promise<{\n width: number;\n height: number;\n }>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n URL.revokeObjectURL(img.src);\n };\n img.src = URL.createObjectURL(imageBlobOrFile);\n });\n\n return { width, height };\n}\n\nasync function getPlaceholderBase64(\n imageBlobOrFile: Blob | File,\n): Promise<string> {\n // Inizialize Reducer here to not have module side effects\n if (!reducer) {\n reducer = new ImageBlobReduce({ pica: new Pica() });\n }\n\n const canvas = await reducer.toCanvas(imageBlobOrFile, { max: 8 });\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function resize(\n imageBlobOrFile: Blob | File,\n width: number,\n height: number,\n): Promise<Blob> {\n // Inizialize Reducer here to not have module side effects\n if (!reducer) {\n reducer = new ImageBlobReduce({ pica: new Pica() });\n }\n\n return reducer.toBlob(imageBlobOrFile, { max: Math.max(width, height) });\n}\n\nconst getNewDimensions = (\n originalWidth: number,\n originalHeight: number,\n maxSize: number,\n) => {\n const width =\n originalWidth > originalHeight\n ? maxSize\n : Math.round(maxSize * (originalWidth / originalHeight));\n\n const height =\n originalHeight > originalWidth\n ? maxSize\n : Math.round(maxSize * (originalHeight / originalWidth));\n\n return { width, height };\n};\n"],"mappings":";AAAA,OAAO,qBAAqB;AAC5B;AAAA,EAEE;AAAA,EAEA;AAAA,OAEK;AACP,OAAO,UAAU;AAEjB,IAAI;AAGJ,eAAsB,YACpB,iBACA,
|
1
|
+
{"version":3,"sources":["../../src/browser-media-images/index.ts"],"sourcesContent":["import ImageBlobReduce from \"image-blob-reduce\";\nimport {\n Account,\n FileStream,\n Group,\n ImageDefinition,\n Loaded,\n} from \"jazz-tools\";\nimport Pica from \"pica\";\n\nlet reducer: ImageBlobReduce.ImageBlobReduce | undefined;\n\n/** @category Image creation */\nexport async function createImage(\n imageBlobOrFile: Blob | File,\n options?: {\n owner?: Group | Account;\n maxSize?: 256 | 1024 | 2048;\n },\n): Promise<Loaded<typeof ImageDefinition, { $each: true }>> {\n // Get the original size of the image\n const { width: originalWidth, height: originalHeight } =\n await getImageSize(imageBlobOrFile);\n\n const highestDimension = Math.max(originalWidth, originalHeight);\n\n // Calculate the sizes to resize the image to\n const resizes = [256, 1024, 2048, highestDimension]\n .filter((s) => s <= (options?.maxSize ?? highestDimension))\n .toSorted((a, b) => a - b);\n\n // Get the highest resolution to use as final original size\n // In case of options.maxSize, it's not the originalWidth/Height\n const { width: finalWidth, height: finalHeight } = getNewDimensions(\n originalWidth,\n originalHeight,\n resizes.at(-1)!,\n );\n\n const imageDefinition = ImageDefinition.create(\n { originalSize: [finalWidth, finalHeight] },\n options?.owner,\n );\n const owner = imageDefinition._owner;\n\n // Placeholder 8x8\n imageDefinition.placeholderDataURL =\n await getPlaceholderBase64(imageBlobOrFile);\n\n // Resizes for progressive loading\n for (let size of resizes) {\n // Calculate width and height respecting the aspect ratio\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n size,\n );\n\n const image = await resize(imageBlobOrFile, width, height);\n\n const binaryStream = await FileStream.createFromBlob(image, owner);\n imageDefinition[`${width}x${height}`] = binaryStream;\n }\n\n return imageDefinition;\n}\n\nasync function getImageSize(\n imageBlobOrFile: Blob | File,\n): Promise<{ width: number; height: number }> {\n const { width, height } = await new Promise<{\n width: number;\n height: number;\n }>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n URL.revokeObjectURL(img.src);\n };\n img.src = URL.createObjectURL(imageBlobOrFile);\n });\n\n return { width, height };\n}\n\nasync function getPlaceholderBase64(\n imageBlobOrFile: Blob | File,\n): Promise<string> {\n // Inizialize Reducer here to not have module side effects\n if (!reducer) {\n reducer = new ImageBlobReduce({ pica: new Pica() });\n }\n\n const canvas = await reducer.toCanvas(imageBlobOrFile, { max: 8 });\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function resize(\n imageBlobOrFile: Blob | File,\n width: number,\n height: number,\n): Promise<Blob> {\n // Inizialize Reducer here to not have module side effects\n if (!reducer) {\n reducer = new ImageBlobReduce({ pica: new Pica() });\n }\n\n return reducer.toBlob(imageBlobOrFile, { max: Math.max(width, height) });\n}\n\nconst getNewDimensions = (\n originalWidth: number,\n originalHeight: number,\n maxSize: number,\n) => {\n const width =\n originalWidth > originalHeight\n ? maxSize\n : Math.round(maxSize * (originalWidth / originalHeight));\n\n const height =\n originalHeight > originalWidth\n ? maxSize\n : Math.round(maxSize * (originalHeight / originalWidth));\n\n return { width, height };\n};\n"],"mappings":";AAAA,OAAO,qBAAqB;AAC5B;AAAA,EAEE;AAAA,EAEA;AAAA,OAEK;AACP,OAAO,UAAU;AAEjB,IAAI;AAGJ,eAAsB,YACpB,iBACA,SAI0D;AAE1D,QAAM,EAAE,OAAO,eAAe,QAAQ,eAAe,IACnD,MAAM,aAAa,eAAe;AAEpC,QAAM,mBAAmB,KAAK,IAAI,eAAe,cAAc;AAG/D,QAAM,UAAU,CAAC,KAAK,MAAM,MAAM,gBAAgB,EAC/C,OAAO,CAAC,MAAM,MAAM,SAAS,WAAW,iBAAiB,EACzD,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAI3B,QAAM,EAAE,OAAO,YAAY,QAAQ,YAAY,IAAI;AAAA,IACjD;AAAA,IACA;AAAA,IACA,QAAQ,GAAG,EAAE;AAAA,EACf;AAEA,QAAM,kBAAkB,gBAAgB;AAAA,IACtC,EAAE,cAAc,CAAC,YAAY,WAAW,EAAE;AAAA,IAC1C,SAAS;AAAA,EACX;AACA,QAAM,QAAQ,gBAAgB;AAG9B,kBAAgB,qBACd,MAAM,qBAAqB,eAAe;AAG5C,WAAS,QAAQ,SAAS;AAExB,UAAM,EAAE,OAAO,OAAO,IAAI;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,OAAO,iBAAiB,OAAO,MAAM;AAEzD,UAAM,eAAe,MAAM,WAAW,eAAe,OAAO,KAAK;AACjE,oBAAgB,GAAG,KAAK,IAAI,MAAM,EAAE,IAAI;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,eAAe,aACb,iBAC4C;AAC5C,QAAM,EAAE,OAAO,OAAO,IAAI,MAAM,IAAI,QAGjC,CAAC,SAAS,WAAW;AACtB,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,SAAS,MAAM;AACjB,cAAQ,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO,CAAC;AAChD,UAAI,gBAAgB,IAAI,GAAG;AAAA,IAC7B;AACA,QAAI,UAAU,MAAM;AAClB,aAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,UAAI,gBAAgB,IAAI,GAAG;AAAA,IAC7B;AACA,QAAI,MAAM,IAAI,gBAAgB,eAAe;AAAA,EAC/C,CAAC;AAED,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,eAAe,qBACb,iBACiB;AAEjB,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,gBAAgB,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;AAAA,EACpD;AAEA,QAAM,SAAS,MAAM,QAAQ,SAAS,iBAAiB,EAAE,KAAK,EAAE,CAAC;AACjE,SAAO,OAAO,UAAU,WAAW;AACrC;AAEA,eAAe,OACb,iBACA,OACA,QACe;AAEf,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,gBAAgB,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;AAAA,EACpD;AAEA,SAAO,QAAQ,OAAO,iBAAiB,EAAE,KAAK,KAAK,IAAI,OAAO,MAAM,EAAE,CAAC;AACzE;AAEA,IAAM,mBAAmB,CACvB,eACA,gBACA,YACG;AACH,QAAM,QACJ,gBAAgB,iBACZ,UACA,KAAK,MAAM,WAAW,gBAAgB,eAAe;AAE3D,QAAM,SACJ,iBAAiB,gBACb,UACA,KAAK,MAAM,WAAW,iBAAiB,cAAc;AAE3D,SAAO,EAAE,OAAO,OAAO;AACzB;","names":[]}
|