jazz-tools 0.18.15 → 0.18.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.svelte-kit/__package__/media/image.svelte +104 -98
  2. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +16 -2
  4. package/.turbo/turbo-build.log +48 -38
  5. package/CHANGELOG.md +20 -0
  6. package/dist/better-auth/database-adapter/index.d.ts +50 -0
  7. package/dist/better-auth/database-adapter/index.d.ts.map +1 -0
  8. package/dist/better-auth/database-adapter/index.js +920 -0
  9. package/dist/better-auth/database-adapter/index.js.map +1 -0
  10. package/dist/better-auth/database-adapter/repository/account.d.ts +24 -0
  11. package/dist/better-auth/database-adapter/repository/account.d.ts.map +1 -0
  12. package/dist/better-auth/database-adapter/repository/generic.d.ts +45 -0
  13. package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -0
  14. package/dist/better-auth/database-adapter/repository/index.d.ts +6 -0
  15. package/dist/better-auth/database-adapter/repository/index.d.ts.map +1 -0
  16. package/dist/better-auth/database-adapter/repository/session.d.ts +29 -0
  17. package/dist/better-auth/database-adapter/repository/session.d.ts.map +1 -0
  18. package/dist/better-auth/database-adapter/repository/user.d.ts +30 -0
  19. package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -0
  20. package/dist/better-auth/database-adapter/repository/verification.d.ts +18 -0
  21. package/dist/better-auth/database-adapter/repository/verification.d.ts.map +1 -0
  22. package/dist/better-auth/database-adapter/schema.d.ts +27 -0
  23. package/dist/better-auth/database-adapter/schema.d.ts.map +1 -0
  24. package/dist/better-auth/database-adapter/tests/index.test.d.ts +2 -0
  25. package/dist/better-auth/database-adapter/tests/index.test.d.ts.map +1 -0
  26. package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts +2 -0
  27. package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts.map +1 -0
  28. package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts +2 -0
  29. package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts.map +1 -0
  30. package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts +2 -0
  31. package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts.map +1 -0
  32. package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts +2 -0
  33. package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts.map +1 -0
  34. package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts +2 -0
  35. package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts.map +1 -0
  36. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts +16 -0
  37. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -0
  38. package/dist/better-auth/database-adapter/tests/utils.test.d.ts +2 -0
  39. package/dist/better-auth/database-adapter/tests/utils.test.d.ts.map +1 -0
  40. package/dist/better-auth/database-adapter/utils.d.ts +16 -0
  41. package/dist/better-auth/database-adapter/utils.d.ts.map +1 -0
  42. package/dist/{chunk-GRN6OAUX.js → chunk-OTWWOZMB.js} +73 -4
  43. package/dist/chunk-OTWWOZMB.js.map +1 -0
  44. package/dist/index.js +1 -1
  45. package/dist/react/index.js +2 -0
  46. package/dist/react/index.js.map +1 -1
  47. package/dist/react/media/image.d.ts.map +1 -1
  48. package/dist/react-native-core/index.js +3 -1
  49. package/dist/react-native-core/index.js.map +1 -1
  50. package/dist/react-native-core/media/image.d.ts.map +1 -1
  51. package/dist/svelte/media/image.svelte +104 -98
  52. package/dist/svelte/media/image.svelte.d.ts.map +1 -1
  53. package/dist/svelte/tests/media/image.svelte.test.js +16 -2
  54. package/dist/testing.js +1 -1
  55. package/dist/tools/implementation/refs.d.ts +1 -1
  56. package/dist/tools/implementation/refs.d.ts.map +1 -1
  57. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +4 -0
  58. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
  59. package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -0
  60. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  61. package/dist/tools/subscribe/index.d.ts.map +1 -1
  62. package/jazz-tools-0.18.6.tgz +0 -0
  63. package/package.json +10 -5
  64. package/src/better-auth/database-adapter/index.ts +228 -0
  65. package/src/better-auth/database-adapter/repository/account.ts +131 -0
  66. package/src/better-auth/database-adapter/repository/generic.ts +297 -0
  67. package/src/better-auth/database-adapter/repository/index.ts +5 -0
  68. package/src/better-auth/database-adapter/repository/session.ts +190 -0
  69. package/src/better-auth/database-adapter/repository/user.ts +158 -0
  70. package/src/better-auth/database-adapter/repository/verification.ts +37 -0
  71. package/src/better-auth/database-adapter/schema.ts +222 -0
  72. package/src/better-auth/database-adapter/tests/index.test.ts +690 -0
  73. package/src/better-auth/database-adapter/tests/repository/account.test.ts +149 -0
  74. package/src/better-auth/database-adapter/tests/repository/generic.test.ts +183 -0
  75. package/src/better-auth/database-adapter/tests/repository/session.test.ts +419 -0
  76. package/src/better-auth/database-adapter/tests/repository/user.test.ts +673 -0
  77. package/src/better-auth/database-adapter/tests/repository/verification.test.ts +101 -0
  78. package/src/better-auth/database-adapter/tests/sync-utils.ts +127 -0
  79. package/src/better-auth/database-adapter/tests/utils.test.ts +787 -0
  80. package/src/better-auth/database-adapter/utils.ts +178 -0
  81. package/src/react/media/image.tsx +2 -0
  82. package/src/react/tests/media/image.test.tsx +20 -2
  83. package/src/react-native-core/media/image.tsx +4 -1
  84. package/src/svelte/media/image.svelte +104 -98
  85. package/src/svelte/tests/media/image.svelte.test.ts +18 -2
  86. package/src/tools/implementation/refs.ts +27 -3
  87. package/src/tools/subscribe/CoValueCoreSubscription.ts +14 -0
  88. package/src/tools/subscribe/SubscriptionScope.ts +62 -1
  89. package/src/tools/subscribe/index.ts +8 -0
  90. package/tsup.config.ts +7 -0
  91. package/dist/chunk-GRN6OAUX.js.map +0 -1
