jazz-tools 0.14.6 → 0.14.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.turbo/turbo-build.log +7 -7
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-E2B2W453.js → chunk-PA6UHG6Q.js} +16 -5
  4. package/dist/{chunk-E2B2W453.js.map → chunk-PA6UHG6Q.js.map} +1 -1
  5. package/dist/coValues/extensions/imageDef.d.ts +1 -1
  6. package/dist/coValues/extensions/imageDef.d.ts.map +1 -1
  7. package/dist/exports.d.ts +1 -1
  8. package/dist/exports.d.ts.map +1 -1
  9. package/dist/implementation/zodSchema/runtimeConverters/zodFieldToCoFieldDef.d.ts +2 -2
  10. package/dist/implementation/zodSchema/runtimeConverters/zodFieldToCoFieldDef.d.ts.map +1 -1
  11. package/dist/implementation/zodSchema/runtimeConverters/zodSchemaToCoSchema.d.ts +1 -1
  12. package/dist/implementation/zodSchema/runtimeConverters/zodSchemaToCoSchema.d.ts.map +1 -1
  13. package/dist/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +1 -1
  14. package/dist/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  15. package/dist/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +1 -1
  16. package/dist/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
  17. package/dist/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +1 -1
  18. package/dist/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
  19. package/dist/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +1 -1
  20. package/dist/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  21. package/dist/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +1 -1
  22. package/dist/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
  23. package/dist/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +1 -1
  24. package/dist/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  25. package/dist/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +1 -1
  26. package/dist/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
  27. package/dist/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +1 -1
  28. package/dist/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
  29. package/dist/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +1 -1
  30. package/dist/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
  31. package/dist/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts +1 -1
  32. package/dist/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts.map +1 -1
  33. package/dist/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts +4 -3
  34. package/dist/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts.map +1 -1
  35. package/dist/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts +4 -3
  36. package/dist/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts.map +1 -1
  37. package/dist/implementation/zodSchema/unionUtils.d.ts +1 -1
  38. package/dist/implementation/zodSchema/unionUtils.d.ts.map +1 -1
  39. package/dist/implementation/zodSchema/zodCo.d.ts +1 -1
  40. package/dist/implementation/zodSchema/zodCo.d.ts.map +1 -1
  41. package/dist/implementation/zodSchema/zodReExport.d.ts +2 -0
  42. package/dist/implementation/zodSchema/zodReExport.d.ts.map +1 -0
  43. package/dist/implementation/zodSchema/zodSchema.d.ts +1 -1
  44. package/dist/implementation/zodSchema/zodSchema.d.ts.map +1 -1
  45. package/dist/index.js +75 -6
  46. package/dist/index.js.map +1 -1
  47. package/dist/testing.js +1 -1
  48. package/dist/tests/zod.test.d.ts +2 -0
  49. package/dist/tests/zod.test.d.ts.map +1 -0
  50. package/package.json +2 -2
  51. package/src/coValues/extensions/imageDef.ts +1 -1
  52. package/src/exports.ts +1 -1
  53. package/src/implementation/zodSchema/runtimeConverters/zodFieldToCoFieldDef.ts +22 -2
  54. package/src/implementation/zodSchema/runtimeConverters/zodSchemaToCoSchema.ts +1 -1
  55. package/src/implementation/zodSchema/schemaTypes/AccountSchema.ts +1 -1
  56. package/src/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +1 -1
  57. package/src/implementation/zodSchema/schemaTypes/CoListSchema.ts +1 -1
  58. package/src/implementation/zodSchema/schemaTypes/CoMapSchema.ts +1 -1
  59. package/src/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +1 -1
  60. package/src/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +1 -1
  61. package/src/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +1 -1
  62. package/src/implementation/zodSchema/schemaTypes/RichTextSchema.ts +1 -1
  63. package/src/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +1 -1
  64. package/src/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.ts +1 -1
  65. package/src/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.ts +44 -31
  66. package/src/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.ts +46 -33
  67. package/src/implementation/zodSchema/unionUtils.ts +1 -1
  68. package/src/implementation/zodSchema/zodCo.ts +1 -1
  69. package/src/implementation/zodSchema/zodReExport.ts +37 -0
  70. package/src/implementation/zodSchema/zodSchema.ts +1 -3
  71. package/src/tests/coMap.record.test-d.ts +1 -1
  72. package/src/tests/coMap.test-d.ts +1 -1
  73. package/src/tests/coMap.test.ts +1 -1
  74. package/src/tests/schemaUnion.test.ts +5 -2
  75. package/src/tests/zod.test.ts +419 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/exports.ts","../src/auth/DemoAuth.ts","../src/auth/PassphraseAuth.ts","../src/implementation/invites.ts","../src/index.ts"],"sourcesContent":["export type {\n AgentID,\n CoValueUniqueness,\n CryptoProvider,\n InviteSecret,\n Peer,\n SessionID,\n SyncMessage,\n} from \"cojson\";\n\nexport { z } from \"zod/v4\";\n\nexport type { CoValue, ID } from \"./internal.js\";\n\nexport { Encoders, coField } from \"./internal.js\";\n\nexport { Inbox, InboxSender } from \"./internal.js\";\n\nexport { Group } from \"./internal.js\";\nexport { CoValueBase } from \"./internal.js\";\nexport { Profile } from \"./internal.js\";\nexport { SchemaUnion } from \"./internal.js\";\n\nexport { co } from \"./internal.js\";\n\nexport type {\n CoValueClass,\n CoValueFromRaw,\n DeeplyLoaded,\n Resolved,\n RefsToResolve,\n RefsToResolveStrict,\n CoMapInit,\n CoFeedEntry,\n TextPos,\n AccountClass,\n AccountCreationProps,\n} from \"./internal.js\";\n\nexport {\n CoMap,\n CoList,\n BinaryCoStream,\n CoFeed,\n CoStream,\n FileStream,\n CoPlainText,\n CoRichText,\n Account,\n isControlledAccount,\n createCoValueObservable,\n loadCoValue,\n subscribeToCoValue,\n ImageDefinition,\n} from \"./internal.js\";\n\nexport {\n JazzContextManager,\n type JazzContextManagerAuthProps,\n} from \"./internal.js\";\n\nexport { AuthSecretStorage } from \"./auth/AuthSecretStorage.js\";\nexport { KvStoreContext, type KvStore } from \"./auth/KvStoreContext.js\";\nexport { InMemoryKVStore } from \"./auth/InMemoryKVStore.js\";\nexport { DemoAuth } from \"./auth/DemoAuth.js\";\nexport { PassphraseAuth } from \"./auth/PassphraseAuth.js\";\n\nexport {\n createInviteLink,\n parseInviteLink,\n consumeInviteLink,\n} from \"./implementation/invites.js\";\n\nexport {\n AnonymousJazzAgent,\n createAnonymousJazzContext,\n createJazzContextFromExistingCredentials,\n createJazzContextForNewAccount,\n createJazzContext,\n randomSessionProvider,\n type AuthResult,\n type Credentials,\n type JazzContextWithAccount,\n} from \"./internal.js\";\n\nexport type * from \"./types.js\";\n\nexport {\n zodSchemaToCoSchema,\n anySchemaToCoSchema,\n type InstanceOfSchema,\n type InstanceOfSchemaCoValuesNullable,\n type CoValueOrZodSchema,\n type Loaded,\n type AccountSchema,\n type AnyAccountSchema,\n type CoListSchema,\n type CoMapSchema,\n type CoFeedSchema,\n type PlainTextSchema,\n type FileStreamSchema,\n type ResolveQuery,\n type ResolveQueryStrict,\n type InitFor,\n} from \"./internal.js\";\n","import { AgentSecret } from \"cojson\";\nimport { Account, ID } from \"../internal.js\";\nimport { AuthenticateAccountFunction } from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\nimport { KvStore, KvStoreContext } from \"./KvStoreContext.js\";\n\ntype StorageData = {\n accountID: ID<Account>;\n accountSecret: AgentSecret;\n secretSeed?: number[];\n};\n\n/**\n * `DemoAuth` provides a `JazzAuth` object for demo authentication.\n *\n * Demo authentication is useful for quickly testing your app, as it allows you to create new accounts and log in as existing ones.\n *\n * ```\n * import { DemoAuth } from \"jazz-tools\";\n *\n * const auth = new DemoAuth(jazzContext.authenticate, new AuthSecretStorage());\n * ```\n *\n * @category Auth Providers\n */\nexport class DemoAuth {\n constructor(\n private authenticate: AuthenticateAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n ) {}\n\n logIn = async (username: string) => {\n const existingUsers = await this.getExisitingUsersWithData();\n const storageData = existingUsers[username];\n\n if (!storageData?.accountID) {\n throw new Error(\"User not found\");\n }\n\n await this.authenticate({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n secretSeed: storageData.secretSeed\n ? new Uint8Array(storageData.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n };\n\n signUp = async (username: string) => {\n const existingUsers = await this.getExistingUsers();\n if (existingUsers.includes(username)) {\n throw new Error(\"User already registered\");\n }\n\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"No credentials found\");\n }\n\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.name = username;\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? new Uint8Array(credentials.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n\n await this.addToExistingUsers(username, {\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n });\n };\n\n private async addToExistingUsers(username: string, data: StorageData) {\n const existingUsers = await this.getExisitingUsersWithData();\n\n if (existingUsers[username]) {\n return;\n }\n\n existingUsers[username] = data;\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n }\n\n private async getExisitingUsersWithData() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n await migrateExistingUsers(kvStore);\n\n const existingUsers = await kvStore.get(\"demo-auth-users\");\n return existingUsers ? JSON.parse(existingUsers) : {};\n }\n\n getExistingUsers = async () => {\n return Object.keys(await this.getExisitingUsersWithData());\n };\n}\n\nexport function encodeUsername(username: string) {\n return btoa(username)\n .replace(/=/g, \"-\")\n .replace(/\\+/g, \"_\")\n .replace(/\\//g, \".\");\n}\n\nasync function getStorageVersion(kvStore: KvStore) {\n try {\n const version = await kvStore.get(\"demo-auth-storage-version\");\n return version ? parseInt(version) : 1;\n } catch (error) {\n return 1;\n }\n}\n\nasync function setStorageVersion(kvStore: KvStore, version: number) {\n await kvStore.set(\"demo-auth-storage-version\", version.toString());\n}\n\nasync function getExistingUsersList(kvStore: KvStore) {\n const existingUsers = await kvStore.get(\"demo-auth-existing-users\");\n return existingUsers ? existingUsers.split(\",\") : [];\n}\n\n/**\n * Migrates existing users keys to work with any storage.\n */\nasync function migrateExistingUsers(kvStore: KvStore) {\n if ((await getStorageVersion(kvStore)) < 2) {\n const existingUsers = await getExistingUsersList(kvStore);\n\n for (const username of existingUsers) {\n const legacyKey = `demo-auth-existing-users-${username}`;\n const storageData = await kvStore.get(legacyKey);\n if (storageData) {\n await kvStore.set(\n `demo-auth-existing-users-${encodeUsername(username)}`,\n storageData,\n );\n await kvStore.delete(legacyKey);\n }\n }\n\n await setStorageVersion(kvStore, 2);\n }\n\n if ((await getStorageVersion(kvStore)) < 3) {\n const existingUsersList = await getExistingUsersList(kvStore);\n\n const existingUsers: Record<string, StorageData> = {};\n const keysToDelete: string[] = [\"demo-auth-existing-users\"];\n\n for (const username of existingUsersList) {\n const key = `demo-auth-existing-users-${encodeUsername(username)}`;\n const storageData = await kvStore.get(key);\n if (storageData) {\n existingUsers[username] = JSON.parse(storageData);\n keysToDelete.push(key);\n }\n }\n\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n\n for (const key of keysToDelete) {\n await kvStore.delete(key);\n }\n\n await setStorageVersion(kvStore, 3);\n }\n}\n","import * as bip39 from \"@scure/bip39\";\nimport { entropyToMnemonic } from \"@scure/bip39\";\nimport { CryptoProvider, cojsonInternals } from \"cojson\";\nimport type { ID } from \"../internal.js\";\nimport { Account } from \"../internal.js\";\nimport type {\n AuthenticateAccountFunction,\n RegisterAccountFunction,\n} from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\n\n/**\n * `PassphraseAuth` provides a `JazzAuth` object for passphrase authentication.\n *\n * ```ts\n * import { PassphraseAuth } from \"jazz-tools\";\n *\n * const auth = new PassphraseAuth(crypto, jazzContext.authenticate, new AuthSecretStorage(), wordlist);\n * ```\n *\n * @category Auth Providers\n */\nexport class PassphraseAuth {\n passphrase: string = \"\";\n\n constructor(\n private crypto: CryptoProvider,\n private authenticate: AuthenticateAccountFunction,\n private register: RegisterAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n public wordlist: string[],\n ) {}\n\n logIn = async (passphrase: string) => {\n const { crypto, authenticate } = this;\n\n let secretSeed;\n\n try {\n secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n } catch (e) {\n throw new Error(\"Invalid passphrase\");\n }\n\n const accountSecret = crypto.agentSecretFromSecretSeed(secretSeed);\n\n const accountID = cojsonInternals.idforHeader(\n cojsonInternals.accountHeaderForInitialAgentSecret(accountSecret, crypto),\n crypto,\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n this.passphrase = passphrase;\n this.notify();\n };\n\n signUp = async (name?: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n const passphrase = entropyToMnemonic(credentials.secretSeed, this.wordlist);\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passphrase\",\n });\n\n if (name?.trim()) {\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.name = name;\n }\n\n return passphrase;\n };\n\n registerNewAccount = async (passphrase: string, name: string) => {\n const secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n const accountSecret = this.crypto.agentSecretFromSecretSeed(secretSeed);\n const accountID = await this.register(accountSecret, { name });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n return accountID;\n };\n\n getCurrentAccountPassphrase = async () => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n return entropyToMnemonic(credentials.secretSeed, this.wordlist);\n };\n\n generateRandomPassphrase = () => {\n return entropyToMnemonic(this.crypto.newRandomSecretSeed(), this.wordlist);\n };\n\n loadCurrentAccountPassphrase = async () => {\n const passphrase = await this.getCurrentAccountPassphrase();\n this.passphrase = passphrase;\n this.notify();\n };\n\n listeners = new Set<() => void>();\n subscribe = (callback: () => void) => {\n this.listeners.add(callback);\n\n return () => {\n this.listeners.delete(callback);\n };\n };\n\n notify() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","import { type InviteSecret, cojsonInternals } from \"cojson\";\nimport { Account } from \"../coValues/account.js\";\nimport type {\n CoValue,\n CoValueClass,\n CoValueOrZodSchema,\n ID,\n} from \"../internal.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n baseURL: string,\n 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(inviteURL: string):\n | {\n valueID: string;\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: string | 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];\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2];\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n\n/** @category Invite Links */\nexport function consumeInviteLink<S extends CoValueOrZodSchema>({\n inviteURL,\n as = Account.getMe(),\n forValueHint,\n invitedObjectSchema,\n}: {\n inviteURL: string;\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 return new Promise((resolve, reject) => {\n const result = parseInviteLink(inviteURL);\n\n if (result && result.valueHint === forValueHint) {\n as.acceptInvite(result.valueID, result.inviteSecret, invitedObjectSchema)\n .then(() => {\n resolve(result);\n })\n .catch(reject);\n } else {\n resolve(undefined);\n }\n });\n}\n","export * from \"./exports.js\";\n\nexport { MAX_RECOMMENDED_TX_SIZE, cojsonInternals } from \"cojson\";\n"],"mappings":"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","names":["cojsonInternals","cojsonInternals","cojsonInternals"]}
