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.
- package/.svelte-kit/__package__/media/image.svelte +104 -98
- package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/tests/media/image.svelte.test.js +16 -2
- package/.turbo/turbo-build.log +48 -38
- package/CHANGELOG.md +20 -0
- package/dist/better-auth/database-adapter/index.d.ts +50 -0
- package/dist/better-auth/database-adapter/index.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/index.js +920 -0
- package/dist/better-auth/database-adapter/index.js.map +1 -0
- package/dist/better-auth/database-adapter/repository/account.d.ts +24 -0
- package/dist/better-auth/database-adapter/repository/account.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/generic.d.ts +45 -0
- package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/index.d.ts +6 -0
- package/dist/better-auth/database-adapter/repository/index.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/session.d.ts +29 -0
- package/dist/better-auth/database-adapter/repository/session.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/user.d.ts +30 -0
- package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/verification.d.ts +18 -0
- package/dist/better-auth/database-adapter/repository/verification.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/schema.d.ts +27 -0
- package/dist/better-auth/database-adapter/schema.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/index.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/index.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/sync-utils.d.ts +16 -0
- package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/utils.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/utils.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/utils.d.ts +16 -0
- package/dist/better-auth/database-adapter/utils.d.ts.map +1 -0
- package/dist/{chunk-GRN6OAUX.js → chunk-OTWWOZMB.js} +73 -4
- package/dist/chunk-OTWWOZMB.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/media/image.d.ts.map +1 -1
- package/dist/react-native-core/index.js +3 -1
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/media/image.d.ts.map +1 -1
- package/dist/svelte/media/image.svelte +104 -98
- package/dist/svelte/media/image.svelte.d.ts.map +1 -1
- package/dist/svelte/tests/media/image.svelte.test.js +16 -2
- package/dist/testing.js +1 -1
- package/dist/tools/implementation/refs.d.ts +1 -1
- package/dist/tools/implementation/refs.d.ts.map +1 -1
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +4 -0
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -0
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/subscribe/index.d.ts.map +1 -1
- package/jazz-tools-0.18.6.tgz +0 -0
- package/package.json +10 -5
- package/src/better-auth/database-adapter/index.ts +228 -0
- package/src/better-auth/database-adapter/repository/account.ts +131 -0
- package/src/better-auth/database-adapter/repository/generic.ts +297 -0
- package/src/better-auth/database-adapter/repository/index.ts +5 -0
- package/src/better-auth/database-adapter/repository/session.ts +190 -0
- package/src/better-auth/database-adapter/repository/user.ts +158 -0
- package/src/better-auth/database-adapter/repository/verification.ts +37 -0
- package/src/better-auth/database-adapter/schema.ts +222 -0
- package/src/better-auth/database-adapter/tests/index.test.ts +690 -0
- package/src/better-auth/database-adapter/tests/repository/account.test.ts +149 -0
- package/src/better-auth/database-adapter/tests/repository/generic.test.ts +183 -0
- package/src/better-auth/database-adapter/tests/repository/session.test.ts +419 -0
- package/src/better-auth/database-adapter/tests/repository/user.test.ts +673 -0
- package/src/better-auth/database-adapter/tests/repository/verification.test.ts +101 -0
- package/src/better-auth/database-adapter/tests/sync-utils.ts +127 -0
- package/src/better-auth/database-adapter/tests/utils.test.ts +787 -0
- package/src/better-auth/database-adapter/utils.ts +178 -0
- package/src/react/media/image.tsx +2 -0
- package/src/react/tests/media/image.test.tsx +20 -2
- package/src/react-native-core/media/image.tsx +4 -1
- package/src/svelte/media/image.svelte +104 -98
- package/src/svelte/tests/media/image.svelte.test.ts +18 -2
- package/src/tools/implementation/refs.ts +27 -3
- package/src/tools/subscribe/CoValueCoreSubscription.ts +14 -0
- package/src/tools/subscribe/SubscriptionScope.ts +62 -1
- package/src/tools/subscribe/index.ts +8 -0
- package/tsup.config.ts +7 -0
- 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 @@
|
|
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 @@
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/tests/index.test.ts"],"names":[],"mappings":""}
|
@@ -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 @@
|
|
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 @@
|
|
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 @@
|
|
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 @@
|
|
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 @@
|
|
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
|
-
|
3321
|
-
|
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-
|
6150
|
+
//# sourceMappingURL=chunk-OTWWOZMB.js.map
|