@@ -0,0 +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":"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","names":["node","list","user","co","z","co","z","co","z","worker"]}
@@ -0,0 +1,24 @@
1
+ import { CleanedWhere } from "better-auth/adapters";
2
+ import { JazzRepository } from "./generic";
3
+ import type { TableItem } from "../schema";
4
+ export declare class AccountRepository extends JazzRepository {
5
+ /**
6
+ * Custom logic:
7
+ * - keep sync accountId index
8
+ */
9
+ create(model: string, data: Record<string, any>, uniqueId?: string): Promise<TableItem>;
10
+ /**
11
+ * Custom logic:
12
+ * - if the accountId is in the where clause, get the ids from the index
13
+ */
14
+ findMany(model: string, where: CleanedWhere[] | undefined, limit?: number, sortBy?: {
15
+ field: string;
16
+ direction: "asc" | "desc";
17
+ }, offset?: number): Promise<TableItem[]>;
18
+ deleteValue(model: string, where: CleanedWhere[]): Promise<number>;
19
+ private getAccountIdIndex;
20
+ private updateAccountIdIndex;
21
+ private deleteAccountIdIndex;
22
+ private getAccountIdProperty;
23
+ }
24
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/repository/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAS3C,qBAAa,iBAAkB,SAAQ,cAAc;IACnD;;;OAGG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;IAWrB;;;OAGG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,EACjC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,EAAE,CAAC;IA0BjB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAkB1D,iBAAiB;YAcjB,oBAAoB;YAYpB,oBAAoB;IAYlC,OAAO,CAAC,oBAAoB;CAK7B"}
@@ -0,0 +1,45 @@
1
+ import { CleanedWhere } from "better-auth/adapters";
2
+ import { BetterAuthDbSchema } from "better-auth/db";
3
+ import { Account, CoList, CoMap, Group, co } from "jazz-tools";
4
+ import type { Database, TableItem } from "../schema.js";
5
+ export declare class JazzRepository {
6
+ protected databaseSchema: Database;
7
+ protected databaseRoot: co.loaded<Database, {
8
+ group: true;
9
+ }>;
10
+ protected worker: Account;
11
+ protected owner: Group;
12
+ protected betterAuthSchema: BetterAuthDbSchema;
13
+ private coValuesTracker;
14
+ constructor(databaseSchema: Database, databaseRoot: co.loaded<Database, {
15
+ group: true;
16
+ }>, worker: Account, betterAuthSchema?: BetterAuthDbSchema, ensureSync?: boolean);
17
+ ensureSync(): Promise<unknown[][]>;
18
+ create(model: string, data: Record<string, any>, uniqueId?: string): Promise<TableItem>;
19
+ findOne(model: string, where: CleanedWhere[]): Promise<TableItem | null>;
20
+ findById(model: string, where: [{
21
+ field: "id";
22
+ operator: "eq";
23
+ value: string;
24
+ connector: "AND";
25
+ }]): Promise<TableItem | null>;
26
+ findByUnique(model: string, where: [{
27
+ field: string;
28
+ operator: "eq";
29
+ value: string;
30
+ connector: "AND";
31
+ }]): Promise<TableItem | null>;
32
+ findMany(model: string, where: CleanedWhere[] | undefined, limit?: number, sortBy?: {
33
+ field: string;
34
+ direction: "asc" | "desc";
35
+ }, offset?: number): Promise<TableItem[]>;
36
+ update(model: string, where: CleanedWhere[], update: Record<string, any>): Promise<TableItem[]>;
37
+ deleteValue(model: string, where: CleanedWhere[]): Promise<number>;
38
+ count(model: string, where: CleanedWhere[] | undefined): Promise<number>;
39
+ protected getSchema(model: string): co.Map<any, unknown, Group | Account>;
40
+ protected filterSortPaginateList<T extends TableItem>(list: CoList<CoMap | null>, where: CleanedWhere[] | undefined, limit?: number, sortBy?: {
41
+ field: string;
42
+ direction: "asc" | "desc";
43
+ }, offset?: number): T[];
44
+ }
45
+ //# sourceMappingURL=generic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/repository/generic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./generic.js";
2
+ export * from "./user.js";
3
+ export * from "./session.js";
4
+ export * from "./verification.js";
5
+ export * from "./account.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/repository/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { BetterAuthDbSchema } from "better-auth/db";
2
+ import { CleanedWhere } from "better-auth/adapters";
3
+ import { co, Account } from "jazz-tools";
4
+ import { JazzRepository } from "./generic";
5
+ import { UserRepository } from "./user";
6
+ import type { Database, TableItem } from "../schema";
7
+ export declare class SessionRepository extends JazzRepository {
8
+ protected userRepository: UserRepository;
9
+ constructor(databaseSchema: Database, databaseRoot: co.loaded<Database, {
10
+ group: true;
11
+ }>, worker: Account, betterAuthSchema?: BetterAuthDbSchema, ensureSync?: boolean);
12
+ /**
13
+ * Custom logic: sessions are stored inside the user object
14
+ */
15
+ create(model: string, data: Record<string, any>, uniqueId?: string): Promise<TableItem>;
16
+ /**
17
+ * Custom logic: sessions are stored inside the user object.
18
+ */
19
+ findMany(model: string, where: CleanedWhere[] | undefined, limit?: number, sortBy?: {
20
+ field: string;
21
+ direction: "asc" | "desc";
22
+ }, offset?: number): Promise<TableItem[]>;
23
+ /**
24
+ * Custom logic: sessions are stored inside the user object.
25
+ */
26
+ deleteValue(model: string, where: CleanedWhere[]): Promise<number>;
27
+ private deleteSession;
28
+ }
29
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/repository/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAOxC,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAMrD,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;gBAGvC,cAAc,EAAE,QAAQ,EACxB,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC,EAClD,MAAM,EAAE,OAAO,EACf,gBAAgB,GAAE,kBAAuB,EACzC,UAAU,GAAE,OAAe;IAY7B;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;IAkCrB;;OAEG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,EACjC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,EAAE,CAAC;IAkDvB;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAW1D,aAAa;CAsC5B"}
@@ -0,0 +1,30 @@
1
+ import { CleanedWhere } from "better-auth/adapters";
2
+ import { JazzRepository } from "./generic";
3
+ import type { TableItem } from "../schema";
4
+ export declare class UserRepository extends JazzRepository {
5
+ /**
6
+ * Custom logic:
7
+ * - sessions are stored inside the user object
8
+ * - keep sync email index
9
+ */
10
+ create(model: string, data: Record<string, any>, uniqueId?: string): Promise<TableItem>;
11
+ /**
12
+ * Custom logic:
13
+ * - if the email is in the where clause, find by email
14
+ */
15
+ findMany(model: string, where: CleanedWhere[] | undefined, limit?: number, sortBy?: {
16
+ field: string;
17
+ direction: "asc" | "desc";
18
+ }, offset?: number): Promise<TableItem[]>;
19
+ private getEmailProperty;
20
+ private findByEmail;
21
+ /**
22
+ * Custom logic:
23
+ * - if the email is changed, update the email index
24
+ */
25
+ update(model: string, where: CleanedWhere[], update: Record<string, any>): Promise<TableItem[]>;
26
+ deleteValue(model: string, where: CleanedWhere[]): Promise<number>;
27
+ private loadEmailIndex;
28
+ private updateEmailIndex;
29
+ }
30
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/repository/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAI3C,qBAAa,cAAe,SAAQ,cAAc;IAChD;;;;OAIG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;IA2BrB;;;OAGG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,EACjC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,EAAE,CAAC;IAQvB,OAAO,CAAC,gBAAgB;YAIV,WAAW;IAczB;;;OAGG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAAC,SAAS,EAAE,CAAC;IAkCjB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAiB1D,cAAc;YAQd,gBAAgB;CAS/B"}
@@ -0,0 +1,18 @@
1
+ import { CleanedWhere } from "better-auth/adapters";
2
+ import { JazzRepository } from "./generic";
3
+ import type { TableItem } from "../schema";
4
+ export declare class VerificationRepository extends JazzRepository {
5
+ /**
6
+ * Custom logic: property identifier is used as uniqueId
7
+ */
8
+ create(model: string, data: Record<string, any>, uniqueId?: string): Promise<TableItem>;
9
+ /**
10
+ * Custom logic: property identifier is used as uniqueId
11
+ * If we look for identifier, we use findByUnique instead of findMany
12
+ */
13
+ findMany(model: string, where: CleanedWhere[] | undefined, limit?: number, sortBy?: {
14
+ field: string;
15
+ direction: "asc" | "desc";
16
+ }, offset?: number): Promise<TableItem[]>;
17
+ }
18
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/repository/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,qBAAa,sBAAuB,SAAQ,cAAc;IACxD;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;IAIrB;;;OAGG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,EACjC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,EAAE,CAAC;CASxB"}
@@ -0,0 +1,27 @@
1
+ import { BetterAuthDbSchema } from "better-auth/db";
2
+ import { Group, co } from "jazz-tools";
3
+ type TableRow = co.Map<any>;
4
+ export type TableItem = co.loaded<TableRow>;
5
+ type Table = co.List<TableRow>;
6
+ export type Database = co.Map<{
7
+ group: typeof Group;
8
+ tables: co.Map<{
9
+ [key: string]: Table;
10
+ }>;
11
+ }>;
12
+ type WorkerAccount = co.Account<{
13
+ profile: co.Profile;
14
+ root: co.Map<any>;
15
+ }>;
16
+ type JazzSchema = {
17
+ WorkerAccount: WorkerAccount;
18
+ DatabaseRoot: Database;
19
+ betterAuthSchema: BetterAuthDbSchema;
20
+ loadDatabase: (account: co.loaded<co.Account>, options?: Parameters<Database["loadUnique"]>[2]) => Promise<co.loaded<Database, {
21
+ group: true;
22
+ }>>;
23
+ };
24
+ export declare function createJazzSchema(schema: BetterAuthDbSchema): JazzSchema;
25
+ export declare function tableItem2Record(tableItem: TableItem | null | undefined): Record<string, any> | null | undefined;
26
+ export {};
27
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/better-auth/database-adapter/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAK,MAAM,YAAY,CAAC;AAE1C,KAAK,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE5C,KAAK,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,MAAM,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC;IAC5B,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;KACtB,CAAC,CAAC;CACJ,CAAC,CAAC;AAEH,KAAK,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;IAC9B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACnB,CAAC,CAAC;AAEH,KAAK,UAAU,GAAG;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,QAAQ,CAAC;IACvB,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,YAAY,EAAE,CACZ,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,KAC5C,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;CACpD,CAAC;AAIF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,UAAU,CA8FvE;AAkFD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GACtC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAYxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/tests/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=account.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.test.d.ts","sourceRoot":"","sources":["../../../../../src/better-auth/database-adapter/tests/repository/account.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.test.d.ts","sourceRoot":"","sources":["../../../../../src/better-auth/database-adapter/tests/repository/generic.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../../../../src/better-auth/database-adapter/tests/repository/session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=user.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.test.d.ts","sourceRoot":"","sources":["../../../../../src/better-auth/database-adapter/tests/repository/user.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.test.d.ts","sourceRoot":"","sources":["../../../../../src/better-auth/database-adapter/tests/repository/verification.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { LocalNode } from "cojson";
2
+ export declare const startSyncServer: (port?: number) => Promise<{
3
+ close: () => void;
4
+ syncServer: string;
5
+ port: number;
6
+ localNode: LocalNode;
7
+ wss: import("ws").Server<typeof import("ws"), typeof import("http").IncomingMessage>;
8
+ }>;
9
+ export declare const createWorkerAccount: ({ name, peer: peerAddr, }: {
10
+ name: string;
11
+ peer: string;
12
+ }) => Promise<{
13
+ accountID: string;
14
+ agentSecret: `sealerSecret_z${string}/signerSecret_z${string}`;
15
+ }>;
16
+ //# sourceMappingURL=sync-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-utils.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/tests/sync-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,eAAO,MAAM,eAAe,UAAiB,MAAM;;;;;;EAsFlD,CAAC;AAEF,eAAO,MAAM,mBAAmB,8BAG7B;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;;;EAyBA,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/tests/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { CleanedWhere } from "better-auth/adapters";
2
+ export declare function filterListByWhere<T>(data: T[], where: CleanedWhere[] | undefined): T[];
3
+ export declare function sortListByField<T extends Record<string, any> | null>(data: T[], sort?: {
4
+ field: string;
5
+ direction: "asc" | "desc";
6
+ }): T[];
7
+ export declare function paginateList<T>(data: T[], limit: number | undefined, offset: number | undefined): T[];
8
+ export declare function isWhereBySingleField<T extends string>(field: T, where: CleanedWhere[] | undefined): where is [{
9
+ field: T;
10
+ operator: "eq";
11
+ value: string;
12
+ connector: "AND";
13
+ }];
14
+ export declare function containWhereByField<T extends string>(field: T, where: CleanedWhere[] | undefined): boolean;
15
+ export declare function extractWhereByField<T extends string>(field: T, where: CleanedWhere[] | undefined): [CleanedWhere | undefined, CleanedWhere[]];
16
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +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,CA0EL;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"}
@@ -3317,8 +3317,21 @@ var Ref = class {
3317
3317
  }