1
+ {"version":3,"sources":["../src/implementation/zodSchema/zodReExport.ts","../src/auth/DemoAuth.ts","../src/auth/PassphraseAuth.ts","../src/implementation/invites.ts","../src/index.ts"],"sourcesContent":["export {\n string,\n number,\n boolean,\n union,\n object,\n array,\n templateLiteral,\n json,\n tuple,\n date,\n emoji,\n base64,\n base64url,\n nanoid,\n cuid,\n cuid2,\n ulid,\n ipv4,\n ipv6,\n email,\n url,\n uuid,\n literal,\n enum,\n cidrv4,\n cidrv6,\n iso,\n int32,\n strictObject,\n discriminatedUnion,\n // intersection,\n // record,\n int,\n optional,\n type ZodOptional,\n} from \"jazz-tools-zod-v4-rn-patch/v4\";\n","import { AgentSecret } from \"cojson\";\nimport { Account, ID } from \"../internal.js\";\nimport { AuthenticateAccountFunction } from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\nimport { KvStore, KvStoreContext } from \"./KvStoreContext.js\";\n\ntype StorageData = {\n accountID: ID<Account>;\n accountSecret: AgentSecret;\n secretSeed?: number[];\n};\n\n/**\n * `DemoAuth` provides a `JazzAuth` object for demo authentication.\n *\n * Demo authentication is useful for quickly testing your app, as it allows you to create new accounts and log in as existing ones.\n *\n * ```\n * import { DemoAuth } from \"jazz-tools\";\n *\n * const auth = new DemoAuth(jazzContext.authenticate, new AuthSecretStorage());\n * ```\n *\n * @category Auth Providers\n */\nexport class DemoAuth {\n constructor(\n private authenticate: AuthenticateAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n ) {}\n\n logIn = async (username: string) => {\n const existingUsers = await this.getExisitingUsersWithData();\n const storageData = existingUsers[username];\n\n if (!storageData?.accountID) {\n throw new Error(\"User not found\");\n }\n\n await this.authenticate({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n secretSeed: storageData.secretSeed\n ? new Uint8Array(storageData.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n };\n\n signUp = async (username: string) => {\n const existingUsers = await this.getExistingUsers();\n if (existingUsers.includes(username)) {\n throw new Error(\"User already registered\");\n }\n\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"No credentials found\");\n }\n\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.name = username;\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? new Uint8Array(credentials.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n\n await this.addToExistingUsers(username, {\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n });\n };\n\n private async addToExistingUsers(username: string, data: StorageData) {\n const existingUsers = await this.getExisitingUsersWithData();\n\n if (existingUsers[username]) {\n return;\n }\n\n existingUsers[username] = data;\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n }\n\n private async getExisitingUsersWithData() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n await migrateExistingUsers(kvStore);\n\n const existingUsers = await kvStore.get(\"demo-auth-users\");\n return existingUsers ? JSON.parse(existingUsers) : {};\n }\n\n getExistingUsers = async () => {\n return Object.keys(await this.getExisitingUsersWithData());\n };\n}\n\nexport function encodeUsername(username: string) {\n return btoa(username)\n .replace(/=/g, \"-\")\n .replace(/\\+/g, \"_\")\n .replace(/\\//g, \".\");\n}\n\nasync function getStorageVersion(kvStore: KvStore) {\n try {\n const version = await kvStore.get(\"demo-auth-storage-version\");\n return version ? parseInt(version) : 1;\n } catch (error) {\n return 1;\n }\n}\n\nasync function setStorageVersion(kvStore: KvStore, version: number) {\n await kvStore.set(\"demo-auth-storage-version\", version.toString());\n}\n\nasync function getExistingUsersList(kvStore: KvStore) {\n const existingUsers = await kvStore.get(\"demo-auth-existing-users\");\n return existingUsers ? existingUsers.split(\",\") : [];\n}\n\n/**\n * Migrates existing users keys to work with any storage.\n */\nasync function migrateExistingUsers(kvStore: KvStore) {\n if ((await getStorageVersion(kvStore)) < 2) {\n const existingUsers = await getExistingUsersList(kvStore);\n\n for (const username of existingUsers) {\n const legacyKey = `demo-auth-existing-users-${username}`;\n const storageData = await kvStore.get(legacyKey);\n if (storageData) {\n await kvStore.set(\n `demo-auth-existing-users-${encodeUsername(username)}`,\n storageData,\n );\n await kvStore.delete(legacyKey);\n }\n }\n\n await setStorageVersion(kvStore, 2);\n }\n\n if ((await getStorageVersion(kvStore)) < 3) {\n const existingUsersList = await getExistingUsersList(kvStore);\n\n const existingUsers: Record<string, StorageData> = {};\n const keysToDelete: string[] = [\"demo-auth-existing-users\"];\n\n for (const username of existingUsersList) {\n const key = `demo-auth-existing-users-${encodeUsername(username)}`;\n const storageData = await kvStore.get(key);\n if (storageData) {\n existingUsers[username] = JSON.parse(storageData);\n keysToDelete.push(key);\n }\n }\n\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n\n for (const key of keysToDelete) {\n await kvStore.delete(key);\n }\n\n await setStorageVersion(kvStore, 3);\n }\n}\n","import * as bip39 from \"@scure/bip39\";\nimport { entropyToMnemonic } from \"@scure/bip39\";\nimport { CryptoProvider, cojsonInternals } from \"cojson\";\nimport type { ID } from \"../internal.js\";\nimport { Account } from \"../internal.js\";\nimport type {\n AuthenticateAccountFunction,\n RegisterAccountFunction,\n} from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\n\n/**\n * `PassphraseAuth` provides a `JazzAuth` object for passphrase authentication.\n *\n * ```ts\n * import { PassphraseAuth } from \"jazz-tools\";\n *\n * const auth = new PassphraseAuth(crypto, jazzContext.authenticate, new AuthSecretStorage(), wordlist);\n * ```\n *\n * @category Auth Providers\n */\nexport class PassphraseAuth {\n passphrase: string = \"\";\n\n constructor(\n private crypto: CryptoProvider,\n private authenticate: AuthenticateAccountFunction,\n private register: RegisterAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n public wordlist: string[],\n ) {}\n\n logIn = async (passphrase: string) => {\n const { crypto, authenticate } = this;\n\n let secretSeed;\n\n try {\n secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n } catch (e) {\n throw new Error(\"Invalid passphrase\");\n }\n\n const accountSecret = crypto.agentSecretFromSecretSeed(secretSeed);\n\n const accountID = cojsonInternals.idforHeader(\n cojsonInternals.accountHeaderForInitialAgentSecret(accountSecret, crypto),\n crypto,\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n this.passphrase = passphrase;\n this.notify();\n };\n\n signUp = async (name?: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n const passphrase = entropyToMnemonic(credentials.secretSeed, this.wordlist);\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passphrase\",\n });\n\n if (name?.trim()) {\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.name = name;\n }\n\n return passphrase;\n };\n\n registerNewAccount = async (passphrase: string, name: string) => {\n const secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n const accountSecret = this.crypto.agentSecretFromSecretSeed(secretSeed);\n const accountID = await this.register(accountSecret, { name });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n return accountID;\n };\n\n getCurrentAccountPassphrase = async () => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n return entropyToMnemonic(credentials.secretSeed, this.wordlist);\n };\n\n generateRandomPassphrase = () => {\n return entropyToMnemonic(this.crypto.newRandomSecretSeed(), this.wordlist);\n };\n\n loadCurrentAccountPassphrase = async () => {\n const passphrase = await this.getCurrentAccountPassphrase();\n this.passphrase = passphrase;\n this.notify();\n };\n\n listeners = new Set<() => void>();\n subscribe = (callback: () => void) => {\n this.listeners.add(callback);\n\n return () => {\n this.listeners.delete(callback);\n };\n };\n\n notify() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","import { type InviteSecret, cojsonInternals } from \"cojson\";\nimport { Account } from \"../coValues/account.js\";\nimport type {\n CoValue,\n CoValueClass,\n CoValueOrZodSchema,\n ID,\n} from \"../internal.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n baseURL: string,\n 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(inviteURL: string):\n | {\n valueID: string;\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: string | 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];\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2];\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n\n/** @category Invite Links */\nexport function consumeInviteLink<S extends CoValueOrZodSchema>({\n inviteURL,\n as = Account.getMe(),\n forValueHint,\n invitedObjectSchema,\n}: {\n inviteURL: string;\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 return new Promise((resolve, reject) => {\n const result = parseInviteLink(inviteURL);\n\n if (result && result.valueHint === forValueHint) {\n as.acceptInvite(result.valueID, result.inviteSecret, invitedObjectSchema)\n .then(() => {\n resolve(result);\n })\n .catch(reject);\n } else {\n resolve(undefined);\n }\n });\n}\n","export * from \"./exports.js\";\n\nexport { MAX_RECOMMENDED_TX_SIZE, cojsonInternals } from \"cojson\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OAEK;;;ACXA,IAAM,WAAN,MAAe;AAAA,EACpB,YACU,cACA,mBACR;AAFQ;AACA;AAGV,iBAAQ,OAAO,aAAqB;AAClC,YAAM,gBAAgB,MAAM,KAAK,0BAA0B;AAC3D,YAAM,cAAc,cAAc,QAAQ;AAE1C,UAAI,CAAC,aAAa,WAAW;AAC3B,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AAEA,YAAM,KAAK,aAAa;AAAA,QACtB,WAAW,YAAY;AAAA,QACvB,eAAe,YAAY;AAAA,MAC7B,CAAC;AAED,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B,WAAW,YAAY;AAAA,QACvB,eAAe,YAAY;AAAA,QAC3B,YAAY,YAAY,aACpB,IAAI,WAAW,YAAY,UAAU,IACrC;AAAA,QACJ,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,kBAAS,OAAO,aAAqB;AACnC,YAAM,gBAAgB,MAAM,KAAK,iBAAiB;AAClD,UAAI,cAAc,SAAS,QAAQ,GAAG;AACpC,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,YAAM,cAAc,MAAM,KAAK,kBAAkB,IAAI;AAErD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AAEA,YAAM,iBAAiB,MAAM,QAAQ,MAAM,EAAE,aAAa;AAAA,QACxD,SAAS;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAED,qBAAe,QAAQ,OAAO;AAE9B,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B,WAAW,YAAY;AAAA,QACvB,eAAe,YAAY;AAAA,QAC3B,YAAY,YAAY,aACpB,IAAI,WAAW,YAAY,UAAU,IACrC;AAAA,QACJ,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,KAAK,mBAAmB,UAAU;AAAA,QACtC,WAAW,YAAY;AAAA,QACvB,eAAe,YAAY;AAAA,QAC3B,YAAY,YAAY,aACpB,MAAM,KAAK,YAAY,UAAU,IACjC;AAAA,MACN,CAAC;AAAA,IACH;AAuBA,4BAAmB,YAAY;AAC7B,aAAO,OAAO,KAAK,MAAM,KAAK,0BAA0B,CAAC;AAAA,IAC3D;AAAA,EAtFG;AAAA,EA+DH,MAAc,mBAAmB,UAAkB,MAAmB;AACpE,UAAM,gBAAgB,MAAM,KAAK,0BAA0B;AAE3D,QAAI,cAAc,QAAQ,GAAG;AAC3B;AAAA,IACF;AAEA,kBAAc,QAAQ,IAAI;AAE1B,UAAM,UAAU,eAAe,YAAY,EAAE,WAAW;AACxD,UAAM,QAAQ,IAAI,mBAAmB,KAAK,UAAU,aAAa,CAAC;AAAA,EACpE;AAAA,EAEA,MAAc,4BAA4B;AACxC,UAAM,UAAU,eAAe,YAAY,EAAE,WAAW;AACxD,UAAM,qBAAqB,OAAO;AAElC,UAAM,gBAAgB,MAAM,QAAQ,IAAI,iBAAiB;AACzD,WAAO,gBAAgB,KAAK,MAAM,aAAa,IAAI,CAAC;AAAA,EACtD;AAKF;AAEO,SAAS,eAAe,UAAkB;AAC/C,SAAO,KAAK,QAAQ,EACjB,QAAQ,MAAM,GAAG,EACjB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG;AACvB;AAEA,eAAe,kBAAkB,SAAkB;AACjD,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,IAAI,2BAA2B;AAC7D,WAAO,UAAU,SAAS,OAAO,IAAI;AAAA,EACvC,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBAAkB,SAAkB,SAAiB;AAClE,QAAM,QAAQ,IAAI,6BAA6B,QAAQ,SAAS,CAAC;AACnE;AAEA,eAAe,qBAAqB,SAAkB;AACpD,QAAM,gBAAgB,MAAM,QAAQ,IAAI,0BAA0B;AAClE,SAAO,gBAAgB,cAAc,MAAM,GAAG,IAAI,CAAC;AACrD;AAKA,eAAe,qBAAqB,SAAkB;AACpD,MAAK,MAAM,kBAAkB,OAAO,IAAK,GAAG;AAC1C,UAAM,gBAAgB,MAAM,qBAAqB,OAAO;AAExD,eAAW,YAAY,eAAe;AACpC,YAAM,YAAY,4BAA4B,QAAQ;AACtD,YAAM,cAAc,MAAM,QAAQ,IAAI,SAAS;AAC/C,UAAI,aAAa;AACf,cAAM,QAAQ;AAAA,UACZ,4BAA4B,eAAe,QAAQ,CAAC;AAAA,UACpD;AAAA,QACF;AACA,cAAM,QAAQ,OAAO,SAAS;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,kBAAkB,SAAS,CAAC;AAAA,EACpC;AAEA,MAAK,MAAM,kBAAkB,OAAO,IAAK,GAAG;AAC1C,UAAM,oBAAoB,MAAM,qBAAqB,OAAO;AAE5D,UAAM,gBAA6C,CAAC;AACpD,UAAM,eAAyB,CAAC,0BAA0B;AAE1D,eAAW,YAAY,mBAAmB;AACxC,YAAM,MAAM,4BAA4B,eAAe,QAAQ,CAAC;AAChE,YAAM,cAAc,MAAM,QAAQ,IAAI,GAAG;AACzC,UAAI,aAAa;AACf,sBAAc,QAAQ,IAAI,KAAK,MAAM,WAAW;AAChD,qBAAa,KAAK,GAAG;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,mBAAmB,KAAK,UAAU,aAAa,CAAC;AAElE,eAAW,OAAO,cAAc;AAC9B,YAAM,QAAQ,OAAO,GAAG;AAAA,IAC1B;AAEA,UAAM,kBAAkB,SAAS,CAAC;AAAA,EACpC;AACF;;;AC5LA,YAAY,WAAW;AACvB,SAAS,yBAAyB;AAClC,SAAyB,uBAAuB;AAoBzC,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YACU,QACA,cACA,UACA,mBACD,UACP;AALQ;AACA;AACA;AACA;AACD;AAPT,sBAAqB;AAUrB,iBAAQ,OAAO,eAAuB;AACpC,YAAM,EAAE,QAAQ,aAAa,IAAI;AAEjC,UAAI;AAEJ,UAAI;AACF,qBAAmB,wBAAkB,YAAY,KAAK,QAAQ;AAAA,MAChE,SAAS,GAAG;AACV,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AAEA,YAAM,gBAAgB,OAAO,0BAA0B,UAAU;AAEjE,YAAM,YAAY,gBAAgB;AAAA,QAChC,gBAAgB,mCAAmC,eAAe,MAAM;AAAA,QACxE;AAAA,MACF;AAEA,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAED,WAAK,aAAa;AAClB,WAAK,OAAO;AAAA,IACd;AAEA,kBAAS,OAAO,SAAkB;AAChC,YAAM,cAAc,MAAM,KAAK,kBAAkB,IAAI;AAErD,UAAI,CAAC,eAAe,CAAC,YAAY,YAAY;AAC3C,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AAEA,YAAM,aAAa,kBAAkB,YAAY,YAAY,KAAK,QAAQ;AAE1E,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B,WAAW,YAAY;AAAA,QACvB,YAAY,YAAY;AAAA,QACxB,eAAe,YAAY;AAAA,QAC3B,UAAU;AAAA,MACZ,CAAC;AAED,UAAI,MAAM,KAAK,GAAG;AAChB,cAAM,iBAAiB,MAAM,QAAQ,MAAM,EAAE,aAAa;AAAA,UACxD,SAAS;AAAA,YACP,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAED,uBAAe,QAAQ,OAAO;AAAA,MAChC;AAEA,aAAO;AAAA,IACT;AAEA,8BAAqB,OAAO,YAAoB,SAAiB;AAC/D,YAAM,aAAmB,wBAAkB,YAAY,KAAK,QAAQ;AACpE,YAAM,gBAAgB,KAAK,OAAO,0BAA0B,UAAU;AACtE,YAAM,YAAY,MAAM,KAAK,SAAS,eAAe,EAAE,KAAK,CAAC;AAE7D,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAED,aAAO;AAAA,IACT;AAEA,uCAA8B,YAAY;AACxC,YAAM,cAAc,MAAM,KAAK,kBAAkB,IAAI;AAErD,UAAI,CAAC,eAAe,CAAC,YAAY,YAAY;AAC3C,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AAEA,aAAO,kBAAkB,YAAY,YAAY,KAAK,QAAQ;AAAA,IAChE;AAEA,oCAA2B,MAAM;AAC/B,aAAO,kBAAkB,KAAK,OAAO,oBAAoB,GAAG,KAAK,QAAQ;AAAA,IAC3E;AAEA,wCAA+B,YAAY;AACzC,YAAM,aAAa,MAAM,KAAK,4BAA4B;AAC1D,WAAK,aAAa;AAClB,WAAK,OAAO;AAAA,IACd;AAEA,qBAAY,oBAAI,IAAgB;AAChC,qBAAY,CAAC,aAAyB;AACpC,WAAK,UAAU,IAAI,QAAQ;AAE3B,aAAO,MAAM;AACX,aAAK,UAAU,OAAO,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,EA3GG;AAAA,EA6GH,SAAS;AACP,eAAW,YAAY,KAAK,WAAW;AACrC,eAAS;AAAA,IACX;AAAA,EACF;AACF;;;ACjJA,SAA4B,mBAAAC,wBAAuB;AAU5C,SAAS,iBACd,OACA,MACA,SACA,WACQ;AACR,QAAM,cAAc,MAAM,KAAK;AAC/B,MAAI,iBAAiB;AAErB,SAAO,eAAe,SAAS,OAAO,QAAQ,SAAS,gBAAgB;AACrE,qBAAiB,eAAe,SAAS,EAAE;AAAA,EAC7C;AAEA,QAAM,EAAE,SAAS,KAAK,IAAI,eAAe,SAAS;AAElD,MAAI,QAAQ,SAAS,WAAW,MAAM,SAAS,WAAW;AACxD,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,QAAM,QAAQC,iBAAgB,YAAY,eAAe,kBAAkB,CAAC;AAC5E,QAAM,eAAe,MAAM,aAAa,IAAI;AAE5C,SAAO,GAAG,OAAO,YAAY,YAAY,YAAY,MAAM,EAAE,GAC3D,MAAM,EACR,IAAI,YAAY;AAClB;AAGO,SAAS,gBAAgB,WAMlB;AACZ,QAAMC,OAAM,IAAI,IAAI,SAAS;AAC7B,QAAM,QAAQA,KAAI,KAAK,MAAM,GAAG;AAEhC,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,UAAU;AAC7C,QAAI,MAAM,WAAW,GAAG;AACtB,kBAAY,MAAM,CAAC;AACnB,gBAAU,MAAM,CAAC;AACjB,qBAAe,MAAM,CAAC;AAAA,IACxB,WAAW,MAAM,WAAW,GAAG;AAC7B,gBAAU,MAAM,CAAC;AACjB,qBAAe,MAAM,CAAC;AAAA,IACxB;AAEA,QAAI,CAAC,WAAW,CAAC,cAAc;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,SAAS,cAAc,UAAU;AAAA,EAC5C;AACF;AAGO,SAAS,kBAAgD;AAAA,EAC9D;AAAA,EACA,KAAK,QAAQ,MAAM;AAAA,EACnB;AAAA,EACA;AACF,GAYE;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,gBAAgB,SAAS;AAExC,QAAI,UAAU,OAAO,cAAc,cAAc;AAC/C,SAAG,aAAa,OAAO,SAAS,OAAO,cAAc,mBAAmB,EACrE,KAAK,MAAM;AACV,gBAAQ,MAAM;AAAA,MAChB,CAAC,EACA,MAAM,MAAM;AAAA,IACjB,OAAO;AACL,cAAQ,MAAS;AAAA,IACnB;AAAA,EACF,CAAC;AACH;;;ACnGA,SAAS,yBAAyB,mBAAAC,wBAAuB;","names":["enum","cojsonInternals","cojsonInternals","url","cojsonInternals"]}
package/dist/testing.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  createAnonymousJazzContext,
7
7
  createJazzContext,
8
8
  randomSessionProvider
9
- } from "./chunk-E2B2W453.js";
9
+ } from "./chunk-PA6UHG6Q.js";
10
10
 
