jazz-tools 0.18.29 → 0.18.31
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__/media/image.svelte +7 -4
- package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/media/image.types.d.ts +1 -0
- package/.svelte-kit/__package__/media/image.types.d.ts.map +1 -1
- package/.svelte-kit/__package__/tests/media/image.svelte.test.js +63 -0
- package/.turbo/turbo-build.log +60 -60
- package/CHANGELOG.md +26 -0
- package/dist/better-auth/auth/client.d.ts +1 -1
- package/dist/better-auth/auth/server.d.ts +1 -1
- package/dist/better-auth/auth/server.d.ts.map +1 -1
- package/dist/better-auth/auth/server.js.map +1 -1
- package/dist/better-auth/database-adapter/index.d.ts +3 -3
- package/dist/better-auth/database-adapter/index.d.ts.map +1 -1
- package/dist/better-auth/database-adapter/index.js +6 -2
- package/dist/better-auth/database-adapter/index.js.map +1 -1
- package/dist/better-auth/database-adapter/utils.d.ts.map +1 -1
- package/dist/browser/index.d.ts +2 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/{chunk-F55R554M.js → chunk-6BIYT3KH.js} +51 -30
- package/dist/chunk-6BIYT3KH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inspector/{custom-element-35MDW4SW.js → custom-element-RQTLPAPJ.js} +584 -298
- package/dist/inspector/custom-element-RQTLPAPJ.js.map +1 -0
- package/dist/inspector/index.js +570 -338
- package/dist/inspector/index.js.map +1 -1
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/inspector/ui/index.d.ts +6 -0
- package/dist/inspector/ui/index.d.ts.map +1 -0
- package/dist/inspector/viewer/group-view.d.ts +3 -2
- package/dist/inspector/viewer/group-view.d.ts.map +1 -1
- package/dist/inspector/viewer/page.d.ts.map +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react/media/image.d.ts +8 -0
- package/dist/react/media/image.d.ts.map +1 -1
- package/dist/react-native-core/index.js +3 -3
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/media/image.d.ts +15 -0
- package/dist/react-native-core/media/image.d.ts.map +1 -1
- package/dist/svelte/media/image.svelte +7 -4
- package/dist/svelte/media/image.svelte.d.ts.map +1 -1
- package/dist/svelte/media/image.types.d.ts +1 -0
- package/dist/svelte/media/image.types.d.ts.map +1 -1
- package/dist/svelte/tests/media/image.svelte.test.js +63 -0
- package/dist/testing.js +8 -1
- package/dist/testing.js.map +1 -1
- package/dist/tools/coValues/account.d.ts +1 -0
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/group.d.ts +3 -3
- package/dist/tools/coValues/group.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/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts +1 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/TypeOfZodSchema.d.ts +3 -1
- package/dist/tools/implementation/zodSchema/typeConverters/TypeOfZodSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodReExport.d.ts +1 -1
- package/dist/tools/implementation/zodSchema/zodReExport.d.ts.map +1 -1
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +0 -2
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/testing.d.ts +1 -0
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/tests/CoValueCoreSubscription.test.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/better-auth/auth/server.ts +7 -2
- package/src/better-auth/auth/tests/server.test.ts +39 -17
- package/src/better-auth/database-adapter/index.ts +8 -5
- package/src/better-auth/database-adapter/utils.ts +4 -0
- package/src/browser/index.ts +2 -1
- package/src/inspector/ui/index.ts +5 -0
- package/src/inspector/viewer/group-view.tsx +304 -20
- package/src/inspector/viewer/new-app.tsx +4 -4
- package/src/inspector/viewer/page.tsx +16 -2
- package/src/react/media/image.tsx +11 -2
- package/src/react/tests/media/image.test.tsx +94 -0
- package/src/react-native-core/media/image.tsx +11 -3
- package/src/svelte/media/image.svelte +7 -4
- package/src/svelte/media/image.types.ts +1 -0
- package/src/svelte/tests/media/image.svelte.test.ts +85 -0
- package/src/tools/coValues/account.ts +30 -5
- package/src/tools/coValues/group.ts +13 -12
- package/src/tools/coValues/inbox.ts +5 -5
- package/src/tools/implementation/invites.ts +3 -8
- package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +5 -1
- package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +2 -0
- package/src/tools/implementation/zodSchema/typeConverters/TypeOfZodSchema.ts +63 -50
- package/src/tools/implementation/zodSchema/zodReExport.ts +2 -2
- package/src/tools/subscribe/CoValueCoreSubscription.ts +17 -0
- package/src/tools/subscribe/SubscriptionScope.ts +1 -27
- package/src/tools/testing.ts +7 -0
- package/src/tools/{subscribe → tests}/CoValueCoreSubscription.test.ts +233 -3
- package/src/tools/tests/coFeed.branch.test.ts +14 -5
- package/src/tools/tests/coMap.test.ts +139 -42
- package/src/tools/tests/coOptional.test.ts +9 -1
- package/src/tools/tests/groupsAndAccounts.test.ts +156 -1
- package/src/tools/tests/load.test.ts +198 -1
- package/src/tools/tests/zod.test-d.ts +0 -2
- package/src/tools/tests/zod.test.ts +43 -40
- package/dist/chunk-F55R554M.js.map +0 -1
- package/dist/inspector/custom-element-35MDW4SW.js.map +0 -1
- package/dist/tools/subscribe/CoValueCoreSubscription.test.d.ts.map +0 -1
- /package/dist/tools/{subscribe → tests}/CoValueCoreSubscription.test.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/better-auth/database-adapter/index.ts","../../../src/better-auth/database-adapter/utils.ts","../../../src/better-auth/database-adapter/repository/generic.ts","../../../src/better-auth/database-adapter/repository/user.ts","../../../src/better-auth/database-adapter/repository/session.ts","../../../src/better-auth/database-adapter/repository/verification.ts","../../../src/better-auth/database-adapter/repository/account.ts","../../../src/better-auth/database-adapter/schema.ts"],"sourcesContent":["import { type AdapterDebugLogs, createAdapter } from \"better-auth/adapters\";\nimport type { Account } from \"jazz-tools\";\nimport { startWorker } from \"jazz-tools/worker\";\nimport {\n JazzRepository,\n UserRepository,\n SessionRepository,\n VerificationRepository,\n AccountRepository,\n} from \"./repository\";\nimport { createJazzSchema, tableItem2Record } from \"./schema.js\";\n\nexport interface JazzAdapterConfig {\n /**\n * Helps you debug issues with the adapter.\n */\n debugLogs?: AdapterDebugLogs;\n /**\n * The sync server to use.\n */\n syncServer: string;\n /**\n * The worker account ID to use.\n */\n accountID: string;\n /**\n * The worker account secret to use.\n */\n accountSecret: string;\n}\n\n/**\n * Creates a Better Auth database adapter that integrates with Jazz framework.\n *\n * This adapter provides a seamless integration between Better Auth and Jazz,\n * allowing you to use Jazz as database for for Better Auth's authentication system.\n *\n * @param config - Configuration object for the Jazz Better Auth adapter\n * @param config.syncServer - The Jazz sync server URL to connect to (e.g., \"wss://your-sync-server.com\")\n * @param config.accountID - The worker account ID for the Jazz worker that will handle auth operations\n * @param config.accountSecret - The worker account secret for authenticating with the Jazz sync server\n * @param config.debugLogs - Optional debug logging configuration to help troubleshoot adapter issues\n *\n * @returns A Better Auth adapter instance configured to work with Jazz\n *\n * @example\n * ```typescript\n * import { JazzBetterAuthDatabaseAdapter } from \"jazz-tools/better-auth/database-adapter\";\n * import { createAuth } from \"better-auth\";\n *\n * const auth = createAuth({\n * adapter: JazzBetterAuthDatabaseAdapter({\n * syncServer: \"wss://your-jazz-sync-server.com\",\n * accountID: \"auth-worker-account-id\",\n * accountSecret: \"your-worker-account-secret\",\n * }),\n * // ... other auth configuration\n * });\n * ```\n */\nexport const JazzBetterAuthDatabaseAdapter = (\n config: JazzAdapterConfig,\n): ReturnType<typeof createAdapter> =>\n createAdapter({\n config: {\n adapterId: \"jazz-tools-adapter\", // A unique identifier for the adapter.\n adapterName: \"Jazz Tools Adapter\", // The name of the adapter.\n debugLogs: config.debugLogs ?? false, // Whether to enable debug logs.\n supportsJSON: true, // Whether the database supports JSON. (Default: false)\n supportsDates: true, // Whether the database supports dates. (Default: true)\n supportsBooleans: true, // Whether the database supports booleans. (Default: true)\n supportsNumericIds: false, // Whether the database supports auto-incrementing numeric IDs. (Default: true)\n disableIdGeneration: true,\n },\n adapter: ({ schema }) => {\n const JazzSchema = createJazzSchema(schema);\n\n let worker: Account | undefined = undefined;\n\n async function getWorker() {\n if (worker) {\n return worker;\n }\n\n const result = await startWorker({\n AccountSchema: JazzSchema.WorkerAccount,\n syncServer: config.syncServer,\n accountID: config.accountID,\n accountSecret: config.accountSecret,\n skipInboxLoad: true,\n asActiveAccount: false,\n });\n\n worker = result.worker;\n\n return worker;\n }\n\n async function initRepository(\n model: string,\n ensureSync: boolean = false,\n ): Promise<JazzRepository> {\n let Repository: typeof JazzRepository | undefined = undefined;\n switch (model) {\n case \"user\":\n Repository = UserRepository;\n break;\n case \"session\":\n Repository = SessionRepository;\n break;\n case \"verification\":\n Repository = VerificationRepository;\n break;\n case \"account\":\n Repository = AccountRepository;\n break;\n }\n\n if (!Repository) {\n Repository = JazzRepository;\n }\n\n const worker = await getWorker();\n const database = await JazzSchema.loadDatabase(worker);\n\n const repository = new Repository(\n JazzSchema.DatabaseRoot,\n database,\n worker,\n schema,\n ensureSync,\n );\n\n return repository;\n }\n\n return {\n create: async ({ data, model, select }): Promise<any> => {\n // console.log(\"create\", { data, model, select });\n const repository = await initRepository(model, true);\n\n const created = await repository.create(model, data);\n\n await repository.ensureSync();\n\n return tableItem2Record(created);\n },\n update: async ({ model, where, update }): Promise<any> => {\n // console.log(\"update\", { model, where, update });\n const repository = await initRepository(model, true);\n\n const updated = await repository.update(\n model,\n where,\n update as Record<string, any>,\n );\n\n if (updated.length === 0) {\n return null;\n }\n\n await repository.ensureSync();\n\n return tableItem2Record(updated[0]!);\n },\n updateMany: async ({ model, where, update }) => {\n // console.log(\"updateMany\", { model, where, update });\n const repository = await initRepository(model, true);\n\n const updated = await repository.update(model, where, update);\n\n await repository.ensureSync();\n\n return updated.length;\n },\n delete: async ({ model, where }) => {\n // console.log(\"delete\", { model, where });\n const repository = await initRepository(model, true);\n\n await repository.deleteValue(model, where);\n\n await repository.ensureSync();\n },\n findOne: async ({ model, where }): Promise<any> => {\n // console.log(\"findOne\", { model, where });\n const repository = await initRepository(model);\n\n const item = await repository.findOne(model, where);\n\n return tableItem2Record(item);\n },\n findMany: async ({\n model,\n where,\n limit,\n sortBy,\n offset,\n }): Promise<any[]> => {\n const repository = await initRepository(model);\n\n const items = await repository.findMany(\n model,\n where,\n limit,\n sortBy,\n offset,\n );\n\n return items.map(tableItem2Record);\n },\n deleteMany: async ({ model, where }) => {\n const repository = await initRepository(model, true);\n\n const deleted = await repository.deleteValue(model, where);\n\n await repository.ensureSync();\n\n return deleted;\n },\n count: async ({ model, where }) => {\n // console.log(\"count\", { model, where });\n const repository = await initRepository(model);\n\n return repository.count(model, where);\n },\n };\n },\n });\n","import { CleanedWhere } from \"better-auth/adapters\";\n\nexport function filterListByWhere<T>(\n data: T[],\n where: CleanedWhere[] | undefined,\n): T[] {\n if (!Array.isArray(data)) {\n throw new Error(\"Expected data to be an array\");\n }\n\n if (where === undefined) {\n return data;\n }\n\n if (!Array.isArray(where)) {\n throw new Error(\"Expected where to be an array\");\n }\n\n // Helper to evaluate a single condition\n function evaluateCondition(item: any, condition: CleanedWhere): boolean {\n const { field, operator, value } = condition;\n const itemValue = field === \"id\" ? item.$jazz.id : item[field];\n\n switch (operator) {\n case \"eq\":\n return itemValue === value;\n case \"ne\":\n return itemValue !== value;\n case \"lt\":\n return value !== null && itemValue < value;\n case \"lte\":\n return value !== null && itemValue <= value;\n case \"gt\":\n return value !== null && itemValue > value;\n case \"gte\":\n return value !== null && itemValue >= value;\n case \"in\":\n return Array.isArray(value)\n ? (value as (string | number | boolean | Date)[]).includes(itemValue)\n : false;\n case \"contains\":\n return typeof itemValue === \"string\" && typeof value === \"string\"\n ? itemValue.includes(value)\n : false;\n case \"starts_with\":\n return typeof itemValue === \"string\" && typeof value === \"string\"\n ? itemValue.startsWith(value)\n : false;\n case \"ends_with\":\n return typeof itemValue === \"string\" && typeof value === \"string\"\n ? itemValue.endsWith(value)\n : false;\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n }\n\n // Group conditions by connector (AND/OR)\n // If no connector, default to AND between all\n return data.filter((item) => {\n let result: boolean = true;\n for (let i = 0; i < where.length; i++) {\n const condition = where[i]!;\n const matches = evaluateCondition(item, condition);\n if (i === 0) {\n result = matches;\n } else {\n const connector = condition.connector || \"AND\";\n if (connector === \"AND\") {\n result = result && matches;\n } else if (connector === \"OR\") {\n result = result || matches;\n } else {\n throw new Error(`Unsupported connector: ${connector}`);\n }\n }\n }\n return result;\n });\n}\n\nexport function sortListByField<T extends Record<string, any> | null>(\n data: T[],\n sort?: { field: string; direction: \"asc\" | \"desc\" },\n): T[] {\n if (!sort) {\n return data;\n }\n\n const { field, direction } = sort;\n\n data.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n\n if (typeof a[field] === \"string\" && typeof b[field] === \"string\") {\n return direction === \"asc\"\n ? a[field].localeCompare(b[field])\n : b[field].localeCompare(a[field]);\n }\n\n return direction === \"asc\" ? a[field] - b[field] : b[field] - a[field];\n });\n\n return data;\n}\n\nexport function paginateList<T>(\n data: T[],\n limit: number | undefined,\n offset: number | undefined,\n): T[] {\n if (offset === undefined && limit === undefined) {\n return data;\n }\n\n if (limit === 0) {\n return [];\n }\n\n let start = offset ?? 0;\n if (start < 0) {\n start = 0;\n }\n\n const end = limit ? start + limit : undefined;\n return data.slice(start, end);\n}\n\nfunction isWhereByField(field: string, where: CleanedWhere): boolean {\n return (\n where.field === field &&\n where.operator === \"eq\" &&\n where.connector === \"AND\"\n );\n}\n\nexport function isWhereBySingleField<T extends string>(\n field: T,\n where: CleanedWhere[] | undefined,\n): where is [{ field: T; operator: \"eq\"; value: string; connector: \"AND\" }] {\n if (where === undefined || where.length !== 1) {\n return false;\n }\n\n const [cond] = where;\n if (!cond) {\n return false;\n }\n\n return isWhereByField(field, cond);\n}\n\nexport function containWhereByField<T extends string>(\n field: T,\n where: CleanedWhere[] | undefined,\n): boolean {\n if (where === undefined) {\n return false;\n }\n\n return where.some((cond) => isWhereByField(field, cond));\n}\n\nexport function extractWhereByField<T extends string>(\n field: T,\n where: CleanedWhere[] | undefined,\n): [CleanedWhere | undefined, CleanedWhere[]] {\n if (where === undefined) {\n return [undefined, []];\n }\n\n return [\n where.find((cond) => isWhereByField(field, cond)),\n where.filter((cond) => !isWhereByField(field, cond)),\n ];\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { BetterAuthDbSchema } from \"better-auth/db\";\nimport { Account, CoList, CoMap, Group, co } from \"jazz-tools\";\nimport type { Database, TableItem } from \"../schema.js\";\nimport {\n filterListByWhere,\n isWhereBySingleField,\n paginateList,\n sortListByField,\n} from \"../utils.js\";\n\nexport class JazzRepository {\n protected databaseSchema: Database;\n protected databaseRoot: co.loaded<Database, { group: true }>;\n protected worker: Account;\n protected owner: Group;\n protected betterAuthSchema: BetterAuthDbSchema;\n\n private coValuesTracker:\n | {\n done: () => Set<`co_z${string}`>;\n }\n | undefined = undefined;\n\n constructor(\n databaseSchema: Database,\n databaseRoot: co.loaded<Database, { group: true }>,\n worker: Account,\n betterAuthSchema: BetterAuthDbSchema = {},\n ensureSync: boolean = false,\n ) {\n this.databaseSchema = databaseSchema;\n this.databaseRoot = databaseRoot;\n this.worker = worker;\n this.owner = databaseRoot.group;\n this.betterAuthSchema = betterAuthSchema;\n\n if (ensureSync)\n this.coValuesTracker =\n worker.$jazz.raw.core.node.syncManager.trackDirtyCoValues();\n }\n\n ensureSync() {\n if (!this.coValuesTracker)\n throw new Error(\"Repository wasn't initialized with ensureSync option\");\n\n return Promise.all(\n Array.from(this.coValuesTracker.done(), (id) =>\n this.worker.$jazz.raw.core.node.syncManager.waitForSync(id),\n ),\n );\n }\n\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n const schema = this.getSchema(model);\n\n const resolved = await this.databaseRoot.$jazz.ensureLoaded({\n resolve: {\n tables: {\n [model]: true,\n },\n },\n });\n\n const list = resolved.tables?.[model] as unknown as CoList<CoMap>;\n\n if (!uniqueId) {\n // Use the same owner of the table.\n const node = schema.create(data, {\n owner: list.$jazz.owner,\n });\n\n list.$jazz.push(node);\n\n return node;\n }\n\n // If we have a unique id, we must check for soft deleted items first\n const existingNode = (await schema.loadUnique(\n uniqueId,\n list.$jazz.owner.$jazz.id,\n {\n loadAs: this.worker,\n },\n )) as CoMap | null;\n\n // if the entity exists and is not soft deleted, we must throw an error\n if (existingNode && existingNode.$jazz?.raw.get(\"_deleted\") !== true) {\n throw new Error(\"Entity already exists\");\n }\n\n // create the entity or update the deleted one\n const node = await schema.upsertUnique({\n value: {\n ...data,\n _deleted: false,\n },\n owner: list.$jazz.owner,\n unique: uniqueId,\n });\n\n if (!node) {\n throw new Error(\"Unable to create entity\");\n }\n\n list.$jazz.push(node);\n\n return node;\n }\n\n async findOne(\n model: string,\n where: CleanedWhere[],\n ): Promise<TableItem | null> {\n return this.findMany(model, where, 1).then((users) => users?.at(0) ?? null);\n }\n\n async findById(\n model: string,\n where: [{ field: \"id\"; operator: \"eq\"; value: string; connector: \"AND\" }],\n ): Promise<TableItem | null> {\n const id = where[0]!.value;\n\n if (!id.startsWith(\"co_\")) {\n return null;\n }\n\n const node = await this.getSchema(model).load(id, { loadAs: this.worker });\n\n if (!node) {\n return null;\n }\n\n if (node.$jazz.raw.get(\"_deleted\")) {\n return null;\n }\n\n return node;\n }\n\n async findByUnique(\n model: string,\n where: [{ field: string; operator: \"eq\"; value: string; connector: \"AND\" }],\n ): Promise<TableItem | null> {\n const value = where[0]!.value;\n\n const node = await this.getSchema(model).loadUnique(\n value,\n this.owner.$jazz.id,\n {\n loadAs: this.worker,\n },\n );\n\n if (!node) {\n return null;\n }\n\n if (node.$jazz.raw.get(\"_deleted\")) {\n return null;\n }\n\n return node;\n }\n\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n // ensure schema exists\n this.getSchema(model);\n\n if (isWhereBySingleField(\"id\", where)) {\n return this.findById(model, where).then((node) => (node ? [node] : []));\n }\n\n const resolvedRoot = await this.databaseRoot.$jazz.ensureLoaded({\n resolve: {\n tables: {\n [model]: {\n $each: true,\n },\n },\n },\n });\n\n const list = resolvedRoot.tables?.[model] as CoList<CoMap> | undefined;\n\n if (!list) {\n return [];\n }\n\n return this.filterSortPaginateList(list, where, limit, sortBy, offset);\n }\n\n async update(\n model: string,\n where: CleanedWhere[],\n update: Record<string, any>,\n ): Promise<TableItem[]> {\n const nodes = await this.findMany(model, where);\n\n if (nodes.length === 0) {\n return [];\n }\n\n for (const node of nodes) {\n for (const [key, value] of Object.entries(\n update as Record<string, any>,\n )) {\n node.$jazz.set(key, value);\n }\n }\n\n return nodes;\n }\n\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const items = await this.findMany(model, where);\n\n if (items.length === 0) {\n return 0;\n }\n\n const resolved = await this.databaseRoot.$jazz.ensureLoaded({\n resolve: {\n tables: {\n [model]: {\n $each: true,\n },\n },\n },\n });\n\n if (!resolved) {\n throw new Error(\"Unable to load values\");\n }\n\n const list = resolved?.tables?.[model] as unknown as CoList<CoMap>;\n\n for (const toBeDeleted of items) {\n // Get entries without trigger the shallow load\n const index = [...list.entries()].findIndex(\n ([_, value]) => value && value.$jazz.id === toBeDeleted.$jazz.id,\n );\n\n toBeDeleted.$jazz.set(\"_deleted\", true);\n\n if (index !== -1) {\n list.$jazz.remove(index);\n }\n }\n\n return items.length;\n }\n\n async count(\n model: string,\n where: CleanedWhere[] | undefined,\n ): Promise<number> {\n return this.findMany(model, where).then((values) => values.length);\n }\n\n protected getSchema(model: string) {\n const schema = this.databaseSchema.shape.tables.shape[model]?.element;\n if (!schema) {\n throw new Error(`Schema for model \"${model}\" not found`);\n }\n return schema;\n }\n\n protected filterSortPaginateList<T extends TableItem>(\n list: CoList<CoMap | null>,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): T[] {\n // ignore nullable values and soft deleted items\n return [\n list.filter(\n (item) => item !== null && item.$jazz.raw.get(\"_deleted\") !== true,\n ),\n ]\n .map((list) => filterListByWhere(list, where))\n .map((list) => sortListByField(list, sortBy))\n .map((list) => paginateList(list, limit, offset))\n .at(0)! as T[];\n }\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { co, z } from \"jazz-tools\";\nimport { JazzRepository } from \"./generic\";\nimport { isWhereBySingleField } from \"../utils\";\nimport type { TableItem } from \"../schema\";\n\nconst EmailIndex = co.map({ user: z.string().nullable() });\n\nexport class UserRepository extends JazzRepository {\n /**\n * Custom logic:\n * - sessions are stored inside the user object\n * - keep sync email index\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n const SessionListSchema = this.databaseSchema.shape.tables.shape.session;\n\n if (!SessionListSchema) {\n throw new Error(\"Session list schema not found\");\n }\n\n const userEmail = data[this.getEmailProperty()] as string;\n\n const emailIndex = await this.loadEmailIndex(userEmail);\n\n if (emailIndex?.user) {\n throw new Error(\"Email already exists\");\n }\n\n const user = await super.create(model, data, uniqueId);\n\n await this.updateEmailIndex(userEmail, user.$jazz.id);\n\n user.$jazz.set(\n \"sessions\",\n co.list(SessionListSchema).create([], user.$jazz.owner),\n );\n\n return user;\n }\n\n /**\n * Custom logic:\n * - if the email is in the where clause, find by email\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(\"email\", where)) {\n return this.findByEmail(where[0].value as string);\n }\n\n return super.findMany(model, where, limit, sortBy, offset);\n }\n\n private getEmailProperty(): string {\n return this.betterAuthSchema.user?.fields.email?.fieldName || \"email\";\n }\n\n private async findByEmail(email: string): Promise<TableItem[]> {\n const emailIndex = await this.loadEmailIndex(email);\n\n const user = emailIndex?.user;\n\n if (!user) {\n return [];\n }\n\n return this.findById(\"user\", [\n { field: \"id\", operator: \"eq\", value: user, connector: \"AND\" },\n ]).then((user) => (user ? [user] : []));\n }\n\n /**\n * Custom logic:\n * - if the email is changed, update the email index\n */\n async update(\n model: string,\n where: CleanedWhere[],\n update: Record<string, any>,\n ): Promise<TableItem[]> {\n const nodes = await this.findMany(model, where);\n if (nodes.length === 0) {\n return [];\n }\n\n const newEmail = (update as Record<string, any>)[this.getEmailProperty()] as\n | string\n | undefined;\n\n for (const node of nodes) {\n const oldEmail = node.$jazz.raw.get(this.getEmailProperty()) as\n | string\n | undefined;\n for (const [key, value] of Object.entries(\n update as Record<string, any>,\n )) {\n node.$jazz.set(key, value);\n }\n\n // if the email is changed, update the email index\n if (\n oldEmail !== newEmail &&\n oldEmail !== undefined &&\n newEmail !== undefined\n ) {\n await this.updateEmailIndex(oldEmail, null);\n await this.updateEmailIndex(newEmail, node.$jazz.id);\n }\n }\n\n return nodes;\n }\n\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const nodes = await this.findMany(model, where);\n\n const deleted = await super.deleteValue(model, where);\n\n for (const node of nodes) {\n const email = node.$jazz.raw.get(this.getEmailProperty()) as\n | string\n | undefined;\n if (email) {\n await this.updateEmailIndex(email, null);\n }\n }\n\n return deleted;\n }\n\n private async loadEmailIndex(email: string) {\n const emailIndex = await EmailIndex.loadUnique(email, this.owner.$jazz.id, {\n loadAs: this.worker,\n });\n\n return emailIndex;\n }\n\n private async updateEmailIndex(email: string, userId: string | null) {\n await EmailIndex.upsertUnique({\n value: {\n user: userId,\n },\n unique: email,\n owner: this.owner,\n });\n }\n}\n","import { BetterAuthDbSchema } from \"better-auth/db\";\nimport { CleanedWhere } from \"better-auth/adapters\";\nimport { co, Account } from \"jazz-tools\";\nimport { JazzRepository } from \"./generic\";\nimport { UserRepository } from \"./user\";\nimport {\n containWhereByField,\n extractWhereByField,\n filterListByWhere,\n isWhereBySingleField,\n} from \"../utils\";\nimport type { Database, TableItem } from \"../schema\";\n\ntype UserSchema = co.Map<{\n sessions: co.List<co.Map<any>>;\n}>;\n\nexport class SessionRepository extends JazzRepository {\n protected userRepository: UserRepository;\n\n constructor(\n databaseSchema: Database,\n databaseRoot: co.loaded<Database, { group: true }>,\n worker: Account,\n betterAuthSchema: BetterAuthDbSchema = {},\n ensureSync: boolean = false,\n ) {\n super(databaseSchema, databaseRoot, worker, betterAuthSchema, ensureSync);\n\n this.userRepository = new UserRepository(\n databaseSchema,\n databaseRoot,\n worker,\n betterAuthSchema,\n );\n }\n\n /**\n * Custom logic: sessions are stored inside the user object\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n if (typeof data.token !== \"string\" || typeof data.userId !== \"string\") {\n throw new Error(\"Token and userId are required for session creation\");\n }\n\n const user = await this.userRepository.findById(\"user\", [\n {\n field: \"id\",\n operator: \"eq\",\n value: data.userId,\n connector: \"AND\",\n },\n ]);\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const { sessions } = await user.$jazz.ensureLoaded({\n resolve: {\n sessions: true,\n },\n });\n\n const session = this.getSchema(\"session\").create(data, {\n unique: data.token,\n owner: this.owner,\n });\n\n sessions.$jazz.push(session);\n\n return session;\n }\n\n /**\n * Custom logic: sessions are stored inside the user object.\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(\"id\", where)) {\n return this.findById(model, where).then((node) => (node ? [node] : []));\n }\n\n if (isWhereBySingleField(\"token\", where)) {\n return this.findByUnique(model, where).then((node) =>\n node ? [node] : [],\n );\n }\n\n if (containWhereByField(\"userId\", where)) {\n const [userIdWhere, otherWhere] = extractWhereByField(\"userId\", where);\n\n const user = await this.userRepository.findById(\"user\", [\n {\n field: \"id\",\n operator: \"eq\",\n value: userIdWhere!.value as string,\n connector: \"AND\",\n },\n ]);\n\n if (!user) {\n console.warn(\"Trying to find user's sessions, but user not found\");\n return [];\n }\n\n const { sessions } = await user.$jazz.ensureLoaded({\n resolve: {\n sessions: {\n $each: true,\n },\n },\n });\n\n return this.filterSortPaginateList(\n sessions,\n otherWhere,\n limit,\n sortBy,\n offset,\n );\n }\n\n throw new Error(\n \"Unable to find session with where: \" + JSON.stringify(where),\n );\n }\n\n /**\n * Custom logic: sessions are stored inside the user object.\n */\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const items = await this.findMany(model, where);\n if (items.length === 0) {\n return 0;\n }\n\n const userId = items[0]!.userId;\n\n return this.deleteSession(userId, items);\n }\n\n private async deleteSession(\n userId: string,\n items: TableItem[],\n ): Promise<number> {\n const user = await this.userRepository.findById(\"user\", [\n {\n field: \"id\",\n operator: \"eq\",\n value: userId,\n connector: \"AND\",\n },\n ]);\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const { sessions } = await user.$jazz.ensureLoaded({\n resolve: {\n sessions: true,\n },\n });\n\n for (const toBeDeleted of items) {\n // Get entries without trigger the shallow load\n const index = [...sessions.entries()].findIndex(\n ([_, value]) => value && value.$jazz.id === toBeDeleted.$jazz.id,\n );\n\n toBeDeleted.$jazz.set(\"_deleted\", true);\n\n if (index !== -1) {\n sessions.$jazz.remove(index);\n }\n }\n\n return items.length;\n }\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { JazzRepository } from \"./generic\";\nimport { isWhereBySingleField } from \"../utils\";\nimport type { TableItem } from \"../schema\";\n\nexport class VerificationRepository extends JazzRepository {\n /**\n * Custom logic: property identifier is used as uniqueId\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n return super.create(model, data, data[\"identifier\"]);\n }\n\n /**\n * Custom logic: property identifier is used as uniqueId\n * If we look for identifier, we use findByUnique instead of findMany\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(\"identifier\", where)) {\n return this.findByUnique(model, where).then((node) =>\n node ? [node] : [],\n );\n }\n\n return super.findMany(model, where, limit, sortBy, offset);\n }\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { co, z } from \"jazz-tools\";\nimport { JazzRepository } from \"./generic\";\nimport { isWhereBySingleField } from \"../utils\";\nimport type { TableItem } from \"../schema\";\n\n/**\n * This list stores an array of covalues ID\n * mapped by the accountID property.\n * Because accountId is not unique, and it is used on every social login\n */\nconst AccountIdIndex = co.list(z.string());\n\nexport class AccountRepository extends JazzRepository {\n /**\n * Custom logic:\n * - keep sync accountId index\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n const account = await super.create(model, data, uniqueId);\n\n await this.updateAccountIdIndex(\n account[this.getAccountIdProperty()],\n account.$jazz.id,\n );\n\n return account;\n }\n\n /**\n * Custom logic:\n * - if the accountId is in the where clause, get the ids from the index\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(this.getAccountIdProperty(), where)) {\n const accountIdIndex = await this.getAccountIdIndex(where[0].value);\n\n const ids = accountIdIndex ?? [];\n\n if (ids.length === 0) {\n return [];\n }\n\n // except for accountId clashing from different social providers,\n // ids should contain a single id, max two\n const results = await Promise.all(\n ids.map((id) =>\n super.findById(model, [\n { field: \"id\", operator: \"eq\", value: id, connector: \"AND\" },\n ]),\n ),\n );\n\n return results.filter((value) => value !== null);\n }\n\n return super.findMany(model, where, limit, sortBy, offset);\n }\n\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const nodes = await this.findMany(model, where);\n\n const deleted = await super.deleteValue(model, where);\n\n for (const node of nodes) {\n const accountId = node.$jazz.raw.get(this.getAccountIdProperty()) as\n | string\n | undefined;\n\n if (accountId) {\n await this.deleteAccountIdIndex(accountId, node.$jazz.id);\n }\n }\n\n return deleted;\n }\n\n private async getAccountIdIndex(accountId: string) {\n const indexUnique = this.getAccountIdProperty() + \"_\" + accountId;\n\n const accountIdIndex = await AccountIdIndex.loadUnique(\n indexUnique,\n this.owner.$jazz.id,\n {\n loadAs: this.worker,\n },\n );\n\n return accountIdIndex;\n }\n\n private async updateAccountIdIndex(accountId: string, entityId: string) {\n const accountIdIndex = await this.getAccountIdIndex(accountId);\n\n const ids = accountIdIndex ?? [];\n\n await AccountIdIndex.upsertUnique({\n value: [...ids, entityId],\n unique: this.getAccountIdProperty() + \"_\" + accountId,\n owner: this.owner,\n });\n }\n\n private async deleteAccountIdIndex(accountId: string, entityId: string) {\n const accountIdIndex = await this.getAccountIdIndex(accountId);\n\n const ids = accountIdIndex ?? [];\n\n await AccountIdIndex.upsertUnique({\n value: ids.filter((id) => id !== entityId),\n unique: this.getAccountIdProperty() + \"_\" + accountId,\n owner: this.owner,\n });\n }\n\n private getAccountIdProperty(): string {\n return (\n this.betterAuthSchema.account?.fields.accountId?.fieldName || \"accountId\"\n );\n }\n}\n","import { BetterAuthDbSchema, FieldAttribute } from \"better-auth/db\";\nimport { Group, co, z } from \"jazz-tools\";\n\ntype TableRow = co.Map<any>;\nexport type TableItem = co.loaded<TableRow>;\n\ntype Table = co.List<TableRow>;\nexport type Database = co.Map<{\n group: typeof Group;\n tables: co.Map<{\n [key: string]: Table;\n }>;\n}>;\n\ntype WorkerAccount = co.Account<{\n profile: co.Profile;\n root: co.Map<any>;\n}>;\n\ntype JazzSchema = {\n WorkerAccount: WorkerAccount;\n DatabaseRoot: Database;\n betterAuthSchema: BetterAuthDbSchema;\n loadDatabase: (\n account: co.loaded<co.Account>,\n options?: Parameters<Database[\"loadUnique\"]>[2],\n ) => Promise<co.loaded<Database, { group: true }>>;\n};\n\nconst DATABASE_ROOT_ID = \"better-auth-root\";\n\nexport function createJazzSchema(schema: BetterAuthDbSchema): JazzSchema {\n const tablesSchema = generateSchemaFromBetterAuthSchema(schema);\n\n const DatabaseRoot: Database = co.map({\n group: Group,\n tables: co.map(tablesSchema),\n });\n\n const WorkerAccount: WorkerAccount = co\n .account({\n profile: co.profile(),\n root: co.map({}),\n })\n .withMigration(async (account) => {\n const dbRoot = await DatabaseRoot.loadUnique(\n DATABASE_ROOT_ID,\n account.$jazz.id,\n {\n resolve: {\n group: true,\n tables: true,\n },\n loadAs: account,\n },\n );\n\n if (!dbRoot) {\n // Create a group for the first time\n // it will be the owner of the all tables and data\n const adminGroup = Group.create({ owner: account });\n await DatabaseRoot.upsertUnique({\n value: {\n group: adminGroup,\n // create empty tables for each model\n tables: co\n .map(tablesSchema)\n .create(\n Object.fromEntries(\n Object.entries(tablesSchema).map(([key, value]) => [\n key,\n value.create([], adminGroup),\n ]),\n ),\n adminGroup,\n ),\n },\n unique: DATABASE_ROOT_ID,\n owner: account,\n });\n } else {\n // partial migrations\n for (const [key, value] of Object.entries(\n DatabaseRoot.shape.tables.shape,\n )) {\n if (dbRoot.tables[key] === undefined) {\n dbRoot.tables.$jazz.set(key, value.create([], dbRoot.group));\n }\n }\n }\n });\n\n return {\n WorkerAccount,\n DatabaseRoot,\n betterAuthSchema: schema,\n async loadDatabase(account, options) {\n if (\n options?.resolve === false ||\n (typeof options?.resolve === \"object\" &&\n options?.resolve.group !== true)\n ) {\n throw new Error(\"Group is required to load the database\");\n }\n\n const db = (await DatabaseRoot.loadUnique(\n DATABASE_ROOT_ID,\n account.$jazz.id,\n {\n resolve: {\n group: true,\n tables: true,\n },\n loadAs: account,\n ...options,\n },\n )) as co.loaded<Database, { group: true }>;\n\n if (!db) {\n throw new Error(\"Database not found\");\n }\n\n return db;\n },\n };\n}\n\ntype ZodPrimitiveSchema =\n | z.z.ZodString\n | z.z.ZodNumber\n | z.z.ZodBoolean\n | z.z.ZodNull\n | z.z.ZodDate\n | z.z.ZodLiteral;\ntype ZodOptionalPrimitiveSchema = z.z.ZodOptional<ZodPrimitiveSchema>;\n\nfunction generateSchemaFromBetterAuthSchema(schema: BetterAuthDbSchema) {\n const tablesSchema: Record<string, Table> = {};\n\n for (const [key, value] of Object.entries(schema)) {\n const modelShape: Record<\n string,\n ZodPrimitiveSchema | ZodOptionalPrimitiveSchema\n > = {\n _deleted: z.boolean(),\n };\n\n for (const [fieldName, field] of Object.entries(value.fields)) {\n modelShape[field.fieldName || fieldName] = convertFieldToCoValue(field);\n }\n\n const coMap = co.map(modelShape);\n tablesSchema[key] = co.list(coMap);\n }\n\n if (tablesSchema[\"user\"] && tablesSchema[\"session\"]) {\n tablesSchema[\"user\"] = co.list(\n co\n .map({\n ...tablesSchema[\"user\"].element.shape,\n sessions: tablesSchema[\"session\"],\n })\n .withMigration((user) => {\n if (user.sessions === undefined) {\n user.$jazz.set(\n \"sessions\",\n tablesSchema[\"session\"]!.create([], user.$jazz.owner),\n );\n }\n }),\n );\n } else {\n throw new Error(\n \"Cannot find user and session tables, sessions will not be persisted\",\n );\n }\n\n return tablesSchema;\n}\n\nfunction convertFieldToCoValue(field: FieldAttribute) {\n let zodType: ZodPrimitiveSchema | ZodOptionalPrimitiveSchema;\n\n switch (field.type) {\n case \"string\":\n zodType = z.string();\n break;\n case \"number\":\n zodType = z.number();\n break;\n case \"boolean\":\n zodType = z.boolean();\n break;\n case \"date\":\n zodType = z.date();\n break;\n default:\n throw new Error(`Unsupported field type: ${field.type}`);\n }\n\n if (field.required === false) {\n zodType = zodType.optional();\n }\n\n return zodType;\n}\n\nexport function tableItem2Record(\n tableItem: TableItem | null | undefined,\n): Record<string, any> | null | undefined {\n if (!tableItem) {\n return tableItem;\n }\n\n // tableItem.toJSON() transforms Date objects to ISO strings\n // by returning ...rest, we keep the objects\n const { $jazz, ...rest } = tableItem;\n return {\n ...rest,\n id: $jazz.id,\n };\n}\n"],"mappings":";AAAA,SAAgC,qBAAqB;AAErD,SAAS,mBAAmB;;;ACArB,SAAS,kBACd,MACA,OACK;AACL,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAGA,WAAS,kBAAkB,MAAW,WAAkC;AACtE,UAAM,EAAE,OAAO,UAAU,MAAM,IAAI;AACnC,UAAM,YAAY,UAAU,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK;AAE7D,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,cAAc;AAAA,MACvB,KAAK;AACH,eAAO,cAAc;AAAA,MACvB,KAAK;AACH,eAAO,UAAU,QAAQ,YAAY;AAAA,MACvC,KAAK;AACH,eAAO,UAAU,QAAQ,aAAa;AAAA,MACxC,KAAK;AACH,eAAO,UAAU,QAAQ,YAAY;AAAA,MACvC,KAAK;AACH,eAAO,UAAU,QAAQ,aAAa;AAAA,MACxC,KAAK;AACH,eAAO,MAAM,QAAQ,KAAK,IACrB,MAA+C,SAAS,SAAS,IAClE;AAAA,MACN,KAAK;AACH,eAAO,OAAO,cAAc,YAAY,OAAO,UAAU,WACrD,UAAU,SAAS,KAAK,IACxB;AAAA,MACN,KAAK;AACH,eAAO,OAAO,cAAc,YAAY,OAAO,UAAU,WACrD,UAAU,WAAW,KAAK,IAC1B;AAAA,MACN,KAAK;AACH,eAAO,OAAO,cAAc,YAAY,OAAO,UAAU,WACrD,UAAU,SAAS,KAAK,IACxB;AAAA,MACN;AACE,cAAM,IAAI,MAAM,yBAAyB,QAAQ,EAAE;AAAA,IACvD;AAAA,EACF;AAIA,SAAO,KAAK,OAAO,CAAC,SAAS;AAC3B,QAAI,SAAkB;AACtB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,YAAY,MAAM,CAAC;AACzB,YAAM,UAAU,kBAAkB,MAAM,SAAS;AACjD,UAAI,MAAM,GAAG;AACX,iBAAS;AAAA,MACX,OAAO;AACL,cAAM,YAAY,UAAU,aAAa;AACzC,YAAI,cAAc,OAAO;AACvB,mBAAS,UAAU;AAAA,QACrB,WAAW,cAAc,MAAM;AAC7B,mBAAS,UAAU;AAAA,QACrB,OAAO;AACL,gBAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,gBACd,MACA,MACK;AACL,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,UAAU,IAAI;AAE7B,OAAK,KAAK,CAAC,GAAG,MAAM;AAClB,QAAI,MAAM,QAAQ,MAAM,MAAM;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,EAAE,KAAK,MAAM,YAAY,OAAO,EAAE,KAAK,MAAM,UAAU;AAChE,aAAO,cAAc,QACjB,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,IAC/B,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC;AAAA,IACrC;AAEA,WAAO,cAAc,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,EACvE,CAAC;AAED,SAAO;AACT;AAEO,SAAS,aACd,MACA,OACA,QACK;AACL,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,GAAG;AACf,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,QAAQ,UAAU;AACtB,MAAI,QAAQ,GAAG;AACb,YAAQ;AAAA,EACV;AAEA,QAAM,MAAM,QAAQ,QAAQ,QAAQ;AACpC,SAAO,KAAK,MAAM,OAAO,GAAG;AAC9B;AAEA,SAAS,eAAe,OAAe,OAA8B;AACnE,SACE,MAAM,UAAU,SAChB,MAAM,aAAa,QACnB,MAAM,cAAc;AAExB;AAEO,SAAS,qBACd,OACA,OAC0E;AAC1E,MAAI,UAAU,UAAa,MAAM,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,IAAI,IAAI;AACf,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,OAAO,IAAI;AACnC;AAEO,SAAS,oBACd,OACA,OACS;AACT,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,KAAK,CAAC,SAAS,eAAe,OAAO,IAAI,CAAC;AACzD;AAEO,SAAS,oBACd,OACA,OAC4C;AAC5C,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC,QAAW,CAAC,CAAC;AAAA,EACvB;AAEA,SAAO;AAAA,IACL,MAAM,KAAK,CAAC,SAAS,eAAe,OAAO,IAAI,CAAC;AAAA,IAChD,MAAM,OAAO,CAAC,SAAS,CAAC,eAAe,OAAO,IAAI,CAAC;AAAA,EACrD;AACF;;;ACtKO,IAAM,iBAAN,MAAqB;AAAA,EAa1B,YACE,gBACA,cACA,QACA,mBAAuC,CAAC,GACxC,aAAsB,OACtB;AAZF,SAAQ,kBAIQ;AASd,SAAK,iBAAiB;AACtB,SAAK,eAAe;AACpB,SAAK,SAAS;AACd,SAAK,QAAQ,aAAa;AAC1B,SAAK,mBAAmB;AAExB,QAAI;AACF,WAAK,kBACH,OAAO,MAAM,IAAI,KAAK,KAAK,YAAY,mBAAmB;AAAA,EAChE;AAAA,EAEA,aAAa;AACX,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,sDAAsD;AAExE,WAAO,QAAQ;AAAA,MACb,MAAM;AAAA,QAAK,KAAK,gBAAgB,KAAK;AAAA,QAAG,CAAC,OACvC,KAAK,OAAO,MAAM,IAAI,KAAK,KAAK,YAAY,YAAY,EAAE;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,OACA,MACA,UACoB;AACpB,UAAM,SAAS,KAAK,UAAU,KAAK;AAEnC,UAAM,WAAW,MAAM,KAAK,aAAa,MAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,QACP,QAAQ;AAAA,UACN,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,OAAO,SAAS,SAAS,KAAK;AAEpC,QAAI,CAAC,UAAU;AAEb,YAAMA,QAAO,OAAO,OAAO,MAAM;AAAA,QAC/B,OAAO,KAAK,MAAM;AAAA,MACpB,CAAC;AAED,WAAK,MAAM,KAAKA,KAAI;AAEpB,aAAOA;AAAA,IACT;AAGA,UAAM,eAAgB,MAAM,OAAO;AAAA,MACjC;AAAA,MACA,KAAK,MAAM,MAAM,MAAM;AAAA,MACvB;AAAA,QACE,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAGA,QAAI,gBAAgB,aAAa,OAAO,IAAI,IAAI,UAAU,MAAM,MAAM;AACpE,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAGA,UAAM,OAAO,MAAM,OAAO,aAAa;AAAA,MACrC,OAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,KAAK,MAAM;AAAA,MAClB,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,SAAK,MAAM,KAAK,IAAI;AAEpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QACJ,OACA,OAC2B;AAC3B,WAAO,KAAK,SAAS,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,OAAO,GAAG,CAAC,KAAK,IAAI;AAAA,EAC5E;AAAA,EAEA,MAAM,SACJ,OACA,OAC2B;AAC3B,UAAM,KAAK,MAAM,CAAC,EAAG;AAErB,QAAI,CAAC,GAAG,WAAW,KAAK,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,KAAK,UAAU,KAAK,EAAE,KAAK,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;AAEzE,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,MAAM,IAAI,IAAI,UAAU,GAAG;AAClC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aACJ,OACA,OAC2B;AAC3B,UAAM,QAAQ,MAAM,CAAC,EAAG;AAExB,UAAM,OAAO,MAAM,KAAK,UAAU,KAAK,EAAE;AAAA,MACvC;AAAA,MACA,KAAK,MAAM,MAAM;AAAA,MACjB;AAAA,QACE,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,MAAM,IAAI,IAAI,UAAU,GAAG;AAClC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SACJ,OACA,OACA,OACA,QACA,QACsB;AAEtB,SAAK,UAAU,KAAK;AAEpB,QAAI,qBAAqB,MAAM,KAAK,GAAG;AACrC,aAAO,KAAK,SAAS,OAAO,KAAK,EAAE,KAAK,CAAC,SAAU,OAAO,CAAC,IAAI,IAAI,CAAC,CAAE;AAAA,IACxE;AAEA,UAAM,eAAe,MAAM,KAAK,aAAa,MAAM,aAAa;AAAA,MAC9D,SAAS;AAAA,QACP,QAAQ;AAAA,UACN,CAAC,KAAK,GAAG;AAAA,YACP,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,OAAO,aAAa,SAAS,KAAK;AAExC,QAAI,CAAC,MAAM;AACT,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,KAAK,uBAAuB,MAAM,OAAO,OAAO,QAAQ,MAAM;AAAA,EACvE;AAAA,EAEA,MAAM,OACJ,OACA,OACA,QACsB;AACtB,UAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK;AAE9C,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,eAAW,QAAQ,OAAO;AACxB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,QAChC;AAAA,MACF,GAAG;AACD,aAAK,MAAM,IAAI,KAAK,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,OAAe,OAAwC;AACvE,UAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK;AAE9C,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,KAAK,aAAa,MAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,QACP,QAAQ;AAAA,UACN,CAAC,KAAK,GAAG;AAAA,YACP,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,UAAM,OAAO,UAAU,SAAS,KAAK;AAErC,eAAW,eAAe,OAAO;AAE/B,YAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE;AAAA,QAChC,CAAC,CAAC,GAAG,KAAK,MAAM,SAAS,MAAM,MAAM,OAAO,YAAY,MAAM;AAAA,MAChE;AAEA,kBAAY,MAAM,IAAI,YAAY,IAAI;AAEtC,UAAI,UAAU,IAAI;AAChB,aAAK,MAAM,OAAO,KAAK;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,MACJ,OACA,OACiB;AACjB,WAAO,KAAK,SAAS,OAAO,KAAK,EAAE,KAAK,CAAC,WAAW,OAAO,MAAM;AAAA,EACnE;AAAA,EAEU,UAAU,OAAe;AACjC,UAAM,SAAS,KAAK,eAAe,MAAM,OAAO,MAAM,KAAK,GAAG;AAC9D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,qBAAqB,KAAK,aAAa;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EAEU,uBACR,MACA,OACA,OACA,QACA,QACK;AAEL,WAAO;AAAA,MACL,KAAK;AAAA,QACH,CAAC,SAAS,SAAS,QAAQ,KAAK,MAAM,IAAI,IAAI,UAAU,MAAM;AAAA,MAChE;AAAA,IACF,EACG,IAAI,CAACC,UAAS,kBAAkBA,OAAM,KAAK,CAAC,EAC5C,IAAI,CAACA,UAAS,gBAAgBA,OAAM,MAAM,CAAC,EAC3C,IAAI,CAACA,UAAS,aAAaA,OAAM,OAAO,MAAM,CAAC,EAC/C,GAAG,CAAC;AAAA,EACT;AACF;;;ACvSA,SAAS,IAAI,SAAS;AAKtB,IAAM,aAAa,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAElD,IAAM,iBAAN,cAA6B,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjD,MAAM,OACJ,OACA,MACA,UACoB;AACpB,UAAM,oBAAoB,KAAK,eAAe,MAAM,OAAO,MAAM;AAEjE,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,UAAM,YAAY,KAAK,KAAK,iBAAiB,CAAC;AAE9C,UAAM,aAAa,MAAM,KAAK,eAAe,SAAS;AAEtD,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,UAAM,OAAO,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ;AAErD,UAAM,KAAK,iBAAiB,WAAW,KAAK,MAAM,EAAE;AAEpD,SAAK,MAAM;AAAA,MACT;AAAA,MACA,GAAG,KAAK,iBAAiB,EAAE,OAAO,CAAC,GAAG,KAAK,MAAM,KAAK;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SACJ,OACA,OACA,OACA,QACA,QACsB;AACtB,QAAI,qBAAqB,SAAS,KAAK,GAAG;AACxC,aAAO,KAAK,YAAY,MAAM,CAAC,EAAE,KAAe;AAAA,IAClD;AAEA,WAAO,MAAM,SAAS,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,EAC3D;AAAA,EAEQ,mBAA2B;AACjC,WAAO,KAAK,iBAAiB,MAAM,OAAO,OAAO,aAAa;AAAA,EAChE;AAAA,EAEA,MAAc,YAAY,OAAqC;AAC7D,UAAM,aAAa,MAAM,KAAK,eAAe,KAAK;AAElD,UAAM,OAAO,YAAY;AAEzB,QAAI,CAAC,MAAM;AACT,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,KAAK,SAAS,QAAQ;AAAA,MAC3B,EAAE,OAAO,MAAM,UAAU,MAAM,OAAO,MAAM,WAAW,MAAM;AAAA,IAC/D,CAAC,EAAE,KAAK,CAACC,UAAUA,QAAO,CAACA,KAAI,IAAI,CAAC,CAAE;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OACJ,OACA,OACA,QACsB;AACtB,UAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK;AAC9C,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAAY,OAA+B,KAAK,iBAAiB,CAAC;AAIxE,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,KAAK,MAAM,IAAI,IAAI,KAAK,iBAAiB,CAAC;AAG3D,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,QAChC;AAAA,MACF,GAAG;AACD,aAAK,MAAM,IAAI,KAAK,KAAK;AAAA,MAC3B;AAGA,UACE,aAAa,YACb,aAAa,UACb,aAAa,QACb;AACA,cAAM,KAAK,iBAAiB,UAAU,IAAI;AAC1C,cAAM,KAAK,iBAAiB,UAAU,KAAK,MAAM,EAAE;AAAA,MACrD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,OAAe,OAAwC;AACvE,UAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK;AAE9C,UAAM,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK;AAEpD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,iBAAiB,CAAC;AAGxD,UAAI,OAAO;AACT,cAAM,KAAK,iBAAiB,OAAO,IAAI;AAAA,MACzC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,OAAe;AAC1C,UAAM,aAAa,MAAM,WAAW,WAAW,OAAO,KAAK,MAAM,MAAM,IAAI;AAAA,MACzE,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,OAAe,QAAuB;AACnE,UAAM,WAAW,aAAa;AAAA,MAC5B,OAAO;AAAA,QACL,MAAM;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;;;AC5IO,IAAM,oBAAN,cAAgC,eAAe;AAAA,EAGpD,YACE,gBACA,cACA,QACA,mBAAuC,CAAC,GACxC,aAAsB,OACtB;AACA,UAAM,gBAAgB,cAAc,QAAQ,kBAAkB,UAAU;AAExE,SAAK,iBAAiB,IAAI;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,OACA,MACA,UACoB;AACpB,QAAI,OAAO,KAAK,UAAU,YAAY,OAAO,KAAK,WAAW,UAAU;AACrE,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,OAAO,MAAM,KAAK,eAAe,SAAS,QAAQ;AAAA,MACtD;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAED,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,MAAM,aAAa;AAAA,MACjD,SAAS;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,UAAM,UAAU,KAAK,UAAU,SAAS,EAAE,OAAO,MAAM;AAAA,MACrD,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,IACd,CAAC;AAED,aAAS,MAAM,KAAK,OAAO;AAE3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,OACA,OACA,OACA,QACA,QACsB;AACtB,QAAI,qBAAqB,MAAM,KAAK,GAAG;AACrC,aAAO,KAAK,SAAS,OAAO,KAAK,EAAE,KAAK,CAAC,SAAU,OAAO,CAAC,IAAI,IAAI,CAAC,CAAE;AAAA,IACxE;AAEA,QAAI,qBAAqB,SAAS,KAAK,GAAG;AACxC,aAAO,KAAK,aAAa,OAAO,KAAK,EAAE;AAAA,QAAK,CAAC,SAC3C,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,oBAAoB,UAAU,KAAK,GAAG;AACxC,YAAM,CAAC,aAAa,UAAU,IAAI,oBAAoB,UAAU,KAAK;AAErE,YAAM,OAAO,MAAM,KAAK,eAAe,SAAS,QAAQ;AAAA,QACtD;AAAA,UACE,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO,YAAa;AAAA,UACpB,WAAW;AAAA,QACb;AAAA,MACF,CAAC;AAED,UAAI,CAAC,MAAM;AACT,gBAAQ,KAAK,oDAAoD;AACjE,eAAO,CAAC;AAAA,MACV;AAEA,YAAM,EAAE,SAAS,IAAI,MAAM,KAAK,MAAM,aAAa;AAAA,QACjD,SAAS;AAAA,UACP,UAAU;AAAA,YACR,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR,wCAAwC,KAAK,UAAU,KAAK;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAe,OAAwC;AACvE,UAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK;AAC9C,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,CAAC,EAAG;AAEzB,WAAO,KAAK,cAAc,QAAQ,KAAK;AAAA,EACzC;AAAA,EAEA,MAAc,cACZ,QACA,OACiB;AACjB,UAAM,OAAO,MAAM,KAAK,eAAe,SAAS,QAAQ;AAAA,MACtD;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAED,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,MAAM,aAAa;AAAA,MACjD,SAAS;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,eAAW,eAAe,OAAO;AAE/B,YAAM,QAAQ,CAAC,GAAG,SAAS,QAAQ,CAAC,EAAE;AAAA,QACpC,CAAC,CAAC,GAAG,KAAK,MAAM,SAAS,MAAM,MAAM,OAAO,YAAY,MAAM;AAAA,MAChE;AAEA,kBAAY,MAAM,IAAI,YAAY,IAAI;AAEtC,UAAI,UAAU,IAAI;AAChB,iBAAS,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AACF;;;ACxLO,IAAM,yBAAN,cAAqC,eAAe;AAAA;AAAA;AAAA;AAAA,EAIzD,MAAM,OACJ,OACA,MACA,UACoB;AACpB,WAAO,MAAM,OAAO,OAAO,MAAM,KAAK,YAAY,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SACJ,OACA,OACA,OACA,QACA,QACsB;AACtB,QAAI,qBAAqB,cAAc,KAAK,GAAG;AAC7C,aAAO,KAAK,aAAa,OAAO,KAAK,EAAE;AAAA,QAAK,CAAC,SAC3C,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,MAAM,SAAS,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,EAC3D;AACF;;;ACnCA,SAAS,MAAAC,KAAI,KAAAC,UAAS;AAUtB,IAAM,iBAAiBC,IAAG,KAAKC,GAAE,OAAO,CAAC;AAElC,IAAM,oBAAN,cAAgC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpD,MAAM,OACJ,OACA,MACA,UACoB;AACpB,UAAM,UAAU,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ;AAExD,UAAM,KAAK;AAAA,MACT,QAAQ,KAAK,qBAAqB,CAAC;AAAA,MACnC,QAAQ,MAAM;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SACJ,OACA,OACA,OACA,QACA,QACsB;AACtB,QAAI,qBAAqB,KAAK,qBAAqB,GAAG,KAAK,GAAG;AAC5D,YAAM,iBAAiB,MAAM,KAAK,kBAAkB,MAAM,CAAC,EAAE,KAAK;AAElE,YAAM,MAAM,kBAAkB,CAAC;AAE/B,UAAI,IAAI,WAAW,GAAG;AACpB,eAAO,CAAC;AAAA,MACV;AAIA,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,IAAI;AAAA,UAAI,CAAC,OACP,MAAM,SAAS,OAAO;AAAA,YACpB,EAAE,OAAO,MAAM,UAAU,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,UAC7D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,QAAQ,OAAO,CAAC,UAAU,UAAU,IAAI;AAAA,IACjD;AAEA,WAAO,MAAM,SAAS,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,EAC3D;AAAA,EAEA,MAAM,YAAY,OAAe,OAAwC;AACvE,UAAM,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK;AAE9C,UAAM,UAAU,MAAM,MAAM,YAAY,OAAO,KAAK;AAEpD,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,KAAK,MAAM,IAAI,IAAI,KAAK,qBAAqB,CAAC;AAIhE,UAAI,WAAW;AACb,cAAM,KAAK,qBAAqB,WAAW,KAAK,MAAM,EAAE;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,WAAmB;AACjD,UAAM,cAAc,KAAK,qBAAqB,IAAI,MAAM;AAExD,UAAM,iBAAiB,MAAM,eAAe;AAAA,MAC1C;AAAA,MACA,KAAK,MAAM,MAAM;AAAA,MACjB;AAAA,QACE,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,qBAAqB,WAAmB,UAAkB;AACtE,UAAM,iBAAiB,MAAM,KAAK,kBAAkB,SAAS;AAE7D,UAAM,MAAM,kBAAkB,CAAC;AAE/B,UAAM,eAAe,aAAa;AAAA,MAChC,OAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,MACxB,QAAQ,KAAK,qBAAqB,IAAI,MAAM;AAAA,MAC5C,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,qBAAqB,WAAmB,UAAkB;AACtE,UAAM,iBAAiB,MAAM,KAAK,kBAAkB,SAAS;AAE7D,UAAM,MAAM,kBAAkB,CAAC;AAE/B,UAAM,eAAe,aAAa;AAAA,MAChC,OAAO,IAAI,OAAO,CAAC,OAAO,OAAO,QAAQ;AAAA,MACzC,QAAQ,KAAK,qBAAqB,IAAI,MAAM;AAAA,MAC5C,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEQ,uBAA+B;AACrC,WACE,KAAK,iBAAiB,SAAS,OAAO,WAAW,aAAa;AAAA,EAElE;AACF;;;ACjIA,SAAS,OAAO,MAAAC,KAAI,KAAAC,UAAS;AA4B7B,IAAM,mBAAmB;AAElB,SAAS,iBAAiB,QAAwC;AACvE,QAAM,eAAe,mCAAmC,MAAM;AAE9D,QAAM,eAAyBD,IAAG,IAAI;AAAA,IACpC,OAAO;AAAA,IACP,QAAQA,IAAG,IAAI,YAAY;AAAA,EAC7B,CAAC;AAED,QAAM,gBAA+BA,IAClC,QAAQ;AAAA,IACP,SAASA,IAAG,QAAQ;AAAA,IACpB,MAAMA,IAAG,IAAI,CAAC,CAAC;AAAA,EACjB,CAAC,EACA,cAAc,OAAO,YAAY;AAChC,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA,QAAQ,MAAM;AAAA,MACd;AAAA,QACE,SAAS;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ;AAGX,YAAM,aAAa,MAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAClD,YAAM,aAAa,aAAa;AAAA,QAC9B,OAAO;AAAA,UACL,OAAO;AAAA;AAAA,UAEP,QAAQA,IACL,IAAI,YAAY,EAChB;AAAA,YACC,OAAO;AAAA,cACL,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,gBACjD;AAAA,gBACA,MAAM,OAAO,CAAC,GAAG,UAAU;AAAA,cAC7B,CAAC;AAAA,YACH;AAAA,YACA;AAAA,UACF;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AAEL,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,QAChC,aAAa,MAAM,OAAO;AAAA,MAC5B,GAAG;AACD,YAAI,OAAO,OAAO,GAAG,MAAM,QAAW;AACpC,iBAAO,OAAO,MAAM,IAAI,KAAK,MAAM,OAAO,CAAC,GAAG,OAAO,KAAK,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,MAAM,aAAa,SAAS,SAAS;AACnC,UACE,SAAS,YAAY,SACpB,OAAO,SAAS,YAAY,YAC3B,SAAS,QAAQ,UAAU,MAC7B;AACA,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAEA,YAAM,KAAM,MAAM,aAAa;AAAA,QAC7B;AAAA,QACA,QAAQ,MAAM;AAAA,QACd;AAAA,UACE,SAAS;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,UACA,QAAQ;AAAA,UACR,GAAG;AAAA,QACL;AAAA,MACF;AAEA,UAAI,CAAC,IAAI;AACP,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAWA,SAAS,mCAAmC,QAA4B;AACtE,QAAM,eAAsC,CAAC;AAE7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAM,aAGF;AAAA,MACF,UAAUC,GAAE,QAAQ;AAAA,IACtB;AAEA,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AAC7D,iBAAW,MAAM,aAAa,SAAS,IAAI,sBAAsB,KAAK;AAAA,IACxE;AAEA,UAAM,QAAQD,IAAG,IAAI,UAAU;AAC/B,iBAAa,GAAG,IAAIA,IAAG,KAAK,KAAK;AAAA,EACnC;AAEA,MAAI,aAAa,MAAM,KAAK,aAAa,SAAS,GAAG;AACnD,iBAAa,MAAM,IAAIA,IAAG;AAAA,MACxBA,IACG,IAAI;AAAA,QACH,GAAG,aAAa,MAAM,EAAE,QAAQ;AAAA,QAChC,UAAU,aAAa,SAAS;AAAA,MAClC,CAAC,EACA,cAAc,CAAC,SAAS;AACvB,YAAI,KAAK,aAAa,QAAW;AAC/B,eAAK,MAAM;AAAA,YACT;AAAA,YACA,aAAa,SAAS,EAAG,OAAO,CAAC,GAAG,KAAK,MAAM,KAAK;AAAA,UACtD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF,OAAO;AACL,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAuB;AACpD,MAAI;AAEJ,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,gBAAUC,GAAE,OAAO;AACnB;AAAA,IACF,KAAK;AACH,gBAAUA,GAAE,OAAO;AACnB;AAAA,IACF,KAAK;AACH,gBAAUA,GAAE,QAAQ;AACpB;AAAA,IACF,KAAK;AACH,gBAAUA,GAAE,KAAK;AACjB;AAAA,IACF;AACE,YAAM,IAAI,MAAM,2BAA2B,MAAM,IAAI,EAAE;AAAA,EAC3D;AAEA,MAAI,MAAM,aAAa,OAAO;AAC5B,cAAU,QAAQ,SAAS;AAAA,EAC7B;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,WACwC;AACxC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAIA,QAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,MAAM;AAAA,EACZ;AACF;;;APjKO,IAAM,gCAAgC,CAC3C,WAEA,cAAc;AAAA,EACZ,QAAQ;AAAA,IACN,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,WAAW,OAAO,aAAa;AAAA;AAAA,IAC/B,cAAc;AAAA;AAAA,IACd,eAAe;AAAA;AAAA,IACf,kBAAkB;AAAA;AAAA,IAClB,oBAAoB;AAAA;AAAA,IACpB,qBAAqB;AAAA,EACvB;AAAA,EACA,SAAS,CAAC,EAAE,OAAO,MAAM;AACvB,UAAM,aAAa,iBAAiB,MAAM;AAE1C,QAAI,SAA8B;AAElC,mBAAe,YAAY;AACzB,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B,eAAe,WAAW;AAAA,QAC1B,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,eAAe,OAAO;AAAA,QACtB,eAAe;AAAA,QACf,iBAAiB;AAAA,MACnB,CAAC;AAED,eAAS,OAAO;AAEhB,aAAO;AAAA,IACT;AAEA,mBAAe,eACb,OACA,aAAsB,OACG;AACzB,UAAI,aAAgD;AACpD,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,uBAAa;AACb;AAAA,QACF,KAAK;AACH,uBAAa;AACb;AAAA,QACF,KAAK;AACH,uBAAa;AACb;AAAA,QACF,KAAK;AACH,uBAAa;AACb;AAAA,MACJ;AAEA,UAAI,CAAC,YAAY;AACf,qBAAa;AAAA,MACf;AAEA,YAAMC,UAAS,MAAM,UAAU;AAC/B,YAAM,WAAW,MAAM,WAAW,aAAaA,OAAM;AAErD,YAAM,aAAa,IAAI;AAAA,QACrB,WAAW;AAAA,QACX;AAAA,QACAA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,QAAQ,OAAO,EAAE,MAAM,OAAO,OAAO,MAAoB;AAEvD,cAAM,aAAa,MAAM,eAAe,OAAO,IAAI;AAEnD,cAAM,UAAU,MAAM,WAAW,OAAO,OAAO,IAAI;AAEnD,cAAM,WAAW,WAAW;AAE5B,eAAO,iBAAiB,OAAO;AAAA,MACjC;AAAA,MACA,QAAQ,OAAO,EAAE,OAAO,OAAO,OAAO,MAAoB;AAExD,cAAM,aAAa,MAAM,eAAe,OAAO,IAAI;AAEnD,cAAM,UAAU,MAAM,WAAW;AAAA,UAC/B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,GAAG;AACxB,iBAAO;AAAA,QACT;AAEA,cAAM,WAAW,WAAW;AAE5B,eAAO,iBAAiB,QAAQ,CAAC,CAAE;AAAA,MACrC;AAAA,MACA,YAAY,OAAO,EAAE,OAAO,OAAO,OAAO,MAAM;AAE9C,cAAM,aAAa,MAAM,eAAe,OAAO,IAAI;AAEnD,cAAM,UAAU,MAAM,WAAW,OAAO,OAAO,OAAO,MAAM;AAE5D,cAAM,WAAW,WAAW;AAE5B,eAAO,QAAQ;AAAA,MACjB;AAAA,MACA,QAAQ,OAAO,EAAE,OAAO,MAAM,MAAM;AAElC,cAAM,aAAa,MAAM,eAAe,OAAO,IAAI;AAEnD,cAAM,WAAW,YAAY,OAAO,KAAK;AAEzC,cAAM,WAAW,WAAW;AAAA,MAC9B;AAAA,MACA,SAAS,OAAO,EAAE,OAAO,MAAM,MAAoB;AAEjD,cAAM,aAAa,MAAM,eAAe,KAAK;AAE7C,cAAM,OAAO,MAAM,WAAW,QAAQ,OAAO,KAAK;AAElD,eAAO,iBAAiB,IAAI;AAAA,MAC9B;AAAA,MACA,UAAU,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,MAAsB;AACpB,cAAM,aAAa,MAAM,eAAe,KAAK;AAE7C,cAAM,QAAQ,MAAM,WAAW;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO,MAAM,IAAI,gBAAgB;AAAA,MACnC;AAAA,MACA,YAAY,OAAO,EAAE,OAAO,MAAM,MAAM;AACtC,cAAM,aAAa,MAAM,eAAe,OAAO,IAAI;AAEnD,cAAM,UAAU,MAAM,WAAW,YAAY,OAAO,KAAK;AAEzD,cAAM,WAAW,WAAW;AAE5B,eAAO;AAAA,MACT;AAAA,MACA,OAAO,OAAO,EAAE,OAAO,MAAM,MAAM;AAEjC,cAAM,aAAa,MAAM,eAAe,KAAK;AAE7C,eAAO,WAAW,MAAM,OAAO,KAAK;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF,CAAC;","names":["node","list","user","co","z","co","z","co","z","worker"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/better-auth/database-adapter/index.ts","../../../src/better-auth/database-adapter/utils.ts","../../../src/better-auth/database-adapter/repository/generic.ts","../../../src/better-auth/database-adapter/repository/user.ts","../../../src/better-auth/database-adapter/repository/session.ts","../../../src/better-auth/database-adapter/repository/verification.ts","../../../src/better-auth/database-adapter/repository/account.ts","../../../src/better-auth/database-adapter/schema.ts"],"sourcesContent":["import {\n createAdapterFactory,\n type DBAdapterDebugLogOption,\n} from \"better-auth/adapters\";\nimport type { Account } from \"jazz-tools\";\nimport { startWorker } from \"jazz-tools/worker\";\nimport {\n JazzRepository,\n UserRepository,\n SessionRepository,\n VerificationRepository,\n AccountRepository,\n} from \"./repository/index.js\";\nimport { createJazzSchema, tableItem2Record } from \"./schema.js\";\n\nexport interface JazzAdapterConfig {\n /**\n * Helps you debug issues with the adapter.\n */\n debugLogs?: DBAdapterDebugLogOption;\n /**\n * The sync server to use.\n */\n syncServer: string;\n /**\n * The worker account ID to use.\n */\n accountID: string;\n /**\n * The worker account secret to use.\n */\n accountSecret: string;\n}\n\n/**\n * Creates a Better Auth database adapter that integrates with Jazz framework.\n *\n * This adapter provides a seamless integration between Better Auth and Jazz,\n * allowing you to use Jazz as database for for Better Auth's authentication system.\n *\n * @param config - Configuration object for the Jazz Better Auth adapter\n * @param config.syncServer - The Jazz sync server URL to connect to (e.g., \"wss://your-sync-server.com\")\n * @param config.accountID - The worker account ID for the Jazz worker that will handle auth operations\n * @param config.accountSecret - The worker account secret for authenticating with the Jazz sync server\n * @param config.debugLogs - Optional debug logging configuration to help troubleshoot adapter issues\n *\n * @returns A Better Auth adapter instance configured to work with Jazz\n *\n * @example\n * ```typescript\n * import { JazzBetterAuthDatabaseAdapter } from \"jazz-tools/better-auth/database-adapter\";\n * import { createAuth } from \"better-auth\";\n *\n * const auth = createAuth({\n * adapter: JazzBetterAuthDatabaseAdapter({\n * syncServer: \"wss://your-jazz-sync-server.com\",\n * accountID: \"auth-worker-account-id\",\n * accountSecret: \"your-worker-account-secret\",\n * }),\n * // ... other auth configuration\n * });\n * ```\n */\nexport const JazzBetterAuthDatabaseAdapter = (\n config: JazzAdapterConfig,\n): ReturnType<typeof createAdapterFactory> =>\n createAdapterFactory({\n config: {\n adapterId: \"jazz-tools-adapter\", // A unique identifier for the adapter.\n adapterName: \"Jazz Tools Adapter\", // The name of the adapter.\n debugLogs: config.debugLogs ?? false, // Whether to enable debug logs.\n supportsJSON: true, // Whether the database supports JSON. (Default: false)\n supportsDates: true, // Whether the database supports dates. (Default: true)\n supportsBooleans: true, // Whether the database supports booleans. (Default: true)\n supportsNumericIds: false, // Whether the database supports auto-incrementing numeric IDs. (Default: true)\n disableIdGeneration: true,\n },\n adapter: ({ schema }) => {\n const JazzSchema = createJazzSchema(schema);\n\n let worker: Account | undefined = undefined;\n\n async function getWorker() {\n if (worker) {\n return worker;\n }\n\n const result = await startWorker({\n AccountSchema: JazzSchema.WorkerAccount,\n syncServer: config.syncServer,\n accountID: config.accountID,\n accountSecret: config.accountSecret,\n skipInboxLoad: true,\n asActiveAccount: false,\n });\n\n worker = result.worker;\n\n return worker;\n }\n\n async function initRepository(\n model: string,\n ensureSync: boolean = false,\n ): Promise<JazzRepository> {\n let Repository: typeof JazzRepository | undefined = undefined;\n switch (model) {\n case \"user\":\n Repository = UserRepository;\n break;\n case \"session\":\n Repository = SessionRepository;\n break;\n case \"verification\":\n Repository = VerificationRepository;\n break;\n case \"account\":\n Repository = AccountRepository;\n break;\n }\n\n if (!Repository) {\n Repository = JazzRepository;\n }\n\n const worker = await getWorker();\n const database = await JazzSchema.loadDatabase(worker);\n\n const repository = new Repository(\n JazzSchema.DatabaseRoot,\n database,\n worker,\n schema,\n ensureSync,\n );\n\n return repository;\n }\n\n return {\n create: async ({ data, model, select }): Promise<any> => {\n // console.log(\"create\", { data, model, select });\n const repository = await initRepository(model, true);\n\n const created = await repository.create(model, data);\n\n await repository.ensureSync();\n\n return tableItem2Record(created);\n },\n update: async ({ model, where, update }): Promise<any> => {\n // console.log(\"update\", { model, where, update });\n const repository = await initRepository(model, true);\n\n const updated = await repository.update(\n model,\n where,\n update as Record<string, any>,\n );\n\n if (updated.length === 0) {\n return null;\n }\n\n await repository.ensureSync();\n\n return tableItem2Record(updated[0]!);\n },\n updateMany: async ({ model, where, update }) => {\n // console.log(\"updateMany\", { model, where, update });\n const repository = await initRepository(model, true);\n\n const updated = await repository.update(model, where, update);\n\n await repository.ensureSync();\n\n return updated.length;\n },\n delete: async ({ model, where }) => {\n // console.log(\"delete\", { model, where });\n const repository = await initRepository(model, true);\n\n await repository.deleteValue(model, where);\n\n await repository.ensureSync();\n },\n findOne: async ({ model, where }): Promise<any> => {\n // console.log(\"findOne\", { model, where });\n const repository = await initRepository(model);\n\n const item = await repository.findOne(model, where);\n\n return tableItem2Record(item);\n },\n findMany: async ({\n model,\n where,\n limit,\n sortBy,\n offset,\n }): Promise<any[]> => {\n const repository = await initRepository(model);\n\n const items = await repository.findMany(\n model,\n where,\n limit,\n sortBy,\n offset,\n );\n\n return items.map(tableItem2Record);\n },\n deleteMany: async ({ model, where }) => {\n const repository = await initRepository(model, true);\n\n const deleted = await repository.deleteValue(model, where);\n\n await repository.ensureSync();\n\n return deleted;\n },\n count: async ({ model, where }) => {\n // console.log(\"count\", { model, where });\n const repository = await initRepository(model);\n\n return repository.count(model, where);\n },\n };\n },\n });\n","import { CleanedWhere } from \"better-auth/adapters\";\n\nexport function filterListByWhere<T>(\n data: T[],\n where: CleanedWhere[] | undefined,\n): T[] {\n if (!Array.isArray(data)) {\n throw new Error(\"Expected data to be an array\");\n }\n\n if (where === undefined) {\n return data;\n }\n\n if (!Array.isArray(where)) {\n throw new Error(\"Expected where to be an array\");\n }\n\n // Helper to evaluate a single condition\n function evaluateCondition(item: any, condition: CleanedWhere): boolean {\n const { field, operator, value } = condition;\n const itemValue = field === \"id\" ? item.$jazz.id : item[field];\n\n switch (operator) {\n case \"eq\":\n return itemValue === value;\n case \"ne\":\n return itemValue !== value;\n case \"lt\":\n return value !== null && itemValue < value;\n case \"lte\":\n return value !== null && itemValue <= value;\n case \"gt\":\n return value !== null && itemValue > value;\n case \"gte\":\n return value !== null && itemValue >= value;\n case \"in\":\n return Array.isArray(value)\n ? (value as (string | number | boolean | Date)[]).includes(itemValue)\n : false;\n case \"not_in\":\n return Array.isArray(value)\n ? !(value as (string | number | boolean | Date)[]).includes(itemValue)\n : false;\n case \"contains\":\n return typeof itemValue === \"string\" && typeof value === \"string\"\n ? itemValue.includes(value)\n : false;\n case \"starts_with\":\n return typeof itemValue === \"string\" && typeof value === \"string\"\n ? itemValue.startsWith(value)\n : false;\n case \"ends_with\":\n return typeof itemValue === \"string\" && typeof value === \"string\"\n ? itemValue.endsWith(value)\n : false;\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n }\n\n // Group conditions by connector (AND/OR)\n // If no connector, default to AND between all\n return data.filter((item) => {\n let result: boolean = true;\n for (let i = 0; i < where.length; i++) {\n const condition = where[i]!;\n const matches = evaluateCondition(item, condition);\n if (i === 0) {\n result = matches;\n } else {\n const connector = condition.connector || \"AND\";\n if (connector === \"AND\") {\n result = result && matches;\n } else if (connector === \"OR\") {\n result = result || matches;\n } else {\n throw new Error(`Unsupported connector: ${connector}`);\n }\n }\n }\n return result;\n });\n}\n\nexport function sortListByField<T extends Record<string, any> | null>(\n data: T[],\n sort?: { field: string; direction: \"asc\" | \"desc\" },\n): T[] {\n if (!sort) {\n return data;\n }\n\n const { field, direction } = sort;\n\n data.sort((a, b) => {\n if (a === null || b === null) {\n return 0;\n }\n\n if (typeof a[field] === \"string\" && typeof b[field] === \"string\") {\n return direction === \"asc\"\n ? a[field].localeCompare(b[field])\n : b[field].localeCompare(a[field]);\n }\n\n return direction === \"asc\" ? a[field] - b[field] : b[field] - a[field];\n });\n\n return data;\n}\n\nexport function paginateList<T>(\n data: T[],\n limit: number | undefined,\n offset: number | undefined,\n): T[] {\n if (offset === undefined && limit === undefined) {\n return data;\n }\n\n if (limit === 0) {\n return [];\n }\n\n let start = offset ?? 0;\n if (start < 0) {\n start = 0;\n }\n\n const end = limit ? start + limit : undefined;\n return data.slice(start, end);\n}\n\nfunction isWhereByField(field: string, where: CleanedWhere): boolean {\n return (\n where.field === field &&\n where.operator === \"eq\" &&\n where.connector === \"AND\"\n );\n}\n\nexport function isWhereBySingleField<T extends string>(\n field: T,\n where: CleanedWhere[] | undefined,\n): where is [{ field: T; operator: \"eq\"; value: string; connector: \"AND\" }] {\n if (where === undefined || where.length !== 1) {\n return false;\n }\n\n const [cond] = where;\n if (!cond) {\n return false;\n }\n\n return isWhereByField(field, cond);\n}\n\nexport function containWhereByField<T extends string>(\n field: T,\n where: CleanedWhere[] | undefined,\n): boolean {\n if (where === undefined) {\n return false;\n }\n\n return where.some((cond) => isWhereByField(field, cond));\n}\n\nexport function extractWhereByField<T extends string>(\n field: T,\n where: CleanedWhere[] | undefined,\n): [CleanedWhere | undefined, CleanedWhere[]] {\n if (where === undefined) {\n return [undefined, []];\n }\n\n return [\n where.find((cond) => isWhereByField(field, cond)),\n where.filter((cond) => !isWhereByField(field, cond)),\n ];\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { BetterAuthDbSchema } from \"better-auth/db\";\nimport { Account, CoList, CoMap, Group, co } from \"jazz-tools\";\nimport type { Database, TableItem } from \"../schema.js\";\nimport {\n filterListByWhere,\n isWhereBySingleField,\n paginateList,\n sortListByField,\n} from \"../utils.js\";\n\nexport class JazzRepository {\n protected databaseSchema: Database;\n protected databaseRoot: co.loaded<Database, { group: true }>;\n protected worker: Account;\n protected owner: Group;\n protected betterAuthSchema: BetterAuthDbSchema;\n\n private coValuesTracker:\n | {\n done: () => Set<`co_z${string}`>;\n }\n | undefined = undefined;\n\n constructor(\n databaseSchema: Database,\n databaseRoot: co.loaded<Database, { group: true }>,\n worker: Account,\n betterAuthSchema: BetterAuthDbSchema = {},\n ensureSync: boolean = false,\n ) {\n this.databaseSchema = databaseSchema;\n this.databaseRoot = databaseRoot;\n this.worker = worker;\n this.owner = databaseRoot.group;\n this.betterAuthSchema = betterAuthSchema;\n\n if (ensureSync)\n this.coValuesTracker =\n worker.$jazz.raw.core.node.syncManager.trackDirtyCoValues();\n }\n\n ensureSync() {\n if (!this.coValuesTracker)\n throw new Error(\"Repository wasn't initialized with ensureSync option\");\n\n return Promise.all(\n Array.from(this.coValuesTracker.done(), (id) =>\n this.worker.$jazz.raw.core.node.syncManager.waitForSync(id),\n ),\n );\n }\n\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n const schema = this.getSchema(model);\n\n const resolved = await this.databaseRoot.$jazz.ensureLoaded({\n resolve: {\n tables: {\n [model]: true,\n },\n },\n });\n\n const list = resolved.tables?.[model] as unknown as CoList<CoMap>;\n\n if (!uniqueId) {\n // Use the same owner of the table.\n const node = schema.create(data, {\n owner: list.$jazz.owner,\n });\n\n list.$jazz.push(node);\n\n return node;\n }\n\n // If we have a unique id, we must check for soft deleted items first\n const existingNode = (await schema.loadUnique(\n uniqueId,\n list.$jazz.owner.$jazz.id,\n {\n loadAs: this.worker,\n },\n )) as CoMap | null;\n\n // if the entity exists and is not soft deleted, we must throw an error\n if (existingNode && existingNode.$jazz?.raw.get(\"_deleted\") !== true) {\n throw new Error(\"Entity already exists\");\n }\n\n // create the entity or update the deleted one\n const node = await schema.upsertUnique({\n value: {\n ...data,\n _deleted: false,\n },\n owner: list.$jazz.owner,\n unique: uniqueId,\n });\n\n if (!node) {\n throw new Error(\"Unable to create entity\");\n }\n\n list.$jazz.push(node);\n\n return node;\n }\n\n async findOne(\n model: string,\n where: CleanedWhere[],\n ): Promise<TableItem | null> {\n return this.findMany(model, where, 1).then((users) => users?.at(0) ?? null);\n }\n\n async findById(\n model: string,\n where: [{ field: \"id\"; operator: \"eq\"; value: string; connector: \"AND\" }],\n ): Promise<TableItem | null> {\n const id = where[0]!.value;\n\n if (!id.startsWith(\"co_\")) {\n return null;\n }\n\n const node = await this.getSchema(model).load(id, { loadAs: this.worker });\n\n if (!node) {\n return null;\n }\n\n if (node.$jazz.raw.get(\"_deleted\")) {\n return null;\n }\n\n return node;\n }\n\n async findByUnique(\n model: string,\n where: [{ field: string; operator: \"eq\"; value: string; connector: \"AND\" }],\n ): Promise<TableItem | null> {\n const value = where[0]!.value;\n\n const node = await this.getSchema(model).loadUnique(\n value,\n this.owner.$jazz.id,\n {\n loadAs: this.worker,\n },\n );\n\n if (!node) {\n return null;\n }\n\n if (node.$jazz.raw.get(\"_deleted\")) {\n return null;\n }\n\n return node;\n }\n\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n // ensure schema exists\n this.getSchema(model);\n\n if (isWhereBySingleField(\"id\", where)) {\n return this.findById(model, where).then((node) => (node ? [node] : []));\n }\n\n const resolvedRoot = await this.databaseRoot.$jazz.ensureLoaded({\n resolve: {\n tables: {\n [model]: {\n $each: true,\n },\n },\n },\n });\n\n const list = resolvedRoot.tables?.[model] as CoList<CoMap> | undefined;\n\n if (!list) {\n return [];\n }\n\n return this.filterSortPaginateList(list, where, limit, sortBy, offset);\n }\n\n async update(\n model: string,\n where: CleanedWhere[],\n update: Record<string, any>,\n ): Promise<TableItem[]> {\n const nodes = await this.findMany(model, where);\n\n if (nodes.length === 0) {\n return [];\n }\n\n for (const node of nodes) {\n for (const [key, value] of Object.entries(\n update as Record<string, any>,\n )) {\n node.$jazz.set(key, value);\n }\n }\n\n return nodes;\n }\n\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const items = await this.findMany(model, where);\n\n if (items.length === 0) {\n return 0;\n }\n\n const resolved = await this.databaseRoot.$jazz.ensureLoaded({\n resolve: {\n tables: {\n [model]: {\n $each: true,\n },\n },\n },\n });\n\n if (!resolved) {\n throw new Error(\"Unable to load values\");\n }\n\n const list = resolved?.tables?.[model] as unknown as CoList<CoMap>;\n\n for (const toBeDeleted of items) {\n // Get entries without trigger the shallow load\n const index = [...list.entries()].findIndex(\n ([_, value]) => value && value.$jazz.id === toBeDeleted.$jazz.id,\n );\n\n toBeDeleted.$jazz.set(\"_deleted\", true);\n\n if (index !== -1) {\n list.$jazz.remove(index);\n }\n }\n\n return items.length;\n }\n\n async count(\n model: string,\n where: CleanedWhere[] | undefined,\n ): Promise<number> {\n return this.findMany(model, where).then((values) => values.length);\n }\n\n protected getSchema(model: string) {\n const schema = this.databaseSchema.shape.tables.shape[model]?.element;\n if (!schema) {\n throw new Error(`Schema for model \"${model}\" not found`);\n }\n return schema;\n }\n\n protected filterSortPaginateList<T extends TableItem>(\n list: CoList<CoMap | null>,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): T[] {\n // ignore nullable values and soft deleted items\n return [\n list.filter(\n (item) => item !== null && item.$jazz.raw.get(\"_deleted\") !== true,\n ),\n ]\n .map((list) => filterListByWhere(list, where))\n .map((list) => sortListByField(list, sortBy))\n .map((list) => paginateList(list, limit, offset))\n .at(0)! as T[];\n }\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { co, z } from \"jazz-tools\";\nimport { JazzRepository } from \"./generic\";\nimport { isWhereBySingleField } from \"../utils\";\nimport type { TableItem } from \"../schema\";\n\nconst EmailIndex = co.map({ user: z.string().nullable() });\n\nexport class UserRepository extends JazzRepository {\n /**\n * Custom logic:\n * - sessions are stored inside the user object\n * - keep sync email index\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n const SessionListSchema = this.databaseSchema.shape.tables.shape.session;\n\n if (!SessionListSchema) {\n throw new Error(\"Session list schema not found\");\n }\n\n const userEmail = data[this.getEmailProperty()] as string;\n\n const emailIndex = await this.loadEmailIndex(userEmail);\n\n if (emailIndex?.user) {\n throw new Error(\"Email already exists\");\n }\n\n const user = await super.create(model, data, uniqueId);\n\n await this.updateEmailIndex(userEmail, user.$jazz.id);\n\n user.$jazz.set(\n \"sessions\",\n co.list(SessionListSchema).create([], user.$jazz.owner),\n );\n\n return user;\n }\n\n /**\n * Custom logic:\n * - if the email is in the where clause, find by email\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(\"email\", where)) {\n return this.findByEmail(where[0].value as string);\n }\n\n return super.findMany(model, where, limit, sortBy, offset);\n }\n\n private getEmailProperty(): string {\n return this.betterAuthSchema.user?.fields.email?.fieldName || \"email\";\n }\n\n private async findByEmail(email: string): Promise<TableItem[]> {\n const emailIndex = await this.loadEmailIndex(email);\n\n const user = emailIndex?.user;\n\n if (!user) {\n return [];\n }\n\n return this.findById(\"user\", [\n { field: \"id\", operator: \"eq\", value: user, connector: \"AND\" },\n ]).then((user) => (user ? [user] : []));\n }\n\n /**\n * Custom logic:\n * - if the email is changed, update the email index\n */\n async update(\n model: string,\n where: CleanedWhere[],\n update: Record<string, any>,\n ): Promise<TableItem[]> {\n const nodes = await this.findMany(model, where);\n if (nodes.length === 0) {\n return [];\n }\n\n const newEmail = (update as Record<string, any>)[this.getEmailProperty()] as\n | string\n | undefined;\n\n for (const node of nodes) {\n const oldEmail = node.$jazz.raw.get(this.getEmailProperty()) as\n | string\n | undefined;\n for (const [key, value] of Object.entries(\n update as Record<string, any>,\n )) {\n node.$jazz.set(key, value);\n }\n\n // if the email is changed, update the email index\n if (\n oldEmail !== newEmail &&\n oldEmail !== undefined &&\n newEmail !== undefined\n ) {\n await this.updateEmailIndex(oldEmail, null);\n await this.updateEmailIndex(newEmail, node.$jazz.id);\n }\n }\n\n return nodes;\n }\n\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const nodes = await this.findMany(model, where);\n\n const deleted = await super.deleteValue(model, where);\n\n for (const node of nodes) {\n const email = node.$jazz.raw.get(this.getEmailProperty()) as\n | string\n | undefined;\n if (email) {\n await this.updateEmailIndex(email, null);\n }\n }\n\n return deleted;\n }\n\n private async loadEmailIndex(email: string) {\n const emailIndex = await EmailIndex.loadUnique(email, this.owner.$jazz.id, {\n loadAs: this.worker,\n });\n\n return emailIndex;\n }\n\n private async updateEmailIndex(email: string, userId: string | null) {\n await EmailIndex.upsertUnique({\n value: {\n user: userId,\n },\n unique: email,\n owner: this.owner,\n });\n }\n}\n","import { BetterAuthDbSchema } from \"better-auth/db\";\nimport { CleanedWhere } from \"better-auth/adapters\";\nimport { co, Account } from \"jazz-tools\";\nimport { JazzRepository } from \"./generic\";\nimport { UserRepository } from \"./user\";\nimport {\n containWhereByField,\n extractWhereByField,\n filterListByWhere,\n isWhereBySingleField,\n} from \"../utils\";\nimport type { Database, TableItem } from \"../schema\";\n\ntype UserSchema = co.Map<{\n sessions: co.List<co.Map<any>>;\n}>;\n\nexport class SessionRepository extends JazzRepository {\n protected userRepository: UserRepository;\n\n constructor(\n databaseSchema: Database,\n databaseRoot: co.loaded<Database, { group: true }>,\n worker: Account,\n betterAuthSchema: BetterAuthDbSchema = {},\n ensureSync: boolean = false,\n ) {\n super(databaseSchema, databaseRoot, worker, betterAuthSchema, ensureSync);\n\n this.userRepository = new UserRepository(\n databaseSchema,\n databaseRoot,\n worker,\n betterAuthSchema,\n );\n }\n\n /**\n * Custom logic: sessions are stored inside the user object\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n if (typeof data.token !== \"string\" || typeof data.userId !== \"string\") {\n throw new Error(\"Token and userId are required for session creation\");\n }\n\n const user = await this.userRepository.findById(\"user\", [\n {\n field: \"id\",\n operator: \"eq\",\n value: data.userId,\n connector: \"AND\",\n },\n ]);\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const { sessions } = await user.$jazz.ensureLoaded({\n resolve: {\n sessions: true,\n },\n });\n\n const session = this.getSchema(\"session\").create(data, {\n unique: data.token,\n owner: this.owner,\n });\n\n sessions.$jazz.push(session);\n\n return session;\n }\n\n /**\n * Custom logic: sessions are stored inside the user object.\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(\"id\", where)) {\n return this.findById(model, where).then((node) => (node ? [node] : []));\n }\n\n if (isWhereBySingleField(\"token\", where)) {\n return this.findByUnique(model, where).then((node) =>\n node ? [node] : [],\n );\n }\n\n if (containWhereByField(\"userId\", where)) {\n const [userIdWhere, otherWhere] = extractWhereByField(\"userId\", where);\n\n const user = await this.userRepository.findById(\"user\", [\n {\n field: \"id\",\n operator: \"eq\",\n value: userIdWhere!.value as string,\n connector: \"AND\",\n },\n ]);\n\n if (!user) {\n console.warn(\"Trying to find user's sessions, but user not found\");\n return [];\n }\n\n const { sessions } = await user.$jazz.ensureLoaded({\n resolve: {\n sessions: {\n $each: true,\n },\n },\n });\n\n return this.filterSortPaginateList(\n sessions,\n otherWhere,\n limit,\n sortBy,\n offset,\n );\n }\n\n throw new Error(\n \"Unable to find session with where: \" + JSON.stringify(where),\n );\n }\n\n /**\n * Custom logic: sessions are stored inside the user object.\n */\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const items = await this.findMany(model, where);\n if (items.length === 0) {\n return 0;\n }\n\n const userId = items[0]!.userId;\n\n return this.deleteSession(userId, items);\n }\n\n private async deleteSession(\n userId: string,\n items: TableItem[],\n ): Promise<number> {\n const user = await this.userRepository.findById(\"user\", [\n {\n field: \"id\",\n operator: \"eq\",\n value: userId,\n connector: \"AND\",\n },\n ]);\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const { sessions } = await user.$jazz.ensureLoaded({\n resolve: {\n sessions: true,\n },\n });\n\n for (const toBeDeleted of items) {\n // Get entries without trigger the shallow load\n const index = [...sessions.entries()].findIndex(\n ([_, value]) => value && value.$jazz.id === toBeDeleted.$jazz.id,\n );\n\n toBeDeleted.$jazz.set(\"_deleted\", true);\n\n if (index !== -1) {\n sessions.$jazz.remove(index);\n }\n }\n\n return items.length;\n }\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { JazzRepository } from \"./generic\";\nimport { isWhereBySingleField } from \"../utils\";\nimport type { TableItem } from \"../schema\";\n\nexport class VerificationRepository extends JazzRepository {\n /**\n * Custom logic: property identifier is used as uniqueId\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n return super.create(model, data, data[\"identifier\"]);\n }\n\n /**\n * Custom logic: property identifier is used as uniqueId\n * If we look for identifier, we use findByUnique instead of findMany\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(\"identifier\", where)) {\n return this.findByUnique(model, where).then((node) =>\n node ? [node] : [],\n );\n }\n\n return super.findMany(model, where, limit, sortBy, offset);\n }\n}\n","import { CleanedWhere } from \"better-auth/adapters\";\nimport { co, z } from \"jazz-tools\";\nimport { JazzRepository } from \"./generic\";\nimport { isWhereBySingleField } from \"../utils\";\nimport type { TableItem } from \"../schema\";\n\n/**\n * This list stores an array of covalues ID\n * mapped by the accountID property.\n * Because accountId is not unique, and it is used on every social login\n */\nconst AccountIdIndex = co.list(z.string());\n\nexport class AccountRepository extends JazzRepository {\n /**\n * Custom logic:\n * - keep sync accountId index\n */\n async create(\n model: string,\n data: Record<string, any>,\n uniqueId?: string,\n ): Promise<TableItem> {\n const account = await super.create(model, data, uniqueId);\n\n await this.updateAccountIdIndex(\n account[this.getAccountIdProperty()],\n account.$jazz.id,\n );\n\n return account;\n }\n\n /**\n * Custom logic:\n * - if the accountId is in the where clause, get the ids from the index\n */\n async findMany(\n model: string,\n where: CleanedWhere[] | undefined,\n limit?: number,\n sortBy?: { field: string; direction: \"asc\" | \"desc\" },\n offset?: number,\n ): Promise<TableItem[]> {\n if (isWhereBySingleField(this.getAccountIdProperty(), where)) {\n const accountIdIndex = await this.getAccountIdIndex(where[0].value);\n\n const ids = accountIdIndex ?? [];\n\n if (ids.length === 0) {\n return [];\n }\n\n // except for accountId clashing from different social providers,\n // ids should contain a single id, max two\n const results = await Promise.all(\n ids.map((id) =>\n super.findById(model, [\n { field: \"id\", operator: \"eq\", value: id, connector: \"AND\" },\n ]),\n ),\n );\n\n return results.filter((value) => value !== null);\n }\n\n return super.findMany(model, where, limit, sortBy, offset);\n }\n\n async deleteValue(model: string, where: CleanedWhere[]): Promise<number> {\n const nodes = await this.findMany(model, where);\n\n const deleted = await super.deleteValue(model, where);\n\n for (const node of nodes) {\n const accountId = node.$jazz.raw.get(this.getAccountIdProperty()) as\n | string\n | undefined;\n\n if (accountId) {\n await this.deleteAccountIdIndex(accountId, node.$jazz.id);\n }\n }\n\n return deleted;\n }\n\n private async getAccountIdIndex(accountId: string) {\n const indexUnique = this.getAccountIdProperty() + \"_\" + accountId;\n\n const accountIdIndex = await AccountIdIndex.loadUnique(\n indexUnique,\n this.owner.$jazz.id,\n {\n loadAs: this.worker,\n },\n );\n\n return accountIdIndex;\n }\n\n private async updateAccountIdIndex(accountId: string, entityId: string) {\n const accountIdIndex = await this.getAccountIdIndex(accountId);\n\n const ids = accountIdIndex ?? [];\n\n await AccountIdIndex.upsertUnique({\n value: [...ids, entityId],\n unique: this.getAccountIdProperty() + \"_\" + accountId,\n owner: this.owner,\n });\n }\n\n private async deleteAccountIdIndex(accountId: string, entityId: string) {\n const accountIdIndex = await this.getAccountIdIndex(accountId);\n\n const ids = accountIdIndex ?? [];\n\n await AccountIdIndex.upsertUnique({\n value: ids.filter((id) => id !== entityId),\n unique: this.getAccountIdProperty() + \"_\" + accountId,\n owner: this.owner,\n });\n }\n\n private getAccountIdProperty(): string {\n return (\n this.betterAuthSchema.account?.fields.accountId?.fieldName || \"accountId\"\n );\n }\n}\n","import { BetterAuthDbSchema, FieldAttribute } from \"better-auth/db\";\nimport { Group, co, z } from \"jazz-tools\";\n\ntype TableRow = co.Map<any>;\nexport type TableItem = co.loaded<TableRow>;\n\ntype Table = co.List<TableRow>;\nexport type Database = co.Map<{\n group: typeof Group;\n tables: co.Map<{\n [key: string]: Table;\n }>;\n}>;\n\ntype WorkerAccount = co.Account<{\n profile: co.Profile;\n root: co.Map<any>;\n}>;\n\ntype JazzSchema = {\n WorkerAccount: WorkerAccount;\n DatabaseRoot: Database;\n betterAuthSchema: BetterAuthDbSchema;\n loadDatabase: (\n account: co.loaded<co.Account>,\n options?: Parameters<Database[\"loadUnique\"]>[2],\n ) => Promise<co.loaded<Database, { group: true }>>;\n};\n\nconst DATABASE_ROOT_ID = \"better-auth-root\";\n\nexport function createJazzSchema(schema: BetterAuthDbSchema): JazzSchema {\n const tablesSchema = generateSchemaFromBetterAuthSchema(schema);\n\n const DatabaseRoot: Database = co.map({\n group: Group,\n tables: co.map(tablesSchema),\n });\n\n const WorkerAccount: WorkerAccount = co\n .account({\n profile: co.profile(),\n root: co.map({}),\n })\n .withMigration(async (account) => {\n const dbRoot = await DatabaseRoot.loadUnique(\n DATABASE_ROOT_ID,\n account.$jazz.id,\n {\n resolve: {\n group: true,\n tables: true,\n },\n loadAs: account,\n },\n );\n\n if (!dbRoot) {\n // Create a group for the first time\n // it will be the owner of the all tables and data\n const adminGroup = Group.create({ owner: account });\n await DatabaseRoot.upsertUnique({\n value: {\n group: adminGroup,\n // create empty tables for each model\n tables: co\n .map(tablesSchema)\n .create(\n Object.fromEntries(\n Object.entries(tablesSchema).map(([key, value]) => [\n key,\n value.create([], adminGroup),\n ]),\n ),\n adminGroup,\n ),\n },\n unique: DATABASE_ROOT_ID,\n owner: account,\n });\n } else {\n // partial migrations\n for (const [key, value] of Object.entries(\n DatabaseRoot.shape.tables.shape,\n )) {\n if (dbRoot.tables[key] === undefined) {\n dbRoot.tables.$jazz.set(key, value.create([], dbRoot.group));\n }\n }\n }\n });\n\n return {\n WorkerAccount,\n DatabaseRoot,\n betterAuthSchema: schema,\n async loadDatabase(account, options) {\n if (\n options?.resolve === false ||\n (typeof options?.resolve === \"object\" &&\n options?.resolve.group !== true)\n ) {\n throw new Error(\"Group is required to load the database\");\n }\n\n const db = (await DatabaseRoot.loadUnique(\n DATABASE_ROOT_ID,\n account.$jazz.id,\n {\n resolve: {\n group: true,\n tables: true,\n },\n loadAs: account,\n ...options,\n },\n )) as co.loaded<Database, { group: true }>;\n\n if (!db) {\n throw new Error(\"Database not found\");\n }\n\n return db;\n },\n };\n}\n\ntype ZodPrimitiveSchema =\n | z.z.ZodString\n | z.z.ZodNumber\n | z.z.ZodBoolean\n | z.z.ZodNull\n | z.z.ZodDate\n | z.z.ZodLiteral;\ntype ZodOptionalPrimitiveSchema = z.z.ZodOptional<ZodPrimitiveSchema>;\n\nfunction generateSchemaFromBetterAuthSchema(schema: BetterAuthDbSchema) {\n const tablesSchema: Record<string, Table> = {};\n\n for (const [key, value] of Object.entries(schema)) {\n const modelShape: Record<\n string,\n ZodPrimitiveSchema | ZodOptionalPrimitiveSchema\n > = {\n _deleted: z.boolean(),\n };\n\n for (const [fieldName, field] of Object.entries(value.fields)) {\n modelShape[field.fieldName || fieldName] = convertFieldToCoValue(field);\n }\n\n const coMap = co.map(modelShape);\n tablesSchema[key] = co.list(coMap);\n }\n\n if (tablesSchema[\"user\"] && tablesSchema[\"session\"]) {\n tablesSchema[\"user\"] = co.list(\n co\n .map({\n ...tablesSchema[\"user\"].element.shape,\n sessions: tablesSchema[\"session\"],\n })\n .withMigration((user) => {\n if (user.sessions === undefined) {\n user.$jazz.set(\n \"sessions\",\n tablesSchema[\"session\"]!.create([], user.$jazz.owner),\n );\n }\n }),\n );\n } else {\n throw new Error(\n \"Cannot find user and session tables, sessions will not be persisted\",\n );\n }\n\n return tablesSchema;\n}\n\nfunction convertFieldToCoValue(field: FieldAttribute) {\n let zodType: ZodPrimitiveSchema | ZodOptionalPrimitiveSchema;\n\n switch (field.type) {\n case \"string\":\n zodType = z.string();\n break;\n case \"number\":\n zodType = z.number();\n break;\n case \"boolean\":\n zodType = z.boolean();\n break;\n case \"date\":\n zodType = z.date();\n break;\n default:\n throw new Error(`Unsupported field type: ${field.type}`);\n }\n\n if (field.required === false) {\n zodType = zodType.optional();\n }\n\n return zodType;\n}\n\nexport function tableItem2Record(\n tableItem: TableItem | null | undefined,\n): Record<string, any> | null | undefined {\n if (!tableItem) {\n return tableItem;\n }\n\n // tableItem.toJSON() transforms Date objects to ISO strings\n // by returning ...rest, we keep the objects\n const { $jazz, ...rest } = tableItem;\n return {\n ...rest,\n id: $jazz.id,\n };\n}\n"],"mappings":"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","names":["node","list","user","co","z","co","z","co","z","worker"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/better-auth/database-adapter/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,IAAI,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,GAChC,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/better-auth/database-adapter/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,IAAI,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,GAChC,CAAC,EAAE,CA8EL;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAClE,IAAI,EAAE,CAAC,EAAE,EACT,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,GAClD,CAAC,EAAE,CAsBL;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,CAAC,EAAE,CAgBL;AAUD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,GAChC,KAAK,IAAI,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,CAAA;CAAE,CAAC,CAW1E;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,GAChC,OAAO,CAMT;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,GAChC,CAAC,YAAY,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,CAS5C"}
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { AccountRole } from "cojson";
|
|
1
2
|
import { Account, CoValue, CoValueClassOrSchema, InviteSecret } from "jazz-tools";
|
|
2
3
|
export { BrowserPasskeyAuth } from "./auth/PasskeyAuth.js";
|
|
3
4
|
export * from "./createBrowserContext.js";
|
|
4
5
|
export * from "./BrowserContextManager.js";
|
|
5
6
|
export { LocalStorageKVStore } from "./auth/LocalStorageKVStore.js";
|
|
6
7
|
/** @category Invite Links */
|
|
7
|
-
export declare function createInviteLink<C extends CoValue>(value: C, role:
|
|
8
|
+
export declare function createInviteLink<C extends CoValue>(value: C, role: AccountRole, { baseURL, valueHint, }?: {
|
|
8
9
|
baseURL?: string;
|
|
9
10
|
valueHint?: string;
|
|
10
11
|
}): string;
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,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,WAAW,EAEjB,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 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().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.$jazz.set(\"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: new Uint8Array(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: new Uint8Array(this.crypto.randomBytes(20)),\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 peers: Peer[] = [];\n\n const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n addConnectionListener: () => () => {},\n connected: () => false,\n toggleNetwork: () => {},\n peers,\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 peers.push(peer);\n }\n },\n removePeer: (peer) => {\n peers.splice(peers.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 addConnectionListener(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n connected() {\n return wsPeer.connected;\n },\n peers,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peers,\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 addConnectionListener,\n connected,\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 {\n toggleNetwork,\n peers,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\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 peers,\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 addConnectionListener,\n connected,\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 if (typeof navigator === \"undefined\" || !navigator.locks?.request) {\n // Fallback to random session ID for each tab session\n return Promise.resolve({\n sessionID: crypto.newRandomSessionID(accountID as RawAccountID | AgentID),\n sessionDone: () => {},\n });\n }\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.$jazz.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.$jazz.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 { AccountRole } from \"cojson\";\nimport {\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: AccountRole,\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().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.$jazz.set(\"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: new Uint8Array(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: new Uint8Array(this.crypto.randomBytes(20)),\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 peers: Peer[] = [];\n\n const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n addConnectionListener: () => () => {},\n connected: () => false,\n toggleNetwork: () => {},\n peers,\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 peers.push(peer);\n }\n },\n removePeer: (peer) => {\n peers.splice(peers.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 addConnectionListener(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n connected() {\n return wsPeer.connected;\n },\n peers,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peers,\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 addConnectionListener,\n connected,\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 {\n toggleNetwork,\n peers,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\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 peers,\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 addConnectionListener,\n connected,\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 if (typeof navigator === \"undefined\" || !navigator.locks?.request) {\n // Fallback to random session ID for each tab session\n return Promise.resolve({\n sessionID: crypto.newRandomSessionID(accountID as RawAccountID | AgentID),\n sessionDone: () => {},\n });\n }\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.$jazz.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.$jazz.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"]}
|