3318
3318
  async load() {
3319
3319
  const subscriptionScope = getSubscriptionScope(this.parent);
3320
- subscriptionScope.subscribeToId(this.id, this.schema);
3321
- const node = subscriptionScope.childNodes.get(this.id);
3320
+ let node;
3321
+ if (subscriptionScope.closed) {
3322
+ node = new SubscriptionScope(
3323
+ subscriptionScope.node,
3324
+ true,
3325
+ this.id,
3326
+ this.schema,
3327
+ subscriptionScope.skipRetry,
3328
+ subscriptionScope.bestEffortResolution,
3329
+ subscriptionScope.unstable_branch
3330
+ );
3331
+ } else {
3332
+ subscriptionScope.subscribeToId(this.id, this.schema);
3333
+ node = subscriptionScope.childNodes.get(this.id);
3334
+ }
3322
3335
  if (!node) {
3323
3336
  return null;
3324
3337
  }
@@ -3338,6 +3351,9 @@ var Ref = class {
3338
3351
  unsubscribe();
3339
3352
  resolve(null);
3340
3353
  }
3354
+ if (subscriptionScope.closed) {
3355
+ node.destroy();
3356
+ }
3341
3357
  });
3342
3358
  });
3343
3359
  }
@@ -3523,6 +3539,17 @@ var CoValueCoreSubscription = class {
3523
3539
  this.source = localNode.getCoValue(id);
3524
3540
  this.initializeSubscription();
3525
3541
  }