11
11
  // src/testing.ts
12
12
  import { LocalNode } from "cojson";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zod.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.test.d.ts","sourceRoot":"","sources":["../../src/tests/zod.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -17,11 +17,11 @@
17
17
  },
18
18
  "type": "module",
19
19
  "license": "MIT",
20
- "version": "0.14.6",
20
+ "version": "0.14.8",
21
21
  "dependencies": {
22
22
  "@scure/bip39": "^1.3.0",
23
23
  "fast-myers-diff": "^3.2.0",
24
- "zod": "3.25.0-beta.20250518T002810",
24
+ "jazz-tools-zod-v4-rn-patch": "3.25.22",
25
25
  "cojson": "0.14.1"
26
26
  },
27
27
  "devDependencies": {
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import {
3
3
  Loaded,
4
4
  co,
package/src/exports.ts CHANGED
@@ -8,7 +8,7 @@ export type {
8
8
  SyncMessage,
9
9
  } from "cojson";
10
10
 
11
- export { z } from "zod/v4";
11
+ export * as z from "./implementation/zodSchema/zodReExport.js";
12
12
 
13
13
  export type { CoValue, ID } from "./internal.js";
14
14
 
@@ -1,4 +1,8 @@
1
- import z from "zod/v4";
1
+ import z, {
2
+ ZodCatch,
3
+ ZodLazy,
4
+ ZodReadonly,
5
+ } from "jazz-tools-zod-v4-rn-patch/v4";
2
6
  import { CoMap, CoValueClass, isCoValueClass } from "../../../internal.js";
3
7
  import { coField } from "../../schema.js";
4
8
  import {
@@ -17,6 +21,12 @@ type FieldSchema =
17
21
  | z.core.$ZodObject<z.core.$ZodLooseShape>
18
22
  | z.core.$ZodArray<z.core.$ZodType>
19
23
  | z.core.$ZodTuple<z.core.$ZodType[]>
24
+ | z.core.$ZodReadonly<z.core.$ZodType>
25
+ | z.core.$ZodLazy<z.core.$ZodType>
26
+ | z.core.$ZodTemplateLiteral<any>
27
+ | z.core.$ZodLiteral<any>
28
+ | z.core.$ZodCatch<z.core.$ZodType>
29
+ | z.core.$ZodEnum<any>
20
30
  | (z.core.$ZodCustom<any, any> & { builtin: any });
21
31
 
22
32
  export function zodFieldToCoFieldDef(schema: FieldSchema) {
@@ -41,11 +51,21 @@ export function zodFieldToCoFieldDef(schema: FieldSchema) {
41
51
  return coField.boolean;
42
52
  } else if (schema._zod.def.type === "null") {
43
53
  return coField.null;
44
- // @ts-expect-error enum is not declared as def.type
45
54
  } else if (schema._zod.def.type === "enum") {
46
55
  return coField.string;
56
+ } else if (schema._zod.def.type === "readonly") {
57
+ return zodFieldToCoFieldDef(
58
+ (schema as unknown as ZodReadonly).def.innerType as FieldSchema,
59
+ );
47
60
  } else if (schema._zod.def.type === "date") {
48
61
  return coField.Date;
62
+ } else if (schema._zod.def.type === "template_literal") {
63
+ return coField.string;
64
+ } else if (schema._zod.def.type === "lazy") {
65
+ // Mostly to support z.json()
66
+ return zodFieldToCoFieldDef(
67
+ (schema as unknown as ZodLazy).unwrap() as FieldSchema,
68
+ );
49
69
  } else if (schema._zod.def.type === "literal") {
50
70
  if (
51
71
  schema._zod.def.values.some(
@@ -1,5 +1,5 @@
1
1
  import { RawCoList, RawCoMap } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import {
4
4
  Account,
5
5
  CoFeed,
@@ -1,5 +1,5 @@
1
1
  import { CryptoProvider } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import {
4
4
  Account,
5
5
  Group,
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import {
3
3
  Account,
4
4
  CoFeed,
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import {
3
3
  Account,
4
4
  CoList,
@@ -1,5 +1,5 @@
1
1
  import { CoValueUniqueness } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import {
4
4
  Account,
5
5
  CoMap,
@@ -1,5 +1,5 @@
1
1
  import { CoValueUniqueness } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import {
4
4
  Account,
5
5
  CoMap,
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import {
3
3
  Account,
4
4
  AnonymousJazzAgent,
@@ -1,5 +1,5 @@
1
1
  import { RawCoPlainText } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import { Account, CoPlainText, Group } from "../../../internal.js";
4
4
  import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
5
5
 
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import { Account, CoRichText, Group } from "../../../internal.js";
3
3
  import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
4
4
 
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import {
3
3
  Account,
4
4
  CoFeed,
@@ -1,4 +1,4 @@
1
- import z from "zod/v4";
1
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
2
  import {
3
3
  Account,
4
4
  AnyCoFeedSchema,
@@ -1,4 +1,5 @@
1
- import z from "zod/v4";
1
+ import { JsonValue } from "cojson";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
3
  import {
3
4
  Account,
4
5
  CoFeed,
@@ -57,36 +58,48 @@ export type InstanceOrPrimitiveOfSchema<
57
58
  ? FileStream
58
59
  : S extends z.core.$ZodOptional<infer Inner>
59
60
  ? InstanceOrPrimitiveOfSchema<Inner> | undefined
60
- : S extends z.core.$ZodUnion<infer Members>
61
- ? InstanceOrPrimitiveOfSchema<Members[number]>
62
- : // primitives below here - we manually traverse to ensure we only allow what we can handle
63
- S extends z.core.$ZodObject<infer Shape>
64
- ? {
65
- -readonly [key in keyof Shape]: InstanceOrPrimitiveOfSchema<
66
- Shape[key]
67
- >;
68
- }
69
- : S extends z.core.$ZodArray<infer Item>
70
- ? InstanceOrPrimitiveOfSchema<Item>[]
71
- : S extends z.core.$ZodTuple<infer Items>
72
- ? {
73
- [key in keyof Items]: InstanceOrPrimitiveOfSchema<
74
- Items[key]
75
- >;
76
- }
77
- : S extends z.core.$ZodString
78
- ? string
79
- : S extends z.core.$ZodNumber
80
- ? number
81
- : S extends z.core.$ZodBoolean
82
- ? boolean
83
- : S extends z.core.$ZodLiteral<infer Literal>
84
- ? Literal
85
- : S extends z.core.$ZodDate
86
- ? Date
87
- : S extends z.core.$ZodEnum<infer Enum>
88
- ? Enum[keyof Enum]
89
- : never
61
+ : S extends z.ZodJSONSchema
62
+ ? JsonValue
63
+ : S extends z.core.$ZodUnion<infer Members>
64
+ ? InstanceOrPrimitiveOfSchema<Members[number]>
65
+ : // primitives below here - we manually traverse to ensure we only allow what we can handle
66
+ S extends z.core.$ZodObject<infer Shape>
67
+ ? {
68
+ -readonly [key in keyof Shape]: InstanceOrPrimitiveOfSchema<
69
+ Shape[key]
70
+ >;
71
+ }
72
+ : S extends z.core.$ZodArray<infer Item>
73
+ ? InstanceOrPrimitiveOfSchema<Item>[]
74
+ : S extends z.core.$ZodTuple<infer Items>
75
+ ? {
76
+ [key in keyof Items]: InstanceOrPrimitiveOfSchema<
77
+ Items[key]
78
+ >;
79
+ }
80
+ : S extends z.core.$ZodString
81
+ ? string
82
+ : S extends z.core.$ZodNumber
83
+ ? number
84
+ : S extends z.core.$ZodBoolean
85
+ ? boolean
86
+ : S extends z.core.$ZodLiteral<
87
+ infer Literal
88
+ >
89
+ ? Literal
90
+ : S extends z.core.$ZodDate
91
+ ? Date
92
+ : S extends z.core.$ZodEnum<infer Enum>
93
+ ? Enum[keyof Enum]
94
+ : S extends z.core.$ZodTemplateLiteral<
95
+ infer pattern
96
+ >
97
+ ? pattern
98
+ : S extends z.core.$ZodReadonly<
99
+ infer Inner
100
+ >
101
+ ? InstanceOrPrimitiveOfSchema<Inner>
102
+ : never
90
103
  : S extends CoValueClass
91
104
  ? InstanceType<S>
92
105
  : never;
@@ -1,4 +1,5 @@
1
- import z from "zod/v4";
1
+ import { JsonValue } from "cojson";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
2
3
  import {
3
4
  Account,
4
5
  CoFeed,
@@ -68,38 +69,50 @@ export type InstanceOrPrimitiveOfSchemaCoValuesNullable<
68
69
  ?
69
70
  | InstanceOrPrimitiveOfSchemaCoValuesNullable<Inner>
70
71
  | undefined
71
- : S extends z.core.$ZodUnion<infer Members>
72
- ? InstanceOrPrimitiveOfSchemaCoValuesNullable<
73
- Members[number]
74
- >
75
- : // primitives below here - we manually traverse to ensure we only allow what we can handle
76
- S extends z.core.$ZodObject<infer Shape>
77
- ? {
78
- -readonly [key in keyof Shape]: InstanceOrPrimitiveOfSchema<
79
- Shape[key]
80
- >;
81
- }
82
- : S extends z.core.$ZodArray<infer Item>
83
- ? InstanceOrPrimitiveOfSchema<Item>[]
84
- : S extends z.core.$ZodTuple<infer Items>
85
- ? {
86
- [key in keyof Items]: InstanceOrPrimitiveOfSchema<
87
- Items[key]
88
- >;
89
- }
90
- : S extends z.core.$ZodString
91
- ? string
92
- : S extends z.core.$ZodNumber
93
- ? number
94
- : S extends z.core.$ZodBoolean
95
- ? boolean
96
- : S extends z.core.$ZodLiteral<infer Literal>
97
- ? Literal
98
- : S extends z.core.$ZodDate
99
- ? Date
100
- : S extends z.core.$ZodEnum<infer Enum>
101
- ? Enum[keyof Enum]
102
- : never
72
+ : S extends z.ZodJSONSchema
73
+ ? JsonValue
74
+ : S extends z.core.$ZodUnion<infer Members>
75
+ ? InstanceOrPrimitiveOfSchemaCoValuesNullable<
76
+ Members[number]
77
+ >
78
+ : // primitives below here - we manually traverse to ensure we only allow what we can handle
79
+ S extends z.core.$ZodObject<infer Shape>
80
+ ? {
81
+ -readonly [key in keyof Shape]: InstanceOrPrimitiveOfSchema<
82
+ Shape[key]
83
+ >;
84
+ }
85
+ : S extends z.core.$ZodArray<infer Item>
86
+ ? InstanceOrPrimitiveOfSchema<Item>[]
87
+ : S extends z.core.$ZodTuple<infer Items>
88
+ ? {
89
+ [key in keyof Items]: InstanceOrPrimitiveOfSchema<
90
+ Items[key]
91
+ >;
92
+ }
93
+ : S extends z.core.$ZodString
94
+ ? string
95
+ : S extends z.core.$ZodNumber
96
+ ? number
97
+ : S extends z.core.$ZodBoolean
98
+ ? boolean
99
+ : S extends z.core.$ZodLiteral<
100
+ infer Literal
101
+ >
102
+ ? Literal
103
+ : S extends z.core.$ZodDate
104
+ ? Date
105
+ : S extends z.core.$ZodEnum<infer Enum>
106
+ ? Enum[keyof Enum]
107
+ : S extends z.core.$ZodTemplateLiteral<
108
+ infer pattern
109
+ >
110
+ ? pattern
111
+ : S extends z.core.$ZodReadonly<
112
+ infer Inner
113
+ >
114
+ ? InstanceOrPrimitiveOfSchema<Inner>
115
+ : never
103
116
  : S extends CoValueClass
104
117
  ? InstanceType<S> | null
105
118
  : never;
@@ -1,5 +1,5 @@
1
1
  import { RawAccount, RawCoList, RawCoMap } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import { zodSchemaToCoSchema } from "./runtimeConverters/zodSchemaToCoSchema.js";
4
4
 
5
5
  export function schemaUnionDiscriminatorFor(
@@ -1,5 +1,5 @@
1
1
  import { CoValueUniqueness } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import {
4
4
  Account,
5
5
  AccountCreationProps,
@@ -0,0 +1,37 @@
1
+ export {
2
+ string,
3
+ number,
4
+ boolean,
5
+ union,
6
+ object,
7
+ array,
8
+ templateLiteral,
9
+ json,
10
+ tuple,
11
+ date,
12
+ emoji,
13
+ base64,
14
+ base64url,
15
+ nanoid,
16
+ cuid,
17
+ cuid2,
18
+ ulid,
19
+ ipv4,
20
+ ipv6,
21
+ email,
22
+ url,
23
+ uuid,
24
+ literal,
25
+ enum,
26
+ cidrv4,
27
+ cidrv6,
28
+ iso,
29
+ int32,
30
+ strictObject,
31
+ discriminatedUnion,
32
+ // intersection,
33
+ // record,
34
+ int,
35
+ optional,
36
+ type ZodOptional,
37
+ } from "jazz-tools-zod-v4-rn-patch/v4";
@@ -1,5 +1,5 @@
1
1
  import { LocalNode, RawAccount } from "cojson";
2
- import z from "zod/v4";
2
+ import z from "jazz-tools-zod-v4-rn-patch/v4";
3
3
  import {
4
4
  Account,
5
5
  AccountClass,
@@ -21,8 +21,6 @@ import { PlainTextSchema } from "./schemaTypes/PlainTextSchema.js";
21
21
  import { RichTextSchema } from "./schemaTypes/RichTextSchema.js";
22
22
  import { InstanceOfSchema } from "./typeConverters/InstanceOfSchema.js";
23
23
  import { InstanceOfSchemaCoValuesNullable } from "./typeConverters/InstanceOfSchemaCoValuesNullable.js";
24
- import { InstanceOrPrimitiveOfSchema } from "./typeConverters/InstanceOrPrimitiveOfSchema.js";
25
- import { InstanceOrPrimitiveOfSchemaCoValuesNullable } from "./typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.js";
26
24
 
27
25
  // defining an extra type for this, otherwise BaseSchema & {...} often
28
26
  // gets expanded into a n inferred type that's too long for typescript to print
@@ -1,4 +1,4 @@
1
- import { assert, describe, expectTypeOf, test } from "vitest";
1
+ import { describe, expectTypeOf, test } from "vitest";
2
2
  import { Group, co, z } from "../exports.js";
3
3
  import { Account } from "../index.js";
4
4
  import { Loaded } from "../internal.js";
@@ -280,7 +280,7 @@ describe("CoMap", async () => {
280
280
 
281
281
  const MapWithEnumOfMaps = co.map({
282
282
  name: z.string(),
283
- child: z.discriminatedUnion([ChildA, ChildB]),
283
+ child: z.discriminatedUnion("type", [ChildA, ChildB]),
284
284
  });
285
285
 
286
286
  const mapWithEnum = MapWithEnumOfMaps.create({
@@ -416,7 +416,7 @@ describe("CoMap", async () => {
416
416
 
417
417
  const MapWithEnumOfMaps = co.map({
418
418
  name: z.string(),
419
- child: z.discriminatedUnion([ChildA, ChildB]),
419
+ child: z.discriminatedUnion("type", [ChildA, ChildB]),
420
420
  });
421
421
 
422
422
  const mapWithEnum = MapWithEnumOfMaps.create({
@@ -24,7 +24,10 @@ const BlueButtonWidget = co.map({
24
24
  blueness: z.number(),
25
25
  });
26
26
 
27
- const ButtonWidget = z.discriminatedUnion([RedButtonWidget, BlueButtonWidget]);
27
+ const ButtonWidget = z.discriminatedUnion("type", [
28
+ RedButtonWidget,
29
+ BlueButtonWidget,
30
+ ]);
28
31
 
29
32
  const SliderWidget = co.map({
30
33
  type: z.literal("slider"),
@@ -37,7 +40,7 @@ const CheckboxWidget = co.map({
37
40
  checked: z.boolean(),
38
41
  });
39
42
 
40
- const WidgetUnion = z.discriminatedUnion([
43
+ const WidgetUnion = z.discriminatedUnion("type", [
41
44
  ButtonWidget,
42
45
  SliderWidget,
43
46
  CheckboxWidget,