3542
+ /**
3543
+ * Rehydrates the subscription by resetting the unsubscribed flag and initializing the subscription again
3544
+ */
3545
+ pullValue() {
3546
+ if (!this.unsubscribed) {
3547
+ return;
3548
+ }
3549
+ this.unsubscribed = false;
3550
+ this.initializeSubscription();
3551
+ this.unsubscribe();
3552
+ }
3526
3553
  /**
3527
3554
  * Main entry point for subscription initialization.
3528
3555
  * Determines the subscription strategy based on current availability and branch requirements.
@@ -3753,6 +3780,7 @@ var SubscriptionScope = class _SubscriptionScope {
3753
3780
  this.totalValidTransactions = 0;
3754
3781
  this.migrated = false;
3755
3782
  this.migrating = false;
3783
+ this.closed = false;
3756
3784
  this.silenceUpdates = false;
3757
3785
  this.handleChildUpdate = (id, value, key) => {
3758
3786
  if (value.type === "unloaded") {
@@ -3788,7 +3816,6 @@ var SubscriptionScope = class _SubscriptionScope {
3788
3816
  lastUpdate = value;
3789
3817
  if (skipRetry && value === "unavailable") {
3790
3818
  this.handleUpdate(value);
3791
- this.destroy();
3792
3819
  return;
3793
3820
  }
3794
3821
  if (!this.migrated && value !== "unavailable") {
@@ -3992,8 +4019,37 @@ var SubscriptionScope = class _SubscriptionScope {
3992
4019
  isSubscribedToId(id) {
3993
4020
  return this.idsSubscribed.has(id) || this.childValues.has(id) || this.pendingAutoloadedChildren.has(id) || this.pendingLoadedChildren.has(id);
3994
4021
  }
4022
+ /**
4023
+ * Checks if the currently unloaded value has got some updates
4024
+ *
4025
+ * Used to make the autoload work on closed subscription scopes
4026
+ */
4027
+ pullValue(listener) {
4028
+ if (!this.closed) {
4029
+ throw new Error("Cannot pull a non-closed subscription scope");
4030
+ }
4031
+ if (this.value.type === "loaded") {
4032
+ return;
4033
+ }
4034
+ this.subscription.pullValue();
4035
+ const value = this.getCurrentValue();
4036
+ if (value) {
4037
+ listener({
4038
+ type: "loaded",
4039
+ value,
4040
+ id: this.id
4041
+ });
4042
+ }
4043
+ }
3995
4044
  subscribeToId(id, descriptor) {
3996
4045
  if (this.isSubscribedToId(id)) {
4046
+ if (!this.closed) {
4047
+ return;
4048
+ }
4049
+ const child2 = this.childNodes.get(id);
4050
+ if (child2) {
4051
+ child2.pullValue((value) => this.handleChildUpdate(id, value));
4052
+ }
3997
4053
  return;
3998
4054
  }
3999
4055
  this.idsSubscribed.add(id);
@@ -4011,6 +4067,9 @@ var SubscriptionScope = class _SubscriptionScope {
4011
4067
  );
4012
4068
  this.childNodes.set(id, child);
4013
4069
  child.setListener((value) => this.handleChildUpdate(id, value));
4070
+ if (this.closed) {
4071
+ child.destroy();
4072
+ }
4014
4073
  this.silenceUpdates = false;
4015
4074
  }
4016
4075
  loadChildren() {
@@ -4200,8 +4259,12 @@ var SubscriptionScope = class _SubscriptionScope {
4200
4259
  );
4201
4260
  this.childNodes.set(id, child);
4202
4261
  child.setListener((value) => this.handleChildUpdate(id, value, key));
4262
+ if (this.closed) {
4263
+ child.destroy();
4264
+ }
4203
4265
  }
4204
4266
  destroy() {
4267
+ this.closed = true;
4205
4268
  this.subscription.unsubscribe();
4206
4269
  this.subscribers.clear();
4207
4270
  this.childNodes.forEach((child) => child.destroy());
@@ -4227,12 +4290,18 @@ function getSubscriptionScope(value) {
4227
4290
  enumerable: false,
4228
4291
  configurable: false
4229
4292
  });
4293
+ newSubscriptionScope.destroy();
4230
4294
  return newSubscriptionScope;
4231
4295
  }
4232
4296
  function accessChildByKey(parent, childId, key) {
4233
4297
  const subscriptionScope = getSubscriptionScope(parent);
4298
+ const node = subscriptionScope.childNodes.get(childId);
4234
4299
  if (!subscriptionScope.isSubscribedToId(childId)) {
4235
4300
  subscriptionScope.subscribeToKey(key);
4301
+ } else if (node && node.closed) {
4302
+ node.pullValue(
4303
+ (value2) => subscriptionScope.handleChildUpdate(childId, value2)
4304
+ );
4236
4305
  }
4237
4306
  const value = subscriptionScope.childValues.get(childId);
4238
4307
  if (value?.type === "loaded") {
@@ -6078,4 +6147,4 @@ export {
6078
6147
  JazzContextManager
6079
6148
  };
6080
6149
  /* istanbul ignore file -- @preserve */
6081
- //# sourceMappingURL=chunk-GRN6OAUX.js.map
6150
+ //# sourceMappingURL=chunk-OTWWOZMB.js.map